免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

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
返回資訊列表
无码少妇高潮喷水A片免费| 《丁香激情综合久久伊人久久》影视在线观看 -高清预告手机免费播放 -三妹影院 | 人妻AV在线观看| 97人妻碰碰碰久久香蕉| 婷婷五月天最新综合你懂的 | 九九九九精品精| 九九一综合精品| 超碰人妻公开在线| 激情综合五月天| 五月丁香色婷婷色| 亚洲综合色网| 天天草天天摸| 色情五月天视频网| 五月婷婷丁香日韩在线| 丁香五月开心亚洲| 2020久久婷婷五月| 91精品综合久久久五月天| 99热丁香| 激情丁香五月激情婷婷| 9热视频在线观看| 色墦五月丁香| 色在线视频网2025| 亭亭五月丁香综合欧美| 99热免费18| 第四色五月婷婷| 玖玖视频福利| 麻豆123区| 五月天开心色情网| 婷婷综合五月色播| 91日本在线观看| 天堂成人A片永久免费网站| 色婷婷色情| 婷婷爱五月| 丁香五月激情婷婷| 99久久久| 热久久77777| 大香蕉婷婷婷| 婷婷五月天av| 丁香五月成人婷婷| 五五月五月| 丁香五月婷婷激情中文| 精品一二三区久久AAA片| 日日激情网| www.99精品视频| 九九亚洲视频| 综激情网| 女高怪谈在线观看| 色九月激情综合网| 亚洲99综合| 欧美大片| 五月丁香啪啪综合| 五月婷婷六月色| 九九这里有精品视频| 99热色综合| 国产激情综合五月久久| 国产精品VA在线| 色婷婷黄色网络| 第四色婷婷色五月| 99精品在| 操逼视频一区| 激情综合婷婷久久| 久久艹 五月天| 日韩综合久久| xxx.色婷婷| 永久思思热在线| 综合超碰熟| 色婷网| 激情www| 天天人人综合| 色综合色五月| 欧美性爱一区| 五月天大香蕉AV| 国产做爰视频免费播放| 婷婷狠狠操| 色婷插| 亚洲12p| 欧美影院| 久久九九色| 色插综合网| 四色永久成人网站| 91大神操美女| 91丨九色丨熟女| 秋霞九九无码| 96丁香婷婷九月蜜桃综合久久| 激情视频网址| 91美女被操| 久久ab| 婷婷五月AV| 性爱AV天堂| 狼人婷婷久久| 99ri视频在线观看| 五月婷婷丁香综合| 日本三级韩三级99久久| 伊人五月婷婷| 91seav| 天天做天天爱| 91人操人人人操人| 超碰超碰在线| 五月婷婷丁香在线| 丁香桃色网| 香蕉操亚洲| 久久这里只有精品热在99| 五月丁香伊人网| 国产日韩欧美性生活| 丁香色色色| 日韩精品一品二区三区的使用体验| 亚洲综合视频八| 日本熟妇乱妇熟色A片蜜桃| 天天干狠狠| 五月亭亭网成人在线视频| 五月丁香婷婷激情四射迷人| 丁香激情综合| 青青操成人福利| 婷久久高清| 成人中文网| 少妇高潮呻吟A片免费看软件| 99性爱| 色九九综合| 激情综合国产| 99视频精品在线| 91超碰人人操| 婷婷六月综合激情| 在线另类| 六月色丁香婷婷| 午夜无码熟熟妇丰满人妻| 99热在线观看| 1024成人免费看| 99精品在线播放| 五月婷婷七月丁香| 色色99| 五月丁香激情综合| 少妇人妻丰满做爰XXX| WWW.国产| 91啦丨九色丨刺激中文| 久久综合婷婷五月| 天天日天天舔天天摸| 秋霞免费三级片| 五月婷婷激情综合在线| 最新亚洲色色网| 欧美天天干天天草| 99热| 久久人妻视频| 97超级碰| 91九色 婷婷| 日韩人妻无码精品| 国产成人AV人人爽人人澡Va| 婷婷激情五月综合在线视频| 色综合色| 可以免费观看的AV| 亚洲天堂青草| 九色91国产| 九九热这里只有精品5| 天天日日夜夜爽| 91超碰在线观看| 精品婷婷五月视| 五月激情丁香五月| 狠狠干 狠狠操| 久久免费9| 六月丁香激情| 免费观看亚洲AV片| 五月丁香成人网| 都市激情蜜桃婷婷五月天| www.99久| 丁香五月婷婷基地| 色婷婷色和| 99九九在线视频| 五月婷婷AV| 丁香五月天人体| 人人操婷婷| www.激情五月天.com| 欧美日韩成人在线| 欧美精品狠狠色丁香婷婷| 日本在线观看91| 九九狠狠干| 亚洲一个色| 久久九精品| 荷兰av一级| 久久ww| 操操综合网婷婷| 久久9999| 六月婷婷影院| 五月天伊人网| 精品久热| 成人午夜视频精品一区| 丁香五月激情婷婷婷婷在线观看| 好好干Av| 91欧美| 五月丁香婷婷综合| 色五月婷婷91| AAA亚洲AV| 五月丁香综合啪啪| 十区av| 五月天婷婷日日爱| 99久在线| 五月天大香蕉视频| 激情五月婷婷色综合| 婷婷色综合av| www.婷婷激情网.com| 97碰在线| 五月婷婷视频| 六月婷综合| 玖玖爱综合网| 天天天综合网| 超碰在线50| 殴美激情综合网| 婷婷五月天综合久久| www.zbzhongsen.com| 四月婷婷五月丁香| 色五月丁香六月欧美综合| 婷婷五月丁香五月| 色五月超碰| 精品一区二区三区木瓜| 天天干一干| av成人在线播放| 五月婷婷精品视频| 天天干,天天日| 狠狠色丁香婷婷久久综合| 亚洲综合视频一下| 五月丁香色综合| 91激情五月开心| 五月天久久www| 亚州色色色| www.久9| 成人无码精品1区2区3区免费看| 激情五月,婷婷五月,丁香五月| 狠狠久久婷五月综合色| 97久久久久| 大香伊人婷婷影院| 五月丁香六月婷婷网站| 婷婷五月成人社区| 狠狠狠狠操| 色婷婷电影网| 色狠狠999综合网| 狠狠久久婷五月| 久久婷婷大香蕉| 99热这里只有精品1998| 影音先锋美国A| 婷婷激情五月天激情在线| 天堂久久婷婷| 久9久9热久热| 99ri国产| 丁香六月婷| 97色伦另类图片小说视频 | 综合五月丁香97| 五月综合缴情网| 无码少妇高潮喷水A片免费| 亚洲网视屏| 婷婷成人视频| 五月综合丁香婷婷| 99热精品在线| 色色综合成人网| www.久久久.com| 激情亭亭五月| 色婷婷婷婷| 亚洲成人网站在线播放| 成人av在线网站| 成人版视频在线观看| 大香蕉九九| 免费观看欧美成人AA片爱我多深 | 婷婷五月天情色| 色婷婷五月综合| 日韩AV在线免费| 91wwmm导航| 亚洲AV成人在线观看| 久热这里只有精品99re,久热这里只有精品7 | av在线免费网站 | 六月丁香影院| 在线观看亚洲AV| 久久精品这里只有精品免费首页| 91精品综合久久婷婷九色| 人妻久久久| 五月婷婷七月丁香| 久久久婷婷| 久久欧洲久久| 97亚洲视频在线| 五月丁香在线偷拍视频| 婷婷五月超碰| 伊久久婷婷| 狠狠色噜噜狠狠狠狠综合| 99日本精品视频热| 九九操屄| 97干在线免费| 激情五月婷婷丁香六月| 91精品综合久久久久久五月丁香| 五月婷婷婷婷| 亚洲第精品| 99网址在线观看| 色色色.COM| 九月av在线| 69久久99精品久久久久婷婷| 狠狠狠婷婷五月综合| 一起草AV入口| 五月婷视频在线| 欧美精品啪啪| 日本人妻伦在线中文字幕| 99er在线观看| www.99热在线| 另类天堂| 亚洲天堂aaa| 射琪琪| 色婷丁香| 第一区久久网站| 五月天激情视频| 综合色播| 久久9热| 青草青草视频2免费观看 | 亚洲狠狠色丁香婷婷综合久久| 婷婷五月天美女视频| 老师把我爽高潮了免费A片| 2017狠狠干| 婷婷五月天伊人在线| 日本黄色精品| 成人操呦av| 激情五月天伊人av| 97在线精品| 波多野结衣成人作品在线| www.五月婷婷.com| 欧美色爱五月天| 色色色色色色网| 婷婷在线日韩综合| 天天爱天天做天天舔| 久婷婷色| 丁香六月婷婷色XXXX| 香蕉伊人综合| 91人人人人人| 丁香五月婷婷基地| 色五月婷婷色五月| 中文字幕,综合,91| 五月婷婷免费视频| 毛v一区二区视频| 五月婷婷AV| 精品婷婷五月视| 91日精品| www.9操| 91狠狠色色丁香婷婷综合久久| 亚洲婷婷五月草久| 亚洲第一黄网| 激情色情五月天| 婷婷综合五月| 97干欧美| 久久婷婷成人综合色怡春院| 色噜噜,噜噜色| 午夜日日| 五月天婷婷Av| 成人综合网站| 狠狠操狠狠操| 97韩国久久电影院| 人人搡人人| 色中色综合| 丁香六月中文| 在线婷婷| 91viP在线看| 六月激情综合| 六月婷欧美| 激情五月婷婷丁香| 天堂综合久| 激情深爱综合网| 婷婷五月丁香婷婷| 五月婷婷啪啪网| 婷婷激情五月天桃花网| 99丁香婷婷综合网| 熟女人妻一区二区三区免费看| 婷婷综合视频| 婷婷丁香六月| Av大香蕉| 激情综合网激情五月天| 深爱五月天 开心网| 欧美交换配乱吟粗大25P| 亚洲成人日韩无码精品| 婷香五月激情视频| 伊人久久中文网| 人人摸人人| 91婷婷在线观看| 神马欧美精| 在线观看996精品| 91综合色| 五月婷婷六月丁香激情深爱| 亚洲熟妇AV乱码在线观看| 激情网 五月天| 性一交一乱一交A片久| 色播五月丁香婷婷| 国产亚洲成人综合| 色婷五月天| 成人丁香五月| 丁香伍月婷电影全集| 99热在这里只有免费精品| 亚州色色色| 99热热热99精品婷婷| 亚洲成人免费在线| 亚洲99综合| 日日噜噜久久婷婷五月天| 色丁香五月婷婷| 永久免费一区二区三区| 婷婷,五月天,丁香,第一| 99热精品在线观看| 婷婷五月激情五月激情| 五月天婷婷xxx| 性做爰1一7伦| 一级二级色大片| 久久曰曰| 伊人九九九久| 深爱婷婷网| 久久婷婷五月天激情唯美| 9九色首页| 久久99网| 欧美日本另类| 求可以看的AV网址| 超碰在线免费| 新激情五月天| 婷婷网五月天| 91人妻人人操| 色婷婷丁香五月丁香| 久久99网站| 亚洲va欧美| www.色婷婷| 日日噜狠狠| 婷婷丁香人妻天天爽| 婷婷激情丁五月| 日本九九视频| 超碰免费观看| 天堂网亚洲色图| 久久婷婷成人视频| 国外亚洲成AV人片在线观看| 精品九九视频在线观看| 激情色五月天| 国产精品VA在线| 天天射色五月天| 日本色五月| 婷婷五月天中文字幕| 国产乱妇乱子伦| 激情综合五月婷| 99人人干人人操| 激情开心五月天| 五月丁香影院 | 色五月激情视频在线综合| 99精品在线观看| 丁香五月激情六月欧亚激情综合导航| 亚洲人人操| 99精品视频免费观看,| 黃色三级三级三级三级 qixing300.shrkbk.com www.jinbozs.com tianmiaosw.com | www.婷婷.com| 玖玖爱导航| 大伊香蕉精品视频在线| 另类视频五月天| 五月天激情网站| 丁香婷婷五色月| 丁香五月婷婷六月婷婷| 高清视频一区| 六月婷婷久久| 六月丁香婷婷综合狠狠爱夜夜爱| 综合久久综合五月天婷婷| 26.uuu丁香五月婷婷| 色五月av| 婷婷五月天 偷拍| WWW色色色COM| 精品久久久人妻| 丁香婷婷五月天色播| 婷婷五月丁香五月天| 色狠狠999综合| 九伊人网| 碰97久久| 91性高潮久久久久久久久| 五月天丁香婷婷社区| 婷婷9月天| 五月丁香久久综合91| 青青草免费公开视频| 中文激情网| 九九激情网| 色99网| 棕合影院色色| 99久久激情视频| 五月天开心激情综合网| 91精品久久久久久77777| 亚洲成人在线播放| 99色综合| 影音先锋日本三级资源| 婷婷色综合| 亚洲人人干| 色婷婷先锋| 成人综合网站| 九九aV| 99热在线观看亚洲区| 色婷婷狠狠| 五月天激情美女久久| 爱婷婷五月| 丁香五月激情啪啪| 婷婷五月综激情| 三级三久久线久久99久目本WW| 五月天综合在线| 人人草人人爱| 久99在线| 夜夜大香蕉婷婷丁香| 国产成人在线精品| 99热99日…..| 久久精品只有这| 婷婷色在线视频| 五月婷婷中文| 久久久久久久久久久久久久久久一道本| 天天综合网~91| 国产婷婷综合| 婷婷成人综合免费视频| 九九热在线视频观看| 亚洲啪啪网| 婷婷五月天av| 九月大香蕉| www.超碰在线| 婷婷五月丁香久久| 丁香五月激情啪啪| 婷婷五月丁香成人网| 色五月婷婷1| 丁香五月网络网络| 综合网五月| 色婷婷小说| 日韩丁香涩| 97极品在线| 婷婷AV丁香| 激情綜合W W W,激情五月天| 五月婷在线| 九九精品re免费视频| 久久婷婷五月天懂色| 天天天天做夜夜夜夜做| 深夜男女福利刺激影院一区完整| 婷婷丁香精品视频在线观看| 99久久婷婷| www,av好吊操| 99热久久这里只有精品| 色色婷| 99操逼| 99热网站| 99热这里都是精品| 五月六月婷| 丰满少妇猛烈A片免费看观看| 婷婷99丁香| 婷婷五月天影视| 色综合九九色综合88| 亚洲狠狠色丁香婷婷综合久久| 综合另类视频| 久久久久人妻精品| 超碰操日| 五月丁香激情综合网官网| 婷婷内射视频在线| 久久99免费视屏| 青草久久五月婷伊人| 亚洲精品影视| 97色色综合| 夜夜操天天爽| 风流少妇A片一区二区蜜桃 | 婷婷五月丁香香蕉| 伊人婷婷福利网| 欧美激情五月综合| 99热这里只有精品2| 色五月中文字幕| 色五月丁香五月婷婷五月成人网| 久久人妻少妇嫩草AV| 激情综合网五月在线播放| 色色亚洲视频| 六月婷婷综合| 久久这里都是精品| 国产特级毛片AAAAAAA高清| 99久久精品免费精品国产_国产精品久久久久久_国产在线|日韩_久久国产精品电影 | 欧美日韩成人| 开心五月天激情网| 丁香六月婷婷色播| 六月婷婷激情| 九九亚洲无码| WWW免费视频碰碰碰碰| 91人人看| 天天弄天天操| av国产精品偷| 五月色婷| 色5在线| 天天综合在线网| 九九aV| 色情丁香五月婷婷精品| 色噜噜狠狠色综合无码久久欧美| 婷婷五月婷婷| 婷婷五月AA五月在线| 婷婷五月天在线观看| 六月激情婷婷色| 狠狠干综合| 深爱开心激情网| 老妇六区| 五月亭亭性| 久久婷婷五月综合啪| 淫视馆AV在线| 婷婷丁香六月综合激情站| 五月香婷婷| 五月丁香在线国产| 综合激情四射一theav| 天天操天天操天天操天天操天天操 | 禁欲电影完整版在线播放| 色天天狠狠干| 久久精品日| 色天堂在线| 九九日本视频| 婷婷丁香成人色综合| 五月婷婷啪| 一本久道综合99| 亚洲天堂色色| 人人人va亚洲视频在线| 91AV婷婷| 熟女人妻一区二区三区免费看| 久热这里只有精品66| 热婷婷在线视频| 99热碰碰热| www.精品99| 欧美三级大片AA在线看| 97人人操人人| 色情一区二区播放| www999日韩精品| 色播五月婷婷| 婷婷五月免费视频| 五月婷婷六月丁| 日本道久久91| 久久婷婷五月天| 五月天久久丁香| 久久精典| 91av成人| 日本丁香五月| 182tv992tv人之初午夜免费观看| 97人凄人人操人人爽| 五月婷婷久久开心网| 日韩乱轮AV| 五月天婷婷爱| 五月丁香六月婷婷综合| 人妻人人操| xfplayav在线| 久久五月婷婷电影| 日韩无码人妻一区二区| 久久在线视频免费观看| 五月丁香色| 国产在线另类五月婷婷| 久久综合婷婷| 丁香五月婷婷99| 欧美叉叉叉BBB网站| 色婷婷五月天| 激情婷婷五月基地| 狠狠夜夜五月丁香| 日韩不卡DvD| 草久私拍| AV中文网| 婷婷五月综合激情| 91色久| 五月天亚洲色| 99久久久国产精品免费蜜乳tv| 婷婷综合久久| 五月色婷婷影院| 久久婷婷电影| 五月天婷婷丁香社区| 色噜噜狠狠色综合无码久久欧美| 91在线日本| 精品综合网在线| 国产成人片| 99在线观看精品视频| 婷婷五月丁香色综合| 热思思| 夜夜躁爽日| 无码免费人妻A片AAA毛片西瓜| 色色色色色色色色综合网| 欧美婷婷五月天综合| 日本色婷婷五月天成人电影| 99久久9| 婷婷射丁香| 99人妻碰碰碰久久久久| CAOBIBI| 1024在线观看免费视频| 玖玖九九超碰| 五月丁香狠狠爱婷婷综合| 4399啪啪视频| 婷婷五月色播天| 9久热精品在线视频| 超碰在线国产| 伊人综合网站| 性欧美大战久久久久久久83| 国产欧美精品AAAAAA片| 亚洲欧洲中文日韩久久AV乱码| 狠狠五月天| 涩综合婷婷| 成功精品影院| 日日影院 | 思思久久99热只有频精品66| 91 影音先锋| AV网在线| 一区二区三区四区牛| 极品五月天| 日韩精品一区二区刘| 91丨九色丨国产在线| 色99www.| 五月色网| ji'qing'luan'ren'lun| 都市激情小说婷婷| 伊人婷婷五月天| 婷婷丁香激情综合色情| 91丨九色丨国产打屁股| 久久xx| 婷婷丁香熟女| 99久精品| 欧美欧盟性爱网| 九九视频这里是精品五月| 久久香蕉婷婷五月天| 五月涩涩网| 婷婷狠狠操| 成人AV免费观看| 久久性爱视频| 99色嘟嘟精品网站| www.jiujiujiu| 在线观看五月婷婷网| 欧美性爱特黄一级aaaassss| 国产婷婷五月色情综合| av狠狠操| 美女100%露全身无挡网站| www.开心激情| 99这里只有精品视频| 色香蕉精品五夜婷| 日日噜噜夜夜狠狠久久丁香六月| 色播五月婷婷综合| 丁香六月青青草| 97操碰| 婷婷五月天狠狠色| 亚州视频九九99| 婷婷综合亚洲| av网站免费在线| 亚洲丁香花色| 色深爱五月| 精品久久人妻热| 欧美日比视频| 亚洲欧美成人在线观看| 成年人丁香五月| 99热在线只有精品| 婷婷激情六月中文| 操97| 欧美操我| 五月婷婷综合在线亚洲视频| 欧美操人| 天天爽天天| 欧美性色五月天| 99热九九这里只有精品| 国精产品一区二区三区| 欧洲电影在线观看免费版英语版| 色欲婷婷五月天| 婷婷五月天开心激情网| 五月天色综合服务平台| 日本片日本片祼观看网站在线看中文版网页在线看 | 99热丁香| 日韩精品色| 久久婷婷五月综合| 99精品久久久久久| 99热久久这里只有精品| 久久五月丁香婷婷| www,色综合| 91视频精品99| 亭亭五月激情亚洲在线| 成人色色综合| 国产婷婷色五月| 六月婷婷色色色| 91丨九色丨老熟女激情| 日本操B视频在线观看| 国产精品第一国产精品| 26uuu.| 亚洲六月色| 亚洲网站999| 国产欧洲欧洲精品久久| 99热免费| 色综合大香蕉| 亚洲顶级VA在线观看-高清完整版在线影院观看-S022AV | 久久奄也去色色网站| 丁香六月情| 大香蕉婷婷丁香视频在线| 97色色综合| 99在线免费视频播放| 五月亭亭狠狠| 色婷亚洲| 亚洲第一色区| 99re最新地址| 成人视频婷婷| 五月丁香黄色视频| 婷婷五月天精品| 色五月丁香伊人五月| 亚洲经典小视频| 亭亭五月天黑人2014| av国产精品| 九九色人| 色播五月婷婷| 夜夜躁狠狠| 欧亚成人A片一区二区| 玖玖99福利| 色婷婷成人做爰A片免费看网站| 丁香五月在线视频| 极品少妇XXXX精品少妇偷拍| 天天色天天爱天天爽| 激情综合亚洲色婷婷五月| 91精品国产综合久久密臀| 人妻 性久久久久久| 毛片新网地| www,av好吊操| 婷婷色六月| 亚洲无码11| 色综合色色| 天天日天天干天天操| 99热欧美| 9久热精品在线视频| 国产性爱大片久久| 丁香五月www| 久99久视频免费观看| 久久精品婷婷| 中文人妻主播久久| SS丁香五月婷婷| 思思热精品在线观看| 婷婷五月天天爽| 综合啪啪| 少妇AB又爽又紧无码网站| 久久婷婷老| 色色九区| 丁香五月电影| 五月丁香好婷婷A片网| 婷婷色狠狠| 强伦轩人妻一区二区电影| 99热最新网址| 99视频这里有精品| 日本123区日韩欧美不卡在线看| xxxx久| 亚洲精品又粗又大又爽A片| 丁香五月自拍| 亚洲色图啪啪| www.五月天婷婷| 婷婷五月天a| 影视av久久久噜噜噜噜噜三级| 五月丁香大香蕉| 五月丁香六月婷婷综合网站 | 深爱激情五月网| 婷婷丁香五月天综合AV| 丁香婷婷影院| 国产成人综合网| 熟女人妻一区二区三区免费看| 免费观看高清无码| 五月婷成人| 天天干天天叉| 国产 码在线成人网站| 91男人操女人视频| 日韩欧美成人片| 99热6这里只有精品6| 五月婷婷中文字幕| 色综合色色| 丁香五月婷婷亚洲激情四射| 天天摸天天舔在线视频| 婷婷激情五月色综合| 狠狠操狠狠爱| 草榴视频黄色网| 丁香五月天啪啪| 丁香婷婷十月| 深爱激情五月网| 操b视频在线观看一区二区| 色五月综合激情| 婷婷五月图片小说视频| 日韩色色视频| 日韩大片艹艹| 亚洲女婷婷五月基地综合久久久| 日韩啪| 蜜臀综合久草| 亭亭玉立国色天香| 丁香综合婷婷五月天| 青青久在线视频免费观看| 久久久99婷婷久久久久久| 欧美英丁香开心快乐六月天网| 日韩亚洲视频| 国产亚洲色婷婷久久99精品91 www.riverspirits.org www.hnnun.com www.changh | 天天揷综合网| 色色色欧美| 九九综合九九| 久9免费视频| 色婷婷综合影院| 青青草视频免费观看| 久热欧美| 思思热在线视频精品| 久久一级AV| 欧美五月丁香啪啪响视频| 婷婷九月在线| 日本玖玖在线| 午夜不卡成人一区二区| 激情久久伊人| 五月天开心网| 色婷婷色人人射| 五月婷亚洲精品AV天堂| www,色综合| 就爱射中文字幕资源网| 久久视频在线视频| 久久婷婷成人视频| 亚洲最大在线| 啪精品| 国产,欧美,日韩,性爱| 日韩免费视频| 涩综合在线| 丁香五月天色综合| 亚洲一区国产传媒| 人妻激情综合| AV操逼网| 操人久久| 五月激情射| 99久在线精品99re8| 日本美女97在线视频| 丁香五月aV| 99热这里都是精品| 激情五月深爱五月| 丁香五月天堂网| 五月丁香激情综合网| 99热亚洲| 天堂资源欧日浪女在线播放| 伊人网啪啪| 激情久久久久久久久久| 色欲午夜无码久久久久久张津瑜| 九九久久污| 九九人妻福利| 色色婷婷五月天| 99爱欧美| Www.狠狠| 99re在线精品视频| 深爱激情五月网| 国产精品天天狠天天看| 国产精女同一区二区三区久| 激情婷婷五月天丁香| 综合一区二区三区| 婷婷丁香社区网| 另类图片 五月激情| 亚洲第一视频 久久| 五月色亚洲| 99爱视频在线| 黄色片久久| 超碰色天堂| 人妻久久久久| 五月天激情网页| 婷婷五月激情网| 激情五月天 婷婷| 欧美情色电影一区二区| 日韩成人精品中文字幕电影| 色五月成人婷婷| 99re6在线视频精品免费| www。五月天。com| 午夜微拍福利| 婷婷丁香18| 人人妻人人澡| 亚洲综合色婷婷| 色五月五月天| 激情五月天福利| 在线观看av网站| 99久久精彩视频。| 色135综合网| 五月伊人婷婷| 激情AV在线| 欧美色婷婷| 人妻尝试久久久久久久久久久久| 一区中文字幕电影| 在线中文字幕av| 色播五月婷婷综合| 亚洲一级 片内射网站在线观看| 99热在这里只有精品| 婷婷丁香色情| 婷婷五月成人| 五月婷婷开心综合| www色五月| 夜精品无码A片一区二区蜜桃| 五月天婷婷丁香六月| 国产成人高清| 少妇被躁爽到高潮无码文| 婷婷.com| 丁香色色色| AV在线不卡播放| 激情五月天婷婷| 开心五月天私房婷婷| 成人av在线网址| 天天日天天插| 久99热在线观看| 天堂AV在线看| 超碰碰碰碰| av在线激情| 精品亚洲VA网站| 亚洲亚洲人成综合网络| 九九色影视| 天天插天天射| 国产女18毛片多18精品| 伊人丁香六月婷婷| 91狠狠色| 婷婷综合影院| 亚洲aV写真天天综合网久久| 丁香五月成人| 五月丁香综合| 婷婷在线综合| 永久免费一区二区三区| 五月婷婷开心综合| 亚洲午夜在线视频| 亚洲久久视频| 五月天.com| 激情综合网址| 婷婷爱五月| 欧美婷婷色五月网| 丁香五月天视频在线播放| 激情五月天色播| 婷婷放心五日爱| 色五月婷婷色| 欧美日韩成人免费在线| 亚洲va国产va天堂va综合va| 亚洲一二三网| 五月综合影院| 国产一区二区av免费| 激情婷婷五月天网址| 国产激情综合| 丁香婷婷精品视频| www.91色| 五月天伊人av| www.狠狠操| 丁香五月婷婷动漫| EEUSS鲁片一区二区三区| 久久综合激情五月天| 中文AV网| 激情婷婷五六月天| 99精彩视频| 五月婷婷综合色啪| 夜精品无码A片一区二区蜜桃| 99区视频| 一级操逼大片| 日韩欧美一级大黄网站| 久久婷婷五月综合色和| 色狠狠综合入口| 国产色香蕉精品五夜婷| 久久九九国产精品怡红院| 超碰国产AV| www久久久久久久97| 色婷婷久久综合| 天天狠狠夜夜狠狠2023| 99热无码精品| 91se视频| 婷婷色五月色| 热99精品视频| 丁香五月婷婷六月| 天天日狠狠| 精品视频二级九九| 色婷婷成人| 五月丁香久久综合| 五月天大香蕉| 久热中文字幕在线线观看| 五月婷av| 色综合久久44| www色婷婷久久综合久色| 丁香五月天AV在线 | 欧美日本一区二区三区| 色综合香蕉视频| 五月婷亚洲精品AV天堂| 99久久国产成人精品| 六六久久黄色| 91色吧网| 涩涩五月天综合| 九色成人AV在线| 99成人| 九九家庭影院| 色吧网综合| 五月婷婷三级| 丁香五月天婷婷久久| av婷婷丁香| 欧美六月| 色婷婷香蕉丁丁网| 第五婷婷伊人丁香色| 精品亚洲国产成人A片在线鸭王| 六月婷婷九月丁香亚洲综合| 99热碰碰热| 久久综合婷婷激情| 色婷婷88| 亚洲日韩26uuu| www.综合久久.com| 欧美经典片免费观看大全| 九九热只有精品| 99综合视频在线| 久久久久九九九九视屏小说88| 五月综合丁香婷婷| 成人在线网| 五月丁香啪| BBWCUCKOLD精品熟妇| 色六月 婷婷| 久久日曰| 狠狠狠狠狠狠色| 婷婷香香五月| 激情五月婷婷伊人| 深爱激情六月| 亚洲va成人va成人va在线观看| 在线另类视频| 99精品热| 老妇六区| 超碰在线网站| 99热超碰在线| 亚洲五月天天| 婷婷综合六月| 美欧日韩国产成人在战| 激情五月婷| 婷婷欠久少妇| 国产av天堂| WWW.婷婷| 精品皮股午夜AV| 亚洲激情校园| AV在线资源| 99啪啪网| 99re免费视频| 2050人人操免费工开爱| 99熟女| 五月婷婷六月丁香| 婷婷九月在线| 色爱五月天| 五月花亭亭| 先锋资源996| 華人性愛AV在線| WWW.99热| 色吧五月婷婷| WWW久| 大香人妻| 99色人| 色亭亭影园| 丰满老熟妇BBBBB搡BBB| 婷婷五月天开心网| 色99在线视频| 欧美日韩成人在线网| 五月婷婷五月天激情网| Www.婷婷五月| 狠狠狠狠狠狠狠狠草| 丁香五月成人论坛| 麻豆科斗777| 亚洲视频a| 99婷婷| 婷婷色色五月天| 男女99免费视频| 九九久久五月天综合伊人| 亚洲婷婷婷| 色欲五月婷婷| 激情中文在线| 六月撸婷婷| 大香蕉婷婷久久| 日本三级中国三级99| 久久久99婷婷久久久久久| 综合色影院| 五月天婷婷社区久久综合| 国产色99| 丁香六月婷婷综合啪啪| 99热久久这里只有精品| 香蕉久久国产av一区二区| 国产精品视频网| 大香蕉欧美在线| 超碰资源在线| 国产免费一区二区三区三州老师F1F1.CC| 99热精品网| 九热久| AV在线观看网站| 日韩一级片| 婷婷六月激情小说网| 色五月丁香总合网| 五月天激情网址| 激情美女五月天激情在线| 99免费视频网| 色久丁香五| 99碰碰视频| 国产成人亚洲综合A∨婷婷| 久久婷婷影院| 久久婷婷七月丁香| 九九综合88| 青青草色在线视频观看| 操操操操操操婷婷五月天| 狠狠干2007| 3www激情| 天天综合五月天| 丁香桃色网| 日韩成人无码| 五月丁香日逼| 色婷婷综合综合网| 欧美日本综合网| 欧美综合激情五月| 激情综合五| 婷婷综合激情| 五月四色激情| 91ncm视频| 久一这里有精品国产| 99综合一区| 久久性操| 亚洲V国产V欧美V久久久久久| 31色区视频免费看| 97婷婷狠狠| 五月丁香av在线| 99热这里只有精品在线观看| 精品久久艹| 99欧美精品99日本精品| 182TV亚洲| 97婷婷丁香五月天激情图片| 夜夜干夜夜操| 婷婷六月综合激情| 久久久日韩特色特黄AAAA| 婷婷五月花| 一本综合丁香日日狠狠色| 9l视频自拍9l九色9l成人| 202丰满熟女妇大| 亚洲AV无码成人精品区电影网| 深爱激情中文五月天av| 亚洲综合色棒| 丁香五月天色婷婷| 五月天激情亚洲| 亚洲性受XXXX五月丁香| 婷婷六月五月| av九九| 久久五月婷婷丁香| 五月婷在线色视频| 久久婷婷色| 丁香影院五月综合| 婷婷五月激情四月综合| 六月丁香激情网| 五月天社区| 久久综合中文字幕| 欧美久久婷婷| 精品久热| 欧美视频五区| 精品草原久久视频| 激情五月久久| 大香线蕉伊人| 五月天精品综合| 激情久久久| 91九色丨国产丨爆乳| 2025年最新亚洲在线欧美| 99久久综合网| 99热在线观看精品| 五月天.com| 91丁香色| 婷婷久久免费看| 色五月天丁香| 99手机在线精品视频| 凹凸操Av| 99re热视频这里只精品| 91五月天| 91凹凸在线| 91趴趴| 狠狠色综合五月| 777精品久无码人妻蜜桃| 91丨九色丨大屁股| 丁香五月婷婷偷拍| 丁香五月婷婷久久久| 天天舔天天插天天干| 婷婷综合在线| 天天玩夜夜操天天爽| 欧美婷婷日本| 久婷婷五月天影院| 色色AV色色色东莞| 丁香操逼| 丁香激激情网| 亚洲天堂婷婷丁香| 丁香婷婷激情五月| 99超级碰免费视频| 热九九精品| 久久亚洲婷婷| 成人亚洲精品| 91综合国免费久入| 久久久性爱网| 婷婷操超碰| 久久免费丁香| 女人被男人吃奶到高潮| 久久9RE热视频精品98| 五月丁香六月情| 亚洲国产另类av| 五月综合激情视频在线| 色九九一二| 最新va在线播放| 日本人人干| 99ri精品视频在线观看| 九九99精品| 久久女婷| 秋霞电影理论|