99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線(xiàn)實(shí)戰(zhàn)洞察。

Java實(shí)現(xiàn)MAVLink協(xié)議解析與封包:幀結(jié)構(gòu)、CRC校驗(yàn)與工程實(shí)踐

Java實(shí)現(xiàn)MAVLink協(xié)議解析與封包:幀結(jié)構(gòu)、CRC校驗(yàn)與工程實(shí)踐 搞過(guò)無(wú)人機(jī)地面站、數(shù)傳鏈路或者飛控二次開(kāi)發(fā)的朋友對(duì)MAVLink這個(gè)協(xié)議應(yīng)該都不陌生。ArduPilot、PX4這些主流飛控都拿它當(dāng)對(duì)外通信的“官方語(yǔ)言”QGroundControl、Mission Planner這些地面站也是靠它和飛機(jī)對(duì)話(huà)。我最早接觸MAVLink是在做一個(gè)無(wú)人機(jī)數(shù)據(jù)鏈路網(wǎng)關(guān)的時(shí)候那時(shí)候項(xiàng)目技術(shù)棧是Java需要把飛控發(fā)出來(lái)的MAVLink報(bào)文接收下來(lái)解析出姿態(tài)、GPS、電量這些信息同時(shí)還要能反向把航點(diǎn)任務(wù)或控制指令封包上傳給飛控。一開(kāi)始我以為這玩意兒有現(xiàn)成的庫(kù)直接調(diào)API就行了但實(shí)際一深入才發(fā)現(xiàn)如果不懂幀結(jié)構(gòu)、不懂CRC_EXTRA校驗(yàn)機(jī)制、不懂粘包半包的處理哪怕用了庫(kù)也很容易在數(shù)據(jù)交互上翻車(chē)。這篇文章就把我對(duì)MAVLink協(xié)議解析與封包的經(jīng)驗(yàn)完整梳理一遍包含協(xié)議核心原理、手寫(xiě)解析和封包的Java代碼實(shí)現(xiàn)、基于官方庫(kù)的工程化用法以及我在實(shí)際調(diào)試中踩過(guò)的各種坑。無(wú)論你是準(zhǔn)備在Java后端里對(duì)接飛控?cái)?shù)據(jù)還是在做自己的地面站、數(shù)傳中轉(zhuǎn)服務(wù)或者只是對(duì)MAVLink協(xié)議本身感興趣這篇文章應(yīng)該都能幫你少走不少?gòu)澛贰?. Java做MAVLink二次開(kāi)發(fā)的場(chǎng)景與選型思考1.1 什么場(chǎng)景下會(huì)用到Java對(duì)接MAVLink很多人一聽(tīng)到MAVLink就想到C或Python畢竟飛控固件和大量開(kāi)源地面站都是用C寫(xiě)的Python也靠pymavlink占了腳本自動(dòng)化半壁江山。但在真實(shí)工程里Java接MAVLink的需求其實(shí)一點(diǎn)不少。舉個(gè)例子很多無(wú)人機(jī)巡檢、測(cè)繪、安防系統(tǒng)都是前后端分離的Web架構(gòu)后端服務(wù)可能是一個(gè)Spring Boot應(yīng)用負(fù)責(zé)接收飛控回傳的實(shí)時(shí)狀態(tài)寫(xiě)入時(shí)序數(shù)據(jù)庫(kù)再推送給前端Web頁(yè)面展示航跡和姿態(tài)。這種情況下鏈路可以是飛控 - 數(shù)傳模塊 - 串口服務(wù)器 - Java后端也可以是飛控 - 機(jī)載計(jì)算機(jī)樹(shù)莓派/Jetson上的Java程序 - 云平臺(tái)。還有一類(lèi)是仿真測(cè)試系統(tǒng)用Java模擬多個(gè)無(wú)人機(jī)節(jié)點(diǎn)向地面站或空管系統(tǒng)發(fā)送MAVLink報(bào)文這種場(chǎng)景也需要一套可靠的封包能力。在這些場(chǎng)景里用Java處理MAVLink就不是可選項(xiàng)而是必經(jīng)之路。雖然可以用Java調(diào)用pymavlink的子進(jìn)程繞一圈但性能和部署復(fù)雜度都不理想直接在Java層面實(shí)現(xiàn)協(xié)議解析和封包才是正解。1.2 自己手寫(xiě)還是用現(xiàn)成庫(kù)這是一個(gè)繞不開(kāi)的選型問(wèn)題。Java生態(tài)里比較常用的MAVLink庫(kù)是來(lái)自Dronefleet的mavlink庫(kù)以及dronekit-java這類(lèi)偏應(yīng)用層的SDK。它們能幫你省掉協(xié)議編解碼的臟活但用起來(lái)有幾個(gè)限制生成代碼的消息定義通常是固定的如果你用的飛控固件版本較老或較新消息字段可能與庫(kù)內(nèi)置的XML定義不一致。自定義MAVLink消息需要自己擴(kuò)展代碼生成器配置成本不低。庫(kù)只負(fù)責(zé)編解碼不負(fù)責(zé)傳輸層。你依然要自己處理串口、TCP、UDP的收發(fā)以及半包、粘包、超時(shí)重傳這些實(shí)際問(wèn)題。所以我個(gè)人的建議是如果你只是想快速跑通一個(gè)Demo直接用現(xiàn)成庫(kù)沒(méi)問(wèn)題但如果你想深入理解協(xié)議細(xì)節(jié)或者你的場(chǎng)景有定制消息、私有擴(kuò)展字段、異構(gòu)設(shè)備接入的需求那最好還是把協(xié)議本身吃透甚至自己手寫(xiě)一套輕量級(jí)的編解碼器。這篇博文的核心部分就圍繞著手寫(xiě)解析和封包展開(kāi)同時(shí)也會(huì)給出用官方庫(kù)的工程化方案。2. MAVLink幀結(jié)構(gòu)拆解V1/V2差異與CRC_EXTRA設(shè)計(jì)意圖2.1 MAVLink消息幀的基礎(chǔ)布局MAVLink是一種二進(jìn)制協(xié)議不是文本協(xié)議所以解析的時(shí)候沒(méi)有換行符、分隔符這種東西可以依賴(lài)必須按字節(jié)偏移精確切分。一條完整的MAVLink消息幀大致可以分為三個(gè)區(qū)域幀頭、負(fù)載Payload、幀尾校驗(yàn)。V1版本的幀結(jié)構(gòu)是字節(jié)偏移字段名長(zhǎng)度說(shuō)明0起始標(biāo)志1固定0xFE1負(fù)載長(zhǎng)度1Payload字節(jié)數(shù)2包序列號(hào)10-255循環(huán)3系統(tǒng)ID1發(fā)送設(shè)備系統(tǒng)編號(hào)4組件ID1發(fā)送設(shè)備組件編號(hào)5消息ID1消息類(lèi)型6~N負(fù)載數(shù)據(jù)變化具體消息字段N1~N2校驗(yàn)和2CRC16/MCRF4XXV2版本在V1基礎(chǔ)上擴(kuò)展了幀頭起始標(biāo)志變成了0xFD并在消息ID區(qū)域從1字節(jié)擴(kuò)展到了3字節(jié)同時(shí)增加了額外的增量校驗(yàn)字節(jié)Increment/Compatibility flags。V2的幀頭是這樣的字節(jié)偏移字段名長(zhǎng)度說(shuō)明0起始標(biāo)志1固定0xFD1負(fù)載長(zhǎng)度1Payload字節(jié)數(shù)2包序列號(hào)10-255循環(huán)3系統(tǒng)ID1發(fā)送設(shè)備系統(tǒng)編號(hào)4組件ID1發(fā)送設(shè)備組件編號(hào)5消息ID低字節(jié)1消息ID bit0-76消息ID中間字節(jié)1消息ID bit8-157消息ID高字節(jié)1消息ID bit16-238兼容性標(biāo)志1保留位9兼容性掩碼1保留位10~N9負(fù)載數(shù)據(jù)變化具體消息字段N10~N11校驗(yàn)和2CRC16/MCRF4XX這兩者的核心區(qū)別一個(gè)是消息ID的寬度V2最多支持16777216種消息類(lèi)型而V1只有256種。另一個(gè)是V2增加了兩個(gè)標(biāo)志字節(jié)方便后續(xù)協(xié)議演進(jìn)。實(shí)際開(kāi)發(fā)中V1和V2經(jīng)常會(huì)混用所以解析器必須同時(shí)兼容0xFE和0xFD兩種起始標(biāo)志。2.2 系統(tǒng)ID和組件ID到底怎么理解我剛接觸MAVLink時(shí)對(duì)系統(tǒng)ID和組件ID的概念有點(diǎn)模糊后來(lái)調(diào)鏈路時(shí)踩了坑才徹底明白。簡(jiǎn)單說(shuō)系統(tǒng)ID用于區(qū)分同一通信鏈路上的不同飛行器或地面設(shè)備比如你同時(shí)控制3臺(tái)無(wú)人機(jī)那3臺(tái)飛機(jī)的系統(tǒng)ID一般會(huì)設(shè)成1、2、3。組件ID則用于區(qū)分同一個(gè)系統(tǒng)內(nèi)部的不同功能模塊比如自動(dòng)飛控組件、GPS模塊、相機(jī)云臺(tái)、地面站軟件它們的組件ID都不同。地面站和飛控通信時(shí)飛控發(fā)出的數(shù)據(jù)里系統(tǒng)ID是飛控自己的編號(hào)組件ID是各個(gè)板載組件的編號(hào)。而地面站要發(fā)送指令給飛控時(shí)發(fā)送方的系統(tǒng)ID必須和飛控配置中認(rèn)定的地面站系統(tǒng)ID一致否則飛控會(huì)直接忽略。這部分看起來(lái)不難但做多機(jī)場(chǎng)景時(shí)經(jīng)常有人把系統(tǒng)ID搞混導(dǎo)致指令發(fā)給1號(hào)機(jī)結(jié)果2號(hào)機(jī)沒(méi)有反應(yīng)。2.3 CRC_EXTRA很多人忽略卻致命的校驗(yàn)字節(jié)MAVLink的校驗(yàn)和計(jì)算方式跟普通CRC不太一樣它并不是單純對(duì)幀頭加負(fù)載做CRC16。實(shí)際算法是把整條消息幀的數(shù)據(jù)幀頭部分按特定規(guī)則參與不同版本參與的數(shù)據(jù)范圍不同和一個(gè)消息專(zhuān)屬的CRC_EXTRA種子值一起做CRC16/MCRF4XX運(yùn)算。這個(gè)CRC_EXTRA值是從消息定義XML中提取的具體數(shù)值與消息的字段順序、字段類(lèi)型強(qiáng)相關(guān)。如果發(fā)送端和接收端對(duì)同一消息ID的字段定義不完全一致計(jì)算出的CRC_EXTRA就不一樣接收端理所當(dāng)然會(huì)把這條消息視為非法。以前和第三方設(shè)備做聯(lián)調(diào)時(shí)對(duì)方聲稱(chēng)支持MAVLink結(jié)果發(fā)過(guò)來(lái)的消息我們這邊全部校驗(yàn)失敗最后排查發(fā)現(xiàn)對(duì)方的消息定義里把某個(gè)uint32_t字段改成了uint16_t導(dǎo)致CRC_EXTRA種子對(duì)不上。所以在手寫(xiě)封包和解析時(shí)CRC_EXTRA值必須和你的目標(biāo)飛控固件所用的消息定義嚴(yán)格一致。ArduPilot和PX4的Common.xml定義可以從官方倉(cāng)庫(kù)獲取改動(dòng)任何字段后都要重新計(jì)算CRC_EXTRA。3. 自己寫(xiě)封包校驗(yàn)計(jì)算、字節(jié)序與代碼實(shí)現(xiàn)3.1 封包前必須先確認(rèn)的兩個(gè)參數(shù)目標(biāo)系統(tǒng)的字節(jié)序與CRC種子動(dòng)手寫(xiě)封包代碼前先把兩個(gè)參數(shù)確認(rèn)好否則后面調(diào)試會(huì)非常痛苦。第一個(gè)是字節(jié)序。MAVLink協(xié)議規(guī)定所有多字節(jié)數(shù)值類(lèi)型如uint16_t、uint32_t、float等在負(fù)載區(qū)都使用小端序Little-Endian存儲(chǔ)。這個(gè)規(guī)定幾乎所有飛控實(shí)現(xiàn)都遵循但如果是對(duì)接某些非標(biāo)準(zhǔn)的定制設(shè)備最好先確認(rèn)一下對(duì)方是否符合標(biāo)準(zhǔn)因?yàn)樽止?jié)序錯(cuò)了的話(huà)解析出來(lái)的數(shù)值會(huì)非常離譜比如高度變成幾百萬(wàn)米。第二個(gè)是CRC種子。每個(gè)消息ID都對(duì)應(yīng)一個(gè)固定的CRC_EXTRA值這個(gè)值可以通過(guò)官方腳本crc_extra.py或在線(xiàn)工具查也可以從MAVLink XML消息定義中提取。我習(xí)慣把用到的消息ID和CRC_EXTRA值維護(hù)在一個(gè)常量類(lèi)里作為封包和解析共用的對(duì)照表。3.2 手寫(xiě)封包的核心流程封包的本質(zhì)就是把消息對(duì)象的字段按定義順序?qū)懭胍粋€(gè)字節(jié)緩沖區(qū)計(jì)算CRC再加上幀頭最后輸出完整的字節(jié)數(shù)組。以發(fā)送V1版本HEARTBEAT消息為例我的實(shí)現(xiàn)思路大致如下創(chuàng)建一個(gè)ByteBuffer設(shè)置為小端序如果字節(jié)序不匹配這里就要先調(diào)整否則后面所有數(shù)值字段都會(huì)出問(wèn)題。預(yù)留幀頭部分的空間或者先把幀頭字段逐個(gè)寫(xiě)入。由于負(fù)載長(zhǎng)度是先知的所以可以先把負(fù)載長(zhǎng)度、包序列號(hào)、系統(tǒng)ID、組件ID、消息ID依次寫(xiě)入緩沖區(qū)。接下來(lái)寫(xiě)入負(fù)載數(shù)據(jù)也就是消息具體字段。幀頭加負(fù)載全部寫(xiě)入后用這份完整數(shù)據(jù)計(jì)算CRC16校驗(yàn)和再把2字節(jié)校驗(yàn)和追加到緩沖區(qū)末尾。最終輸出byte[]就是一條可發(fā)送的MAVLink消息幀。下面是一個(gè)偏基礎(chǔ)的實(shí)現(xiàn)示例目標(biāo)是可讀性?xún)?yōu)先方便大家理解協(xié)議流程實(shí)際工程中可以根據(jù)需要再優(yōu)化。import java.nio.ByteBuffer; import java.nio.ByteOrder; public class MavlinkV1Frame { // 每個(gè)消息ID對(duì)應(yīng)的CRC_EXTRA值這里用HEARTBEAT舉例 private static final int CRC_EXTRA_HEARTBEAT 50; public static byte[] buildHeartbeatV1(int sysId, int compId, int seq) { // HEARTBEAT V1 負(fù)載長(zhǎng)度9 字節(jié) int payloadLength 9; ByteBuffer buf ByteBuffer.allocate(payloadLength 8); buf.order(ByteOrder.LITTLE_ENDIAN); buf.put((byte) 0xFE); // 起始標(biāo)志 buf.put((byte) payloadLength); // 負(fù)載長(zhǎng)度 buf.put((byte) seq); // 包序列號(hào) buf.put((byte) sysId); // 系統(tǒng)ID buf.put((byte) compId); // 組件ID buf.put((byte) 0); // 消息ID: HEARTBEAT // payload: MAV_TYPE_FIXED_WING1, MAV_AUTOPILOT_ARDUPILOTMEGA3 buf.put((byte) 1); // type buf.put((byte) 3); // autopilot buf.put((byte) 0); // base_mode buf.put((byte) 0); // custom_mode 低字節(jié) buf.put((byte) 0); // custom_mode 高字節(jié) buf.put((byte) 0); // system_status buf.put((byte) 0); // mavlink_version byte[] frame buf.array(); // 計(jì)算CRC16幀頭 負(fù)載并追加CRC_EXTRA種子參與運(yùn)算 int crc Crc16Util.crc16(frame, frame.length - 2); crc Crc16Util.accumulateByte(crc, CRC_EXTRA_HEARTBEAT); ByteBuffer result ByteBuffer.allocate(frame.length 2); result.order(ByteOrder.LITTLE_ENDIAN); result.put(frame); result.putShort((short) (crc 0xFFFF)); // 校驗(yàn)和低字節(jié)在前 return result.array(); } }這里的Crc16Util就是CRC16/MCRF4XX算法的具體實(shí)現(xiàn)。關(guān)于算法本身下文會(huì)詳細(xì)展開(kāi)這里先留一個(gè)引用。3.3 CRC16/MCRF4XX怎么用Java實(shí)現(xiàn)MAVLink用的CRC16是CRC16/MCRF4XX它的多項(xiàng)式是0x1021初始值是0xFFFF。算法對(duì)輸入數(shù)據(jù)的每一位進(jìn)行處理和普通CRC16區(qū)別不大關(guān)鍵是MAVLink協(xié)議規(guī)定CRC結(jié)束后還需要把CRC_EXTRA種子當(dāng)作一個(gè)獨(dú)立字節(jié)繼續(xù)參與一次或多次累加運(yùn)算。以下是Java實(shí)現(xiàn)可以直接復(fù)用public class Crc16Util { public static int crc16(byte[] data) { int crc 0xFFFF; for (byte b : data) { crc ^ (b 0xFF) 8; for (int i 0; i 8; i) { if ((crc 0x8000) ! 0) { crc (crc 1) ^ 0x1021; } else { crc 1; } crc 0xFFFF; } } return crc; } public static int crc16(byte[] data, int length) { int crc 0xFFFF; for (int i 0; i length; i) { crc ^ (data[i] 0xFF) 8; for (int j 0; j 8; j) { if ((crc 0x8000) ! 0) { crc (crc 1) ^ 0x1021; } else { crc 1; } crc 0xFFFF; } } return crc; } public static int accumulateByte(int crc, int byteValue) { crc ^ (byteValue 0xFF) 8; for (int j 0; j 8; j) { if ((crc 0x8000) ! 0) { crc (crc 1) ^ 0x1021; } else { crc 1; } crc 0xFFFF; } return crc; } }我看到有些網(wǎng)上流傳的代碼在累加CRC_EXTRA時(shí)會(huì)忽略字節(jié)的高位其實(shí)那是不嚴(yán)格的。accumulateByte方法里必須把傳入值按0xFF取低位再放到高8位參與運(yùn)算這樣才能和官方實(shí)現(xiàn)保持一致。3.4 字節(jié)填充順序與ByteBuffer的選擇寫(xiě)封包代碼時(shí)我最常犯的錯(cuò)誤是字段順序和官方消息定義不一致。MAVLink消息的負(fù)載字段順序不是隨意排的而是XML定義里從上到下的順序。比如GLOBAL_POSITION_INT的定義順序是time_boot_ms、lat、lon、alt、relative_alt、vx、vy、vz、hdg如果你把lat和lon寫(xiě)反了經(jīng)緯度就會(huì)在圖上走出奇怪的軌跡。Java里處理二進(jìn)制流我推薦用ByteBuffer而不是手工拼接byte數(shù)組。原因有三點(diǎn)一是ByteBuffer原生支持小端序轉(zhuǎn)換只要order(ByteOrder.LITTLE_ENDIAN)設(shè)好putInt、putFloat這些方法會(huì)自動(dòng)處理字節(jié)順序二是它支持批量操作可以避免大量數(shù)組復(fù)制三是調(diào)試時(shí)可以直接看position和remaining方便定位寫(xiě)入位置。不過(guò)要注意ByteBuffer的get/put操作會(huì)把內(nèi)部position向前移動(dòng)讀取時(shí)需要有意識(shí)的flip或使用絕對(duì)位置訪(fǎng)問(wèn)。3.5 V2封包的差異點(diǎn)如果你要跟PX4或較新的ArduPilot通信V2封包更常見(jiàn)。V2和V1的封包流程差別不大但有幾個(gè)點(diǎn)要特別注意起始標(biāo)志是0xFD接收方如果只認(rèn)0xFE需要兩個(gè)分支同時(shí)兼容。消息ID是3字節(jié)寫(xiě)入時(shí)按低、中、高的順序依次put。在幀頭多出的兩個(gè)標(biāo)志字節(jié)通常填0表示沒(méi)有開(kāi)啟額外的簽名或兼容性擴(kuò)展。如果開(kāi)啟了消息簽名功能幀尾除了2字節(jié)CRC還會(huì)追加13字節(jié)的簽名數(shù)據(jù)簽名機(jī)制比較復(fù)雜一般用不到但對(duì)接某些安全要求較高的系統(tǒng)時(shí)可能要處理。在實(shí)際工程里我建議優(yōu)先支持V2發(fā)送同時(shí)兼容V1解析因?yàn)榇蠖鄶?shù)現(xiàn)代飛控都兼容V2接收而很多舊設(shè)備還在發(fā)V1。4. 自己寫(xiě)解析流式數(shù)據(jù)的狀態(tài)機(jī)處理4.1 粘包、半包與起始標(biāo)志誤判寫(xiě)解析器時(shí)第一個(gè)要面對(duì)的問(wèn)題就是MAVLink是流式協(xié)議底層可能是串口、TCP或UDP數(shù)據(jù)到達(dá)時(shí)不會(huì)剛好是一條完整的消息邊界。你可能會(huì)一次性收到好幾條消息粘在一起也可能收到一條消息的前半截過(guò)一會(huì)才收到后半截。最簡(jiǎn)單的處理思路就是一個(gè)字節(jié)一個(gè)字節(jié)地喂進(jìn)狀態(tài)機(jī)每完整收齊一幀就丟出一幀。這種方式雖然看起來(lái)笨拙但勝在穩(wěn)定不容易丟包而且實(shí)現(xiàn)邏輯直觀(guān)。效率上對(duì)于無(wú)人機(jī)數(shù)據(jù)鏈路這種吞吐量完全夠用。4.2 狀態(tài)機(jī)設(shè)計(jì)我把解析狀態(tài)機(jī)劃分成以下?tīng)顟B(tài)WAITING_FOR_START等待起始標(biāo)志0xFE或0xFD。READING_HEADER正在讀取幀頭剩余字段根據(jù)起始標(biāo)志區(qū)分V1和V2的幀頭長(zhǎng)度。READING_PAYLOAD按幀頭聲明的負(fù)載長(zhǎng)度讀取負(fù)載數(shù)據(jù)。CHECKING_CRC讀取2字節(jié)校驗(yàn)和并計(jì)算比對(duì)?;具壿嬍莗ublic class MavlinkParser { private static final byte START_V1 (byte) 0xFE; private static final byte START_V2 (byte) 0xFD; private int state 0; // 0 等起始, 1 讀幀頭, 2 讀負(fù)載, 3 讀CRC private boolean isV2 false; private int headerLen 0; private int payloadLen 0; private int crcExtra 0; private byte[] header new byte[12]; private int headerPos 0; private byte[] payload new byte[255]; private int payloadPos 0; private int seq 0; private int sysId 0; private int compId 0; private int msgId 0; public void feed(byte b, ListMavlinkMessage out) { switch (state) { case 0: if (b START_V1) { isV2 false; headerLen 6; headerPos 0; state 1; } else if (b START_V2) { isV2 true; headerLen 10; headerPos 0; state 1; } break; case 1: header[headerPos] b; if (headerPos 1) { payloadLen b 0xFF; } if (headerPos headerLen) { // 解析幀頭字段 if (isV2) { seq header[2] 0xFF; sysId header[3] 0xFF; compId header[4] 0xFF; msgId (header[5] 0xFF) | ((header[6] 0xFF) 8) | ((header[7] 0xFF) 16); } else { seq header[2] 0xFF; sysId header[3] 0xFF; compId header[4] 0xFF; msgId header[5] 0xFF; } payloadPos 0; state 2; } break; case 2: if (payloadPos payloadLen) { payload[payloadPos] b; } if (payloadPos payloadLen) { state 3; } break; case 3: // 先讀到的低字節(jié)后讀到的高字節(jié) int crcLow b 0xFF; // 這里簡(jiǎn)化處理實(shí)際還需要第二個(gè)字節(jié)才能算完 // 建議把CRC作為一個(gè)兩字節(jié)小狀態(tài)再細(xì)分 break; } } }上面的代碼只是一個(gè)骨架實(shí)際用的時(shí)候需要把CRC校驗(yàn)部分拆成兩步先收crcLow再收crcHigh收齊后計(jì)算整幀數(shù)據(jù)的CRC然后把crcLow和crcHigh拼成int和計(jì)算值比對(duì)。為了方便閱讀我沒(méi)有把CRC子狀態(tài)寫(xiě)進(jìn)去但思路是一致的。4.3 校驗(yàn)失敗怎么辦CRC校驗(yàn)失敗時(shí)最簡(jiǎn)單粗暴的做法就是把當(dāng)前這一幀丟棄然后回到WAITING_FOR_START狀態(tài)重新開(kāi)始。這個(gè)策略在大多數(shù)字鏈路場(chǎng)景下是合適的因?yàn)镸AVLink本身沒(méi)有幀級(jí)重傳機(jī)制漏掉一幀姿態(tài)數(shù)據(jù)下一幀馬上就會(huì)補(bǔ)上實(shí)時(shí)性數(shù)據(jù)對(duì)單幀丟失并不敏感。但有一種情況要特別注意如果在等待CRC的連續(xù)兩個(gè)字節(jié)期間因?yàn)榇诓ㄌ芈逝渲貌粚?duì)或者鏈路干擾造成字節(jié)錯(cuò)位那么狀態(tài)機(jī)可能會(huì)進(jìn)入假同步。比如數(shù)據(jù)里恰好出現(xiàn)0xFE被你當(dāng)成起始標(biāo)志隨后幾字節(jié)又恰好滿(mǎn)足幀頭結(jié)構(gòu)結(jié)果組裝出一條校驗(yàn)失敗的假消息。處理辦法是CRC校驗(yàn)失敗后不要簡(jiǎn)單地把丟棄點(diǎn)之后的第一個(gè)0xFE當(dāng)作新起始而是應(yīng)該退回到起始標(biāo)志狀態(tài)同時(shí)保留當(dāng)前緩沖區(qū)里已經(jīng)讀過(guò)的數(shù)據(jù)從下一位繼續(xù)掃描。否則某些干擾環(huán)境下會(huì)出現(xiàn)頻繁丟真幀的現(xiàn)象。4.4 如何從原始字節(jié)流切出完整幀半包場(chǎng)景實(shí)測(cè)假設(shè)你從串口讀到了這樣一個(gè)字節(jié)流FE 09 01 01 01 00 ...后面還缺了20個(gè)字節(jié)才夠完整。這時(shí)狀態(tài)機(jī)會(huì)停在READING_PAYLOAD或CHECKING_CRC狀態(tài)。等下一批數(shù)據(jù)到達(dá)你要把新數(shù)據(jù)繼續(xù)喂給狀態(tài)機(jī)而不是重新開(kāi)一幀。這就是狀態(tài)機(jī)的好處幀狀態(tài)跨批次保持天然處理了半包。反之如果一次讀到了三幀粘在一起狀態(tài)機(jī)也會(huì)在解析完第一幀后立刻把后續(xù)的0xFE識(shí)別為新幀的起始繼續(xù)解析第二幀、第三幀。整個(gè)過(guò)程不需要任何復(fù)雜緩沖區(qū)分割一個(gè)狀態(tài)機(jī)加一個(gè)回調(diào)接口就夠。在實(shí)際項(xiàng)目中我通常會(huì)在狀態(tài)機(jī)外面包一個(gè)parse(byte[] data)方法循環(huán)調(diào)用feed并把解析出來(lái)的完整消息收集到List返回。這樣一個(gè)方法就能統(tǒng)一處理單包多包、半包全包的全部場(chǎng)景。5. 工程化接入使用官方Java庫(kù)構(gòu)建數(shù)據(jù)交互鏈路5.1 用庫(kù)不等于不學(xué)協(xié)議自己手寫(xiě)解析器非常適合學(xué)習(xí)協(xié)議但工程效率方面如果目標(biāo)只是快速跑通業(yè)務(wù)我還是推薦用官方生態(tài)的Java庫(kù)。dronefleet的mavlink庫(kù)是業(yè)界相對(duì)活躍的Java MAVLink庫(kù)它通過(guò)代碼生成器從XML消息定義生成Java類(lèi)消息類(lèi)型全CRC_EXTRA也提前算好了省去自己維護(hù)一大堆常量。不過(guò)注意用庫(kù)之前最好還是把我前面講的那套幀結(jié)構(gòu)、校驗(yàn)機(jī)制理解清楚因?yàn)閹?kù)只能幫你解決編解碼問(wèn)題它不負(fù)責(zé)處理串口或網(wǎng)絡(luò)傳輸。數(shù)據(jù)從串口讀出來(lái)后該面對(duì)的半包、粘包問(wèn)題依然要自己面對(duì)。5.2 引入依賴(lài)并發(fā)送HEARTBEAT消息以Maven項(xiàng)目為例引入dronefleet mavlink庫(kù)dependency groupIdio.dronefleet.mavlink/groupId artifactIdmavlink-core/artifactId version1.1.0/version /dependency如果是ArduPilot再加一個(gè)dependency groupIdio.dronefleet.mavlink/groupId artifactIdmavlink-ardupilotmega/artifactId version1.1.0/version /dependency有了依賴(lài)后發(fā)送HEARTBEAT消息的代碼大致如下import io.dronefleet.mavlink.MavlinkConnection; import io.dronefleet.mavlink.MavlinkMessage; import io.dronefleet.mavlink.common.Heartbeat; import io.dronefleet.mavlink.common.MavAutopilot; import io.dronefleet.mavlink.common.MavState; import io.dronefleet.mavlink.common.MavType; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; public class MavlinkSender { private MavlinkConnection connection; public MavlinkSender() { ByteArrayOutputStream out new ByteArrayOutputStream(); ByteArrayInputStream in new ByteArrayInputStream(new byte[0]); connection MavlinkConnection.create(in, out); } public byte[] buildHeartbeat() { Heartbeat heartbeat Heartbeat.builder() .type(MavType.MAV_TYPE_FIXED_WING) .autopilot(MavAutopilot.MAV_AUTOPILOT_ARDUPILOTMEGA) .baseMode(0) .customMode(0) .systemStatus(MavState.MAV_STATE_STANDBY) .mavlinkVersion(3) .build(); MavlinkMessage? msg MavlinkMessage.create(1, 1, heartbeat); connection.send(msg, msg.getOriginSystemId(), msg.getOriginComponentId()); try { return out.toByteArray(); } finally { out.reset(); } } }這段代碼的關(guān)鍵邏輯在MavlinkConnection.send方法內(nèi)部它幫你處理了消息幀的組裝、CRC_EXTRA的寫(xiě)入、序列號(hào)的維護(hù)。getOriginSystemId和getOriginComponentId分別是消息對(duì)象攜帶的系統(tǒng)ID和組件ID需要根據(jù)你的設(shè)備編號(hào)設(shè)置。5.3 解析庫(kù)的常見(jiàn)處理方式用庫(kù)解析消息時(shí)流程一般是從串口或網(wǎng)絡(luò)讀取原始字節(jié)。調(diào)用MavlinkConnection的next()方法傳入原始字節(jié)流返回解析出的MavlinkMessage對(duì)象。對(duì)返回的消息對(duì)象做類(lèi)型匹配判斷是HEARTBEAT還是GLOBAL_POSITION_INT再?gòu)?qiáng)轉(zhuǎn)成具體類(lèi)型取字段。一個(gè)簡(jiǎn)單的解析循環(huán)如下import io.dronefleet.mavlink.MavlinkConnection; import io.dronefleet.mavlink.MavlinkMessage; import io.dronefleet.mavlink.common.GlobalPositionInt; import io.dronefleet.mavlink.common.Heartbeat; import java.io.ByteArrayInputStream; public class MavlinkReceiver { public void handle(byte[] data) { ByteArrayInputStream in new ByteArrayInputStream(data); MavlinkConnection connection MavlinkConnection.create(in, new ByteArrayOutputStream()); // 注意這里只處理單幀實(shí)際場(chǎng)景需要循環(huán)調(diào)用直到數(shù)據(jù)耗盡 MavlinkMessage? msg connection.next(); if (msg.getMessage() instanceof Heartbeat) { Heartbeat hb (Heartbeat) msg.getMessage(); System.out.println(收到心跳類(lèi)型: hb.type()); } else if (msg.getMessage() instanceof GlobalPositionInt) { GlobalPositionInt gpi (GlobalPositionInt) msg.getMessage(); System.out.println(緯度: gpi.lat() / 1.0E7); System.out.println(經(jīng)度: gpi.lon() / 1.0E7); System.out.println(高度: gpi.alt() / 1000.0); } } }這里的lat和lon是int類(lèi)型單位是1e7度alt單位是毫米換算成常用單位時(shí)記得除以對(duì)應(yīng)系數(shù)。用庫(kù)雖然方便但協(xié)議層面的單位換算還是得自己心里有數(shù)。5.4 串口、TCP、UDP傳輸層怎么選MAVLink本身是獨(dú)立的協(xié)議層底層傳輸可以用UART串口、TCP或UDP。串口場(chǎng)景飛控通過(guò)數(shù)傳模塊連到地面站或工控機(jī)數(shù)據(jù)以字節(jié)流方式到達(dá)通常用jserialcomm或串口框架讀取。串口沒(méi)有消息邊界必須靠狀態(tài)機(jī)處理。TCP場(chǎng)景常見(jiàn)于數(shù)傳模塊通過(guò)TCP轉(zhuǎn)發(fā)數(shù)據(jù)或者機(jī)載計(jì)算機(jī)和地面站之間走TCP長(zhǎng)連接。TCP自帶流控和重傳但依然存在粘包問(wèn)題處理方式和串口一樣。UDP場(chǎng)景常用于局域網(wǎng)內(nèi)的數(shù)據(jù)分發(fā)比如QGroundControl和多個(gè)地面終端之間的組播轉(zhuǎn)發(fā)。UDP雖然是數(shù)據(jù)報(bào)協(xié)議但MAVLink經(jīng)常把多條消息塞進(jìn)同一個(gè)UDP包所以依然需要按幀切分。無(wú)論底層的Transport是什么核心編解碼邏輯都可以復(fù)用同一套狀態(tài)機(jī)或同一套MavlinkConnection。我在工程里一般把傳輸層抽象成一個(gè)Transport接口只提供read和write兩個(gè)方法這樣切換串口和UDP就非常輕量。6. 實(shí)際調(diào)試中踩過(guò)的坑與定位方法6.1 坑一CRC_EXTRA值對(duì)不上消息被靜默丟棄有一次聯(lián)調(diào)對(duì)方用自研設(shè)備發(fā)HEARTBEAT我們用解析器接收解析器始終打印“CRC校驗(yàn)失敗”。查看抓包數(shù)據(jù)幀頭、負(fù)載、長(zhǎng)度都完全正確但CRC就是不對(duì)。反復(fù)核對(duì)后才發(fā)現(xiàn)對(duì)方在生成消息定義時(shí)把system_status字段從uint8_t改成了uint16_t。字段類(lèi)型變化導(dǎo)致負(fù)載長(zhǎng)度和CRC_EXTRA都變了幀頭里寫(xiě)的負(fù)載長(zhǎng)度是新長(zhǎng)度但CRC_EXTRA用的是舊值整個(gè)校驗(yàn)自然失敗。這個(gè)坑教會(huì)我一件事CRC_EXTRA不只是一個(gè)消息ID對(duì)應(yīng)的常量它本身就是消息定義的指紋。任何字段順序、類(lèi)型、長(zhǎng)度的變化都會(huì)改變它。所以聯(lián)調(diào)時(shí)如果CRC瘋狂失敗先不要懷疑算法實(shí)現(xiàn)先核對(duì)雙方的消息定義XML是否完全一致。這比一行行看代碼高效得多。6.2 坑二串口讀數(shù)時(shí)buffer不夠?qū)е聨財(cái)嘤么谧x數(shù)時(shí)如果讀取緩沖區(qū)設(shè)置得比較小可能出現(xiàn)一次讀到的數(shù)據(jù)只是一幀消息的一半另一半還留在串口緩沖區(qū)里。如果讀取代碼寫(xiě)得比較簡(jiǎn)單比如讀一次就嘗試解析那就會(huì)出現(xiàn)大量半包導(dǎo)致的解析失敗。我的處理方案是讀到的每一批數(shù)據(jù)都先追加到一個(gè)公共的緩沖隊(duì)列然后讓狀態(tài)機(jī)持續(xù)消費(fèi)緩沖隊(duì)列里的數(shù)據(jù)直到隊(duì)列為空。不要每讀到一批數(shù)據(jù)就做一次“起點(diǎn)尋找完整校驗(yàn)”那是錯(cuò)誤姿勢(shì)。6.3 坑三非小端序造成的臟數(shù)據(jù)Java在x86平臺(tái)上默認(rèn)是大端序執(zhí)行ByteBuffer.wrap(bytes).getInt()讀出的數(shù)據(jù)在MAVLink場(chǎng)景里往往會(huì)得到一個(gè)很大的數(shù)。很多新手在里踩了坑之后以為是自己解析錯(cuò)位了其實(shí)只是忘了設(shè)置ByteOrder.LITTLE_ENDIAN。在涉及float字段時(shí)這個(gè)坑更隱蔽。比如高度、速度、姿態(tài)角這些字段很多是float類(lèi)型如果字節(jié)序不對(duì)解析出來(lái)的數(shù)值看起來(lái)不是邏輯錯(cuò)誤而是一些非常奇怪的小數(shù)。遇到這種數(shù)值不要懷疑人生先檢查ByteOrder。6.4 坑四消息序列號(hào)與丟包統(tǒng)計(jì)MAVLink幀頭里的包序列號(hào)seq可以用來(lái)統(tǒng)計(jì)鏈路丟包率。我在做鏈路質(zhì)量檢測(cè)時(shí)會(huì)記錄每個(gè)系統(tǒng)ID組件ID組合的最近一次序列號(hào)如果下一次收到的序列號(hào)與期望值不連續(xù)就說(shuō)明中間有丟幀。這個(gè)功能看著簡(jiǎn)單但沒(méi)有序列號(hào)意識(shí)的人往往忽略它而它在實(shí)飛調(diào)試中非常有用能快速判斷是數(shù)傳鏈路問(wèn)題還是解析程序問(wèn)題。6.5 坑五坐標(biāo)系與單位換算MAVLink里的經(jīng)緯度使用的是整數(shù)類(lèi)型單位是1e7度也就是說(shuō)lat373774819代表緯度37.3774819度。高度字段可能是毫米空速可能是厘米每秒地速可能是厘米每秒角速度可能是厘度每秒。不同消息的字段單位差異巨大尤其是從飛控切換到PX4再到ArduPilot時(shí)某些擴(kuò)展消息的單位還會(huì)變化。我在做數(shù)據(jù)展示時(shí)會(huì)把單位換算集中到一個(gè)轉(zhuǎn)換層不散落到各個(gè)業(yè)務(wù)方法里這樣即使后續(xù)協(xié)議單位發(fā)生變化只需要改轉(zhuǎn)換層一處。7. 用仿真環(huán)境驗(yàn)證整條鏈路7.1 搭建一個(gè)本地MAVLink驗(yàn)證環(huán)境代碼寫(xiě)完了怎么驗(yàn)證封包和解析是否正確我的習(xí)慣是先用MAVProxy或者QGroundControl連接一個(gè)SITL仿真飛控這樣不炸機(jī)也能把整個(gè)鏈路跑通。SITL是ArduPilot的軟件在環(huán)仿真可以在PC上虛擬出一臺(tái)完整飛控。啟動(dòng)后SITL會(huì)在本地UDP端口14550上輸出MAVLinkQGroundControl默認(rèn)也能連這個(gè)端口。如果你只想驗(yàn)證自己寫(xiě)的Java解析器可以讓Java程序監(jiān)聽(tīng)UDP 14550端口把收到的UDP數(shù)據(jù)包交給狀態(tài)機(jī)解析打印出HEARTBEAT和GLOBAL_POSITION_INT信息。如果程序能持續(xù)打印出正常的經(jīng)緯度和高度說(shuō)明解析鏈路是通的。7.2 發(fā)送航點(diǎn)消息給仿真飛控的驗(yàn)證步驟如果你想驗(yàn)證封包能力比如發(fā)送MissionItem消息給飛控也可以直接用SITL來(lái)驗(yàn)證。流程是啟動(dòng)SITL仿真。用你的Java程序向SITL的UDP端口發(fā)送MISSION_COUNT、MISSION_ITEM最后發(fā)送MISSION_START等消息。在QGroundControl地面站上觀(guān)察航點(diǎn)是否被接收并可以執(zhí)行。要注意的是ArduPilot對(duì)航點(diǎn)消息有一套握手流程不是直接發(fā)一個(gè)MISSION_ITEM就能完成的。你需要按順序處理MISSION_REQUEST_LIST等往返消息否則飛控不會(huì)接受航點(diǎn)。很多人第一次做航點(diǎn)上傳時(shí)在這里卡了很久建議直接看官方MAVLink的Mission Protocol狀態(tài)機(jī)圖搞清楚每個(gè)狀態(tài)該發(fā)什么消息。7.3 自定義消息擴(kuò)展的思路如果你有特殊的數(shù)據(jù)需要走M(jìn)AVLink比如機(jī)載AI識(shí)別結(jié)果、私有傳感器數(shù)據(jù)正規(guī)做法是自定義MAVLink消息擴(kuò)展。思路是在common.xml或ardupilotmega.xml中新增消息定義分配一個(gè)未使用的消息ID。運(yùn)行代碼生成器重新生成Java類(lèi)。用新的Java類(lèi)編解碼自定義消息。整個(gè)過(guò)程不算簡(jiǎn)單但可行性很高。ArduPilot固件側(cè)也可以注冊(cè)對(duì)應(yīng)的自定義消息處理邏輯。如果你不想改飛控固件還可以使用MAVLink的MAV_CMD、NAMED_VALUE_FLOAT、DEBUG_VECT等通用消息來(lái)傳輸自定義數(shù)據(jù)這些消息在常見(jiàn)飛控固件里都有支持不需要改動(dòng)固件。8. 調(diào)試工具與效率提升建議8.1 抓包工具比打印日志好用得多解析MAVLink時(shí)遇到詭異問(wèn)題我強(qiáng)烈建議先用抓包工具看原始二進(jìn)制而不是在代碼里瘋狂打印日志??梢栽陔娔X上用Wireshark抓UDP或串口數(shù)據(jù)包再用4243端口或串口監(jiān)控工具把二進(jìn)制流導(dǎo)出成hex文件。hex文件一看起始標(biāo)志、幀長(zhǎng)度、消息ID是否連續(xù)、CRC是否規(guī)律性失敗基本一目了然。Java程序里也可以加一個(gè)可開(kāi)關(guān)的hex dump工具類(lèi)在高頻調(diào)試階段打開(kāi)把每個(gè)UDP包或串口讀取到的數(shù)據(jù)以hex格式輸出。聯(lián)調(diào)時(shí)讓對(duì)方也打開(kāi)同樣的hex dump兩邊一對(duì)比是發(fā)送端的問(wèn)題還是接收端的問(wèn)題立刻清楚。8.2 消息日志要帶序列號(hào)和時(shí)間戳日志不能只打“收到HEARTBEAT”這種信息最好把幀頭的seq、系統(tǒng)ID、組件ID、CRC校驗(yàn)結(jié)果一起打出來(lái)。seq和時(shí)間戳能幫你定位丟幀規(guī)律系統(tǒng)ID和組件ID能幫你區(qū)分多設(shè)備混連時(shí)的消息來(lái)源。這些信息在后續(xù)排查多機(jī)干擾、鏈路偶發(fā)斷連時(shí)都是關(guān)鍵線(xiàn)索。8.3 建立消息ID對(duì)照表如果你接觸的MAVLink消息比較多建議在項(xiàng)目里維護(hù)一個(gè)消息ID和消息名稱(chēng)的對(duì)照表這樣抓包看到msgId33就能立刻反應(yīng)過(guò)來(lái)是GLOBAL_POSITION_INT而不是每次都要臨時(shí)查XML定義。這個(gè)表也可以用于日志過(guò)濾比如只查看姿態(tài)消息或只查看心跳消息。9. 從單機(jī)到多機(jī)數(shù)據(jù)交互設(shè)計(jì)的一些體會(huì)實(shí)際做多機(jī)場(chǎng)景時(shí)MAVLink的編解碼本身不是最復(fù)雜的部分復(fù)雜的是如何從流式數(shù)據(jù)中區(qū)分不同飛行器的消息。前面說(shuō)過(guò)每架飛機(jī)的系統(tǒng)ID不同所以在解析出消息后第一件事就是根據(jù)源系統(tǒng)ID做路由。我的做法是維護(hù)一個(gè)MapInteger, DeviceSessionkey是系統(tǒng)IDvalue是當(dāng)前在線(xiàn)設(shè)備的狀態(tài)快照。每次解析出一條消息就更新對(duì)應(yīng)設(shè)備的狀態(tài)快照同時(shí)記錄最后活躍時(shí)間。這樣一個(gè)極簡(jiǎn)的設(shè)備管理服務(wù)就能支撐上百臺(tái)無(wú)人機(jī)的狀態(tài)監(jiān)控。心跳超時(shí)檢測(cè)也建議做一下。MAVLink的HEARTBEAT默認(rèn)1Hz發(fā)送如果連續(xù)3到5秒沒(méi)有收到某個(gè)系統(tǒng)ID的心跳基本可以判定該設(shè)備鏈路中斷。我在服務(wù)里用定時(shí)任務(wù)掃描設(shè)備會(huì)話(huà)的最后活躍時(shí)間超過(guò)閾值就標(biāo)記離線(xiàn)并推送告警。另外多機(jī)同時(shí)操作時(shí)指令消息必須攜帶正確的目標(biāo)系統(tǒng)ID和目標(biāo)組件ID。MAVLink的大多數(shù)指令消息都有target_system和target_component字段如果填錯(cuò)飛控可能會(huì)忽略指令。真實(shí)項(xiàng)目中因?yàn)閠arget_system填錯(cuò)導(dǎo)致指令發(fā)給另一臺(tái)飛機(jī)的教訓(xùn)太多了所以發(fā)送前一定要確認(rèn)目標(biāo)編號(hào)。從協(xié)議解析到封包發(fā)送從單機(jī)調(diào)試到多機(jī)管理MAVLink這套體系本身并不復(fù)雜但它藏了很多細(xì)節(jié)任何一個(gè)環(huán)節(jié)出問(wèn)題整條數(shù)據(jù)鏈路都會(huì)變得不可用。希望我上面這些代碼和踩坑經(jīng)驗(yàn)?zāi)軒湍闵僮咭恍澛?。如果你正在做相關(guān)的Java項(xiàng)目遇到具體的協(xié)議細(xì)節(jié)問(wèn)題也歡迎交流。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
五月综合视频| 超碰在线免费9| 综合图片色色| 狠狠色情婷婷| 99热热热国产超碰| 五月婷婷啪啪啪啪| 久久大香蕉同僚| 五月丁香视频在线观看| 狠狠丁香| 婷婷丁香成人五月天| 九月色婷婷| 五月丁香大相交| www.日韩国产| 色色亚洲五月天| 婷婷九月激情| 人妻中文字幕精品| 日韩欧美不卡| 亚洲精品V天堂中文字幕| 激情五月婷婷丁香综合网| 97在线/亚洲| 激情内射人妻1区2区3区| 色婷婷免费视频| 久久久久久综合五月婷婷| 激情图片婷婷| 男人的天堂97| 大香蕉懂9| 色色五月天激情| 狠狠综合网| 亭亭五月激情亚洲在线| 婷婷成人综合五月| 五月青青草综合| 久久综合激情| 久色网| 丁香8月手机综合| 99免费| 人妻久久久久久| 天天天摸夜夜夜玩| 亚洲欧美另类在线23p| 狠狠色丁香久久久婷| 五月综合丁| 超碰人妻公开在线| 日本波多野结衣视频| 九九这里是免费的视频5| 国产午夜精品一区二区三区四区| 亚洲情综合五月天| 亚洲精品又粗又大又爽A片| 91久久久久久久久| XX色综合| 亚洲成av人影院| 婷婷伊人| 狠狠干综合| 久久99精品九九久久久婷婷| 涩涩涩五月天| 丁香五月综合| 秋霞AV吧| 婷婷丁香综合色AV| 成人毛片在线免费观看| 全高清无码视頻| 六月丁香停| 亚洲激情| 成人日韩欧美| 五月婷婷性爱| 精品久久穴| 99精品偷自拍| 97狠狠碰| 色婷婷综合网| 米奇影视资源777狠狠色婷婷五月天激情网 | 97操视频| 色婷婷国色天香综合| 蜜臀A∨在线水帘洞| 天天看A片| 久久伊人大香蕉| 国产超碰在线| 蜜桃五月天色| 激情亚洲色图片丁香综合| 亚洲激情丁香五月天色| 婷婷五月天黄色小说| 这里只有精品9| 婷婷涩五月天综合| 九月婷婷色色| 免费观看18视频网站| 五月天激情国产综合婷婷婷| 中文字幕91,综合| 久9久9久9久9久9久9| 97精品在线| 色五月天丁香| 五月丁香激情六月| 第四色激情网| 91九九热| 秋霞三级影视资源| 五月丁香六月婷婷色情| 能看的AV| 性天堂久久| 国产成人+综合亚洲+天堂| 色九月婷婷| ai97re99一本| 亚州性爱99| 婷婷刺激综合| 婷婷综合在线| 五月婷精品| 激情婷婷久久| 91精品视频男人的天堂| 大香蕉婷婷久久| 久操大香蕉| 精品在线| 99热这里只有精品99| 中文字幕在线观看视频www| 久久久久婷婷| 激情综合色婷婷啪啪六月天| 思思综合热| 日韩无码色色| 国产精品久久久久久久久久久久| 丁香五月婷婷欧美激情-中文天堂最新版在线观看 | 婷婷爱五月天| 另类在线免费视频| 97av在线视频| 九九99九九精品视频| 中文字幕人妻AV| av在线观看免费| 激情五月无码| 激情五月婷婷综合| 啪啪东京热| 永久无码色| 色婷五月天亚洲| 开心婷婷五月天激情网| 内射人妻视频国内| 五月噜噜噜色综合| 激情五月天啪啪| 婷婷五月色惰| 九九免费精品在线视频| 性一交一乱一交A片久| 五月丁香色婷婷| 福利视频在线播放| 亚洲综合无码| 青青草五月天| 99热午夜精品| 日本天天综合| 激情五月天婷婷| 91九色熟女| 丁香五月 六月婷婷首页| 可以看的AV| 日韩精品无码AV| 五月激激网w'w'w| 色情丁香五月婷婷精品| 99在线精品视频| 天天摸色吧天天摸色吧| 久久久人人操A V| 久久草婷婷丁香网站| 婷婷亚洲天堂| 午夜婷婷丁香| 色五月激情| 久久99久久久| 99超级碰碰| 日韩成人电泉AV| 激情综合五月.....| 色九网| 96精品国产综合久久久久久| 99视频这里只有精品10| 2013AV天堂| 开心色播色五月婷婷| 亚洲综合激情五月久久| 久久婷婷五月国产色综合激情| 久热黄色| 婷婷五月天最新综合你懂的| 少妇综合网| 婷婷导航| 久99999热视频在线观看免费| 六月丁香激情综合网| 国产在线中文字幕| 丁香五月骚喷水视频| 九九成人| 天天操电影院色狼性av| 91综合视频在线| www.henhengan| 操日本色| 色综合久| 激情网婷婷婷| www热久久yy9| 亚洲天堂爱爱| 欧美美女国产日韩一区二区久| 婷婷另类小说| 丁香 婷婷 亚洲 熟女| 亚洲情欲久久| 五月天堂色| 天天摸天天舔在线视频| 99热99精品在线观看| 99热在线观看亚洲区| 婷婷激情五月天桃花网| 激情婷婷丁香五月天| 久久中文人妻系列| 久久久久人妻精品| 色很很96| 国产精品第一国产精品| 婷婷色基地| 综合超碰熟| 精品色色| 亚洲婷婷五月天在线激情综合网| 丁香婷婷五月| 婷婷久久婷婷色五月| 无码色| 丁香婷婷五月天亚洲| 狠狠狠狠狠干| 99热综合在线观看| 第五婷婷伊人丁香| 久色网| 五月丁香色色综合| 中文字幕丰满乱孑伦无码专区| 天天做天天摸| 伊人久久婷婷| 超级碰碰97在线| 精品在线| 狠狠色狠狠色综合日日91| 精品色色| 加勒比色色| 婷婷黄色网| 日日夜夜狠狠| 色综合色综合色综合高潮| 婷婷播播五月天| 91国产精品视频播放| 丁香桃色网| 亚州操操| 婷婷丁香熟女| 天堂A∨在线| 日韩狠狠色婷婷| ztEJj| av在线免费网站 | 九九99一区| 激情 婷婷| 99热网站| 狠狠xx| 婷婷无码视频| 91日婷婷在线| 欧美99| 热99只有里视频| 五月婷婷偷拍| 91狼友视频在线观看| www.五月天婷婷| 丁香激情五月综合网| 色香蕉精品五夜婷| 欧美内射AA| 思思w99| 五月天激情网址| 五月丁香成人网| a久久| 五月丁香花婷婷玉莉AV| 亚洲精品一区中文字幕乱码| 97婷婷在线视频| 色情五月丁香婷婷网| av在线超清中文| 色色激情网| 影音先锋男士资源网一区| 久久久久久99精品无码| www.99视频| 5月丁香六月婷婷| 久久99网址| 日本熟妇乱妇熟色A片蜜桃 | 日本在线视频www色| 亚洲欧洲中文日韩久久AV乱码 | 久久性爱视频| 丁香五月婷婷激情中文| 色五月av伊人| 五月丁香色婷婷伊人| 中文字幕五月久久婷婷| 丰满少妇猛烈A片免费看观看| 激情五月天电影| 丁香五月综合婷婷| 97碰碰在线观看视频| 夜夜嗨一区二区三区直播内容| 激情综合激情综合| 26uuu欧美日本| 桃色激情婷婷伊人网| 操久久网| 久久婷婷91| 激情五月天无人视频在线| 婷婷激情丁香五月婷婷激情丁香五月婷婷| AV在线免费播放| 大香蕉天堂色| 淫视馆av三区| 亚洲成av人影院| 97色碰| 97热这里只有精品| 天天干天天干天天操| 亚洲AAAA网| www.五月天婷婷.com| 欧美色97| 色色色婷婷五月天| 成人在线视频网| …亚洲黄色在线播放日韩、av中文a…| 婷婷五月花.97| 婷婷九月色| 色色色成人网| 日本婷婷| 色婷婷久久| 激情五月天小说网| 丁香五月影院| 国产肥白大熟妇BBBB视频| www色婷婷| 久久久久er热| 99色色网| 婷婷的五月天另类视频| 久久综合综合综合| 色色九九五月天| 亚洲综合色网| 婷婷五月天免费视频在线观看| 99er这里只有精品| mmm1717.6dbm人人爱人人操| 亚洲成人电影aaaa| 久久这里只有国产视频| 夜夜操激情| 婷婷五月天久久| 五月激情婷婷在线| www九月婷婷| 婷婷97碰碰| 九九热只有这里是精品| 超碰资源在线| 伊人九九68| 我去色色网五雨天| 青青草视频免费观看| 狠狠综合久久综合| 天天天天天色| 婷婷五月色| 激情综合视频| 天天激情视频| 国产成人网| 丰滿爆乳一区二区三区| 婷婷五月天堂| 天天爽天天摸天天爱| 日韩色色视频| 激情四射网| 六月色狠狠色| 成人在线视频网| 婷婷丁香五月天熟女丝袜| 久久婷婷五月综合97色一本| 婷婷五月天综合蜜桃| 青草五月天| 成人无码精品1区2区3区免费看| 99热丁香五月| 婷婷五月另类网站| 99五月香婷婷丁香在线视频| 五月婷婷狠天天色综合| 日日噜噜夜夜狠狠久久丁香六月| 偷偷操九九| 亚洲av无码精品色午夜| 婷婷六月激情在线视频| 无码一区精品一区视频| 亚洲精品视频在线播放| 丁香久久久| 成人精品在线观看| 四月婷婷五月丁香| 99这里| 婷婷五月天在婷| 91精品综合久久久久久五月丁香| 婷婷色在线视频| er99免费视频在线| 色婷婷视频| 少妇被躁爽到高潮无码文| 超91热| jiujiu无码五区| 九九伊人网| www.色色五月天.com| 九九免费视频| www亚洲无码| 天天干com| 人人爱干人人爱草| AAAA网站| 视频久久9| 日操夜撸| 岛国操B不卡在线| 久久久性爱视频| 拍色综合| 丁香激情五月天| 色五月婷婷激情基地| 亚洲成人人人操| 精品夜夜澡人妻无码AV| 五月综合激情综合久| 日本精品人妻无码77777| 亚洲色色爱| 高清一区二区三区日本久| 婷丁五月| 亚洲日韩操B| 最新热中文字幕| 99色视频| 极品五月天| 丁香五月瑟瑟| 夜夜躁婷婷AV| 激情 五月 婷婷 丁香| 99亚洲精品| 五月丁香婷婷综合网| 丁香五月婷婷六月| 色狠狠六月| 免费视频1区| 九九热99热| 在线资源av-超碰中文在线-成人AV| 久久色9| 五月色丁香| 深爱激情丁香| 99福利视频| 碰97 久| 五月婷婷六月丁香色| 亚洲无码黄色| 欧美在线视频99| 狠狠干青青草| 九月激情综合| 久久综合久色欧美综合狠狠| 66色在线日韩| anquye伊人| 骚逼视频一区2区| www.久热| 狠狠操天天操综合| 欧美日韩国产伦精品日韩人妻一| 香蕉综合网| 国产精品热搜丁香五月婷婷| 久久永久网址| 99超碰在线免费| 97色碰| 亚洲精品久久久久久久久久吃药| 影视av久久久噜噜噜噜噜三级| 超碰在线91| 亚洲天码视频www蛋播视频| 96精品久久久久久久久| 丁香婷婷天堂| 久久婷婷色| 性爱视频99| 九九综合久久丁香婷婷,开心激情综合网| 99在线视频观看| 五月天婷婷免费| 九九操综合网| 丁香蜜臀黄色婷婷五月天| 久在线综合69| 日日干夜夜干| 婷婷激情四射| 五月天婷婷久久| 99福利视频导航| 操逼123网| 激情五月,深深爱五月| 舔色婷婷| 国自产拍偷拍精品啪啪一区二区| 激情五月天在线视频| 欧美三级A做爰在线观看| 开心五月婷婷| 狠狠狠狠狠狠草| 图片区 小说区 区 亚洲五月 | 色色色色av777| 久9免费视频| 超碰在线网站9| 99性视频| 色五月婷婷中文字幕| 五月天开心激情综合网| 人人看人人草人人摸| 色色婷| 国产三级在线播放| 亚洲九九99精品视频在线播放| 天天爽夜爽| 米奇影视资源婷婷狠狠色激情欧美五月丁香 | 这里只有精品视频视频在线观看| 激情爱爱网站| 国产探花一片区| 四色99久久| 色婷婷88| 日本系列_4页_777FP| 色在线视频网2025| 激情小说婷婷五月| 亚洲激情婷婷| 99re久热只有精品6在线直播.com| www.婷婷五月.com| 色婷婷五月丁香色| 九九成年视频| 98色丁香五月婷婷综合网| 久久香蕉影院| ..真实国产乱子伦对白在线_欧| 狠狠色综合网站久久久久| 超碰99久久| 婷婷五月综合色小姐小说| 国产亚洲精品久久久久久久久动漫 | 五月天激情AV| 永久精品| 97夫妻超碰| 99热在线网站| 婷婷激情小说| 五月婷成人网| 综合激情综合啪啪| 五月丁香婷庭在线| 五月草影视| 丁香久久久| 人妻久久久久久久久久久| 成人网丁香五月| 日韩AAA| 草美女在线观看视频在线播放| 99热精在线九九久久保| 那里有AV网址| 激情的五月婷婷蜜桃| 天天草婷婷五月| 玖月婷婷爱丁香| peg 2区三区四区的| 啪啪啪大香蕉| 丁香六月婷婷高清| 九九精品在线观看视频6| 色婷婷在线综合色播网| 人妻性爱| 狠狠狠激情网| 婷婷综合在线观看视频| 亚洲综合干| 国产26uuu视频| 丁香久色| 丁香五月天激情综合| 久久久99久久| 欧美日本免费一道免费视频| 亚洲免费视频网站| 五月大香蕉| 天天爱天天做天天爽| 久久久久人妻精选| 大香蕉综合在线| 日本啪啪网| 丁香五月性| 激情开心五月天| 色婷婷色综合久久精品V| 九九超碰人人| 天天网站天天爽| av五月天婷婷丁香| 欧美色色色色色| 色综合久久44| 五月婷婷性爱网| 91色婷婷综合久久中文字幕二区| 亚洲综合婷婷| 久久久18| 六月丁香开心婷婷欧美| 久色视频首页| 色热久| 97色五月婷婷在线| 久热91| 在线可以看的av网址| 婷婷五月天堂| 香蕉人在线香蕉人在线 | 熟女激情五月天 | 丁香婷婷十月| 色五月婷婷内射| 激情宗合网激情五月天| 欧美日韩成人在线网站| 精品视频这里只有精品| 激情综合婷婷久久| 97丁香五月| 夜夜夜夜夜操| 久久五月视频| 可以看的av| 久久一级AV| www.精品99| 久久精品亚洲一级牲爱综合 | 操操熟女| 五月丁香日本在线视频观看| 色色色色色色色色色色色色色97| 操操综合网婷婷| 入口五月婷婷六月香| 色五月av| 碰碰碰97免费精彩视频| 99热只有精品在线观看| 精品夜夜澡人妻无码AV| 丁香五月天AV在线| 日本色色色| 牛牛热这里只有jingpin| 性一交一乱一交A片久久四色| WWW.婷婷| 99视频日韩| 五月社区婷婷激情| 亚洲国产精品VA在线看黑人| 99在线观看免费精品视频| 丁香激情五月| 碰99在线| 天天爽日日爽夜夜爽| 日本人妻伦在线中文字幕| 快乐激情五月色婷婷| 超碰免费大香蕉| 日韩在线成人电影| 久色视频| 亚洲av电影在线| 丁香色播五月天| 国产精品第一国产精品| 五月婷高清视频| 五月婷婷综合网| 激情人妻综合| 天天干天天日天天操| 亚洲精品444久久久久久| 99性爱精品| 久久婷婷五月综合色丁香花| 久久久久久97| 99热这里都是精品| 婷婷久久婷婷色五月| 黄页大全十八禁| 精品欧美性爱超级爽| 99色色爰| 98国产精品综合一区二区三区| 色婷婷成人影片| 性生生活大片又黄又| 热99re| 丁香五月婷婷社区| 久久a热| 五月天伊人久久久久| 激情五月丁香六月综合AVXXXX| 亚洲国产另类av| 国产欧美va| 4438全国最大视频成人网站在线观看| 丁香婷婷影院| 久久曰曰| 2025神马午夜福利| 人人爱摸视频| 婷婷综合视频| 激情五月天婷婷五月天| 婷婷激情五月综合丁| 婷婷丁香婷婷97| 久久性爱视频网站| 丁香5月激情网| 搡BBBB搡BBB搡五十| 五月婷婷之美女图片| 偷拍丁香九月激情| WWW免费视频碰碰碰碰| 丁香六月狠狠干| 丁香六月婷婷综合啪啪| 91啪啪视频| 成人.在线日韩| 色五月婷婷小说亚洲中文字幕组| 人妻狠狠操| 一级视频网址| 99热这里只有精品66| 欧美综合激情五月| 97操操操| 五月丁香久久激情综合| 日韩AV大全| 婷婷五月中文字幕国产| 91九色无码内射| 丁香五月色| 蜜乳中文字| 色爱99| 亚洲V国产V欧美V久久久久久| 婷婷色情六月| 色黑鬼导航| 91丨九色丨国产在线| 久久综合五月天| 五月婷婷真爱激情网| 操一区| 亚洲韩国日产综合AV| 天天色天天操天天射| 婷婷五月色情天| 激情五月天啪啪视频| 五月婷中文娱乐综合| 夜夜爽天天爽| 亚洲啪啪啪啪| 狠狠色噜噜狠狠狠狠综合| 99热这里只有精品亚洲| 伊人大综合| 中文字幕 中文字幕明步| 激情播丁香| 日韩二区搞逼插逼毛片| 91啪啪视频| 五月丁香好婷婷A片网| 岛国av电影网站| 九玖视频这里只有精品| 色播激情婷婷| 99丁香五月| 色婷婷影院| 成人短视频在线观看| 思思热99热| 欧美日本一区二区三区| 综合xx网| 超碰在线免费| 久久精品婷婷五月丁香| 丁香花婷婷五月天| 久久小说| 9|无码久久久久久| WWW.99视频| 五月激情久久| 夜夜干 夜夜操| 六月婷婷天天操夜夜爽视频| 9久精品视频| 五月天激情网址| 色欧美日| 中文字幕黄色电影网址| WWW.婷婷| 五月婷色色| 26UUU精品一区二区Com| 婷婷五月天丁香花| 俺也去婷婷五月天第五色| 婷婷五月天首页激情| 亚洲精品另类| 色综合久久综合| 99ri视频在线观看| 国产肏屄大片| 综合久久综合久久| 大香蕉婷婷| 五月丁香久久| 成人小说 五月天 婷婷| 婷婷六月激情丁香| 亚洲精品无码A片一区二区| 亚洲无码猫咪| 丁香六月天婷婷色| 婷婷丁香红五月91C| 激情五月丁香五月色| 日韩av手机在线观看| 亚洲久久激情| 九九在线精点品| 天天射影| 久婷久婷| 免费啪啪啪网站| 九九综合网色全集| 婷婷涩五月| 991精品在线视频| 金品在线视频99| 丁香五月天婷婷91| 成人在线高清| 久久婷婷夜| 天天操无码| 五月天婷婷香蕉狠狠超碰综合| 色色九区| 丁香婷婷老司机久操| 影音先锋偷偷色男人站| 六月婷基地| 色综合香蕉| 婷婷精品| 五月天天综合| 91人人操人人| 婷婷五月丁香基| 五月激情婷婷在线| 91狠狠色丁香婷婷综合久久| 99久久网站| 国产午夜精品一区二区三区四区| www.五月婷| 成人在线日韩| 狠狠色噜噜色狠狠狠综合久久成人波| 99热大香蕉| 色狠狠色噜噜AV天堂五区| 久久精品无码一区| 国产精品99久久久久久猫咪| 色噜噜狠狠色综| 中出内射的人妻视频| 狠狠色噜噜狠狠| 性按摩玩人妻HD中文字幕| 99五月香婷婷丁香在线视频| aaa久久| 欧日韩成人| 无码一区二区日韩| 香蕉97碰碰碰超视精品| 能看的av| 伊人五月天久久| 热久久77777| 99日韩网站| 久草xx性爱视频| 99a级片| 欧美婷婷| 日日夜夜亚洲一区| 婷婷啪啪| 高清无码网址| 蜜臀综合久草| 91精品无码久久久久久五月天| 啪啪干伊人婷婷| 无码人妻电影| 996热re视频在线观看视频| 一区二区中文字幕| 最新丁香六月婷婷| 双性美人被调教到喷水A片| 色播婷婷五月天| 99热这里只有精彩| 婷婷激情五月| www.色综合| 婷婷日欧美在线观看| 久久久婷丁香五月| 中文精品在| 99久热这里只有精品| 无码视频国内精品久久久| 天天五月丁香五月| www天天色天天射| 激情小说色五月| 美妞av| 五月婷婷第四色| 九九99九九精品免费 | 91久久精品视频| 天天碰天天插天天操| 婷婷在线精品| 五月色情婷婷| 婷婷色色五月天| 黄网免费观看| 人人人操| 久久99久久99精品免观看粉嫩| 五月天天天色| 亚洲中文AV网站| 色婷婷久久| 婷婷五月AV| 97碰碰叉| 天天夜夜爽| 日本天堂网站99| 日韩操| av五月天婷婷丁香| 天天干com| 天堂在线观看视频| 婷婷五月天首页| www.99riav99| 开心激情网在线| 久久全色| 天天综合五月| www九九热| 99热这里只有精品青草| 综合激情开心五月| 久久精品一区二区三区四区| 99秘 在线| 五月丁香色色网| 婷婷精品免费久久| 成人va在线播放| 欧美色骚婷婷五月天| 被强行糟蹋的女人A片| 五月丁香婷婷人体| 久久久色情| 中文字幕丰满人妻无码专区| 色婷婷激情五月天| 五月天玖玖狠狠色色| AV亚洲在线| 人人视频人人干人人做| 淫视馆AV在线| 五月天丁香网| 日本成人小说婷婷六月| 激情五月天婷婷丁香| www.99热在线| 五月欧美色播| 99热传媒| 九九色欲网| 天天免费成年人视频| 99热在线播放| 一级操逼内射在线视频| 欧美性久| 91爱啪啪| 99热这里只有精品96| 丁香五月熟女| 狠狠香蕉| 狠狠狠狠狠草| 99riAv1国产在线观看| 色婷婷综合网| 激情丁香五月婷| 精品国婬伦V无码久久久| 五月天淫乱视频| 琪琪理论片| 激情婷婷视频在线| 五月婷在线观看| 亚洲看av的网站| 成人在线综合| 国产伦亲子伦亲子视频观看| 996日日爱| av大香蕉| 强壮公让我夜夜高潮A片视频| 一起草性爱不卡视频| 久热只有这里有精品| 在线sebiav精品视频| 欧美婷婷| 色五月天综合网| 日韩色色小视频| 亚洲电影在线观看| 免费观看的婷婷五月视频在线| 无码九九| 色www.con| 屁股翘好撅高迎合跪趴| 成人电影在线免费试看| 欧美激情2025| 五月天激情综合在线| 狠狠色九月| 乱岳熟女50岁| 婷婷激情五月| 日欧大屏操| 五月丁香六月婷婷免费视频| 日本精品99| 99热日本精品| 亚洲在线免费成人| 天天色粽合合合合合合合| 色五月激情网| 青草激情在线| 97婷婷丁香五月天激情图片| 影音先锋四区| 久久91久久精品久久| 色综合伊人网| 婷婷五月激情图片| 色色A| 五月丁香婷婷激情澎湃四射| 五月人人丁香婷婷五月人人丁香| 色五月成人| 六月丁香停| a片在线免费观看一区| 久久您您综合网| 天天做天天爱天天爽夜夜揉| 激情综合另类| 伊人九热| 国产性av| 538在线精品| 久久伊人大香蕉| 91chinese在线| 激情五月婷| 另类激情五月在线视频欧美| 六月综合在线| 久色欧美| 五月深爱激情网| 五月婷婷中字在线| 99资源在线视频| www91久久| 欧美久久久久久久久中文字幕| 超碰色热| 婷婷综合国产| 大香蕉福利导航| 色五月激情图片| 禁欲电影完整版在线播放| 色色色热热热| 色五月婷婷在线| 亚洲AV网址| 99免费热视频在线| 伊人网碰碰| 第五色婷婷| 亚洲激情五月天| 少妇人妻凹凸视频| 六月婷婷五月丁香首页| 99在线观看视频蜜臀| 婷婷久久国产视频| 精品九九视频| 天天爽天天摸| 五月天婷婷久久视频| 九九热精品| 影音先锋噜一噜| 五月婷婷,六月丁香| 开心五月婷婷| 99久久人妻精品无码二区| 九月丁香八月婷婷加勒比| 以及AA大片看看| 9久操| 97人人搞| 激情小说五月丁香在线视频观看视频| 久久婷婷激情五月天一区二区| 天天操天天爱天天日| 色情综合| 91啪级电影| 欧美激情丁香五月天久久婷婷一区| 六月色狠狠色| 婷婷丁香六月综合激情站| 九热免费视频| 中文字幕婷婷五月天| 五月婷在线色视频| 婷婷色五月婷| 婷婷五月色| chaopengdaxiangjiao| 99人人干人人操| 亚洲精品视频在线播放| 天天做天天爰天天爽天天无遮挡| 99久久久国产精品免费蜜乳tv| 狠狠狠色激情综合适合| 99精品在线观看| 97日韩无套内| 久久艹99| 色月视频| 丁香月五月天婷婷久久| 婷婷五月天日日日干干干| 1995年关宝慧版蜘蛛女| 五月婷婷丁香| 欧美大片| 99热线观看9| 激情综合网五月天天| 终合激情网| 天天操比比| 无码AV大香线蕉伊人| 狠狠操综合| 久久久久久五月天| 99色在线| 黄页免费一级视频懂色| 99热99成人| 成人丁香婷婷| 综合网色| www.婷婷,com| 秋霞影音91人妻久久| 五月天婷婷久久| 久9久成人精品视频| 午夜精品久久久久久久爽| 综合色影| 五月天社区狠狠| 日日撸夜夜操| 亚洲无码黄色| 青青草婷婷综合五月| 97中文在线| 一区无码| 色五月婷婷、老熟女| 91成人视频| 日本操B视频| 99操| 国产avapp 网| 强壮的公次次弄得我高潮A片日本 | 欧美日韩成人在线免费| 天天综合久久| 九九99九九99| 色五月色情| 丁香六月成人网| 五月婷婷丁香| 激情久久综合| 另类激情首页| 99色综合久久| 激情五月综亚网| 色色色综合色| 99在线热| 五月婷婷二月丁香| 中字幕视频在线永久在线观看免费| 国产操碰| 九九99热久久精品66中文字幕| 先锋影音男人的天堂AV| 午夜 外网 精品 在线| 六月丁香啪啪啪| 中文字幕高清av| 美国天天日天天操| 少妇性按摩无码中文A片| 丁香五月天在线观看视频| 亚洲碰碰碰| 九九久久精品| 丁香激情五月| 97人人干| 久久色五月| 欧亚洲在线高清视频| 强伦轩人妻一区二区电影| 婷婷六月综合基地| 97人人干人人操| 五月婷婷内射网| 天天做夜夜爽| 婷婷香蕉视频| 99视频| 狠狠色狠狠色综合日日91| 日韩成人网址| 婷婷九月亚洲| 99九九99九九九视频精彩| 99综合| 久久六月综合| 97资源欧美日韩大香蕉超碰一区| 99热这里是精品| 天天综合色| 情婷婷五月天在线| 久久九色| 色亚洲视频| 欧美性猛交99久久久久99按摩| 九九色中文| 五月天激情综合网| 97干在线| 激情中文在线| 天天肏视频| 99综合视频| 日本色婷婷综合| 九久久婷婷| www.99热视频| 婷婷射图| 精品人妻久久久久久| 永久99免费视频网站| 影音先锋日本三级资源| 五月丁欧美| WWW.桔色成人.COM| 伊人9999| 色欲婷婷五月天丁香| 日本三级黄色大片| 久这里只有精品| 天天色综网| 99热这里只有精品免费| 婷婷99热| www.99热这里只有精品| 夜夜天天久久婷婷| 亚洲啪啪自拍| 九九热10| 色五月久久成人婷婷| 色婷婷av综合网| 亚洲性爱电影| 天天草天天舔| 99天堂网最新| 97人人草| 婷婷五月激情六月丁香| 色就色94欧美setu| 丁香五月婷婷激情中文| 亚洲AV无码一区二| 亚洲无码色色| 99愛国产| 日本99热| 婷婷五月综合中文字幕| 超碰男人色| 99九九精品视频| 人人干人人操人人摸人人做| 热99在线| 婷婷综合色图| 青青草五月天| 五月综合色播播丁香婷婷| 婷婷五月天午夜激情影院| 五月丁香婷婷综合网| 五月丁香六月婷婷亚洲视频| 99在线热| 沈娜娜av| 激情五月婷婷五月| 深爱婷婷丁香五月激情| 婷婷偷拍网| 婷婷色色欧美综合网| 激情婷婷色色| 青青草原福利在线| 新久久五月天激情| 五月天AV大香蕉| 国产精品久久久久久久久久| 六月丁香五月婷婷| 夜夜夜夜做天天天做无码视频| www久久艹| 色99在线| 97色97干| 天天日天天日天天搞| 丁香五月天婷婷在线视频| 亚州色综合| αv中文字幕在线观| 五月丁香大香蕉| 第四色五月天| 五月丁香网中文字幕| 91久热| 精品久久9| 亚洲六月色| 天天插天天日天天爽| 婷婷丁香五月麻豆| 欧美毛卡| 一本久久婷婷| 亚州美女| 狠狠干综合| 婷婷丁香五月高清| 深爱五月中文字幕| 色婷婷88| 日韩无码系列| 99操九九网| 一本大道熟女人妻中文字幕在线| 99热综合色图| 五月婷婷真爱激情网| 日在线V视频在线播放| 天天射夜夜爽| 狠狠干狠狠操狠狠爱| 婷婷丁香综合网| 五月天综合色| 日韩啪啪视频| 丁香婷婷六月天| 五月丁香网站| 五月婷婷啪啪| 婷婷婷婷婷婷婷婷| 亚洲欧美一区二区三区爱爱动图| 99亚洲综合| 日韩欧美一区二区三区四区| 亚洲精品亚洲人成人网| 亚洲综合无码| www99久久| 久久99精品日本| 丁香六月激情综合网| 日韩美女在线视频19| 久久女人九九| 色99超碰| 激情AV中文| 无码九九九九| 中文字幕在线aⅴ免费观看| 国产精品久久久久久久久久免费| 开心激情站| 农村熟妇高潮精品A片| 熟女少妇内射日韩亚洲| 伊人在线视频| 成人短视频在线观看| 色婷婷99| 无码激情AAAAA片-区区| 日本44久久在线| 色吊丝99| 4399亚洲视频| 五月天婷五月天综合网小说首页-五月天激激婷婷大综合,婷婷亚洲综合五月天小说 | 五月婷婷丁香婷婷| 26UUU欧美激情一区二区| 亚洲丁香五月| 久久九九视频| 五月婷婷婷丁香播| 91视频一起草| 大香蕉五月天婷婷| 丁香五月六月综合激情| 五月色丁香| 丁香婷婷色五月| 欧美色五月| 精品欧美一区二区三区久久久 | 男女久久婷婷五月天| 天天天天天天天操| 人人草开心五月天| 丁香婷婷色色| 久久婷婷内射| 人人摸人人摸| 国产日产亚系列精品版优势| 伦乱人妻| www.henhenl| 久久久久久草黄色片AV在线观看| 性韩日色婷婷五月天激情啪啪XXX| 婷婷综合97| 激情六月丁香综合| 六月色国内综合| 国产成人综合网| 色亚洲婷婷| 色五月中文网| 人人草人人舔| 精品久久人妻| 1769在线观看欧美国产| 91碰九色| 这里只有精品在线视频精品| 九九这里只有精品在线视频| 丁香 亚洲 久久| 99热精品超碰| 日本五月天婷婷丁香| 国产婷婷综合| 五月天久久婷婷| 久久婷婷成人| 91成人视频| 91蜜桃婷婷狠狠久久综合9色| 日本人人xxx| 99自拍视频| www.五月天色色色| 五月丁香日本片| 激情99。| AⅤ色区| 久操人妻| 色色色五月婷| 激情六月婷婷啪啪| 超碰国产在线| 丁香婷婷色| 色婷婷狠狠| 丁香五月综合激情啪啪| 五月婷高清视频| 成人网站在线观看视频| 丁香五月婷婷色情综合| 无码se| 丁香六月五月婷婷| 色偷偷五月天| 色五月婷婷激情综合网| site:publishdd.com| 热99在线| 色婷婷久久综| 五月婷婷色吧!| 五月天另类激情在线| 五月天天堂久久| 情婷婷五月天在线| 五月成人网站| 性爱网五月天| 另类 在线| 丁香亚洲色综合| 操日本人妻视频| 丁香五月影院| 亚洲AV综合网| 五月丁香综合网| 日韩AV免费| www夜夜操wwwcon| 99视频内射三四| 丁香六月激| 九九亚洲视频| 日韩精品超碰在线观看| 婷婷五月天天天| 超碰在线资源| 欧美婷婷色五月| 亚洲精品又粗又大又爽A片| 天天搽天天射| 五月天社区| 爱射综合| 97在线视频观看| 秋霞性爱AV| 丁香婷婷影院| 日韩亚洲视频| 九九99精品| 欧美99热| 99热这里有精品| 少妇高潮一区二区三区99欧美| 色婷婷六月天| www九九热| AV在线大香蕉| 四虎成人精品永久免费AV九九| 影音先锋色婷婷| 综合久久婷婷| 九九视频这里只有精品| 人妻性爱av网站| 熟妇内谢69XXXXXA片|