亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(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í)踐 搞過無人機(jī)地面站、數(shù)傳鏈路或者飛控二次開發(fā)的朋友對(duì)MAVLink這個(gè)協(xié)議應(yīng)該都不陌生。ArduPilot、PX4這些主流飛控都拿它當(dāng)對(duì)外通信的“官方語言”QGroundControl、Mission Planner這些地面站也是靠它和飛機(jī)對(duì)話。我最早接觸MAVLink是在做一個(gè)無人機(jī)數(shù)據(jù)鏈路網(wǎng)關(guān)的時(shí)候那時(shí)候項(xiàng)目技術(shù)棧是Java需要把飛控發(fā)出來的MAVLink報(bào)文接收下來解析出姿態(tài)、GPS、電量這些信息同時(shí)還要能反向把航點(diǎn)任務(wù)或控制指令封包上傳給飛控。一開始我以為這玩意兒有現(xiàn)成的庫直接調(diào)API就行了但實(shí)際一深入才發(fā)現(xiàn)如果不懂幀結(jié)構(gòu)、不懂CRC_EXTRA校驗(yàn)機(jī)制、不懂粘包半包的處理哪怕用了庫也很容易在數(shù)據(jù)交互上翻車。這篇文章就把我對(duì)MAVLink協(xié)議解析與封包的經(jīng)驗(yàn)完整梳理一遍包含協(xié)議核心原理、手寫解析和封包的Java代碼實(shí)現(xiàn)、基于官方庫的工程化用法以及我在實(shí)際調(diào)試中踩過的各種坑。無論你是準(zhǔn)備在Java后端里對(duì)接飛控?cái)?shù)據(jù)還是在做自己的地面站、數(shù)傳中轉(zhuǎn)服務(wù)或者只是對(duì)MAVLink協(xié)議本身感興趣這篇文章應(yīng)該都能幫你少走不少?gòu)澛贰?. Java做MAVLink二次開發(fā)的場(chǎng)景與選型思考1.1 什么場(chǎng)景下會(huì)用到Java對(duì)接MAVLink很多人一聽到MAVLink就想到C或Python畢竟飛控固件和大量開源地面站都是用C寫的Python也靠pymavlink占了腳本自動(dòng)化半壁江山。但在真實(shí)工程里Java接MAVLink的需求其實(shí)一點(diǎn)不少。舉個(gè)例子很多無人機(jī)巡檢、測(cè)繪、安防系統(tǒng)都是前后端分離的Web架構(gòu)后端服務(wù)可能是一個(gè)Spring Boot應(yīng)用負(fù)責(zé)接收飛控回傳的實(shí)時(shí)狀態(tài)寫入時(shí)序數(shù)據(jù)庫再推送給前端Web頁面展示航跡和姿態(tài)。這種情況下鏈路可以是飛控 - 數(shù)傳模塊 - 串口服務(wù)器 - Java后端也可以是飛控 - 機(jī)載計(jì)算機(jī)樹莓派/Jetson上的Java程序 - 云平臺(tái)。還有一類是仿真測(cè)試系統(tǒng)用Java模擬多個(gè)無人機(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àn)成庫這是一個(gè)繞不開的選型問題。Java生態(tài)里比較常用的MAVLink庫是來自Dronefleet的mavlink庫以及dronekit-java這類偏應(yīng)用層的SDK。它們能幫你省掉協(xié)議編解碼的臟活但用起來有幾個(gè)限制生成代碼的消息定義通常是固定的如果你用的飛控固件版本較老或較新消息字段可能與庫內(nèi)置的XML定義不一致。自定義MAVLink消息需要自己擴(kuò)展代碼生成器配置成本不低。庫只負(fù)責(zé)編解碼不負(fù)責(zé)傳輸層。你依然要自己處理串口、TCP、UDP的收發(fā)以及半包、粘包、超時(shí)重傳這些實(shí)際問題。所以我個(gè)人的建議是如果你只是想快速跑通一個(gè)Demo直接用現(xiàn)成庫沒問題但如果你想深入理解協(xié)議細(xì)節(jié)或者你的場(chǎng)景有定制消息、私有擴(kuò)展字段、異構(gòu)設(shè)備接入的需求那最好還是把協(xié)議本身吃透甚至自己手寫一套輕量級(jí)的編解碼器。這篇博文的核心部分就圍繞著手寫解析和封包展開同時(shí)也會(huì)給出用官方庫的工程化方案。2. MAVLink幀結(jié)構(gòu)拆解V1/V2差異與CRC_EXTRA設(shè)計(jì)意圖2.1 MAVLink消息幀的基礎(chǔ)布局MAVLink是一種二進(jìn)制協(xié)議不是文本協(xié)議所以解析的時(shí)候沒有換行符、分隔符這種東西可以依賴必須按字節(jié)偏移精確切分。一條完整的MAVLink消息幀大致可以分為三個(gè)區(qū)域幀頭、負(fù)載Payload、幀尾校驗(yàn)。V1版本的幀結(jié)構(gòu)是字節(jié)偏移字段名長(zhǎng)度說明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消息類型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)度說明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種消息類型而V1只有256種。另一個(gè)是V2增加了兩個(gè)標(biāo)志字節(jié)方便后續(xù)協(xié)議演進(jìn)。實(shí)際開發(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)模糊后來調(diào)鏈路時(shí)踩了坑才徹底明白。簡(jiǎn)單說系統(tǒng)ID用于區(qū)分同一通信鏈路上的不同飛行器或地面設(shè)備比如你同時(shí)控制3臺(tái)無人機(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ì)直接忽略。這部分看起來不難但做多機(jī)場(chǎng)景時(shí)經(jīng)常有人把系統(tǒng)ID搞混導(dǎo)致指令發(fā)給1號(hào)機(jī)結(jié)果2號(hào)機(jī)沒有反應(yīng)。2.3 CRC_EXTRA很多人忽略卻致命的校驗(yàn)字節(jié)MAVLink的校驗(yàn)和計(jì)算方式跟普通CRC不太一樣它并不是單純對(duì)幀頭加負(fù)載做CRC16。實(shí)際算法是把整條消息幀的數(shù)據(jù)幀頭部分按特定規(guī)則參與不同版本參與的數(shù)據(jù)范圍不同和一個(gè)消息專屬的CRC_EXTRA種子值一起做CRC16/MCRF4XX運(yùn)算。這個(gè)CRC_EXTRA值是從消息定義XML中提取的具體數(shù)值與消息的字段順序、字段類型強(qiáng)相關(guān)。如果發(fā)送端和接收端對(duì)同一消息ID的字段定義不完全一致計(jì)算出的CRC_EXTRA就不一樣接收端理所當(dāng)然會(huì)把這條消息視為非法。以前和第三方設(shè)備做聯(lián)調(diào)時(shí)對(duì)方聲稱支持MAVLink結(jié)果發(fā)過來的消息我們這邊全部校驗(yàn)失敗最后排查發(fā)現(xiàn)對(duì)方的消息定義里把某個(gè)uint32_t字段改成了uint16_t導(dǎo)致CRC_EXTRA種子對(duì)不上。所以在手寫封包和解析時(shí)CRC_EXTRA值必須和你的目標(biāo)飛控固件所用的消息定義嚴(yán)格一致。ArduPilot和PX4的Common.xml定義可以從官方倉庫獲取改動(dòng)任何字段后都要重新計(jì)算CRC_EXTRA。3. 自己寫封包校驗(yàn)計(jì)算、字節(jié)序與代碼實(shí)現(xiàn)3.1 封包前必須先確認(rèn)的兩個(gè)參數(shù)目標(biāo)系統(tǒng)的字節(jié)序與CRC種子動(dòng)手寫封包代碼前先把兩個(gè)參數(shù)確認(rèn)好否則后面調(diào)試會(huì)非常痛苦。第一個(gè)是字節(jié)序。MAVLink協(xié)議規(guī)定所有多字節(jié)數(shù)值類型如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ò)了的話解析出來的數(shù)值會(huì)非常離譜比如高度變成幾百萬米。第二個(gè)是CRC種子。每個(gè)消息ID都對(duì)應(yīng)一個(gè)固定的CRC_EXTRA值這個(gè)值可以通過官方腳本crc_extra.py或在線工具查也可以從MAVLink XML消息定義中提取。我習(xí)慣把用到的消息ID和CRC_EXTRA值維護(hù)在一個(gè)常量類里作為封包和解析共用的對(duì)照表。3.2 手寫封包的核心流程封包的本質(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ì)出問題。預(yù)留幀頭部分的空間或者先把幀頭字段逐個(gè)寫入。由于負(fù)載長(zhǎng)度是先知的所以可以先把負(fù)載長(zhǎng)度、包序列號(hào)、系統(tǒng)ID、組件ID、消息ID依次寫入緩沖區(qū)。接下來寫入負(fù)載數(shù)據(jù)也就是消息具體字段。幀頭加負(fù)載全部寫入后用這份完整數(shù)據(jù)計(jì)算CRC16校驗(yàn)和再把2字節(jié)校驗(yàn)和追加到緩沖區(qū)末尾。最終輸出byte[]就是一條可發(fā)送的MAVLink消息幀。下面是一個(gè)偏基礎(chǔ)的實(shí)現(xiàn)示例目標(biāo)是可讀性優(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ì)展開這里先留一個(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的選擇寫封包代碼時(shí)我最常犯的錯(cuò)誤是字段順序和官方消息定義不一致。MAVLink消息的負(fù)載字段順序不是隨意排的而是XML定義里從上到下的順序。比如GLOBAL_POSITION_INT的定義順序是time_boot_ms、lat、lon、alt、relative_alt、vx、vy、vz、hdg如果你把lat和lon寫反了經(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方便定位寫入位置。不過要注意ByteBuffer的get/put操作會(huì)把內(nèi)部position向前移動(dòng)讀取時(shí)需要有意識(shí)的flip或使用絕對(duì)位置訪問。3.5 V2封包的差異點(diǎn)如果你要跟PX4或較新的ArduPilot通信V2封包更常見。V2和V1的封包流程差別不大但有幾個(gè)點(diǎn)要特別注意起始標(biāo)志是0xFD接收方如果只認(rèn)0xFE需要兩個(gè)分支同時(shí)兼容。消息ID是3字節(jié)寫入時(shí)按低、中、高的順序依次put。在幀頭多出的兩個(gè)標(biāo)志字節(jié)通常填0表示沒有開啟額外的簽名或兼容性擴(kuò)展。如果開啟了消息簽名功能幀尾除了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. 自己寫解析流式數(shù)據(jù)的狀態(tài)機(jī)處理4.1 粘包、半包與起始標(biāo)志誤判寫解析器時(shí)第一個(gè)要面對(duì)的問題就是MAVLink是流式協(xié)議底層可能是串口、TCP或UDP數(shù)據(jù)到達(dá)時(shí)不會(huì)剛好是一條完整的消息邊界。你可能會(huì)一次性收到好幾條消息粘在一起也可能收到一條消息的前半截過一會(huì)才收到后半截。最簡(jiǎn)單的處理思路就是一個(gè)字節(jié)一個(gè)字節(jié)地喂進(jìn)狀態(tài)機(jī)每完整收齊一幀就丟出一幀。這種方式雖然看起來笨拙但勝在穩(wěn)定不容易丟包而且實(shí)現(xiàn)邏輯直觀。效率上對(duì)于無人機(jī)數(shù)據(jù)鏈路這種吞吐量完全夠用。4.2 狀態(tài)機(jī)設(shè)計(jì)我把解析狀態(tài)機(jī)劃分成以下狀態(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ì)。為了方便閱讀我沒有把CRC子狀態(tài)寫進(jìn)去但思路是一致的。4.3 校驗(yàn)失敗怎么辦CRC校驗(yàn)失敗時(shí)最簡(jiǎn)單粗暴的做法就是把當(dāng)前這一幀丟棄然后回到WAITING_FOR_START狀態(tài)重新開始。這個(gè)策略在大多數(shù)字鏈路場(chǎng)景下是合適的因?yàn)镸AVLink本身沒有幀級(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é)又恰好滿足幀頭結(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)讀過的數(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ī)而不是重新開一幀。這就是狀態(tài)機(jī)的好處幀狀態(tài)跨批次保持天然處理了半包。反之如果一次讀到了三幀粘在一起狀態(tài)機(jī)也會(huì)在解析完第一幀后立刻把后續(xù)的0xFE識(shí)別為新幀的起始繼續(xù)解析第二幀、第三幀。整個(gè)過程不需要任何復(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并把解析出來的完整消息收集到List返回。這樣一個(gè)方法就能統(tǒng)一處理單包多包、半包全包的全部場(chǎng)景。5. 工程化接入使用官方Java庫構(gòu)建數(shù)據(jù)交互鏈路5.1 用庫不等于不學(xué)協(xié)議自己手寫解析器非常適合學(xué)習(xí)協(xié)議但工程效率方面如果目標(biāo)只是快速跑通業(yè)務(wù)我還是推薦用官方生態(tài)的Java庫。dronefleet的mavlink庫是業(yè)界相對(duì)活躍的Java MAVLink庫它通過代碼生成器從XML消息定義生成Java類消息類型全CRC_EXTRA也提前算好了省去自己維護(hù)一大堆常量。不過注意用庫之前最好還是把我前面講的那套幀結(jié)構(gòu)、校驗(yàn)機(jī)制理解清楚因?yàn)閹熘荒軒湍憬鉀Q編解碼問題它不負(fù)責(zé)處理串口或網(wǎng)絡(luò)傳輸。數(shù)據(jù)從串口讀出來后該面對(duì)的半包、粘包問題依然要自己面對(duì)。5.2 引入依賴并發(fā)送HEARTBEAT消息以Maven項(xiàng)目為例引入dronefleet mavlink庫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有了依賴后發(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的寫入、序列號(hào)的維護(hù)。getOriginSystemId和getOriginComponentId分別是消息對(duì)象攜帶的系統(tǒng)ID和組件ID需要根據(jù)你的設(shè)備編號(hào)設(shè)置。5.3 解析庫的常見處理方式用庫解析消息時(shí)流程一般是從串口或網(wǎng)絡(luò)讀取原始字節(jié)。調(diào)用MavlinkConnection的next()方法傳入原始字節(jié)流返回解析出的MavlinkMessage對(duì)象。對(duì)返回的消息對(duì)象做類型匹配判斷是HEARTBEAT還是GLOBAL_POSITION_INT再?gòu)?qiáng)轉(zhuǎn)成具體類型取字段。一個(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(收到心跳類型: 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類型單位是1e7度alt單位是毫米換算成常用單位時(shí)記得除以對(duì)應(yīng)系數(shù)。用庫雖然方便但協(xié)議層面的單位換算還是得自己心里有數(shù)。5.4 串口、TCP、UDP傳輸層怎么選MAVLink本身是獨(dú)立的協(xié)議層底層傳輸可以用UART串口、TCP或UDP。串口場(chǎng)景飛控通過數(shù)傳模塊連到地面站或工控機(jī)數(shù)據(jù)以字節(jié)流方式到達(dá)通常用jserialcomm或串口框架讀取。串口沒有消息邊界必須靠狀態(tài)機(jī)處理。TCP場(chǎng)景常見于數(shù)傳模塊通過TCP轉(zhuǎn)發(fā)數(shù)據(jù)或者機(jī)載計(jì)算機(jī)和地面站之間走TCP長(zhǎng)連接。TCP自帶流控和重傳但依然存在粘包問題處理方式和串口一樣。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包所以依然需要按幀切分。無論底層的Transport是什么核心編解碼邏輯都可以復(fù)用同一套狀態(tài)機(jī)或同一套MavlinkConnection。我在工程里一般把傳輸層抽象成一個(gè)Transport接口只提供read和write兩個(gè)方法這樣切換串口和UDP就非常輕量。6. 實(shí)際調(diào)試中踩過的坑與定位方法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。字段類型變化導(dǎo)致負(fù)載長(zhǎng)度和CRC_EXTRA都變了幀頭里寫的負(fù)載長(zhǎng)度是新長(zhǎng)度但CRC_EXTRA用的是舊值整個(gè)校驗(yàn)自然失敗。這個(gè)坑教會(huì)我一件事CRC_EXTRA不只是一個(gè)消息ID對(duì)應(yīng)的常量它本身就是消息定義的指紋。任何字段順序、類型、長(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ū)里。如果讀取代碼寫得比較簡(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類型如果字節(jié)序不對(duì)解析出來的數(shù)值看起來不是邏輯錯(cuò)誤而是一些非常奇怪的小數(shù)。遇到這種數(shù)值不要懷疑人生先檢查ByteOrder。6.4 坑四消息序列號(hào)與丟包統(tǒng)計(jì)MAVLink幀頭里的包序列號(hào)seq可以用來統(tǒng)計(jì)鏈路丟包率。我在做鏈路質(zhì)量檢測(cè)時(shí)會(huì)記錄每個(gè)系統(tǒng)ID組件ID組合的最近一次序列號(hào)如果下一次收到的序列號(hào)與期望值不連續(xù)就說明中間有丟幀。這個(gè)功能看著簡(jiǎn)單但沒有序列號(hào)意識(shí)的人往往忽略它而它在實(shí)飛調(diào)試中非常有用能快速判斷是數(shù)傳鏈路問題還是解析程序問題。6.5 坑五坐標(biāo)系與單位換算MAVLink里的經(jīng)緯度使用的是整數(shù)類型單位是1e7度也就是說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)境代碼寫完了怎么驗(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)證自己寫的Java解析器可以讓Java程序監(jiān)聽UDP 14550端口把收到的UDP數(shù)據(jù)包交給狀態(tài)機(jī)解析打印出HEARTBEAT和GLOBAL_POSITION_INT信息。如果程序能持續(xù)打印出正常的經(jīng)緯度和高度說明解析鏈路是通的。7.2 發(fā)送航點(diǎn)消息給仿真飛控的驗(yàn)證步驟如果你想驗(yàn)證封包能力比如發(fā)送MissionItem消息給飛控也可以直接用SITL來驗(yàn)證。流程是啟動(dòng)SITL仿真。用你的Java程序向SITL的UDP端口發(fā)送MISSION_COUNT、MISSION_ITEM最后發(fā)送MISSION_START等消息。在QGroundControl地面站上觀察航點(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類。用新的Java類編解碼自定義消息。整個(gè)過程不算簡(jiǎn)單但可行性很高。ArduPilot固件側(cè)也可以注冊(cè)對(duì)應(yīng)的自定義消息處理邏輯。如果你不想改飛控固件還可以使用MAVLink的MAV_CMD、NAMED_VALUE_FLOAT、DEBUG_VECT等通用消息來傳輸自定義數(shù)據(jù)這些消息在常見飛控固件里都有支持不需要改動(dòng)固件。8. 調(diào)試工具與效率提升建議8.1 抓包工具比打印日志好用得多解析MAVLink時(shí)遇到詭異問題我強(qiáng)烈建議先用抓包工具看原始二進(jìn)制而不是在代碼里瘋狂打印日志。可以在電腦上用Wireshark抓UDP或串口數(shù)據(jù)包再用4243端口或串口監(jiān)控工具把二進(jìn)制流導(dǎo)出成hex文件。hex文件一看起始標(biāo)志、幀長(zhǎng)度、消息ID是否連續(xù)、CRC是否規(guī)律性失敗基本一目了然。Java程序里也可以加一個(gè)可開關(guān)的hex dump工具類在高頻調(diào)試階段打開把每個(gè)UDP包或串口讀取到的數(shù)據(jù)以hex格式輸出。聯(lián)調(diào)時(shí)讓對(duì)方也打開同樣的hex dump兩邊一對(duì)比是發(fā)送端的問題還是接收端的問題立刻清楚。8.2 消息日志要帶序列號(hào)和時(shí)間戳日志不能只打“收到HEARTBEAT”這種信息最好把幀頭的seq、系統(tǒng)ID、組件ID、CRC校驗(yàn)結(jié)果一起打出來。seq和時(shí)間戳能幫你定位丟幀規(guī)律系統(tǒng)ID和組件ID能幫你區(qū)分多設(shè)備混連時(shí)的消息來源。這些信息在后續(xù)排查多機(jī)干擾、鏈路偶發(fā)斷連時(shí)都是關(guān)鍵線索。8.3 建立消息ID對(duì)照表如果你接觸的MAVLink消息比較多建議在項(xiàng)目里維護(hù)一個(gè)消息ID和消息名稱的對(duì)照表這樣抓包看到msgId33就能立刻反應(yīng)過來是GLOBAL_POSITION_INT而不是每次都要臨時(shí)查XML定義。這個(gè)表也可以用于日志過濾比如只查看姿態(tài)消息或只查看心跳消息。9. 從單機(jī)到多機(jī)數(shù)據(jù)交互設(shè)計(jì)的一些體會(huì)實(shí)際做多機(jī)場(chǎng)景時(shí)MAVLink的編解碼本身不是最復(fù)雜的部分復(fù)雜的是如何從流式數(shù)據(jù)中區(qū)分不同飛行器的消息。前面說過每架飛機(jī)的系統(tǒng)ID不同所以在解析出消息后第一件事就是根據(jù)源系統(tǒng)ID做路由。我的做法是維護(hù)一個(gè)MapInteger, DeviceSessionkey是系統(tǒng)IDvalue是當(dāng)前在線設(shè)備的狀態(tài)快照。每次解析出一條消息就更新對(duì)應(yīng)設(shè)備的狀態(tài)快照同時(shí)記錄最后活躍時(shí)間。這樣一個(gè)極簡(jiǎn)的設(shè)備管理服務(wù)就能支撐上百臺(tái)無人機(jī)的狀態(tài)監(jiān)控。心跳超時(shí)檢測(cè)也建議做一下。MAVLink的HEARTBEAT默認(rèn)1Hz發(fā)送如果連續(xù)3到5秒沒有收到某個(gè)系統(tǒng)ID的心跳基本可以判定該設(shè)備鏈路中斷。我在服務(wù)里用定時(shí)任務(wù)掃描設(shè)備會(huì)話的最后活躍時(shí)間超過閾值就標(biāo)記離線并推送告警。另外多機(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é)出問題整條數(shù)據(jù)鏈路都會(huì)變得不可用。希望我上面這些代碼和踩坑經(jīng)驗(yàn)?zāi)軒湍闵僮咭恍澛?。如果你正在做相關(guān)的Java項(xiàng)目遇到具體的協(xié)議細(xì)節(jié)問題也歡迎交流。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
亚洲区限制级 99| 日韩无限资源| 淫妻综合网| 美国精品国产精品| 激情综合网亚洲| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 91伊人久| 国产亚洲性生活视频播放| 亚洲狠狠入| 无码视频一区二区| 人人操人人射人人干| 99热99re超碰精品| 成人资源中文字幕在线观看天天| 可以在线观看AV的网站| 亚洲黄色a级片| 国产1024在线播放| 内射小黄片| 久久久久白虎| 99久久久| 草草草视频| 日韩电影免费网站麻豆视频| 美女网站黄页| 人妻 欧美亚洲| 日韩无码服务区| 日本黄色XXX| 男人天堂久久精品不卡| 国产人人干| 亚洲凸凹超碰成人| 粉嫩AV一区夜夜嗨| 精品性爱无码在线播放| 国内毛片欧美香蕉精品| 久久社区一区二区三区| 人人操肉肉| 999久久久免费精品国产牛牛| 中出20p| 自拍二页| 歐美性天天| 国产青一二三| 伊人操操| 狠狠干妹子| 国产AV线| 青青草原香蕉日本Ap| 青操影院| 91熟女视频网| 欧美一级二级三级| 国产一区二区二区按摩精品啪视频| 久久久亚洲精品中文字幕人妻| 色欲久久99精品久久| 亚洲人精品久久久| 婷婷综合伊人一区| 尤物网址| 国产精品亚洲美女久久久久| 狠狠操狠狠爱| 蜜桃视频一区二区三区在线观看| ai欧美亚洲小说| 十八禁电影伊人网| 秋霞一级A片黄色视频| 国产精品亚洲一级av第二区| 国产精品久久久久久片| 欧美性猛交美女自慰91| 日日AV加勒比| 91欧美少妇| 国产女人视频三四五区| 日韩三A大片在线观看 | 插入综合网| 精品精品精品| 久久深夜无码| 97资源亚洲| 明星性猛交ⅹxxx乱大交| 美女操逼A A| 亚洲色系另类精品国产| 25国产精品免费观看| 亚洲乱色视频一区、二区在线| 日韩一区二区熟女| 东京热双插| 沈阳熟女高潮对白视频| 日本Xx性爱| 五月天婷婷色色| 天天综合网在线| 精品无码一区二区人妻久久蜜桃| 少妇综合网| 欧美大香蕉同搞| 9l视频自拍9l九色成人| 2017大香蕉国产精品久久| 91插B网站| 色y情视频免费看| 色五月首页| 国产丰满熟夫69mpp| 精品少妇一区二区三区| 人人操 欧美| 日本高清久久| 欧美综合网站999| 懂色Av| 国内自拍 日韩激情 99| 欧美综合 站| 国产黄色剧情影片麻豆免费播放| 久久精品色欧美aⅴ一区二区| 日韩亚洲美女一区久久| 蜜桃午夜视频一区二区 | 久久AV无码网址| 九九九九九九亚洲| 婷婷爽人人婷婷爽视频| 五月综合激情| 免费视频观看60秒| 色青青久久影视| 人人操天天爽| 成人线上超碰| 日韩亚洲美州欧洲综三区一品在线| 欧美性生活免费网| 岛国大片国产| 欧美一区二区情色| 加勒比伊人| 久久,精品一二三| 亚洲天堂少妇| 大香蕉啪啪网| 亚洲 在线| 色色99| 97操综合| 99久视频| 精品人妻一区二区三区在线视频不卡| 久久久精品国产亚洲AV无码| K8久久久久| 国产精品免费视频人成| 91在线一起| WWW黄片COM| 色踪合AV| 五月婷婷影院| 日韩在线地址一| 色婷婷成人综合| 无码动漫av中文字幕| 啊啊啊啊啊啊啊国| 日韩熟女操逼| 91天美传媒在线| 精品人妻1区| 美腿丝袜偷拍亚洲欧美| 天天躁日日躁xxxxx| 91n.欧美| 日本福利社| 国产路线专区| 日本一天色道久久久精品视频| 人人搞人人插人人操| 欧美亚洲性爱一区二区| 激情黄色片在线观看| 麻豆天美传媒在线视频天堂| www.久久最新地址| 99热这里都是精品| 黑人中出21连凳花野真衣| 久久精品 六十路 熟女 欧美| 97色色国产视频| 国产自产一区视频在线| 极品色综合| 国产性感骚丝袜在线| 免费人成在线观看网站品爱网| 欧美国产有色电影| 亚洲综合性感在线| 五月丁香激情综合网| 激情色图| 亚洲天堂久| 九九在线视频| 欧美成人A天堂片在线观看| 操老熟女AV| 超碰亚洲97| 精品毛片av一区二区| 综合亚洲欧美| 色综合99999| 欧美亚洲综合色| 亚洲国产91精品一区二区久久| 夜夜高潮夜夜爽国产伦精品| 狠狠热这里都是精品| 欧美性爱伊人| 芊芊操逼视频无码| 亚洲超碰97| 中文字幕精品亚洲熟女| 日本999精品视频| 一块操欧美性爱| 国产日韩精品suv| 丰满少妇精品一区二区| 亚州色国| 操人妻逼91| 丁香五月社区| 久久婷婷亚洲| 亚洲五码一区二区三区| 国产精品不卡一区二区电影| 欧美日韩国产成人高清| 97在线免费视频| 国际精品久久久| 日本孕妇孕交| 色天使AV天堂| 四虎在线免费视频| 狠狠干妹子| 99蜜桃臀亚洲成人在线观看| 欧美18禁91| 欧美三级一级| 欧美少妇第一页| 精品妇女一区二区三区| 七久久久| 黄色污污污污污污网站| 美女骚尻视频| 日本精品性生活久久久| 操操操操网黑人| 91女在线观看| 九一综合精品视品av| 亚洲婷婷五月天| 中文字幕 国产 精品 | 四虎影库国产精品免费| 九九久久九九久久| 蜜臀av在线播放一区二区三区| 99性视频| 少妇超碰在线| 五月天综合网| 精品久久99| 综合网欧美在线| 97舔舔| 男女激情中文字幕| 亚州欧美总和| 2020中文字幕在线| 人妻熟女一区二区三区视频| 特污精品女优骚货黄色视频在线免费观看| 欧美日韩中文视频播放| 91被操| ji熟女.com| 中文字幕国产| 日亚韩精品视频二区三| 中文字幕在线免费观看视频| 亚州色交| 亚洲视频小说| 97视频在线免费| 日本熟妇人妻一区二区三区| 日韩成人高清一区二区| 欧 美 自 拍 偷 拍| 天天操夜夜操狠很操| 久久久国产亚洲精品系列| 手机看片1024你懂的国产| 色色色色综合网| 熟妇在线视频一区二区| 大香网伊人久久综合网eew| 欧美熟女妇同| 怡红院久久老司机| 蜜乳AV.COM| 黄aaaaaaaaaaaaaaaaaa色网站| 国产日比| 亚洲污一污二| 超碰97COm中文| AV一起草在线| 高清无码网址| 欧美日韩国产人人| 中文操逼字幕| 欧美91在线+|+欧美| 人人搡人人肉久久精品| 欧美色图电影| 亚洲AV无码国产成人| 91九久| 日韩丨制服丨中文|在线| 久久女人| 午夜男人一级A片7777| 曰本熟女视频| 欧美精品偷拍| 人妻熟女一区二区| 日本媚薬中文字幕在线| 欧美不卡二区| 青青草九九九九九| 欧美第五页| 日本人妻伦在线中文字幕| 精品国产人成在线| 日韩天堂av电影在线观看| 天美传媒精品久久视频| 秋霞曰韩R级| 熟妇视频一区二区三区在线观看| 青草地一本线一区二区三区| 日韩丰满熟妇| 91嫩草欧美| 蜜臀久久99精品久久久久久婷婷 | 国产懂色精品国产av| 五月婷婷色| 狠狠爱AV| 久操网视频| 日韩影片中文字幕一区二区三区| 少妇的嫩逼图片| 伊人久操| 久久机热| 免费观看啪视频| 日韩精品系列| 国产精品视频一区二区三区八戒| 欧美熟妇亚洲版| 亚洲日韩在线a不卡99精品| 国产精品一区二区黄片| 成人日本片久久久蜜桃| 成人三级片无码| 二三四区精品| 人人操肉肉| 亚洲情色一区三区| 日韩免费高清大片在线| 久插综合| 男人高清无码一区二区| 超碰综合97在线| 岛国艾薇凹凸视频天堂| 精品人妻视频一区二区在线播放 | 日韩性爱电影一区| 亚洲97成人在线观看| 午夜精品视频777| 亚洲图片欧美另类综合免费视频大大香| 免费一级黄色录像影片| 成人精品一区二区三区| 嫩草一区二区在线观看| 美日韩一二三区| 三级网色| 欧美成人精品一区| 东北女人av| 亚洲精品久久久久毛片A片拉屎| 97爱免费插| 91被操| 欧美操逼视频二区| 欧日a| 国产午夜福利合集| 国产精品久久久视频| 综合久久久久久久久91| 色男人色天堂东京热| 日本性爱不卡视频| 性一级黄色录像片网站导航| 国产久久日韩网站导航| 青草青草久热| 麻豆美女丝袜人妻中文| 国产成人天堂| 91美女中出| 亚洲无码超碰免费| KK色在线影院| 亚洲国产剧情少妇激情| 亚洲AV无码黄色强奸| 美欧色综合| 91久久18禁| 337p大胆噜噜噜噜噜91Av| 综合第一页| www.高清无码诱惑一区.com | 亚州AV无码国产精品| 亚洲图片91| 青青国产在线拍揄自揄拍| 黄色免费网页无码| 在线日韩日本亚洲国产| 国产亚热在线久久| 日韩少妇丰满亚洲| 国产成人自拍视频在线| 日本一区二区三区午夜观看| 久久久久少妇| 欧美色图小说综合| 少妇与黑人高潮在线| 国产一级αv免费看片| 国产91福利小视频在线观看| 香蕉精品二区二区| 啊啊啊啊啊啊啊啊啊在线观看| 亚洲宅男天堂| 综合久久婷婷| 日韩人妻播放| 免费自拍三级综合| 日本视频在线中文字幕| 欧美韩日精品99综合| 99re8超碰| 久久五月综合| 久久久久国产精品喷潮免费观看臀 | 97超碰9| 精吧天堂| 97超碰巨乳| 精品熟女一区=区三区| 国产CHASE男男GAYGA 毛多色婷婷| 国产亚洲福利第一页丝袜| 日本Xx性爱| 密乳视频在线| 超碰91在线| 欧美日韩不卡传媒| 狠狠爱夜夜| 欧美女同在线| 亚洲中文字幕一区| 综合天天。| 天天躁狠狠躁av| 日本一天色道久久久精品视频| 91neishe| 91成人国产综合久久精品蜜月| 熟女丝袜视频| 日韩偷拍色图| av婷婷色网| 一区二区三区网站日日骚| 免费观看欧美日韩操逼视频| 丁香五月天社区| 亚洲AV免费在线| 啊啊啊好爽快点啊啊啊嗯嗯| 亚洲丝袜二区| 超碰97爽| 99国产精品久久久久久久成人热| 蜜臀AV成人精品蜜臀| 色999偷自拍拍| 91熟女综合| 欧美日韩精品久久| 久操| 亚洲性天堂| a'v在线资源| 精品久久久久久AV无码| 国产人妖视频一区在线观看| 大香蕉乱伦视频网| 美女啊啊啊啊pc| 黑人中出21连凳花野真衣| 欧美熟女激情| 久久精品一区二区三区蜜桃臀| 国产AV天美传媒一区二区三区| 加勒比无码毛片| 精品亚洲天堂| 人妻啪| 强奸乱伦资源| 红杏大香蕉| 97色97好| 97操碰| 亲子敌伦对白在线播放| 国产日韩欧美中文在线播放| 黄色欧美性爱视频| 99re6久热只有精品6在线直播| 韩国轻伦国内自拍一区| 99超碰网| 26uuu欧美日韩| 五月丁香激情综合| 国模不卡一本二本三电影| 亚洲资源网| 东京热,男人的天堂| 搡老女人老91妇女老熟女| 黄色AAAAA欧美| 开心婷婷五月| 91欧美综合在线| 国产传媒一区二区三区| 久久久久免费看少妇A片特黄| 新版天堂中文资源8在线| 青草青青久久久久久国产| 操操操五月天婷婷丁香影院| 午夜精品五区| 女同性恋一区二区三区精品视频| 蜜桃午夜视频一区二区 | 色九九综合| 91美女视频在线| 国产一区二区精品久久久不卡蜜臀| 国产色产精品在线观看| 五月天婷婷成人网| 日韩电影免费网站麻豆视频| 先锋影音av先锋一区| 综合激情婷婷| 亚洲丝袜二区在线| 人妻精品一区二区在线| 国产成自自拍在线观看| 欧美劲爆第一页| 全球成人中文在线| 肉丝无码中文高清| 黄色AAAAA欧美| 亚洲天天艹| 自拍啪啪视频| 大屁股xxxxx| 亚洲天堂日本| 国产乱伦亚洲| 男插女青青影院| 97av在线观看| 超91综合网| 日本亚洲嫩草影院啪啪| 丁香五月天啪啪| 九九九偷拍| 日韩成人精品视频自拍| 人妻黑丝袜电影| 欧洲综合无码| AV99热18这里只有精品| 精品久久久久久AV无码| 婷婷情色五月天| 欧美日韩在线视频网站| 中文字幕精品丝袜| 久久久久久久伊人精品| 男人天堂综合| 国产女乱淫真高清免费视频| 久久99精品九九久久久婷婷| 国产剧情AV不卡在线观看| 成人欧美日超碰| 东北丰满熟女国产一区| 制服中出中文人人精品| 无码免费精品高清| 精品一区二区2| 777奇米影视777四色| 天天操熟妇| 亚洲欧美经典一区二区 | 色色99| 99久在线精品99re8蜜桃| 超碰免费人人| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 日韩精品大香蕉伊人在线| 黄色电影在线播放综合网站| 美女网站黄页| 三级三级三级日本99| 搡老女人老91二区| 99爱久久视频频| 一级性爱啪啪视频| 加勒比av网| 少妇一线天久久久久久| 国产探花日韩援交| 日韩在线观看AV| 999熟女精品| 手机看片1025| 校园春色综合网| 综合欧美日韩在线| 激情小说五月天| 亚洲熟女乱色一区二区三区| 男人成人黄色视频在线观看免费下载| 日韩熟妇二区| 色呦呦呦在线观看视频| 日本欧美中文字幕| 加勒比少妇AV婷婷六月天超碰超碰| 亚洲熟女中文字幕在线| 久久久久久九九九九| 十八禁黄色成人网站观看| 亚卅熟女乱色| 大香焦A片| 欧美日韩久久精品爱爱| 欧美日韩大陆黑人少妇99| 免费毛片在线播放| 乱理日韩中文| 久久人妻精品| 午夜无码精品免费看性色| 久久 精品| 欧美熟女丝袜| 韩国轻伦国内自拍一区| 成人av动漫在线观看| 男女一进一出视频久久| 九九九只有精品| 91红杏| 国产精品电影| 亚洲超碰AV| 欧美日韩插逼视频| 欧美性爱一区二区| 玖玖资源视频一区二区三区| 精品国产72| 午夜精品久久久久久久男人的天堂| 秋霞久久亚洲精品成人| 日本人妻丰满熟妇久久久久久| 麻豆色99999| jiujiujiujingpin| 九九英色视频| 欧美三级免费伊人| 日韩99神马视频播放片在线播放| 成人在线视频网| 国产精品久久久无码AV网站| 久久久99免费| 免费国产电影一区二区| 啊啊啊啊啊在线| 国产97av| 欧成人在线| 超碰9 7女人| 欧美偷偷网| 丝袜亚洲91| 91九九九小逼| 97色97好| 97精品第3页| 91网18| 亚洲棕合电彰| 免费网色网站| 久久国语| 亚洲精品久久一区二区三区蜜桃臀| 欧美老妇女内射网址| 黄色小说亚洲| 欧美国产一区二区三区麻豆传媒| 91久久午夜无码鲁丝片久久人妻| 日日日啊啊啊| 999综合色| 久久久久9999精品九九九| 人妻 制服 日韩 中文 在线| 99只有精品| 加勒比东京热五月天天堂网| 91热色| 精品女同一区二区三区| 亚洲人天堂| dy888午夜老子影视达达兔| 黑人娇小av在线播放| 久久国产AⅤ| 国产日韩欧美中文在线播放| 日韩三级天堂在线观看| 中文字幕在线日亚州9| 婷婷五月天福利| 人人操天天爽| 超碰久久网| 神马久久久久久久久| 久热热| 看免费一级在线播放毛片| 亚川综合视频| 中文字幕一区日韩精| A V少妇特黄三级| 国产美女91视频| 久久 久久国内精品亚洲| 青青草大香蕉视频| 少妇高潮流水av免费| 亚洲国产成人精品久久久国产成人一区二区三. | 婷婷五月天AV| 蜜桃在线观看一区二区三区 | 国产亚洲精品美女久久久| 青草青草久热| 日本天天吊| 国产性爱欧美性爱在线| 国产精品久久泡妞网站| 精品人妻中文字幕4399| 丁香五月婷婷色| 久久超碰、| 99热欧美| 影音先锋视频在线| 久久久久久中文字幕中文字幕最新| 九九九九日本| 国产精品视屏| 欧美日韩性爱操大逼| 翘臀vidoes| 视频黄站| 激情抓乳插进去啪啪啪日韩| 欧州色图区| 欧美在线第五页| 影音先锋每日最新资源在线观看| 久久99亚洲精品久久99果| 亚洲精品天天影视综合网 | 日韩性爱视频在线免费观看| 丁香五月激情五月| 国产人妻精品一区二区三区秋霞 | 亚洲成人一二三区| 熟女少妇视频| 大伊香蕉在线视频免费| 久日91在线| 国产精品懂色tv影视免费观看| 精品国产肉丝袜在线拍国语| 久久久久78| 青娱乐999| 熟女丰满人妻一区| 久久尹人大香焦视| 蜜乳av首页| 九七人妻在线| 少妇3P性爱自拍| 欧美另类自拍| 国产AAAAAABBBBB| 九月丁香婷婷| 亚洲小说视频| 丁香五月大香蕉| 免费99精品国产自在在线| 尤物网址| 欧美色图人妻| 亚洲第一黄色av网站| 人人妻人人色| 日本性爱欧美性爱| 日韩精品99久久久久久中文字幕| 性色AV蜜色av色欲av| 久热伊人99re| 国产91影院| 性色乱AV一区二区| 久久香蕉影院| 日韩电影中文字幕| 六月丁香啪啪| 999精品女人| wwwss在线观看| 天天日夜干| 97超碰国产亚洲精品资源| 超碰美国| 九九久久首页| 亚洲无码太久| 嗯嗯啊啊的视频| 爱我干综合| 亚洲男人天堂手机版| 五月天色五月| 婷婷伊人五月| 人妻内射一区二区在线视频| 操我无码| 怡红院成人视频| 偷拍 精品 另类 四区| 天天上日日上日韩精品| 午夜欧美神马久久久久| 欧美亚洲另类在线蜜桃| 999热日韩精品| 超AV色女| 免费啪啪一级视频| 欧美激情专区| 97色色,97综合| 日韩性爱视频免费在线| 伊人网高清| 一区二区三区蜜桃成人撸久久东京热 | 黑人狂躁日本妞一区二区三区| 久久久久久裸体| 日产狠狠干| 午夜.DJ高清在线观看免费7| 精品大全99999| 欧美极品女人的天堂| 26uuu成人影片| 天天综合网合集91| 亚洲夜色在线| 乱论91| 国产精品久久久| 欧美亚洲宗合色性图| 日本三级中国三级99人妇网站| 国产午夜福利专区综合| 人人操人人精品影片| 久久啊哟| 国产树林里野战在线看| 日本一级特级毛片视频| 91男人天堂网| 亚洲日韩乱码中文无码蜜桃臀网站| 色噜噜人妻丝袜AV资源| 日韩精品作爱导航| 欧美日韩在线视频网站| 亚洲污污网站| 国产精品一区二区三区在线密挑| 国产精品人人爽人人做可爱福利| 亚洲天堂少妇| 久久免费看高潮毛片韩国| 亚洲偷拍自拍在线视频| 少妇熟女1区2区3区| 抽插一区二区视频| 中文字幕AV片| 国产精品久久久久久夜夜夜| 免费毛片在线播放| 国产成年精品高清在线观看91| henhen91| 91视频女生| 久噜噜| 97色插| 淫妻综合网| 日韩精品一区二区三区色欲| 久久美女国产| 中文字幕黄片在线| 久操97| 精品无人区麻豆乱码1区2区图片| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 一区二区国产视频在线观看| 超碰爽人妻熟女Av| 五月丁香综合网| 亚洲精品乱码久久久久久蜜桃麻豆 | 翔田千里AⅤHD无码| 欧美性91| 无套后入双马尾| 国产精品一区二区麻豆| 久欲AV| 精品二区三四区五电影 | 欧美日韩操操操| 久久夜黄色无码A级大片| 久久黄色视频一区二区三区| www.亚洲成人一区| 东北少妇高潮zzzz| 国产无码精品无码| 国产日韩精品suv| 日韩欧美性吧婷婷乱伦大香蕉 | 久久久久无码| 日本天堂网| 日韩伦理视频| 好吊色一区| 亚洲情色在线| 色偷综合| 蜜汁欧美| 97精品免费视频网站| 91老熟女| 丁香五六月啪啪| 国模私拍一区二区三区神乳| 国产精品成人无码a v毛片| 天天色天天干天天爱| 强奸国产精品视频| 激情小说成人日本无码一| 免费在线黄片视频| 激情看片网站| 偷拍欧美综合| 在线视频五十市| 精品国产AV一区天美传媒| 台湾佬大香蕉| 在线视频 亚洲精品| 婷婷在线视频在线观看| www.大香| 大香蕉啪啪啪| 欧美成人精品一区二区三区| 91l欧美在线| 蜜臀99久久精品| 青青草中文字幕| 国产乱伦亚洲色图高清无码| 成人午夜小视频手机在线看| 色色色999| 99热精品青草在线| 国产精品在线一区二区| 欧美偷拍| 久久国产免费激情视频| 精品成人av一区二区三区在线| 婷婷91| 色哟哟-国产专区| 亚洲综合校园春色| 色九久| 小日子操bb在线看| www.99视频| 熟女中出视频| 一卡二卡三卡| 眼镜人妻101.com| 伊人久久婷婷| 后入式在线免费观看60秒| 午夜美女诱惑电源网| 国产一区二区免费福利片| 国产美女高潮叫床视频| 97综合在线观看| 激情婷婷丁香网| 久久久久久久久久久免费精品| 97综合在线| 99国产精品久久久在线播放| 日韩在线电影| 亚洲成人久久一区二区| 人妻天天爽夜夜爽爽| 国产欧美日产一区二区三区 - 国产欧美日 | 淫乱图区| 亚洲色人| 久久五月视频| 色在线69堂| 亚洲成人黄色在线观看| 九九热精品| 久久原创中文| 国产精品麻豆免费视频| 狠狠欧美| 色亚洲欧美| 3d成人精品一区二区| 日少妇亚洲版| 欧美91在线| www.激情| 日本五区不卡| 深夜国产一区二区三区在线看| 欧美成不卡网| 亚洲欧美日韩中文播放| 色婷婷狠狠| 偷拍亚洲视频一区二区三区四区| www.91理论| 亚洲在高跟鞋自慰久久在色线| dy888午夜老子影视达达兔| 九九Av| 漂亮人妻被强中文字幕hd| 多乙久久久久久| 色拍偷亚洲| 欧美日韩精品一区二区三区高清| 天美欧美国产| 尤物网址| 日本中文字幕一区| 青椒国产97在线熟女| 久草男人天堂| 无码av永久免费专区网站| 精品网站99999| 91深夜夜| 亚欧美综合网。| 操逼视频亚洲| 91欧洲入口| www.色操逼| 99在线精品观看视频中文| 大地资源在线观看中文第二页| 很狠操| 国产精品自产拍在线观看社区| 加勒比色综合| 自拍鲍鱼一区在线高清观看免费| 91黄射| 99热在线播放| 日韩97| 大吊色| 中国zzijzzijzzwww精品| 青青伊人加勒比海| 国产精品自拍欧美在线| 人妻丰满熟妇av无码区蜜桃| 操碰97| 国产一区二区二区按摩精品啪视频| 久久理论字幕视频| www亚洲免费| 久久精品91| 加勒比大香蕉视频在线| 久久一二三四| 亚洲视频精选| 久久久久久久久九九久孕交| 丰满岳乱妇一区二区三区| 九九九九九九九九九九九蜜桃| 色爱综合网| 加勒比综合网| 成人熟女区| JULIA一区二区三区在线播放| 丰满人妻-区二区三区免费看| 2001天天操| 三级色综合| 啊啊啊啊免费视频| 91日日| 日本肏逼视频在线观看| 欧美亚洲| 丝袜色综合| 97在线免费看| 亚洲色图日韩精品| 91丨人妻丨国产丨丝袜| 国产视频小说| 欧美另类色图片| 亚洲国产一区二区入口| 日韩精品一区二区人人人| 操b网站亚洲无码| 亚洲av无码成人精品国产| 精品蜜乳AV免费观看| 亚洲综合 欧美| 99热这里只有精| 国产精品探花在线| 人妻少妇久久中文字幕一区二区 麻豆 | 精品女人999| 370p日韩欧美亚洲精品| 亚州综| 国产99999久久精品| 超碰97爽| 无码伊人久久大杳蕉中文无码| 蜜乳AV免费观看| 综合色欧美| 欧洲精品欧洲精品| 国产13区| 久久久久久亚洲精品不卡人乳| 伊人久久在线视频观看| 99久久99久久免费精品蜜臀| 九九免费影片| 目产99999久久999| 亚洲精品久久久久久久久豆丁网| 五月天黄色激情视频| 亚洲AV无码乱码| 亚洲AV无码乱码| 综合网少妇| 男女性扦B| 日韩 欧美 校园一区| 日韩无码嘿咻黑热久| 少妇滛荡视频| 色综合久| 久草免费在线一区二区| 377p欧洲日本亚洲大胆| 午夜视频黄| 中文字幕欧美日韩三级| 久久99国产精品| 超碰九九| 天天日天天干天天摸天天操| 97操综合| 人人摸人人舔一区二区| 亚洲欧美日韩电影网站一区| 91欧美美女日韩国产婷婷| www老逼91| 亚洲熟妇乱女区二区三区| 骚逼高潮久久精品| 一起草AV| 丁香激情网| 五月天婷婷久久| 亚洲丝袜二区| 色五月婷婷五月天| 美女黄色一级A视频| 日韩久久三区| 天天综合亚在线| 操穴国产| 性色中出| 日本欧美色| 国产1727欧美| 日本加勒比无码专区一二三| 国产精品久久久久久久久久二区三区| 亚洲丝袜99| 欧洲站一级二级三级h| 精品超碰色| 丰满人妻-区二区三区免费看| www欧美91| 欧美在线播放| 操逼逼一区视频| 久久国产免费激情视频| 国产成人免费观看在线视频| 亚洲精品a人片在线观看视| 啊视频在线| 欧美成人都市人妻| 婷婷综合在线观看| 无码视频一区二区| 久久精品日韩专区免费观看| 九九热只有精品| 天天噜| ji熟女.com| 被体育老师抱着c到高潮| 色五月网址| 精爱久久| 粉嫩久久久极品| 人人妻人人玩人人澡人人爽| 精品久久无码午夜福利| 老司机射| 中文字暮97| 牛牛久久国产精品视频一二三 | 十八禁啪啦拍视频无遮挡| 天天干天天爽| 天天干天天日天天射黄色片| 国产丸一视频| 久热一区二区| 无色无码| 射 色综合| 白丝在线一区| 啊啊啊啊啊啊好多水| 人人操人人干网页| 首页亚洲国产高跟丝袜诱惑视频| 九九久久国产精品| 五月天人妻综合| 国产精品不卡高清在线观看| 极品尤物女神在线观看| 久久久久久久 九九九九九九九| 亚洲男人的天堂网| 69天堂| 无码 有码 国产18p| 91N五十路| 亚洲欧美激情小说| 成人性爱av| 日韩草久视频| 9997se| 免费av在线播放二区| 婷婷综合五月| 香蕉免费一区二区三区不读 | 五月色综合| 国产第11页| 精品人妻免费观看| 天天干天天做| 国产精品粉嫩福利在线| 国内精品久久人妻性色av| 桃色五月天| 九久久精品| 人人操人人干网页| 一区二区三区日韩欧美| 日韩小电影| 精品国产精品一区二区| 激情四射五月天| 欧美日韩性爱电影在线| 你操综合| 九久精品| 五月婷婷AV| 在线电影亚洲色图| 综合操逼| 偷拍综合亚洲| 久久亚洲欧美中文字幕国语 | 日本成人A片免费看| 96AV久久久| 蜜臀久久99精品久久久| 99亚洲精品| 麻豆尤物视频网| 日韩人妻一区二区精品| 超碰久久网| 看一级特黄a大一片| 超碰碰激情97+久| 久久久精品中文字幕爱豆| 久久久精久久久| 青娱乐休闲视频在线观看| 91oumei| 精品亚洲天堂| 91狠| 精品九九| 99爱久久视频频| 成人性爱免费播放| 美女淫穴| 强奸乱伦AV网址| 久久鲁夜| 国产欧美精选激情视频| 亚洲激情天堂网| 天天色,天天干,天天干| 九九国产| 亚洲午夜福利在线影院| 日本黄色天堂| 再深点灬舒服灬太大了好硬好爽| 97在线日韩中文字幕| 激情五月天丁香社区| 亚洲第一页色网| 天天干天天爽| av黄图片在线观看| 啊啊好多水| 美女写真| 精品在线78| 青青草密桃在线播放| 天天看天天日| 亚洲色性情三级| 欧美操逼熟女| 精品视频一区二区| 精品一区二区三区蜜桃臀赵总 | 强奸乱伦资源| 怡春院久久| 色噜噜国产在线| 欧美日韩国产黄色片| 嗯~啊~轻一点 视频| 五月丁香久久| 100啪啪视频大全| 91女优在线观看| 天天综合网站| 乱伦一二三| 风月影院男女十八禁| 五月激情在线| 伊人网免费视频| 亚洲国产中文字幕| 亚洲高潮少妇| 国产精品久久久久无码A√| 伊人网在线点播| 少妇毛片久久| 干婷婷综合网| 男人的天堂 在线一区| 大香蕉之青青草原| 67914亚洲精品| 欧美成人四级在线播放| 一区二区影视| 亚洲男人综合网| 亚洲色鬼| 手机看片1024你懂的国产| 久久专区| 日本国产二线女色| 蜜臀在线免费观看在线免费观看| 国产精品久久久久久片| 91精品国产91久久青草 | 大香蕉黄色一区| 亚洲黄色视频在线观看视频| 四虎免费在线播放| 熟女欧美日韩综合婷婷| 日日干夜夜干| 一起草av| 国产AV无码AV| 午夜福利国产欧美日韩夜夜| 久热精品在线| 麻豆国产成人精品| 九九热精品在线| 自拍鲍鱼一区在线高清观看免费| 久久无码一区二区二三区性色| 亚洲丝袜在线观看| 青草园大香蕉| 久久精品老司| 亚洲18禁| 六月天婷婷| 日韩av在线播放不卡| 草草影院最新网址| 欧美裸体美女日麻屄| 欧美激情 一区| 国产不卡的视频| 黑人精品久久97| 97免费视频网| 人人澡人人爽人人精品| 五月天开心网| 亚洲aV无码成人在线观看| 久久美女国产| 6080YYY午夜理论片在线观看| 亚洲高清视频在线免费观看| 鸥美中出| 欧美亚洲天天| 91大香蕉伊人| 免费男人的天堂| 情色五月天就去干| 亚洲性图91| 久久久九九九九| 青春草A| 久草资源欧美在线视频| 91 丝袜在线| 内射中出日韩在线观看视频| 大香蕉操久久| 国产91美女高潮| 成人五月香网在线| 920日本午夜免费| 狠狠综合网| 久久久爆乳翘臀一线天伦理视频| 超碰免费在线| 婷婷六月色| 亚洲天堂区| 校园春色制服丝袜中文字亚洲| 亚洲天堂综合AV| 日韩乱码av| 无码heyzo高清一区| 精品视频123区小说区| 亚洲精品色| 狠狠图片青青草| 国产精品在线网站| 99re在线精品78| 日本免费一区二区不卡| 精品国产乱码久久久久久日本公司| 九99久久| 亚洲三级。日韩三级| 久久这里只有精品9| 一级乱伦网站| 久久精品国产亚洲AV高清演员表| 曰韩操B| 色一色综合网|