欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,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
返回資訊列表
99性感视频| 五月天色丁香| 婷婷一本和五月丁香| 久久九九亚洲| 久草丁香婷婷1024| 日本欧美成人片AAAA| 91午夜激情| 色欲婷婷夜夜| 91精品久久久久久| 日韩综合久久| 久操操| 婷婷亚洲丁香五月| 色久在| 久久婷婷五月天激情四射| 精品久久久久成人码免费动漫| 亚洲综合视频网| 婷婷激情五月综合丁香社| 五月丁香狠狠爱| 99玖玖精品| 专区无日本视频高清8| 97色色综合| 色日本网| 开心婷婷丁香五月| 99热精品免费| 少妇人妻人伦A片| 伊人网色婷婷五月天| 久久五月婷婷电影| 亚洲综人色综网| 色一情一乱一乱一区9| 亚洲中文字幕在线观看| 久热婷婷综合| 亚洲三A| 精品成人无码A片观看香草视频 | 深爱五月激情网| 七七九色| 九九色热| 青草久久五月婷伊人| 九九99久久| 色五月超碰| 国产亚洲色婷婷久久99精品91 www.riverspirits.org www.hnnun.com www.changh | 91中文狠狠综合| 26UUU精品一区二区| 99热青青草| 五月激情天| 狠狠草在线观看| 亚洲欧美国产高清vA在线播放| 亚洲AV无码久久精品色欲| 9er热在线精品视频| av九九| 婷婷六月久久综合导航| 五月天大香蕉| 黄色录像网点| 91丨九色熟女丨首页| 五月婷婷久久网| 欧美特大片黄| 色婷婷文字幕| 99视频久久| 婷婷五月丁香啪啪| 五月天国产成人| Av狠狠色丁香婷| 六月婷婷俺也去| 久久99热这里| 精品久久66| 婷婷五月天六月| 日韩欧美骚货| 久久综合中文字幕| 色色综合网站| 婷婷五月丁香性爱| 四色永久成人网站| 六月婷婷狠狠做| 青草激情在线| 国产亚洲99| 六月五月丁香五月欧美| 天天檫天天爽| 在线观看中文字幕亚洲| 被强行糟蹋的女人A片| www.五月天| 婷婷99视频在线| 日韩av在线播放综合网| 99热大香蕉| 大香蕉av在线| 五月天综合在线观看| 丁香激情五月| 牛色色碰| 久久ww| renrencaoni| 这里只有精品99www| 亚洲va欧洲va国产va不卡| 丁香六月婷婷色XXXXX| 国产精品视频免费看| 五月婷婷综合网| 另类图片五月天| 玖玖色综合色| 亚洲视频在线观看| 免费成人网在线观看| 色播婷婷五月天| 亚洲综合色丁香婷婷六月| 日本人人xxx| 久久精品99| 久久99国产综合精品免费 | 五月婷成人网| 精品99在线| 久久538| 久久久久9久无码视频| 91人碰| 欧美va亚洲va| 色综合区| 99天堂网最新| xxx日本东京热| 亚洲激情网| 久9热| 大香蕉丁香| 欧美噜噜久久久XXX| 成 久久| 大香蕉AV在线| 三级毛片7979| 男人天堂AV在线一区二区| 99热欧美在线观看| 99在线资源| 国产日产亚洲系列最新| 久久婷婷激情五月天一区二区| 综合色激情| av色色国产| 51精品国内探花| 精热在线综合网| 婷婷丁香小说| 五月婷婷国产| 五月情色天| 天天综合精品| 亚洲成人网无码| 99只有精品| 无码少妇高潮喷水A片免费 | 色五月97| 青青草成人网| 色原狠狠综合| 天天日夜夜拍| 午夜福利8055| 五月天婷婷激情综合| 粉嫩AV久久一区二区三区| www色五月| 婷婷淫淫狠狠六月| 在线综合91| 丁香六月激情综合网| 综合色图区| 九九这里有精品| 思思re视频在线| 五月亭亭直播| 激情深爱五月婷婷| 九九热思思热| 国产美女无遮挡裸体毛片A片| 九九综合九九| se99视频| 伊人丁香六月婷婷| 97碰碰碰免费公开在线视频| 2023天天日夜夜爽| 五月丁香色欲| 婷婷深爱五月丁香| 色色色色色色色色色色色色色五月天| 天天色色天天| 99热热热国产超碰| 狠狠色97| 狠狠搞五月天| 久热久| 久久五月婷婷电影| 成人做爰高潮A片免费视频| 欧美极品999| 综合色色网| 激情亚洲婷婷| 婷婷永久在线| 丁香六月狠狠| 99热个人在线| 2025天天操| 五月婷婷综合在线亚洲视频| 日日爽天天| 丁香桃色网| 免費观看aV在线网址| 丁香五月av在线| 色五月婷婷成人| 亚洲精品性色| 国产综合久久久777777| 国产精品久久久久久白浆色欲| 激情婷婷色小说| 久99久在线| 五月丁香六月色婷| 亚洲精品V天堂中文字幕| 97人人草| 人人妖人人97| 丁香五月欧美午夜视频| 99免费视频久久| 色色网站| 99久久er| 成人版视频在线观看| 99热播放| 五月婷婷co.m| 天堂综合久| 久久伊人婷婷| 婷婷综合五月天激情| ..真实国产乱子伦对白在线_欧| 插插五月天| 在线不卡AC| 伊人啪啪网| 色色色色色五月丁香| 中文字幕不卡+婷婷五月| 天天色播| 97涩婷婷| 久久这里都是精品| 中文乱子伦视频| 九九久久高清| 激情第四色| 都市激情小说婷婷| 色六月婷婷| 深爱五月婷婷| 美国十月色婷婷在线观看| 999婷婷综合| 国产精产国品一二三在观看| 开心婷婷中文字幕| er99免费视频在线| 激情五月婷| 99国产精品久久久久久久久久久| 婷婷色导航| 九九国产精视频| BBWCUCKOLD精品熟妇| 久久婷婷五月综合色和| xxxx五月激情| 91视频久久久| 青草视频在线观看视频| 成人短视频在线| 无码毛片992367| 9 大屁股在线视频精品| 国产欧美性成人精品午夜| 激情五月天开心总和网| 五月丁香直播| 狠狠综合久久| 久久精品五月| 天天日色情| 亚洲熟女色| 天天色,天天操,天天射| 一级片sese片.COM| 天堂爱啪啪| 99久久国产宗和精品1上映| 久久天天| 中文乱子伦视频| 99色婷婷| 色99日韩| 3p久久| 内射人妻视频国内| 天天日夜夜爽| 亚洲色碰| 天天干一干| 狠狠狠狠狠操| 丁香成人综合| 99热这里只有精品国产免费| 色噜噜综合网| www.色综合.com| 婷婷影视久久| 4399无码视频| 成人无码精品1区2区3区免费看| 在线观看av网站| 九一99| 激情五月天综合图片小说网站| 狠狠色五月| 蜜臀综合久草| 99热10在线高清播放| 色婷婷色99国产综合精品| 色情五月天丁香社区| 天天摸夜夜夜| 79精品视频| 情欲综合网| 丁香婷婷大香蕉| 97五月婷婷| 黄色笑话深爱激情网丁香五月婷婷啪啪啪啪啪 | 亚洲AV免费在线| 99色综合| 99资源在线| 国产精品人妻在线网址| 婷五月天天| 天天综合.com| 激情五月小说婷婷| 九九视频这里只有精品| 人人色人人弄人人操| 99se丁香| 色婷操逼| 色六月视频| 色播五月婷婷| 九九热最新视频| 99精品在线观看| 五月天激情美女久久| www.99操| 伍月婷婷免费视频| 亚洲久久激情| 东京热免费视频| 成人国产欧美大片一区| 色娸娸综合网| 五月天激情久色| 色婷婷的五月天| 欧美激情综合| 色约约视频一区二区三区四区五区| 久久9久久| 天天日天天狠狠操| 国产精品人人妻人人爽| 专区无日本视频高清8| 超碰免费电影| 五月丁香婷婷AV天堂| 可以看的AV网站| 久久99视频| 免费在线观看AV网站| 最新日韩久热免费视频看看| 天天色色婷婷| 激情五月丁香五月| 99毛片| 久久五月丁香激情综合| 国产性爱亚洲是图| 夜夜大香蕉婷婷丁香| 思思热久在线观看视频| 成人在线不卡| 99热九九在线| 人人爱人人添| 桃色成人网| 97色色婷婷五月天| 日日噜狠狠色综合久| 丁香六月婷| 五月婷综合激情| 综合亚洲五月天| 婷婷 丁香 精品| 九九视频在线观看视频6| 激情六月天婷婷| 噜噜噜精品欧美成人在线观看| 亚洲中文av| 久久天堂色| 五月丁香六月婷婷免费| 丁香五月av| 激情五月天的婷婷| 五月婷婷五月色| 1级欧美日韩| 六月99天天婷婷激情综合| 噜啊噜在线| 成人 在线观看国产| 五月天狠狠网站| 91色吧网| 亚洲情色一区| 色狠狠综合| 百度4399有码精品V在线观看| 思思热在线视频99| 果冻传媒A片一二三区| www.天天干.com| 免费亚洲婷婷中文字幕| www.五月婷婷久久.com| 色香蕉影院| 97碰碰在线观看视频| 五月情色天| 日韩成人影片网站| 综合色、色综合| 色五月婷婷 成人| 色五月婷婷久久| 人妻久热| 五月天com| 亚洲综合婷婷| 亚洲中文字幕网| 激情丁香五月天综合| 九九热黄色| www.日韩国产| 99视频这里有精品| xfplayav在线| 丁香五月激情欧美| 男人天堂99| 综合久久影院| 狼人久草| 狠狠草综合网| 99色日本| 丁香五月av| 99爱免费在线观看| 五月丁香综缴情性爱| 欧美精品狠狠色丁香婷婷| 26UUU精品一区二区c〇m| 久久91久久精品久久| www.激情五月天com| a毛片二逼wwwwwwwwww| 色五月综合在线| 亚洲AV无码成人精品区电影网| 五月综合色| 色婷婷97| 色级停停| 女婷久久| 夜夜操激情| 黑人无码一区| 99国产精品久久久久久久久久久| 久久人妻www| 亚洲 视频 导航 一区| 9久久精品| 久久视频66| 天天日中文| 午夜做爱影院| 色婷婷五月天激情| 超碰爱爱爱| 久久这里都是精品免费| 婷婷情色五月| 天天操夜夜操| 四月婷婷丁香五月| 日本色图综合| 久久婷婷色| 色99在线观看| 天天操无码| 综合久久高清| 亚洲视频五区| 99热6精品| 九久9精品| 婷婷91| 色婷婷中文在线| 久草a片| 99色五月| 婷婷精品在线| 超碰AV在线| www.色婷婷| 日本欧美在线| 五月婷视频| 66久久视频在线| 影音先锋女人AA鲁色资源| www色婷婷久久综合久色| 99热这里只有精品4| 大地资源色婷婷视频在线| 美女va| 99这里都是精品| 六月婷婷网| 亚洲亚洲人成综合网络| 天天干天天射综合网| 91麻豆国产三级精品福利在线观看| 色综合丁香| 婷婷五月天国产手机在线视频观看| 人人操操| 人人妻人人澡人人爽| 国产精产国品一二三在观看| 日日噜噜夜夜狠狠久久丁香六月| 五月天精品| 婷婷五月天首页| 婷婷六月丁香在线| 亚洲小视频免费播放| 五月天婷婷激情网| 久久六月综合| 26uuu色五月| 99久久9| 综合色五月天| 国产九九一区二区三区| 天天综合色| 婷婷激情社区| 婷婷五月天激情网站| 亚洲第一黄网| 日韩色色视频| 亚洲综合色棒| 99热国产精品| 五月综合人妻| 操人91| 色婷婷在线视频久| 久久久91精品| 五月丁香天堂网| 九色视频91疯狂| 六月丁香五月婷婷| 开心深爱激情网| 色狠狠色| 日本色啪| 99久热这里只有精品| wwwxxx五月婷婷小说| 4399欧美另类视频| 亚洲精品又粗又大又爽A片| 欧美va欧美va差| 超碰激情网| 亚洲99精品欧美一区| 热久久77777| www.99热国产| 天天舔天天插天天干| 五月丁香综合久久| 能直接看的AV网站| 天天日天天草| 九色PORNY9l原创自拍| 久久色天堂| 婷婷五月电影院| 91碰碰碰| 久久人妻熟女一区二区| 亞洲自怕| 六月久久婷婷| 天天操夜夜啊| 先锋av性爱成人电影| 极品五月天| 激情婷婷五月天日本系列 | 五月天综合在线| 丰满女老板BD高清A片| 国产精产国品一二三在观看| 色婷婷第四色| a在线观看| 天天日夜夜B久久| 99热综合在线观看| 六月婷婷综合| 六月激情网| Aaa久久| 久青草大香蕉| 婷婷激情丁香五月天综合| 激情网第四色| 啪啪操超碰| 色色色网站| 亚洲av电影网站| 丁香六月婷| 开心久久五月天| 婷婷激情五月综合丁香社| 久久婷婷五月| 五月天激情综合网| 激情五月丁香六月综合AVXXXX| 婷婷综合色色| 26uuuuuuuu国产| 六月婷久久| 国产欧美精品AAAAAA片| 丁香六月婷| 五月开心六月婷婷在线播放网站| www.色九月| 欧美性生交XXXXX无码小说| 亚洲av电影网站| 另类综合激情| 五月婷婷开心综合| 五月天激情小说| 91操在线观看| 怡红院精品视频久久久久久久久| 婷婷色五月激情| 影音先锋五月婷婷| 久月丁香爱婷婷综合| 五月天婷婷在线播放| 天天日天天舔| 日韩久久色| 另类图片婷婷五月天| 九热视频| 丁香五月777| 激情丁香网| 在线不卡视频| 六月激情婷婷综合| 激情五婷网| 丁香六月视频| 五月丁香狠狠爱| 欧美日韩中国| 丁香五月婷婷天| 国产精品成人在线| 国产精品久久..4399| 婷婷丁香人妻天天| 玖玖色综合色| 午夜精品777| 五月婷婷色色| 婷婷五月丁香综合| 色色婷婷丁香五月天| 五月天婷婷Av| 婷婷深爱网| 欧洲色色| 久久性爱视频免费| 久久xxxx| 九九九九九九九热| 国产五月婷| 亚洲色色精品| 五月成人网站| 久久激情视频| 亚洲无AV在线中文字幕| 中文字幕91,综合| 99色五月| 综合五月草| 91婷婷五月天综合视频| www,99热| 99久在线精品99re8热| 丁香五月社区| 97久久综合网| 久久婷网| 欧美日韩大黄| 欧美成人性爱网| enecarbon-materials.comWu染请涟系Bao护@wip1688 | 99激情视频| 久久一级AV| 野外99热| AV色五月婷婷| 五月天婷婷无码视频| 99热综合色图| 国产精品18久久久| 免费99色| 婷婷五月69| 26uuu欧美亚洲日韩| 色色成人網| 亚洲看av的网站| 噜噜视频| 色综合五月婷婷狠狠干| 老美AA片| 日日夜夜久| 五月婷婷久久久久| 色999;丁香五月| 狠狠舔| www超碰| 丁香5月啪啪| 激情综合文学| 狠狠色五月| 色啪网| 极品少妇高潮啪啪AV无码| 日批在线看| 色丁香五月婷婷综合久久| 五月亭亭开心网| 五月停亭六月,六月停亭的英语| 99这里只有| 六月丁香婷婷网| 色综合婷婷99| 激情四射五月天| 人妻性爱av网站| ..真实国产乱子伦对白在线_欧| 色婷婷五月天天天干天天操天天爽 | 丁香涩涩爱| 中文精品在| 激情五月天综合网| 五月六月伦理| 天天操夜夜啊 | 婷婷欧美激情| 丰满老熟妇BBBBB搡BBB| 天天爽天天日| henhencao国产在线| 亚洲色区17| a在线观看| 久久99热 这里有精品| 婷婷玖玖丁香| 亚洲字幕AV一区二区三区四区| 深爱婷婷丁香五月激情| 新久久五月天激情| 婷婷六月综合基地| 丁香五月五月婷婷欧美大香蕉| 激情五月婷婷五月| www婷婷亚洲| 亚洲乱码w在线观看| 欧美噜噜免费观看| 伊人婷婷五月天av| 国产91资源在线| 成人视频在线免费播放| 亭亭五月天黑人2014| 免费啪啪亚州视频| 99久久婷婷综合| 丁香婷婷社区| www.射伊蕉婷婷| 夜夜夜叫天天天做| 精a品a视a频| 欧美操逼天堂| 日本丰满久久| 一级片操逼视频| 大香蕉520| 婷婷五月丁香五月综合网| 欧美色色色色色色色色色色影视| 超碰99久久| 精品国产a| 亚洲熟妇AV乱码在线观看| 色丁香五月| 激情网婷婷婷| 五月色丁香婷婷中文字幕| 久久99网站| 无码动漫av| 大香蕉久久久久久久久| 婷婷综合中文字幕| 97色婷婷| 国产肥白大熟妇BBBB视频| 丁香五月色色| 另类激情五月| 五月丁香久人妻中文| 五月丁香综合激情网| 青青福利网| 五月激情久久综合| 激情六月五月婷婷综合网| 婷婷中文字幕| 日木狠狠干| www.99婷婷| 99在线视频播放| 51XX嘿嘿午夜无码| 六月激情网| Caoporn公开| 七七久久综合| 伊人成综合五月婷婷| 玖玖婷婷免费| 婷婷五月天在线一区| 亚州性爱99| 色播丁香婷婷五月激情| 伍月婷丁香花全集| 色婷婷久久综合丁香五月| 久久人人人人妻| 日本九九热| 婷婷五月天成人综合网| 免费观看欧美成人AA片爱我多深| 天天综合社区| 婷婷五月色惰| 91人人爽狠狠狠| 亚洲中文字幕av| 99无码黄色视频| 99热只有| 丁香综合| 婷婷激情五月视频| 99操久久| 26uuu国产色| 五月四色色| 这里只精品热在线18| 色色AV色色色东莞| 婷婷久久五月丁香| 五月丁香在线| 久久99激情五月天| 日本高清久| 高清无码网址| 色色色com| 亚洲无码AV片| 欧美日韩成人| 欧美色小说婷婷| 五月婷亚洲精品| 综激情网| 日本不卡高字幕在线2019| 欲色人妻| 大香网伊人久久综合| 五月天久久婷婷婷| 亚洲激情五月天| 婷婷综合在线| 天天草女人| 性爱人人网| 激情五月激情综合俺也去婷婷小说| 婷婷五月激情片| 丁香婷婷六月男男| 欧美在线视频99| 影院久久久| 九九热黄色| 五月天在线视频尤物视频在线看| 五月婷婷成人| A片试看120分钟做受视频红杏 | 日本黄色在线观看| 色婷婷国色天香综合| 色色色com| 激情五月婷婷| 色色激情五月| 热99热9| 岛国AV网| www.com.色色| 五月婷综合性中心| 日韩九区| 99精品偷拍视频| 99爱免费在线观看| 99在线视频播放| 狠狠ri| 六月婷婷天天操夜夜爽视频| 丁香婷婷基地| 丁香五月激动深爱欧美| 久久婷婷色| 天天澡天天狠天天天做| 牛色色碰| 99这里只有精品国产| www.日韩国产| 亚洲成人中文字幕| 天天干天天干天天干天天干天天| 色五月在线观看| 去色色五月天| 天天精品视频在线观看视频| 91中文在线| 日韩成人无码人妻| 99热这里只有精品首页| 久久综合26p| 丁香五月在线视频| 六月丁香五月天| 久久人人九| 久久久久久人妻久久久久久久久久人妻久久久 | 色爱综合网| 丁香婷婷综合影院| 伊人超碰| 成人精品视频99在线观看免费| 99精品自拍视频| 99九九在线视频| 丁香五月www| 可以免费看AV网站| 丁香五月激情久久麻豆| 五月天婷婷色播| 日韩成人精品中文字幕| 婷婷五月激情的图片| 久操人妻| 久综合网| 99热久| 思思热天天看| 欧美这里只有精品| 天天做天天爱天天搞| 五月天激情影院| 综激情网| 丁香成人五月天| 亚洲婷婷丁香| 9久精品| 国产日比| 婷婷激情五月| 激情亚洲五月| 9色婷婷| 久99热| 人人97操| WWW.99视频| 日韩AV片| 五月亭亭开心网| 色七色九九| 国产欧美精品AAAAAA片| 五月天激情日色在线| 丁香五月无码| 蜜桃婷婷狠狠久久综合| 五月丁香六月激情综合| 色色色999| 超碰在线国产| 久久有码| 久久码久久无清| 久久3p| 亚洲综合激情五月久久| 一本大道嫩草AV无码专区| 99精品在| 日本毛片内射| 岛国AV网| 色五月婷婷激情五月| 色综合播放| 999精品乱码77777| 五月天激情国产综合婷婷婷就去爱 | www,99色| 人妻av在线| 青青草a在线| 国产精品男人AV不卡| 色噜噜狠狠色综无码久久合欧美| 久热大香蕉| 在线看的免费网站| 亚洲视频色婷婷| 亚洲成人免费在线| 免费观看欧美成人AA片爱我多深| 操日挥操日日| 色综合久久88色综合天天99| 免费无码毛片一区二区A片| 国模淫穴色图| 超碰大香蕉网| 久久艹 五月天| 综合一区二区三区| 这里只有在线精品| 在线看av| 免费视频WWW在线观看网站| 狠狠狠狠狠狠狠狠| 2015好吊操| 婷婷字幕在线| 婷婷激情社区| 五月成人综合| 激情五月综合色| 国产精品A片在线| 五月婷婷婷| 亚洲色色香蕉| 丁香五月色色色色| 欧美日韩成人在线免费| 极品人妻VIDEOSSS人妻| 久久五月激情综合| 开心五月婷婷99| 91五月天| 99热一本久道| 免费无码毛片一区二区A片| 七七色色综合| 五月丁香六月花| 婷婷久久综合久| 五月天婷婷丁香人人操91| 日日操日日撸| 五月婷婷六月色| 亚洲精| 日韩免费乱轮网站| 91久久九久久九久久九久久九久久| 人与禽A片啪啪| 影音先锋色婷婷| 91成人性爱视频| www.五月婷婷久久.com| 五月天丁香六月综合| 午夜日日| 九九综合网| 欧美性猛交99久久久久99按摩| 久久99精品九九久久久婷婷| 婷婷丁香小说| 人人草人人爱手机视频看看| 99热20| 色五月综合激情| 在线视频99| 国产91在线视频| 射婷婷中文字幕| 国自产拍偷拍精品啪啪一区二区| 大香网伊人久久综合| 99九九视频| 日本色五月| 五月激情婷婷丁香| 武汉美女啪啪视频免费一级片| 99热99思午夜精品| 无码九九| 99热99在线| 成人精品在线观看| 97碰啪啪| 日韩欧美一级大黄网站| 婷婷丁香激情综合色情| 婷婷五月丁香超碰| 97欧美在线| 日亚二欧美| 韩国19 主播内部福利vip免费播放| 黄色AAAA韩国guochansanji | 久婷首页| www.射伊蕉婷婷| 99人人干人人| 亚洲AV第二区国产精品| 久久最新色| 色你久久| 九九热这里只有精品7| 91丨九色丨高潮丰满日本| 99热主页日本| 99亚洲天堂| 色噜噜狠狠色综合伊人| 国产阿姨日皮艹逼内射视频| 第四色婷婷最爱| 亚洲十月婷婷综合| 九九无码视屏| 五月婷婷六月丁香在线视频免费在线观看| 99视频在线| 99视频35精品视频在线观看| 性一交一乱一交A片久久四色| 成人短视频在线| 性爱视频99| 免费看欧美成人A片无码| 欧美成人猛片AAAAAAA| 日B日潘金莲BB| 男人天堂AV在线一区二区| 99re热在线观看| 日本久久99| 久久激情综合| 日日操日日爽| 色婷婷综合影院| 日韩视频99| 777精品久无码人妻蜜桃| 色婷婷很很丝袜| 99ri视频在线播放| 丁香五月婷婷六月婷婷| 婷婷五月精品在线| 狠狠干无码| 91欧美| 九八Av| 色五月婷婷AV| 天天日日人| 五月天色婷婷成人| 丁香激情久久| 伊人在线视频| 97干在线看| 丁香午月AV中文字幕| www开心激情网| 久久总和99| 欧美性做爰大片免费看办公室| 九月色婷婷婷| 伊人91| 日日爱699| 五月婷婷六月丁香| 97超级碰人人| www久| 婷婷五月18永久免费视频| 久久99精品九九久久久婷婷| 丁香情色五月| 日本 欧美在线| 精品一区二区三区木瓜| 色五月天堂| 91麻豆国产三级精品福利在线观看 | 日日噜噜久久婷婷五月天| 91精品久久久久、久五月天| 激情五月天视频| 婷婷丁香色性爱| 玖玖在线资源视频| 激情六月天婷婷| 狠狠干.com| 日韩无码成人电影| VfJxEwPH| 亚洲成av人影院| 热久国产| 五月丁香六月婷婷视频| 激情五月天社区| 超碰99热精品| 丁香色情五月综合网站| 六月婷婷开心| www,com,五月色色| 婷婷六月伊人| 欧美成人精品A片免费一区99| 九九综合网色全集| 欧美久久婷婷| 丁香婷婷激情| 熟女少妇内射日韩亚洲| 色玖玖玖| 色婷婷社区| 先锋影音av色五月天资源站| 五月婷婷亚洲| 激情色色色| 五月丁香久久综合91| 99色在线| 婷婷五月香蕉| 97色图片中文字幕视频在线观看| 九九九午夜影院成人| 九九热免费视频| 噜噜噜狠狠色综| 色五月婷婷很很操| 五月婷无码| 99啪啪视频| 五月99久久| www.爱婷婷.com| 五月亭亭激情综合| 99色视频| 五月六月丁香激情视频| www.久久爱.com| 日韩无码乱轮| 婷婷五月av| 丁香88AV五月婷婷| 亚洲婷婷六月天| 国产人妻人伦精品一区二区| 五月丁香婷婷色| 五月婷婷色色色| 无码少妇高潮喷水A片免费| 麻豆科斗777| www.色综合| 色狠狠综合| 大香蕉婷婷丁香天堂AV| 91碰视频| 日本99在线视频| 99男人的天堂| 久久久久久久久99精品| 狠狠综合区| 97五月天| 成人在线视频一区| 99久久6| 午夜丁香六月婷| 九九热re99re6在线精品| 丁香久久激情俄| 五月婷婷中文字幕| 日韩美女在线视频19| 婷婷涩涩五月天| 久久婷婷五月综合一| 五月丁香婷婷欧美| 婷婷丁香91| 久久婷婷网站| 五月丁香婷婷激情图片| 99这里只有精品99| 五月婷婷六月丁香首页| 激情小说婷婷| 99热这里都是精品| 丁香婷婷社区| .操區COm| 5月丁香综合图区| 拳交大逼| 伊人9在线| 五月婷婷,六月丁香| 96人人操人人操人人| 丁香六月婷婷综合| 99er6热在线观看精品6| 狠狠久久婷婷| 激情五月色婷婷| 激情五月婷婷综合| 99久久国产宗和精品1上映| 涩涩网五月天| 97日本在线| 色99网| 国产视频久色| 丁香婷婷浪潮AV久久综合 | 夜夜爽天天爽| 激情的五月| 久久久久久久久久久久久久久久久精典| 五月天婷婷乱论小说| 久久看婷婷| 精品夜夜澡人妻无码AV| 色婷婷AV久久久久久久| 色爱99| 性一交一乱一交A片久| 天天干天天干天天干天天干天| 欧美性交一区二区三区| 亚洲第一第二网站| 99性爱精品| 色激情五月| 亚洲爆乳无码精品AAA片蜜桃| 五月婷婷激情久久| 色欲九区| 九九成人电影婷婷| 97婷婷狠狠| 99成人网站| 热99在线精品| 亚洲亚洲人成综合网络| 天天做天天爱天天爽综合网| 热九九在线| 欧美婷婷精品激| 久久a热| 激情五月丁香五月| 琪琪理论片| 9999热精品| 日日日日日| 亚洲色图五月丁香| 五月婷婷人人人操| 我要色综合五月婷婷| 久久婷丁香五月| 日韩青青| 五月色婷| 久久美女五月天| 丁香五月天婷婷久久| www热久久yy9| AⅤ网站在线看| 五月天综合在线| 激情五月四色| 噜噜噜噜噜日本视频| 婷婷色色丁香五月天| 在线中文AV| 深爱激情综合| 中文字幕av在线播放| 婷婷五月天六月| 色婷婷手机在线| 丁香六月婷| 91碰操| 午夜69成人做爰视频| 激情综合婷婷| 激情网婷婷五月天| 婷婷五月天亚洲精品| 五月婷婷色播视频| 97碰| 丁香香蕉射射射| 五月天偷拍| 婷婷月综合| 蜘蛛女侠2003满天星免费观看| 婷婷五月天无码熟女| 久久XX| 五月丁香久久久久| 久久香视频| www...com黄在线观看| 99国产精品久久久久久久久久久| 97精品欧美91久久久久久久| 色播五月天激情| 五月第四色| 五月天激情视频网站| 久久丁香五月婷婷激情综合网| 丁香花五月天激情| 91免费看片| 五月丁香888| 欧美69色| 色约约视频一区二区三区四区五区| 610018岁成人视频| 丁香六月婷婷| 九九色色| 免费无码毛片一区二区A片 | http:色情日本com| 中文字幕在线日亚洲9| 99亚洲天堂| 天天日夜夜拍| 饮料下药迷倒漂亮女同事强干| 五月色色色| 怡红院视频| 久久99网| 激情五月天社区| 亚洲激情网| www.色婷婷| 99久久九九视频| 日韩成人无码| 久99久视频精品| 潮汕成人AV片在线| 色激情网| 亚洲无码www| 欧美天堂久久| 97精品综合| 久久99免费视屏| 成人深爱丁香五月| 久久婷五月综合色| 日日做夜夜爱| 五月天俺去也| 六月丁香五月婷婷| 五月婷久久| 婷婷五月黄色激情在线| 色色色精品无码区| 婷婷五月色丁香在线看| 婷婷丁香五月亚洲| 五月天精品视频| 久久9热| 久久激情网| av中文在线| 97精品人人A片免费看| www.久99| 天天综合色丁香| 日本精品99| 丁香五月婷婷亚洲综合精品在线| 日韩色色视频www| 超碰人人91| www.久热| 99精品综合| 婷婷五月色图| 开心 五月 综合| 五月婷婷综合色啪首页| 五月人妻婷婷视频| 六月丁香婷| 噼里啪啦在线观看免费完整版视频 | 欧美色97| 丁香六月综合| 亚洲AV久久久久久久久久久久久久久久 | 丁香婷色| 六月婷伊人| 日本va欧美va欧美va| 欧美精品99| 99ER热精品视频| 五月天丁香欧美激情| 香蕉综合在线| 婷婷五月天激情AV影院| 91色噜噜狠狠狠狠色综合| 内射爽无广熟女亚洲| 狠狠爱丁香婷| 色五月首页| 丁香五月欧美激情| 色色色色色色色色五月先| 日本乱子人伦在线视频| 九九99在线视频| 婷婷五月天国产手机在线视频观看| 九九精品网| 99久久久99久久91熟女| chaopeng在线人人| 五月天婷婷色在线视频免费观看| 99爱免费视频| Av大香蕉| 啪啪色激情五月天| 99热精品网| 久久与婷婷| 亚洲乱码日产精品BD| 国产97色在线| 综合图区激情| 亚洲黄色影视| 99碰在线视频| 五月天性色| 丁香五月婷婷啪啪| 九九亚洲小视频| 99热黄| 97福利视频| 99视频这里有精品| 婷婷久久综合| 久9热视频在线观看| 人妻VideOssS人妻| 丁香六月婷婷综合| 五月天婷婷丁香人人操91| 天天噜天天爱| 91婷婷| 先锋资源91| 五月丁香婷婷伊人| 超碰免费人人| 俺去也综合| 丁香五月激情五月色综合| 99视频久久| 色色色图| 婷婷五月精品| 丁香五月天婷婷中文| 天天操综合网| 欧洲亚洲午夜| 四月婷婷丁香五月| 亚洲无码性爱| 五月婷婷综合色拍| 五月天成人综合| 丁香五月另类色婷婷麻豆| 日本色综合| 狠狠色噜噜狠狠亚洲A∨| 免费日韩99| 综合色99| 97狠狠色| 色播六月| 午夜成人AV在线| 日本人人xxx| 综合九色| 色婷婷狠狠18| 五月婷丁香久久综合| 婷婷丁香人妻天久久| 久久九九99| 色色色欧美| 色色日本| 色久婷婷五月| 91碰视频| 色五月综合| 久久激情视频| 婷婷导航| 激情五月视频在线婷婷| 亚洲情欲久久| 久久久久人妻网址| 久久加勒比| 色五月色五天色情网| 天天操加勒比| 色婷婷久久|