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
返回資訊列表
欧洲色色| 色婷婷婷av| 婷婷五月色天| 五月丁激情| 91人无码久久久久久| 色碰碰| 久久色五月| 天天日天天爽| 女人天堂AV| 亚洲久久婷婷| 99热欧| 色9999综合久久| 9+1视频网址| 狠狠干五码| 五月婷婷六月激情| 婷婷综合六| 91碰碰| Www.久久| 韩日AV片| 婷婷五月a| 丁香婷婷大香蕉| 亚洲热视频在线| 色黑鬼导航| 五月婷婷草| 国产偷人爽久久久久久老妇APP | www.五月丁香| 狠狠操天天干| 日本欧美成人片AAAA| 天天爽夜夜爽夜夜爽精| 亚洲视99| 色99亚洲| 爱草视频在线| 99久久思思| 丁香六月激情综合| 只有精品视频在线观看| 99开心五月五月丁香激情| www一起操| 超碰无码老师| 五月五月婷婷| WWW.99视频| 97操男人的天堂| 七月丁香婷婷 色色| 五月婷婷色| 日本超碰在线| 婷婷天堂站| 日本99久久| 99爱爱网| 来吧亚洲综合网| h在线看免费版在线看| 色五月天丁香| www.五月天| 99精品视频网| 综合av在线| 亚洲精品字幕在线观看| 人人操超碰| www.99精品日操伊人乱碰在线| 欧美顶级少妇做爰HD| 97色婷| 人妻内射视频| 亚洲日韩一页精品发布| 葵花AV在线| 色婷婷亚洲综合天堂| 久久婷婷丁香花综合网| 日熟女| 丁香五月手机在线| 色日本丁香婷婷| 丁香五月狠狠在线观看| 99免费热视频在线| 99热这里只有精品99| 色婷婷狠狠18禁| 欧美色综合天天久久综合精品| 91打屁股免费看| 亚洲xx在线| 亚洲成人av在线观看| 影音先锋91视频| 91视频久久久| 无码地址| 激情五月婷婷开心网| 狠狠操综合| www.henhenl| 天天色宗合| 色婷婷久久| 精品夜夜澡人妻无码AV| 色一情一乱一乱91Av| 国产白丝在线一区| 一区二区三区四区无码| 亚洲av免费在线| www.夜夜操| 亚洲综合网在线| www色综合亚洲92| 99色综合网| 伊人超碰| 极品人妻VideOssS人妻| 色很久综合| 天天舔天天插天天爱| A色色| 91狠狠色丁香| 伊人九热| 六月丁香婷婷亚洲中文玖玖| AV在线资源| www.超碰97| 婷婷五月天你懂的| 涩涩涩.com| 欧美精品999| www.色五月| 玖玖五月丁香| 亚洲五月天婷婷在线| 激情伊人| 色情五月天丁香社区| 综合色五月天| 五月色网| 人人爱操| 深夜男女福利刺激影院一区| 在线观看996精品| 噜色精品| 久草热在线视频| 久久全色| 激情婷婷色五月| 丁香婷婷六月| 91啪啪| 激情小说五月欧美亚洲丁香| 六月婷婷毛片| 六月亭亭久久综合激情| 大香蕉五月婷婷丁香| 五月丁香六月婷婷啪啪| 天天做天天爱天天玩| 欧美黑人巨大性生话| 欧洲亚洲午夜| 婷婷射丁香| 超碰妻人人| 99在线观看免费精品视频| 精品99在线观看| 强辱丰满人妻HD中文字幕| 影音先锋一区| 久久ww| 五月99久久| 色色色欧美色色| 饮料下药迷倒漂亮女同事强干| 色色综合热| 综合久久丁香婷婷,五月婷婷六月丁香,开心激情综合网,六月丁香在线观看,婷婷丁 | 五月丁香啪啪网| 丁香五月婷婷少妇| 五月激情六月综合| 亚洲顶级VA在线观看-高清完整版在线影院观看-S022AV | 日99网站| 成年人看Va免费视频| 精品一二三区久久AAA片| 丁香花五月天激情| 九九综合| 九九在线免费观看| 激情精品久久| 亚洲丁香婷婷丁香五月天激情| 日韩久久日| 伊人网色婷婷五月天| 精品成人在线| 色婷婷亚洲精品天天综| 超碰在线9| 婷婷刺激综合| 激情丁香婷婷六月天| 久久五月综合| 九九热思思热| 丁香色影院| 天天摸天天做天天爱天天爽| 欧洲亚洲免费视频9| 99黄色性生活| 五月永久激情| 9超碰在线| 免费视频无码| 五月天激情站| 超碰五月婷婷五月天| 婷婷色成人| ww超碰在线| 99综合视频| 丁香五月天狠狠操| 色五月婷婷网| 亚洲激情.com| 91狠狠综合久久久| 北条麻妃伊人 | www。五月,com| 婷婷丁香在线播放| 亚洲欧洲另类| 一区无码| 日韩九区| 99热九九热| 久久精品系列| 亚洲乱码日产精品BD| 色婷婷激情五月天| 人人亚洲| 欧美三级级99久久| 亚洲亚洲人成综合网络| 五月婷婷色播| 欧美爆乳一区二区三区| 六月丁香婷婷色狠狠久久| ..真实国产乱子伦对白在线_欧| 天天做天天爱综合| 婷婷 久综合| 97成人丁香| 伊人色综合久久久| 丁香六月天婷婷开心综合| 91在线日本| 九九热在线精品| www,婷婷五月天777me,com| 一区操| 久激情网| 伊人五月天| 欧美五月丁香啪啪响视频| 20253AV| 大香蕉九九| 中文字幕 久久9999| 久草狼人| 殴美97色| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 日韩啪啪视频| 日本英国美国欧美亚洲国产精亚洲日韩精品在线观看 | 91色五月在线观看| 中国丰满熟女A片免费观| 狠狠狠色激情综合适合| 欧美久久婷婷| 天天婷婷天天| 五月丁香爱婷婷深深| 五月激情久久| 丁香五月欧美婷婷| 91干婷婷| 婷婷情色开心五月天99| 欧美一级色| 色哟哟精品| 天天色综合网1| 色五月丁香五月五月婷婷| 成人网站高清无码| 日韩小视频在线99| 日韩一级淫乱片一区二区三区| 色色亚洲视频| www夜夜| 五月天激情国产综合婷婷| 婷婷六月插屄激情| 另类小说五月天综合网| 丁香成人综合| 国产精品久久久60086| www.超碰在线| 色色五月婷婷| 五月婷婷激情综合在线| 久久五月丁香伊人青草| 天天日夜夜B久久| 大香蕉99热| 丁香婷婷午夜| 色天堂97| 秋霞性爱AV| 日本久久超碰| 青青.com| 日日鲁鲁夜夜爽爽| 激情五月,深深爱五月| 五月婷婷开心爱| 思思热国产视频| 婷婷91| 色婷婷伊人| 欧美精品啪啪| 色八月婷婷| 久久婷婷五月丁香网| 99精品视频推荐| 密臀av无码人妻精品| 丁香五月综合激情性爱| 99爱在线精品视频免费观看| AA丁香综合激情| 婷婷色五月天在线| 亚洲精品V天堂中文字幕| 日本欧美成人片AAAA| 丁香五月综合| 五月丁香婷婷钟和色图| 久久 无毛。| 亚洲色综久久五月| 性韩日色婷婷五月天激情啪啪XXX| 久久性视频| jiujiu热在线视频| 狠狠色丁香婷婷综合久久97AV| 九九视频精品在线免费| 可以看的av网站| 少妇性按摩无码中文A片| 亚洲综合五月天婷婷| 天天综合色| 中文资源在线a | 5月婷婷激情6月| 夜夜操少妇| 在线色五月婷婷| 日本精品。999| 中文字幕日韩无码制服诱或| 丁香五月婷婷综合精品素人| 99精品成人无码A片观看金桔| 播丁香五月婷婷欧美| 婷婷丁香日韩五月| 婷婷五月激情欧美| 五月天自拍视频| 丁香五月成人在线| 六月丁香久久| 久久密臀婷婷| 五月五婷婷网| 色屌丝中文字幕| 99热9| 丰满少妇猛烈A片免费看观看| WWW、99热| 五月天综合久久丁香91| 色五月五月丁香| 色色色色色综合| 色婷婷亚洲| 99热这里有精品| 婷婷五月综合网激情| 99色在线视频| 色五月五月婷婷| 丁香五月婷婷啪啪| 日韩 中文 欧美| 丁香五月婷婷丫| 激情五月色婷婷| 色九九综合| 爱操天堂| 国产淫熟妇| 日本久久精品18| 国产免费性爱| 激情文学天天| 六月丁香久久| 色色九九五月天 | 婷婷激情综合| 婷婷伊人综合| 亚洲激情五月婷婷日日| 色五月综合网| www.五月天婷婷| 五月天啪啪啪| 日本综合久久| 激情综合色图| 夫妻超碰在线| 26uuu欧美激情另类| 91九色精品熟女内射| 亚洲蜜乳AV| 天天操夜夜啊| 五月天com| 丁香六月婷| 婷婷久久草| 九月丁香婷婷| 色情五月丁香婷婷网| 久久婷婷网| 丁香花综合永久入口| 99热精品网| 97人人干人人操| 六月婷在线| 日日夜夜噜噜爽爽| 久cao香蕉影院| 99久久a线观| 日本三级日本三级99| 综合九九久久| 熟女网站久久| 99在线69| 九九無妻| 这里只有精9| 色色五月天婷婷| 久操97| 婷婷六月丁香五月| 九九热在线99| 亚洲情色一区| 99热这里| 亚洲激情综合| 五月婷在线色视频| 久久综合五月情| 狠狠狠五月婷婷六月丁香| 极品人妻VIDEOSSS人妻| 激情综合网激情五月俺也去| 五月丁香六月欧美| 九九成年视频| 一区二区免费看| 日韩精品超碰在线观看| www狠狠| 色综合网址| 狠狠爱综合| 五月六月播婷婷| 色综合五月天| 婷婷激情五月综合丁| 97人碰人操| www,99热| 91色五月| AA片在线观看视频在线播放| 99思思热只有在这里看| 五月间天堂综合| 丁香六月婷婷久久综合| 夜夜夜天天操| 婷婷五月激情基地| 日韩综合天堂| 狠狠狠狠狠狠狠狠草| 最新无毒无码AV| 天天爽天天日天天舔| av在线不卡播放| 五月开心网| 久/久精品99看9| 婷婷综合久久| 日本色视| 亚洲熟妇AV综合网五月丁香伊人| 婷婷伊人綜合中文| 久久伊人五月天| 丁香五月综合图片在线观看| 91精品无码久久久久久五月天| 91狠狠综合久久久久久| 久久人妻伊人| 久久视屏这里只有久久| 九九美女视频| 日本高清久久| 五月天色综合| 婷婷丁香五月欧美人| 大香蕉人人网| 少妇2做爰HD韩国电影| 婷婷丁香在线播放| 激情婷婷内射| 色五月色图| 久久99国产综合精品免费| 六月婷婷久久大全| 少妇性按摩无码中文A片| 天天夜天天色天天| 开心久久xxx色| 色播激情| 亚洲妇女熟BBW| 人妻无码精品一区| 爱的综合网| 久久婷丁香五月| 又大又粗九一在线| 51国精产品自偷自偷综合 | 日本少妇AA一级特黄大片| 色九月婷婷| 久久A区B区| 99热综合| 大香蕉啪啪| 五六月婷婷久久| 久草天堂| 亚洲va成人va成人va在线观看| 99色最新在线视频| 91狠狠综合久久| 色婷婷综合在线| 日日躁夜夜躁狠狠久久AV| 色久女| 99小视频网站| 天天日夜夜夜操操操操| 99热国产这里只有| 亚洲成人在线播放| 99热e| 五月丁香亚州综合网| www.激情五月| 91啪啪| 丁香婷婷婷五月| 天天天操天天天爰| 天天干,天天舔| 97人妻碰碰碰久久| 五月天大香蕉婷| 激情五月天色色| 大香蕉99热| 另类图片五月天婷婷| 日日做A爰片久久毛片A片英语| 26UUU欧美激情一区二区| 亚洲AAAA网| 亚洲激情亚洲激情| 亚洲成人免费在线| 五月天丁香综合| Av在线资源| 成人无码精品1区2区3区免费看 | 国产黄大片在线观看画质优化 | 六月丁香网| 亚洲视频二区| 狠狠久久婷五月| AV操操操| 色色色色色色色色色色色色色97| enecarbon-materials.com污K127封锁请涟系@wip1688 | 桃色激情五月天| 精品99*| 中文字幕欧美日韩VA免费视频| 色丁香五月婷婷| 99精品视频在线观看| 丁香五月天AV| AV色婷婷| 99精品免费视频| 日本狠狠干| 中文av网站| 亚州操人在线视频| 日本欧美成人片AAAA| 婷婷五月天成人| 99ri精品| 伊人九九68| 99视频日韩| 亚洲不卡123| 性爱五月婷| www亚洲无码| 五月五月婷婷| 丁香婷婷久久 | 久久婷婷六月综合综合色| 色五月婷婷一二| 婷婷五月天激情电影| 夜夜爱网站| 噜噜在线| 激情久久综合网| 97人人操人人| 五月天婷婷色播| 五月婷婷丁香狠狠撸久久| 五月婷婷片| 久99久在线观看| 色五月 五月婷婷| 国产亚洲精品久久久久久郑州 | 国产脫衣舞一区二区三区| 超碰99热| 婷婷五月色丁香在线看| 婷婷久月| 婷婷五月丁香激情| 亚洲视频五区| 天天干天天爽天天操| 天天肏天天肏天天肏| 99热在线播放| 婷婷激情综合色五月久久图片| 丁香无月在线观看| 婷婷五月天综合久久| 婷婷久久大香蕉| 日本操B视频在线观看| 丁香五月婷婷偷拍| 伊人丁香花综合影院| 99伊人婷婷在线| 97干在线| 婷婷五月天社区| 国产精品久久久久久妇女6080| 91干网| 99热这里只有精品268| 美女美女美女三级色天天天天天| 色五月激情五月| www.一起草av| 丁香五月天激情小说| 成人综合视频在线| 色香蕉婷婷| 五月天啪啪视频| 综合六月激情婷婷| 激情综合五月| 99欧州偷拍视频| 丁香五月六月欧美| 依人大香蕉| 丝袜激情网| 五月婷婷久| 色99视频| 九九九精品视频免费观看| 99热这里只有精品16| 北京熟妇搡BBBB搡BBBB| 97成人丁香婷婷| 欧美婷婷五月天| 亚洲宗合激情| 五月噜噜| 情欲禁地| 国产成人VA| 欧美色五月| 9久久AV| dingxiangtingtingliuyue| 亚洲免费看片| 日日骑夜夜撸| 久久久久久欧美精品se一二三四| 五月婷婷丁香啪啪| 激情开心五月天| ztEJj| 东北婷婷五月天| 婷婷中文字幕| 五月色丁香成人| 丁香久久| 色五月激情五月天| 色啪网| 97超碰人人操| 九色视频91疯狂| 九九re精品视频在线观看| 亚洲婷婷丁香五月| 99爱视频| 99热这里都是精品| 综合激情站| 第四色婷婷日本| 欧美日韩91| 99碰碰| 99熟女| 九九色人| 亚洲无码99| 天天免费成年人视频| 亚洲无码色| 成人深爱丁香五月| 风流少妇A片一区二区蜜桃| 激情深爱综合| 色婷婷丁香花五月天| 婷婷娱乐丁香综合网| 色婷网站| 婷婷五月激情中文字幕| 色综合久久天天综合网| 91精品久久久久久综合五月天| 丁香婷婷五月天校园春色| 婷婷五月天伊人| 久热这里精品免费| 婷婷综合干| 激情五月婷黄版| 97资源碰碰| 97精品综合久久| 五月丁香六月婷婷免费视频| 激情综合婷婷久久| 婷婷色导航| 新99思思视频| 操操操91| 九九热在线观看视频| 欧美性猛交99久久久久99按摩| 人人操A| se99热久久一本| 婷婷五月天堂| 97色伦另类图片小说视频| 激情婷婷黄色五月| 色五月婷婷色| anquye五月| 色在线99| 最近免费中文字幕大全高清大全1| 婷婷五月天免费视频在线观看| 操逼巨乳91| 久久五月天婷婷| 五月综合六月婷婷| 97人妻碰碰中文无码久热丝袜| 亚洲最大成人综合网720P| 九九在线这里只有精品视频| 五月天激情国产综合婷婷婷就去爱| 97精品人人A片免费看| 五月亭亭直播| 亚洲色婷婷激情| 亚洲成人九九九| 亚洲精品一区中文字幕乱码| 丁香六月婷婷综合| 五月婷婷m| 久久久ww| 婷婷色综合网日韩国产| 九九色影院| 六月婷婷开心| 天天爽人人爽| 97精品综合久久| 婷婷五月天渟渟| 精品色色| 日韩啪啪视频| 五月综合婷婷开心网| 国产精品视频网| 色五月婷婷五月天| 超级碰碰碰97免费| 丁香五月婷婷激情中文| 秋霞电影一级黄| 91艹人| 日B日潘金莲BB| 99热这里只有精品55| 亚洲最大激情无码| 牛牛碰免费| WWW丁香五月| 99热热这里只精品996小说| 琪琪色网在线| 午夜大香蕉| 五月丁香久久综合| 日韩啊啊啊| 色综合久久久久久久久五月| 一区二区三区四区五区| www婷婷| 野战毛片三一3| 伊人色欲五月天| 天天综合色丁香| 久久精品4| 97久久五月丁香婷婷| 婷婷五月天丁香综合网| 日本综合99| 欧美日本日韩| 亚洲国产精品VA在线看黑人| 荡乳尤物3HP1V5| 天天爽天天操| 色99视频| 久久伊人大香蕉| 五月天国产| 婷婷免费视频| 亚洲五月婷婷| 久久激情五月| 日本猛少妇色XXXXX猛叫| 欧美这里只有精品| 婷婷导航| 年轻的妺妺伦理HD中文| av亚洲国产小电影| 日日噜噜夜夜狠狠久久丁香五月| 9热网站| 97夫妻超碰| 亚洲深喉aV| 久久久宗合视频88| 九九久99免费视频| 日韩视频女神99| 亚洲黄3级片网站欧美| 第四色网婷婷| 丁香五月欧美激情| 五月份婷婷| av婷婷丁香 六月| 天天插天天很| 久草xx性爱视频| 五月天五月天激情网| 色婷婷亚洲精品天天综| 婷婷色啪| 99操视频| 九月停停| 久久久久久97| 欧美成性色| 高清无码中文字幕aVDV| 成年人最刺激的综合网| 亚洲成人在线免费| 五月丁香婷婷综合| 无码字幕中文| 丁香婷婷九月| 欧美成人va| 色.五月综合网| 久久九九re热| 丁香五月天啪啪| 一本道综合网| 夜夜躁爽日日| 99re久久| 亚洲乱啪| 久久婷婷五月综合97色一本| 丁香五月激情澎湃一区| 天天色天天日天天舔| 激情五月婷婷网| 99re欧美精品| 丁香色五月 97干| jiujiu无码五区| 久热网站| 五月天开心网| 在线综合91| www.主妇. com| 日屌日日操日日色| 丁香六月在线| 色吊操色妞| 五月丁香| 亚洲五月停停| 女人被躁到高潮嗷嗷叫小| 99精品女人天堂| 免费99情趣网视频| 婷婷色片| 色五月婷婷7777| 亚洲成人在线免费| www.99成人视频| 囯产精品久久欠久久久久久九大| 丁香花五月天社区| 狠狠操天天操天天操| 丁香五月影院| www.丁香黄色五月天人与| 成人AV在线网站| 思思热久久爱| 伊人五月天| 大香蕉婷婷五月| 99热12| 欧美三级A做爰在线观看| 97热久久| 91久久婷婷人人澡草 | 国产色99| 伊人色欲五月天| 99热这里只有精品55| 日韩无码性爱| 天天热夜夜操| 蜜臀AV在线观看| 久操大香蕉| 日本狠狠色| 欧美性爱专区| 久热这里精品免费| 亚洲激情综合| 可以免费观看的av网址| 亚洲最大在线| 久久丝袜婷婷| h在线看免费版在线看| www.91热久久| 五月丁香色婷婷基地| 久久xxxx| 99这里是99在线视频| 丁香激情网| 日韩精品超碰在线观看| 五月天精品| 免费看片在线观看| 人人草人人视| 99热色综合| 久久色五月天综合网| 天堂久久丁香| 亚洲一区先锋影音| 国产黄色在线| 婷婷免费无视频| 91男女视频在线观看| 亚洲在线激情婷婷五月| 五月天开心网| 99热欧| 成熟妇人A片免费看网站| 五月天婷婷久久日| 桃色五月天| 天天在线天天综合网色| 无码日本精品XXXXXXXXX| Se.婷婷五月天| 婷婷亚洲综合| 5月丁香综合网| 曰韩少妇内射免费播放| 午夜不卡成人一区二区| 超碰操日| 九热视频| 激情图片99| 99热爱爱干干日| 色九区| 综合色播| 五月噜噜| www.91AV.COM| 日本婷久久| 五月婷婷色色| 国产美女无遮挡裸体毛片A片| 99热这里只有精品96| 国内精品免费一区二区2009| 丁香婷婷深情五月亚洲| 91成人电影| 激情婷婷五月| 亚洲 在线 性爱| 另类亚洲电影| 亚洲无码成人| 激情婷婷内射| 日本玖玖在线| A片一曲| 五月婷婷狠天天色综合| 开心五月婷婷伊人| 99九无网码| 台湾综合丁香五月蜜桃| 色99久草在线| 99热综合在线| 人妻系列久久久久久久久久久| www.丁香黄色五月天人与| 日日夜夜狠狠| site:901-07.com| 五六月丁香激情视频| 狠狠色婷| 超碰AV在线| 99热日本| 色狠狠999综合| 人妻丰满精品一区二区A片| 狠狠五月激情丁香六月| 激情五月丁香五月| 67194线路二在线观看| 超碰com| 提提热五月天婷婷| 日韩欧美一道四区中文字幕| 狠狠干狠狠干| 天天爽夜爽| 婷婷五月天成人动漫| 日韩精品电影| 性一交一乱一交A片久| 停婷丁五月在线| 丁香五月第九色| www.久久综合| 日本WwW色偷偷丁香花久久久京东热| 久re热视频| 夜夜夜叫天天天做| 五月婷久久| 免费看片在线观看| 亚洲乱码日产精品BD| 91狠狠色色丁香婷婷综合久久| 丁香五月天激情小说| 综合色五月天| 九色1区视频在线| 狠狠干狠狠干| 五月婷婷六月天| 天天撸天天干天天插| 六月丁香啪| 五月婷婷亚洲| 色婷婷女优有码五月亭| 99国产精品久久久久久久久久久| 五月天色色网站| 热99在线| 丁香婷婷六月在线资源观看| 婷婷久久五月| 久久久97| 97九色视频| 天天日P天天射P| 少妇人妻丰满做爰XXX| 国产成人网址| 操操自拍| 五月天亭亭俺也| 婷婷五月天激情五月天| 狠狠婷婷爱| 婷婷色婷婷亚洲成人| 97资源碰碰在线| 精品动漫 无码av| 人五月天婷婷喷水| 亚洲第一成人无码A片| 久久怡红院| 久久婷婷五月天懂色| 99超级碰碰| 久久丁香五月| 五月婷亚洲精品| 五月丁香花开综合网| hd五月婷婷在线| 插插插丁香五月婷婷| av中文在线| 色五月婷婷色| 91啪啪视频| 超碰97人人操| 伊人久久艹| 91日本在线观看| 婷婷丁香五月麻豆| 久久XX| 亚洲五月天,激情视频| 成人短视频在线观看| 久99久在线| 五月丁香六月婷| 久久这里精彩免费在线观看| 激情色播| 综合激情啪啪| 午夜丁香六月婷| 婷婷色色播五月天| 婷婷六月中文字幕| www.亚洲激情| jiqingliuyuetian| 26uuu亚洲| 色色无码| 黄色AV日韩| 婷婷五月天视频| 99色综合| 日本黄色三级片内射| 狠狠干五月| 久久婷婷五月综合色天| 国产精品汇聚精彩第二页 - 高清完整版在线 - 青蛙AV | 天天色域综合网| 这里只有精品视频99| 亚洲综合五月| 色情五月丁香| 婷婷五月丁香五月| 伊人香大香蕉视频| 激情婷婷视频在线| 色色色国产| 思思视频精品| 噜噜噜久久亚洲精品国产品91 | 天天日天天操心| 免费看欧美成人A片无码 | 五月丁香六月欧美综合网站| 色久影院| 五月丁香婷婷啪啪| 色九四色| 超级碰碰91| 色婷丁香五月| 五月婷婷之美女图片| 婷婷 伊人 久久| 99A片| 亚洲狠狠爱婷婷| 精品久久婷婷| www.99热最新视频8| 狠狠狠夜夜夜| 91Chinese在线| 久久AV无码精品人妻系列试探| 色婷婷成人久久| 五月香婷婷| 婷婷五月色亚洲| 午夜天堂啪啪| 激情婷婷丁香| 久久久久久激情| 五月色丁香婷婷中文字幕| 色五月五月婷婷| 国产成人精品亚洲线观看| 激情五月天色色色| 婷婷五月天播| 天天色天天日| 亚洲妇女熟BBW| 色www.con| 五月丁香成人| 91九色熟女| 成人五月丁香花| 99在线播放视频| 天天爽夜夜爽天天爽夜夜爽| 丁香五月色| 黄色短视频在线观看| 激情五月天久久丁香| 久久五月天色| 亚洲精品V天堂中文字幕| 在线超碰91| 天天做综合网色综合| 久操人妻| 欧美婷婷综合网| 婷婷五月天视频小说| 99热这里都是精品| 丁香六月婷婷久久亚洲天堂| 天天上天天爽| 免费AV播放| 伊人久热91网| www.思思99热| 久久这里有精品| 天堂网啪啪| 狠狠五月综合在线| 三人荫蒂添的好舒服A片| 久久多色| 日本爆乳片手机在线播放| 婷五月天影院| 男人综合网| 久久人妻视频| 在线色色| 97超碰在线免费观看| 五月色婷婷夜色| 色婷婷五月婷婷五月婷婷五月| 五月天另类视频| 婷婷六月视频| 26UUU精品一区二区| 亚洲99精品九九在线| 婷婷五月综合欧美在线播放| 91欧美| 91人人操人人| 色婷久久| 色99无码| 欧美婷婷五月天| 99精品综合在线| 中文字幕性爱丰满| 成人αV视频免费观看| 久久久人妻人伦| 4399成人黄A片| 精品久久9| 噜噜干日本| 99精品一二三四视频| 99热这里都是精品| 婷婷五月天毛片| 夜夜干夜夜操| 91精品啪| 人人操人人爰人人一天天碰夜夜拍夜夜爽-中国A级毛片天天看天天谢… | 五月停停丁香| 天天干人人奸97| 色色婷婷综合网| seuuu婷婷| 伊人狠狠操| 九九精品9| 99re在线这里只有精品视频首页| 黃色三级三级三级三级 qixing300.shrkbk.com www.jinbozs.com tianmiaosw.com | 丁香五月激情视频在线| www久久久久久久久久久| 色婷綜合网| 五月婷婷六月激情| 婷婷五月天亚洲图片| 久久婷婷青青| 日日色综合| 极品色丁香| 99在线69| .操區COm| 免费观看全黄做爰的视频 | 国产偷人爽久久久久久老妇APP | www激情| 久久99精品日本| 婷婷天堂综合| 欧美成人无码高清一区二区三区| 欧美私人家庭影院| 五月色网| 伦99热| 国产成人99久久亚洲综合精品| 婷婷丁香六月综合激情站| 国产成人精品一区二三区熟女在线 | 91麻豆国产三级精品福利在线观看| 天天情色综合网| 99热精品10| 激情欧美五月丁香| 狠狠操天天操综合| 天天色五月婷婷91久久久久久久| 久久精品视频在这里有| 婷婷97碰碰| 99自拍视频在线| www.热99热| www.色九月| 99久久网站| 玖玖资源站蜜臀| 六月婷婷久久| 日本猛少妇色XXXXX猛叫| 99热这里只有精品官网| 亚洲性爱电影| 中文成人在线| 色亚洲激情| 日本色婷婷| 五月婷婷玖玖综合玖玖爱| 蜜臀av粉嫩av懂色av| 婷婷基地成人五月天| 七七色综合| 色婷婷综合网| 可以直接看的AV网站| 色噜噜狠狠色综合成人网| 免费看欧美成人A片无码| 久色五月丁香视频| 91热er| 亚洲激情五月| 国产精品色色| 开心五月婷婷| 深爱五月中文字幕| 9l视频自拍9l九色9l成人| 亚洲中文字幕在线观看| 国产97色在线 | 日韩| 色婷婷五月天天天做| 97资源碰碰在线| 久久性爱99国产| 人人操AV| 国产精品五月天婷婷| 这里只有精彩小视频视频网站| 青青操日本摸摸看看| 在线播放中文字幕| 天堂网啪啪| 麻豆五月丁香婷婷| 婷婷欧美偷拍综合| 丁香婷婷超碰| 99亚洲精品综合在线| 五月天成人在线视频网站| 五月天婷婷乱论小说| 五月婷婷色播网| 玖玖综合网| 91日综合欧美| 久久艹 五月天| 色综合伊人网| 亭亭色网| 亚洲天码视频www蛋播视频| 亚洲99激情| 另类专区在线| 91xxxx九色| 婷婷丁香五月天激情四射| 国产免费一区二区在线A片视频| 亚洲情色一区| 六月婷婷中文字幕| 久久久久人妻中文| 五月丁香在线国产| 新99思思视频| 97成人丁香婷婷| 五月丁香六月成人| 中日韩狠狠色| 操日本色| 五月婷婷欧洲| 亚洲日韩成人三级av| 五月天婷婷激情| 五月天开心网| 五月丁香六月激情欧美综合| 久久资源网五月婷| 操逼三区| 久久99大全| 五月天婷婷色色网| 99视频只有精品| 亚洲激情五月天| 五月丁香婷婷成人网| 香蕉AV777XXX色综合一区| 五月丁香狠狠| 丁香婷婷六月在线资源观看| www.婷婷,com| 69激情小说| 欧美色小说婷婷| 国产五月婷| 亚洲成人电影aaaa| 99爱视频在线免费观看| Va另类视频| 99成人无码| 激情五月天色婷婷| 激情丁香五月天图片| 日韩色五月| 色五月播五月| 久9视频免费播放| WWW99热| 97资源欧美日韩大香蕉超碰一区| 91色噜噜狠狠狠狠色综合| 五月丁香啪啪激情| 五月天婷婷在线播放| 五月天色色网站| AA片在线观看视频在线播放| 白人荫道BBWBBB大荫道| 久久无码成人| 亚洲成人AV电影网| 女人天堂久久| 欧美va视频| 丁香六月天AV| 激情亚洲色图片丁香综合| 久色网五月| 五月天婷久精视频| 人人干99| 丁香五月天激情综合| 亚洲国产精品VA在线看黑人| 久777| 在线超碰91| 少妇激情基地| 丁香激情合作五月| 丁香五月综合在线观看| 欧美成人精品A片免费一区99| 久播影院免费观看电视剧大全最新网| 亚洲在线网站| 人人爽欧美婷婷久久久五月丁香| 丁香六月激情| 月婷婷亚洲| 亚洲色无码| 99九九视频| 激情五月婷婷丁香| 成人丁香婷婷| 99re热在线视频观看| 色色热99| 五月丁香婷婷潮喷中文字幕| 丁香五月综合激情性爱| 97色色婷婷| 久久ri精品视频| 4399人妻无码久久久| 插插插丁香五月婷婷| 这里只有免费精品| 国产激情AV| 人妻日日日| 4399在线观看免费毛片| 激情五月图| 久久激情网| 色九九综合| 人妻在线网站| 开心婷婷五月天综合| 99热这里只有精品最新| 亚洲高清在线| 665566 无码| 先锋五月婷婷丁香草草| 热久久视频99| 欧美色图天堂网| www.色欲丁香婷婷| 综合激情伊人影视在线| 久久亚洲激情五码| 九九热AV| 99在线视频资源| 婷婷五月AV| 五月婷婷婷婷| 免费在线a| 99色丁香婷婷综合网| 日韩av在线电影| 1级欧美日韩| 色婷婷五月天天天天天| 天天干,夜夜爽| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 精品福利911| 婷婷五月丁香啪啪| 九九色插| 五月六月丁香婷婷在线观看| 日日撸夜夜操| 久久婷婷丁香花综合网| 婷婷丁香在线| www.99热视频| 怎么样可以看免费的一级av| 久久婷婷六月综合| 丁香激情五月| 色综合99色| 亚洲日韩26uuu| 五月丁香六月婷婷网| 开心五月婷婷婷美女| 开心五月婷| 99国产精品久久久久久久久久久| 女操碰| 99色色色色| 久久综合五月天激情小说网站 | 丁香五月婷婷俺也要去| 国产人妻777人伦精品HD| 99热国产精品| 成人在线99| 99热日本精品| 五月婷婷二月丁香| 思思久久久婷婷| 久久这里面只有精品视频| 啪啪啪综合网| av在线激情| 丁香婷婷五月综合| 国产伊人大香蕉| 这里只有精品在线免费视频| 涩涩五月天| 婷婷成人网五月天| 午夜色婷婷| 婷婷丁香花五月天| enecarbon-materials.com污K127封锁请涟系@wip1688 | 久青操| 五月丁香综合中文| 久久久性爱视频| 婷婷WWW久久| 99成人免费热视频| ZpRSw| 婷婷五月天综合中文| 日韩AV免费电影在线播放| 婷婷五月天深爱| 亚洲亚洲人成综合网络| 色五月av伊人| www.久久爱| 久久婷婷亚洲| 可以免费观看的AV| 99热这里只有精品免费| 亚洲婷婷视频| 99热在线观看|