久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

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

Unity安卓串口通信實(shí)戰(zhàn):USB Host橋接實(shí)現(xiàn)手機(jī)直連單片機(jī)

Unity安卓串口通信實(shí)戰(zhàn):USB Host橋接實(shí)現(xiàn)手機(jī)直連單片機(jī) 簡介一份面向 Unity 開發(fā)者的安卓串口收發(fā)代碼包用于解決 Unity 應(yīng)用與 Arduino、樹莓派等外部硬件設(shè)備的數(shù)據(jù)交互問題。壓縮包共 30 個(gè)文件大小約 124KB包含 JNI 橋接相關(guān)的 C/C 源文件.c/.h、Android.mk/Application.mk 構(gòu)建配置、Java 串口接口封裝、多架構(gòu) .so 動(dòng)態(tài)庫及 SVN 元數(shù)據(jù)等。通過閱讀源碼可了解 JNI 層如何封裝打開、關(guān)閉、發(fā)送與接收串口數(shù)據(jù)的邏輯并查看 armeabi-v7a、armeabi、x86 三種 CPU 架構(gòu)的庫文件便于在真機(jī)調(diào)試時(shí)替換對應(yīng) so 庫對于有一定 Android 原生基礎(chǔ)、想擺脫現(xiàn)成插件限制的 Unity 開發(fā)者是可直接參考的實(shí)現(xiàn)樣本。已有 1172 人學(xué)習(xí)下載適合作為復(fù)刻串口收發(fā)功能的起點(diǎn)。1. 一條手機(jī)直連單片機(jī)的數(shù)據(jù)鏈路Unity做界面安卓原生USB口負(fù)責(zé)收發(fā)有一次接產(chǎn)線數(shù)據(jù)采集面板的活兒甲方拿了一臺現(xiàn)場安卓平板要求直接插USB轉(zhuǎn)串口線讀取下方RS485傳感器數(shù)據(jù)同時(shí)在一套Unity做的三維工控界面里實(shí)時(shí)刷新數(shù)值。大部分人聽到“Unity串口”第一反應(yīng)是用C#的System.IO.Ports但這個(gè)庫在安卓上直接失效連打開設(shè)備都會(huì)拋異常原因在于安卓的串口權(quán)限模型和Windows差了一個(gè)時(shí)代。這篇文章拆一套能跑起來的Unity安卓串口收發(fā)方案核心思路是把底層USB串口讀寫交給安卓原生層C#通過AndroidJavaObject橋接調(diào)用Unity只負(fù)責(zé)協(xié)議解析和UI渲染。適合在Unity里做設(shè)備上位機(jī)、需要手機(jī)直連單片機(jī)或傳感器的開發(fā)者讀完照著配權(quán)限、寫代碼基本能在幾分鐘內(nèi)跑通數(shù)據(jù)回路。2. 技術(shù)選型拆解為什么繞開C#串口API把寶押在安卓USB Host上2.1 安卓串口的三條路有兩條走不通先看現(xiàn)狀。在Windows上寫串口System.IO.Ports拿過來就用打開COM3讀數(shù)據(jù)幾行代碼搞定但這個(gè)體驗(yàn)在安卓平臺上徹底失效。Unity的Mono運(yùn)行時(shí)在安卓上沒有串口設(shè)備文件的訪問權(quán)限SerialPort類實(shí)際調(diào)用會(huì)直接失敗或者打開后沒有任何數(shù)據(jù)返回。原因是安卓應(yīng)用層的設(shè)備訪問受SELinux和權(quán)限模型雙重控制工廠設(shè)備里常見的/dev/ttyS0、/dev/ttyMTK節(jié)點(diǎn)普通應(yīng)用連列目錄的權(quán)限都沒有。第二條路是直接用FileStream讀/dev/ttyS*設(shè)備節(jié)點(diǎn)這也是很多老項(xiàng)目在網(wǎng)上流傳的做法。這個(gè)方案依賴root權(quán)限需要把App裝在root過的設(shè)備上再在授權(quán)下執(zhí)行chmod 666。實(shí)際跑起來會(huì)發(fā)現(xiàn)另一個(gè)問題不同SOC平臺的tty節(jié)點(diǎn)命名完全不同高通平臺叫ttyHS聯(lián)發(fā)科部分平臺叫ttyMT展銳的節(jié)點(diǎn)又是另一套。今天能在這臺機(jī)器跑通的代碼換一批設(shè)備就全滅維護(hù)成本高到失控。所以真正可復(fù)現(xiàn)的路徑只剩第三條USB Host外接串口轉(zhuǎn)接芯片。安卓手機(jī)和平板普遍支持OTG系統(tǒng)把外接的CH340、FT232、CP210x這類轉(zhuǎn)接芯片枚舉成USB設(shè)備應(yīng)用層通過UsbManager獲得設(shè)備句柄。這里不像PC那樣由內(nèi)核自動(dòng)加載串口驅(qū)動(dòng)安卓不會(huì)把USB轉(zhuǎn)串口芯片變成/dev/ttyUSB0需要開發(fā)者在應(yīng)用層實(shí)現(xiàn)對應(yīng)芯片的協(xié)議。繞這一大圈本質(zhì)是用USB的批量傳輸端點(diǎn)模擬異步串口的收發(fā)。2.2 自寫芯片驅(qū)動(dòng)不劃算選現(xiàn)成庫省掉八成工作量USB轉(zhuǎn)串口芯片的協(xié)議并不是統(tǒng)一標(biāo)準(zhǔn)。拿市面上最常見的兩種芯片舉例CH340的控制傳輸命令和FT232的格式完全不是一回事波特率配置、流控開關(guān)、數(shù)據(jù)位設(shè)置的寄存器偏移都對不上。這意味著不借助外部庫需要拿到每顆芯片的數(shù)據(jù)手冊逐個(gè)寄存器實(shí)現(xiàn)配置命令再自己處理廠商芯片的識別邏輯。我見過有人在這個(gè)環(huán)節(jié)翻車——花兩個(gè)星期照著CH340手冊寫了一個(gè)能用的驅(qū)動(dòng)換一批FT232的轉(zhuǎn)接板控制命令全部失效又要重新讀FT232手冊。這種純應(yīng)用層開發(fā)去啃芯片協(xié)議性價(jià)比實(shí)在低。工程上推薦直接引入現(xiàn)成的USB串口開源庫它把設(shè)備枚舉、VID/PID匹配、芯片差異、波特率寄存器配置全部封裝在底層上層唯一需要關(guān)心的就是打開、讀、寫三個(gè)動(dòng)作。實(shí)際測過CH340和FT232兩種轉(zhuǎn)接板同一份代碼幾乎不用改就能切換芯片。2.3 工程目錄逐文件拆解每個(gè)文件管哪一段拿一個(gè)可運(yùn)行的Unity工程示例串口相關(guān)資源集中放在兩個(gè)目錄下Unity側(cè)的C#腳本和Android插件。Assets/ ├── Plugins/ │ └── Android/ │ ├── AndroidManifest.xml │ ├── libs/ │ │ └── usb-serial-lib.aar │ └── java/ │ └── com/devdemo/serial/ │ ├── SerialPortBridge.java │ └── SerialCallback.java ├── Scripts/ │ ├── Serial/ │ │ ├── SerialPortConfig.cs │ │ ├── SerialPortService.cs │ │ └── SerialFrame.cs │ └── Demo/ │ └── SerialDemoController.cs └── Prefabs/ └── SerialManager.prefabPlugins/Android下的AndroidManifest.xml不是Unity工程默認(rèn)那個(gè)而是構(gòu)建APK時(shí)給安卓打包用的合并清單負(fù)責(zé)聲明USB Host特性、權(quán)限過濾規(guī)則把USB設(shè)備枚舉的Intent-Filter掛到主Activity上。libs目錄放串口庫的aarjava目錄放我們自己的橋接類SerialPortBridge和回調(diào)接口SerialCallback。Scripts/Serial里SerialPortConfig.cs承載當(dāng)前串口的參數(shù)集合波特率、數(shù)據(jù)位、停止位、校驗(yàn)位都在這定義并通過Inspector露出SerialPortService.cs是全局唯一的串口服務(wù)入口控制打開、關(guān)閉、讀寫SerialFrame.cs是協(xié)議解析工具負(fù)責(zé)把收到的原始字節(jié)流按自定義幀格式拆解。Demo目錄掛一個(gè)演示控制器把串口事件轉(zhuǎn)發(fā)到UI顯示文本。Prefabs/SerialManager.prefab是一個(gè)內(nèi)含SerialPortService組件的空物體場景啟動(dòng)時(shí)掛上即可。這種組織方式的好處是協(xié)議、底層、UI三層隔離。后期協(xié)議從Modbus改成私有文本協(xié)議時(shí)只需要?jiǎng)覵erialFrame其余代碼基本不動(dòng)。2.4 USB通信模型底料endpoint、批量傳輸和控制傳輸串口庫封裝得再深底層還是在跟USB的endpoint打交道。UsbDevice暴露接口后需要拿到UsbDeviceConnection再找到對應(yīng)接口的In/Out兩個(gè)endpoint。endpoint就是USB設(shè)備上數(shù)據(jù)傳輸?shù)耐ǖ酪粋€(gè)負(fù)責(zé)往設(shè)備發(fā)數(shù)據(jù)一個(gè)負(fù)責(zé)收數(shù)據(jù)。批量傳輸不保證實(shí)時(shí)性但適合收發(fā)一幀一幀的串口數(shù)據(jù)??刂苽鬏攧t用來做設(shè)備配置比如切換波特率、設(shè)置數(shù)據(jù)位、請求設(shè)備描述符都走控制端點(diǎn)。UsbSerialPort的setParameters方法內(nèi)部就是拼好控制命令發(fā)到控制端點(diǎn)再由轉(zhuǎn)接芯片改寫內(nèi)部寄存器。理解了這一層就能明白自寫芯片協(xié)議的工作量在哪里——每顆芯片的控制字格式都不同做一次就得重新折騰一遍寄存器映射。提示權(quán)限是一個(gè)繞不開的環(huán)節(jié)。UsbManager是系統(tǒng)服務(wù)App要用設(shè)備必須得到用戶授權(quán)。授權(quán)彈窗呼出后如果沒有對應(yīng)的BroadcastReceiver處理返回結(jié)果后續(xù)openDevice調(diào)用會(huì)一直失敗。這部分在下一章代碼里能看到具體落法。3. 核心模塊拆解從USB設(shè)備枚舉到串口打開的完整鏈路3.1 AndroidManifest配置讓系統(tǒng)把轉(zhuǎn)接板識別成可用USB設(shè)備Unity導(dǎo)出的APK原本帶一個(gè)自動(dòng)生成的AndroidManifest.xml里面只有Unity入口Activity。外接USB轉(zhuǎn)串口設(shè)備時(shí)需要額外聲明USB Host特性并且給Activity加上USB設(shè)備插拔的Intent-Filter否則設(shè)備插上去系統(tǒng)沒有任何反應(yīng)UsbManager.getDeviceList()拿到的列表永遠(yuǎn)是空的。?xml version1.0 encodingutf-8? manifest xmlns:androidhttp://schemas.android.com/apk/res/android uses-feature android:nameandroid.hardware.usb.host android:requiredtrue / application activity android:namecom.unity3d.player.UnityPlayerActivity intent-filter action android:nameandroid.hardware.usb.action.USB_DEVICE_ATTACHED / /intent-filter meta-data android:nameandroid.hardware.usb.action.USB_DEVICE_ATTACHED android:resourcexml/usb_device_filter / /activity /application /manifest這段配置做了兩件事。uses-feature聲明應(yīng)用依賴USB Host硬件系統(tǒng)在一開始就知道這個(gè)App需要OTG能力。intent-filter和meta-data組合起來把USB設(shè)備插拔事件路由到UnityPlayerActivity同時(shí)由usb_device_filter.xml文件做設(shè)備過濾。設(shè)備過濾文件通常按廠商VID和產(chǎn)品PID來放行只讓特定芯片觸發(fā)打開流程?xml version1.0 encodingutf-8? resources usb-device vendor-id6790 product-id29987 / usb-device vendor-id1027 product-id24577 / /resources這兩個(gè)ID是我實(shí)際調(diào)試中用到的分別對應(yīng)CH340和FT232兩種常見芯片的組合識別碼。不同廠商轉(zhuǎn)接板的VID/PID五花八門如果擔(dān)心漏設(shè)備也可以把過濾文件寫成空列表讓系統(tǒng)對所有USB設(shè)備廣播在Java代碼里再靠芯片協(xié)議探測來判斷是不是串口。我的習(xí)慣是過濾寫嚴(yán)一點(diǎn)只放已經(jīng)驗(yàn)證過的板子防止車間現(xiàn)場彈出些莫名其妙的權(quán)限請求干擾作業(yè)。3.2 SerialPortBridge.java設(shè)備枚舉、鑒權(quán)、連接一次說清Java側(cè)的核心類叫SerialPortBridge負(fù)責(zé)把UsbManager的系統(tǒng)服務(wù)能力包裝成Unity方便調(diào)用的接口。先看設(shè)備枚舉public class SerialPortBridge { private static final String ACTION_USB_PERMISSION com.devdemo.serial.USB_PERMISSION; private Context context; private UsbManager usbManager; private PendingIntent usbPermissionIntent; private UsbSerialPort serialPort; private UsbDeviceConnection connection; public SerialPortBridge(Context context, Activity activity) { this.context context; this.usbManager (UsbManager) context.getSystemService(Context.USB_SERVICE); this.usbPermissionIntent PendingIntent.getBroadcast( context, 0, new Intent(ACTION_USB_PERMISSION), PendingIntent.FLAG_MUTABLE); } public String[] enumDevices() { HashMapString, UsbDevice devices usbManager.getDeviceList(); ListString names new ArrayList(); for (UsbDevice device : devices.values()) { names.add(device.getDeviceName()); } return names.toArray(new String[0]); } }枚舉方法把UsbManager內(nèi)的所有USB設(shè)備名取出來返回給Unity側(cè)。一個(gè)安卓設(shè)備會(huì)掛多個(gè)USB設(shè)備比如觸控屏、鍵鼠、數(shù)據(jù)線通通都會(huì)出現(xiàn)在這里。光拿名字不夠打開前還要通過UsbSerialProber探測哪一個(gè)是能被串口芯片協(xié)議識別的設(shè)備。請求權(quán)限的代碼public void requestPermission(String deviceName) { UsbDevice device findDeviceByName(deviceName); if (device null) return; if (!usbManager.hasPermission(device)) { usbManager.requestPermission(device, usbPermissionIntent); } }這里的回調(diào)不是同步返回而是通過ACTION_USB_PERMISSION廣播回到注冊好的BroadcastReceiver。我在構(gòu)造方法里動(dòng)態(tài)注冊Receiver到應(yīng)用Context上收到允許結(jié)果后馬上執(zhí)行openDevice和UsbSerialPort初始化。不熟悉這個(gè)模式的開發(fā)者把requestPermission當(dāng)同步調(diào)用緊接著就調(diào)openDevice必然每次失敗這個(gè)坑后面避坑章節(jié)會(huì)詳細(xì)展開。打開串口的核心方法public int open(String deviceName, int baudRate) { UsbDevice device findDeviceByName(deviceName); if (!usbManager.hasPermission(device)) { return -2; } connection usbManager.openDevice(device); if (connection null) { return -3; } UsbSerialPort port UsbSerialProber .getDefaultProber() .probeDevice(connection, device); if (port null) { return -4; } serialPort port; serialPort.open(connection); serialPort.setParameters( baudRate, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE); return 0; }幾個(gè)返回值對應(yīng)不同失敗原因-2是沒授權(quán)-3是系統(tǒng)把設(shè)備占了-4是芯片協(xié)議不匹配。Unity側(cè)拿到返回值就能直接給用戶一個(gè)明確的提示文案。setParameters里的參數(shù)分別對應(yīng)波特率、數(shù)據(jù)位、停止位和校驗(yàn)位和Windows串口編程里DCB結(jié)構(gòu)體的內(nèi)容一一對應(yīng)這里配置錯(cuò)了后面讀到的數(shù)據(jù)全部是亂碼。3.3 C#側(cè)橋接Unity把調(diào)用傳到Java層的標(biāo)準(zhǔn)姿勢Unity側(cè)并不直接持有UsbManager所有安卓系統(tǒng)服務(wù)調(diào)用都必須經(jīng)過AndroidJavaObject。SerialPortService以單例形式存在構(gòu)造時(shí)同時(shí)創(chuàng)建Java橋接對象和回調(diào)代理public class SerialPortService : AndroidJavaProxy { public delegate void DataReceivedHandler(byte[] data); public event DataReceivedHandler DataReceived; private AndroidJavaObject bridge; private readonly object lockObj new object(); public SerialPortService() : base(com.devdemo.serial.SerialCallback) { AndroidJavaClass unityPlayer new AndroidJavaClass(com.unity3d.player.UnityPlayer); AndroidJavaObject activity unityPlayer.GetStaticAndroidJavaObject(currentActivity); bridge new AndroidJavaObject( com.devdemo.serial.SerialPortBridge, activity, this); } public string[] GetDeviceList() { return bridge.Callstring[](enumDevices); } public int Open(string deviceName, int baudRate) { return bridge.Callint(open, deviceName, baudRate); } public void Close() { bridge.Call(close); } }AndroidJavaProxy是Unity提供的動(dòng)態(tài)代理機(jī)制C#對象可以作為Java接口回調(diào)的實(shí)參傳進(jìn)Java層。Java的SerialCallback接口定義一個(gè)onData(byte[])方法C#類通過重寫OnData方法接收底層數(shù)據(jù)這樣Unity側(cè)不用開額外線程就能拿到串口字節(jié)。調(diào)用過程有兩個(gè)注意點(diǎn)。AndroidJavaObject.Call傳參時(shí)bool要轉(zhuǎn)成Java booleanstring直接用C#的string即可返回值是數(shù)組的Unity能直接轉(zhuǎn)成對應(yīng)類型的C#數(shù)組。另外在Linux編輯器模式下調(diào)試會(huì)報(bào)找不到UnityPlayer類所以串口服務(wù)初始化要包在#if UNITY_ANDROID宏里等真機(jī)打包后再調(diào)用。4. 數(shù)據(jù)收發(fā)實(shí)戰(zhàn)從讀取線程到幀解析完整鏈路一幀不丟4.1 Java側(cè)讀取線程別把USB讀操作塞到主線程USB串口庫提供的read操作是阻塞式的。如果直接在Unity下幀循環(huán)里調(diào)用橋接去讀每一幀都卡在USB讀取上界面明顯掉幀。數(shù)據(jù)流量一上來主線程和渲染線程互相等整個(gè)應(yīng)用就“假死”了。正確做法是在Java層起一條獨(dú)立線程循環(huán)調(diào)用read把讀到的數(shù)據(jù)通過回調(diào)拋給Unityprivate Thread readThread; private volatile boolean running; public void startReading() { running true; readThread new Thread(() - { byte[] buffer new byte[512]; while (running serialPort ! null) { try { int len serialPort.read(buffer, 300); if (len 0) { byte[] data new byte[len]; System.arraycopy(buffer, 0, data, 0, len); callback.onData(data); } } catch (Exception e) { running false; } } }); readThread.start(); } public void stopReading() { running false; if (readThread ! null) { readThread.interrupt(); } }read的第二個(gè)參數(shù)是超時(shí)毫秒數(shù)300毫秒內(nèi)沒有新數(shù)據(jù)就返回0或負(fù)值。進(jìn)入循環(huán)后如果串口斷開read會(huì)拋異常這里捕獲后把running置false線程自然退出避免出現(xiàn)僵尸線程。每次從buffer截取實(shí)際讀到的長度再一次性提交回調(diào)。不直接復(fù)用整個(gè)512字節(jié)數(shù)組是因?yàn)閁nity側(cè)會(huì)把這個(gè)數(shù)組當(dāng)完整數(shù)據(jù)做幀解析如果混入多余空字節(jié)會(huì)判斷錯(cuò)幀長。4.2 Unity側(cè)數(shù)據(jù)接收隊(duì)列把Java回調(diào)轉(zhuǎn)成主線程親和的事件流Java回調(diào)到C#側(cè)時(shí)OnData方法運(yùn)行在子線程而Unity大部分API不允許子線程訪問。處理方法是在C#側(cè)把收到的字節(jié)放入線程安全的隊(duì)列然后在Update里統(tǒng)一取出處理private readonly ConcurrentQueuebyte[] pendingData new ConcurrentQueuebyte[](); public void OnData(byte[] data) { pendingData.Enqueue(data); } private void Update() { byte[] data; while (pendingData.TryDequeue(out data)) { ProcessSerialData(data); } }注意幾個(gè)細(xì)節(jié)OnData回調(diào)必須保證線程安全如果隊(duì)列不加鎖回調(diào)并發(fā)進(jìn)來就可能壞數(shù)據(jù)ConcurrentQueue的TryDequeue保證出隊(duì)原子性但ProcessSerialData內(nèi)部不能做耗時(shí)操作否則隊(duì)列會(huì)越堆越長。ProcessSerialData內(nèi)部流程是先把原始字節(jié)拼進(jìn)一個(gè)分組緩沖區(qū)再按幀頭幀尾切分。不能每收到一次回調(diào)就算一幀因?yàn)榇诘膔ead可能一幀分兩次讀到也可能一次讀到半幀。常見做法是積累式緩沖新字節(jié)append到尾部再循環(huán)從頭查找完整幀。4.3 發(fā)送鏈路指令組包、異步寫入和失敗降級發(fā)送接口同樣走AndroidJavaObject.Call回到Java層。write是同步的在主線程調(diào)用可能卡頓所以發(fā)送時(shí)我一般放在Unity協(xié)程里或Task.Run包一層public bool Write(byte[] payload) { if (bridge null) return false; return bridge.Callbool(write, payload); }Java側(cè)對write封裝一層重試邏輯public boolean write(byte[] data) { if (serialPort null) return false; try { int written serialPort.write(data, 300); return written data.length; } catch (Exception e) { return false; } }寫入時(shí)序有一個(gè)容易翻車的點(diǎn)兩個(gè)指令間隔太短轉(zhuǎn)接芯片的發(fā)送緩沖區(qū)還沒把上一幀發(fā)完下一幀就綴上去。應(yīng)用層要保證每次發(fā)送之間至少有一個(gè)幀的間隔不建議硬編碼毫秒級delay。更穩(wěn)妥的做法是維護(hù)一個(gè)發(fā)送隊(duì)列上一幀write返回后再發(fā)下一幀。對實(shí)時(shí)性要求不高的工業(yè)采集場景發(fā)送頻率控制在20幀每秒以內(nèi)穩(wěn)定性會(huì)好很多。4.4 協(xié)議幀封裝幀頭、長度、命令字和CRC16的通用實(shí)現(xiàn)單片機(jī)那邊幾乎不會(huì)用裸字節(jié)當(dāng)業(yè)務(wù)數(shù)據(jù)至少帶一個(gè)簡單幀格式。下面是一個(gè)可以直接拿去改的組包實(shí)現(xiàn)public static class SerialFrame { public static byte[] BuildFrame(byte cmd, byte[] payload) { int length 1 1 payload.Length 1 2; byte[] frame new byte[length]; frame[0] 0xAA; frame[1] 0x55; frame[2] (byte)(payload.Length 1); frame[3] cmd; System.Buffer.BlockCopy(payload, 0, frame, 4, payload.Length); ushort crc Crc16.Compute(frame, frame.Length - 2); frame[frame.Length - 2] (byte)(crc 0xFF); frame[frame.Length - 1] (byte)((crc 8) 0xFF); return frame; } }幀結(jié)構(gòu)是兩字節(jié)幀頭0xAA55一字節(jié)長度字段一字節(jié)命令字然后是負(fù)載最后兩字節(jié)CRC16校驗(yàn)尾。接收端解析先找?guī)^讀長度字段判斷幀長計(jì)算CRC比對校驗(yàn)尾。這個(gè)格式很通用能應(yīng)付大多數(shù)單片機(jī)通信。CRC16用查表法實(shí)現(xiàn)代碼不復(fù)雜。組包時(shí)注意CRC計(jì)算范圍是除校驗(yàn)尾以外的所有字節(jié)兩個(gè)校驗(yàn)字節(jié)的順序由單片機(jī)固件決定。調(diào)試時(shí)如果CRC一直對不上先把這兩字節(jié)交換一下再看。這類“對不上校驗(yàn)”的排查點(diǎn)后面避坑章節(jié)會(huì)專門提。注意幀頭、長度字段和CRC的字節(jié)序一定要先跟設(shè)備端固件確認(rèn)。很多項(xiàng)目聯(lián)調(diào)翻車都是協(xié)議看起來一致實(shí)際高低字節(jié)順序完全相反。5. 串口調(diào)試避坑五類高頻問題從現(xiàn)象到根因的排查路線5.1 設(shè)備列表為空USB轉(zhuǎn)串口板插上沒反應(yīng)現(xiàn)象Unity界面上點(diǎn)“刷新設(shè)備”枚舉數(shù)組為空OTG線已插好轉(zhuǎn)接板指示燈也亮了。原因AndroidManifest沒聲明USB Host特性或Activity沒有接收USB_DEVICE_ATTACHED廣播。系統(tǒng)層面可能壓根沒把設(shè)備加入U(xiǎn)sbManager設(shè)備列表。另一種情況是部分平板廠商對USB設(shè)備做了白名單限制。解決先確認(rèn)清單里有uses-feature android.hardware.usb.host再檢查Intent-Filter是否齊全。排除后在電腦上用adb shell執(zhí)行dumpsys usb查看系統(tǒng)枚舉結(jié)果如果這里都沒有就是硬件接觸或供電問題。帶RS485隔離模塊的轉(zhuǎn)接板常吃電流單靠平板USB口供電經(jīng)常帶不動(dòng)這時(shí)得外接供電。5.2 權(quán)限彈窗出現(xiàn)但點(diǎn)確定之后沒有任何回調(diào)現(xiàn)象第一次插入設(shè)備系統(tǒng)彈出USB設(shè)備授權(quán)對話框點(diǎn)了允許但串口就是打不開甚至反復(fù)彈窗。原因請求權(quán)限用的PendingIntent在Android 12以上需要顯式指定可變性標(biāo)志如果配了FLAG_MUTABLE或FLAG_IMMUTABLE不當(dāng)權(quán)限回調(diào)廣播就發(fā)不出來。另外BroadcastReceiver如果用Activity作為context動(dòng)態(tài)注冊Activity銷毀后收不到任何事件。解決PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT)Receiver注冊改用context.getApplicationContext()這樣即使頁面重建也不會(huì)丟廣播。還要區(qū)分手機(jī)系統(tǒng)設(shè)置里的“USB調(diào)試”彈窗那是開發(fā)者選項(xiàng)和應(yīng)用層USB權(quán)限是兩回事。5.3 串口打開正常但收到的字節(jié)全是亂碼現(xiàn)象read能收到數(shù)據(jù)打印出來是\u00ff\u00fe之類或者高位字節(jié)全部丟失。原因最常見是波特率不匹配。單片機(jī)端配置9600安卓側(cè)按115200打開肯定亂碼。另一類是數(shù)據(jù)位、停止位、校驗(yàn)位有一項(xiàng)不一致比如設(shè)備端是8N1代碼里寫成了7E1導(dǎo)致字節(jié)錯(cuò)位。解決先查看設(shè)備說明書確認(rèn)串口參數(shù)再把setParameters里四個(gè)參數(shù)對齊。還亂碼就換一根更短的連接線工業(yè)現(xiàn)場長線傳輸高波特率很容易受干擾。試到2400或4800許多老傳感器在低速下反而穩(wěn)定。5.4 數(shù)據(jù)能收但丟幀嚴(yán)重幀與幀之間斷流現(xiàn)象偶爾能收到完整數(shù)據(jù)幀但數(shù)據(jù)不連續(xù)中間缺字節(jié)報(bào)文頭尾經(jīng)常對不上。原因讀取線程buffer太小或讀取間隔太長。USB批量傳輸一次最大有效載荷不過64字節(jié)單次讀取后沒及時(shí)清空下一個(gè)包就可能覆蓋前一個(gè)。另一頭可能是Unity側(cè)ProcessSerialData耗時(shí)太長隊(duì)列堆積串口數(shù)據(jù)延遲后看起來就像斷流。解決Java讀取線程把buffer加大到1024超時(shí)設(shè)200到300毫秒。Unity側(cè)處理函數(shù)不要直接做日志輸出先把字節(jié)緩沖到幀緩沖區(qū)拼出完整幀再處理。如果還是掉考慮在AndroidManifest里給讀取線程加高優(yōu)先級或者直接用后臺Service持有連接。5.5 鎖屏或切后臺后串口斷開回到前臺必須重新打開現(xiàn)象平板鎖屏一段時(shí)間解鎖后串口數(shù)據(jù)停了重新點(diǎn)打開設(shè)備報(bào)設(shè)備被占用或打不開。原因UsbDeviceConnection的存活和Activity生命周期有關(guān)。Unity場景在后臺被回收J(rèn)ava層bridge對象雖然還在底層連接已經(jīng)被系統(tǒng)回收。解決把bridge對象的生命周期和應(yīng)用進(jìn)程對齊在Unity里把SerialPortService掛到一個(gè)DontDestroyOnLoad的空物體上同時(shí)監(jiān)聽Application的pause和resume事件。暫停時(shí)主動(dòng)stopReading恢復(fù)時(shí)再startReading可以有效減少斷開概率。需要高強(qiáng)度后臺采集的場景就得把USB連接放到前臺服務(wù)里維護(hù)那已經(jīng)超出本文范圍但方向是明確的。6. 二次開發(fā)思路把這套鏈路改造成你自己的協(xié)議通道拿到這套代碼后最常見的改造需求就是替換成自己團(tuán)隊(duì)的私有協(xié)議。我的建議是先不要?jiǎng)覬ava層Java層只負(fù)責(zé)把可靠的字節(jié)流送到C#協(xié)議相關(guān)的一切都收斂在SerialFrame和回調(diào)處理函數(shù)里。這樣做的理由是Java層每次改動(dòng)都要重新導(dǎo)出aar、重新打APK聯(lián)調(diào)成本高而C#層的改動(dòng)可以即時(shí)生效熱更新也不受影響。具體改協(xié)議時(shí)我把SerialFrame做成靜態(tài)工具類留出三個(gè)口子BuildFrame用來組包發(fā)送TryParseFrame用來從字節(jié)流里提取完整幀CalculateCRC用來替換校驗(yàn)算法。很多私有協(xié)議其實(shí)就是把幀頭改成別的魔數(shù)或者在幀尾多塞一個(gè)應(yīng)答號。這種程度的改動(dòng)只需要復(fù)制一份SerialFrame改一兩個(gè)方法完全不影響串口底層。還有一個(gè)實(shí)用技巧是事件驅(qū)動(dòng)模式。SerialPortService已經(jīng)暴露了DataReceived事件但更推薦在業(yè)務(wù)層做二次轉(zhuǎn)發(fā)public class SerialDemoController : MonoBehaviour { private void OnEnable() { SerialPortService.Instance.DataReceived OnSerialData; } private void OnDisable() { SerialPortService.Instance.DataReceived - OnSerialData; } private void OnSerialData(byte[] frame) { // 在這里按命令字分發(fā)例如0x01轉(zhuǎn)溫度顯示0x02轉(zhuǎn)開關(guān)量狀態(tài) } }這個(gè)寫法保證了每個(gè)業(yè)務(wù)模塊只訂閱自己關(guān)心的消息不會(huì)在同一個(gè)回調(diào)里寫一堆switch-case。多設(shè)備場景下還可以給回調(diào)加一個(gè)deviceId參數(shù)把多個(gè)串口的字節(jié)流按端口分開。驗(yàn)證方面我在Unity側(cè)放了一個(gè)調(diào)試面板實(shí)時(shí)顯示收包計(jì)數(shù)、錯(cuò)誤幀計(jì)數(shù)和最近一幀的十六進(jìn)制內(nèi)容。每次改動(dòng)協(xié)議解析邏輯先用調(diào)試面板確認(rèn)幀格式正確再開始做UI聯(lián)動(dòng)。從那以后我每次接新的串口設(shè)備都先花十分鐘在安卓原生層用日志確認(rèn)枚舉、權(quán)限、連接三個(gè)節(jié)點(diǎn)全部通過再回來改Unity側(cè)界面。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
五月激情在线| 久9爱精品| 免费啪啪啪网站18岁| 人人妻人射| 性爱乱伦视频免费| 日韩国产成人自拍视频| 在线一道啪| 影视综合无码少妇| 日韩黄色一区二区三区| 一区在线观看中文字幕| 九九热在线视频| 久久婷婷五月天| 污啪啪啪视频| 亚洲 图片 欧美 色图| 青青草日逼视频| 亚洲精品蜜桃久久久一区二区三区| 欧美制服网站美腿丝袜| 国产超碰在线一区| 少妇蹲下买菜露大唇0| 啊啊啊在线看| 极品销魂美女一区二区| 天天干天天燥| 日韩人妻精品久久久久| 色 亚洲 91| 91老妇女| 欧美日韩另类在线| 欧美躁死她一区二区| 欧美色图天堂网m| 久男人久久| 亚洲精品久久久久久久蜜桃臀| 亚州综合| 大香蕉乱伦视频网| 神马久久久久久久久久| 久久老熟女| 欧美大波激情xxxx| 综合色图亚洲欧美| 99精品在线| 中文AV制服乱伦| 一区二区三区精品久久| 97资源免费视频| 激情文学88| 国产成人+综合亚洲+天堂| 用力操死我| 久久风骚城市| 日韩欧美综合激情| 热热热热日日漂亮永久永久国产日| 少妇天堂| 和协影院中文字幕三区| 91精品国产长腿丝袜美女| 91色婷婷综合久久中文字幕二区| 日韩激情啪啪啪| 99999精品视频| 天天夜夜rb| 曰韩av中文字幕专区| 亚洲精品国产av天美传媒| 丝袜天堂网| 亚洲无码AV九九九| 免费草草草草草视频| 黄片免费视频2019| 宗合情欲网| 思思视频免费看网站| 91欧美偷拍| 高清国产无码av| 黄色二级片网站| 精品无码欧美三级| 亚洲图片 激情小说| 最新av中文字幕高清| 超碰97首页| 午夜男人av| 青木玲在线不卡| 亚欧无码在线| 久操精品| 免费成人在线熟妇网| 午夜福利精品| 高清孕妇孕交| 亚洲综合草草| 日韩在线人妻网站| 爱我干综合| 1769成人国产精品视频| 亚洲欧美日韩国产丝袜自拍中文| 国产成人网站在线观看| 一级做a爰片性色毛片久久| 一区二区三区四区久久视1| 成人a大片在线观看| 成人资源中文字幕在线观看| 天天操天天射青青草| 国产精品一级毛片不卡视| 老熟女天天操| 中文字幕超碰CAO| 思思在线免费视频| 香蕉热人人精品| 亚洲色天堂九9| 亚州色站 日韩电影| 日韩人妻一区二区精品| 中文字幕乱在线伦视频中文字幕乱码在线| 亚洲三级。日韩三级| 欧美熟妇人体| 25国产精品免费观看| 很黄很色的视频在线观看| 婷婷午夜清品久久久久久久性色视频观| 亚洲码和欧洲精品激情系列| 欧洲站一级二级三级h| 天美av在线观看| 性一交一乱一交A片久久四色| 黄色成人网久久久久久| J?P?NESEHD熟女熟妇伦| 久久的免费性爱视频| JuliaAnnXXX888| 久久久熟女一区| 性欧美精| 色香网| 精品九九九九九九九九九| 熟女一区二区| 激情欧美日韩女同久久| 蜜桃精品视频一区| 亚洲A曰本VA欧美VA视频| 亚洲综合首页| 秋霞免费无码视频日韩A片| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 人妻精品一区一区三区蜜桃91| 91精品国久久久久久无码| 情色五月天久久久| 欧美人人天天网| 国产精品3| 91高清日| 亚洲AV成人精品网站在AV| 偷拍偷窥与盗摄视频专区| 久9re热视频这里只有精品| 99自拍视频在线观看| 牛黄色久午久| 青青草亚洲一区| 久久久111| 超碰97.com| 中文字幕三四区| 日本一区视频在线观看| 丁香五月天堂网| 天天综和| 操久久久久| 国产精品不卡一区二区电影| 国产成人无码久久精品| 99精品热| 91香蕉国产尤物视频| 五十路六十路素人熟女| 99热色精品| 诱惑人妻欧美一区在线播放| 午夜传煤十二区精品| 欧美日本成人一区二区| 国产做?爰片久久毛片?片美国| 日日干日日| 欧美在线啊啊啊| 国产农村妇女毛片精品久久| 亚洲av综合色区无码一| 亚洲精品丝袜| 亚洲a色| 1769一区二区| 国产精品天干天干综合网麻豆| 久久久精精精| 国产精品自产拍在线观看社区| 欧美三级不卡| 麻豆精品一区二区三区四区免费观看| 国产综合网站在线播放| 熟女露脸激情自拍视频| 福利操逼| 一区,二区,三区视频| 一区二区乱码福利| 丰满少妇人妻久久久久久| 91美女视频。| 91欧美| 新怡红院| 综合五月天| 中国少妇啪啪视频| 99这里只有精品| 久久久久99精品成人片蜜臀| 一本道综合色图| 亚洲人妻爽爽爽| 国产原创自拍| 午夜福利1区2区3区| 97在线欧洲| 天天插夜夜操| 亚洲清纯综合| 无码人妻毛片丰满熟妇精品区| 日本幼女18+| 亚洲国产av中文字幕久久| 日韩精品三区四区| 在线不卡视频| 好爽视频在线观看视频| 亚洲色资源| 中文字幕jul-617人妻熟女| 亚洲资源站| 欧美性爱一区| 人人操我人人干| AA级电影三区| 啊啊啊啊啊啊在线| 小骚逼被操的爽不爽| 校园春色欧美| 97在线观看| 亚洲精品一区二区三区在线播放 | 色九九综合AV| 激情 欧美 亚洲 小说| 亚卅熟女乱色| 青娱乐手机日韩在线视频| 国产精品伦理| 柠檬AV导航| 95人妻爽爽人人做人人澡| 少妇高潮流水av免费| 99re6国产精品99re| 美女被啪到深处抽搐视频| 殴美日韩m| 日本操逼aaaaa| 久久不卡一区二区| 日本精品一区二区中文字幕| 两性综合网| 超踫中文字幕| 丝袜天堂| 强奸熟女一区二区三区 | 99只有精品| 欧美天堂亚洲电影院一区在线播放| 日韩黄色一区二区三区| 综合影院永久入口国产| 天天综合网亚洲综合网| 鸥美插入视频| 伊人97超碰| 久久精品国产亚洲AV成人直播| 好色综合| 日韩一二三区| 91综合网站| 国内一区二区三区| 热久久99999| 夜夜夜久久| 国产又操| 五月天婷婷基地| 成人一级性爱| 国产性爱在线视频一区二区| 99re免费| 中日韩免费看男女操逼大全| 天天澡天天爽日日AV| 欧洲一区二区| 99精品无码| 亚洲人精品久久久喷水| 爱干爱射网啊啊啊| 操逼内射干逼白丝91| 内射中出日韩在线观看视频| 国产蜜臀精品一区免费尤物| 久久综合18p| 久久国色天香香蕉| 日本精品免费一区二区三区四区| 亚洲色图国产另类| 色偷综合| 日韩欧美三级| 一二三区操逼国产91| 中文字幕欧美日韩三级| 妇女性内射冈站HDWWWCOM| 中文字幕蜜乳av| 中日韩一区二区三区欧美| 97超碰色| 日本性爱不卡视频| 丁香久久| 天天爽夜夜欢视| 久久精品人妻一区二区| 丁香五月影院| 国产无码成人无码| 人妻密肉在线观看| 99久久久久久亚洲精品不卡| 久久久久久97| 天天搞在线综合网| 一色网男人的天堂| 劲爆欧美人妖三区91| 久久精品国产99久久,亚洲日韩久久日本一区一区三区 | 综合久欧洲| 色97综合中文字幕| 9久精品| 草草网站影院白丝内射| 日本人体九九九九九九| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 草B在线| 欧美96精品在线| 欧美一级黄片视频在线| 欧美亚性天堂| 男人的天堂久久| 国产中文字幕在线点播| 青青青操| 亚洲一区二区AV| 欧美综合区| 欧美日本久久精品一区| 国产精品成人午夜福利| 一区三区啪啪| 丝袜狠狠草尤物 91| 曰韩中文人妻视频| 中亚精品极乱| 麻豆av一区二区| 久久久精品视频免费观看| 中国黑人三级片网站上区| 色97干| 国产av尤物| 欧姜老司机| 伦理片秋霞免费影院| 亚洲色图 综合| 国产精品久久aV| 久久风骚城市| 亚洲欧美国产成人综合不卡| 不卡av免费在线网址| 96麻豆精品一区二区三区| 78久久久| 亚洲激情深爱文学小说网站| 色噜噜人妻丝袜a∨先锋影 | 丁香六月婷婷综合| 天天色欧美| 农村妇女精品一二区| AV 少妇 人妻 偷拍| 啊啊啊想要| 老色69| 日欧操屄| 日本中文字幕一区| 色优久久| 91影库| 超碰 国产熟女精品一区| 欧美99| 中文字幕日韩专区精品系列| 久久精品99久久久久久| 久久婷婷伊人| 这里只有精品视频在线观看麻豆 | 乱伦图一区| 久久久久密臀一区二区| 日本一级性爱| 欧美在线永久天堂| 97操碰| 情色日播放AV| 亚洲五月婷婷| 国产精品人妻熟女aⅴ| 日日夜夜骑| 久久夜夜夜夜| 亚洲天堂人妻一区二区| 欧美啪啪女女| 中文字幕奈奈美被公侵犯| 欧美日韩制服| 在线电影亚洲色图| 久久超碰、| 日本在线一二| 亚洲一区二区三区欧美日韩| 台湾佬大香蕉| 日本免费二区三区| 久久亚洲日韩国产欧| 亚洲高清视频在线观看| 久久手机视直播| 好吊妞转入那个网| 五月综合色| 亚洲成人网站在线观看| 天堂种子在线www网资源| 午夜福利免费精品视频| 欧美熟妇成人一区二区| 91天天| 欧美一区二区三区入口| 国产嫩草精品A88AV| 亚洲欧美日韩中文久久自慰| 日噜夜夜夜夜夜夜夜夜夜夜爽爽爽爽爽爽爽爽爽爽爽爽 | 人妻啊啊人妻啊| 99综合视频| 国产 码在线成人网站| 欧美中出1| 无码自拍SM| 大香蕉五月天婷婷| 午夜天堂精品久久久久91| 亚洲成人免费电影| 超碰日本97美女人妻人人玩人人爱| 亚洲成人性爱在线观看| 亚洲激情网| 调教熟妇 久久久久久| 中文字幕 人妻不满 在线视频| 99人人干| 亚州色图第三区| 91色碰| 狠狠搞 亚洲91| 久久亚码| 丰满人妻一区二区三区蜜桃视频| 亚洲国产精品无码AV久久久| 色色色天美视频| 99激情视频| 99re69综合| 极品出轨视频网站| 久久久天美| 人妻啊啊人妻啊啊| 91爱欧美| 精品一级毛片在线观看| 色官网色综合| 久久欧美1卡2卡3| 色偷综合| 美国精品国产精品| 欧美拳交在线播放| 久草久日| 性爱视频无打码在线观看| 婷婷亚洲天堂| 青青草好吊| 最新av中文字幕高清| 少妇超碰在线| 天天综合91入口| 国产精品永久免费10000| 桃色五月天| 婷婷久草| 欧美东京热精品A∨| 性天堂| 91亚洲影院综合| 天天天天干| 72av视频| 国产精品亚洲一区二区三区四区| 亚洲综合校园春色| 免费黄色A片| 精品人妻久久久| 99热免费| 国产综合色精品在线观看| 中文字幕在线观看AV| 色波多| 97天天综合网| 最近2019中文字幕国语免费版| 啊嗯嗯啊好大好爽| 99精品在线播放| 97爱综合| 日韩欧美水蜜桃人妻| 日本人人操人人操| 人妖欧美一区二区| 91女网站| 国产www色在线观看| 日本国产二线女色| 久久熟女人| 成全在线观看免费观看| 麻豆一区二区三区在线看| 天天综合日韩网| 日日日日做夜夜夜夜无码| 我想要啊 啊 啊| 天天综合日韩网| 变态乱伦伪娘灌肠一区二区| 九t超碰| 台湾大香蕉99热| 无码高清专| 国产剧情在线| 另类专区加勒比| 日韩免费人妻色情网站| 三级网色| 久久大黄片| 色眯眯av| 少妇一区二区三区在线观看| www色婷婷| 激情天天视频| 成人怡红院| 久久亚洲天堂| 综合网久久| 欧洲色| 国产精品无码av| 屁股久久久久久| Aa东京男人的天堂| 97综合国产精品高潮久久| 色综合久久888| 国产免a费看黄片在线| 78超碰| 久久↗↗| 夜夜综合| 国产AV人人 夜夜人人澡| 精品久久久亚洲AV成人网站| 3028国产精品| 成人无码在线超碰网| 欧美亚洲今日在线| 丝袜综合网| 熟妇高潮二区三区| 丰满人妻一区二区中文| 夜精品久无码| 极品五月天噜噜| 九月婷婷久久| 欧美精品999| JIZZJIZZ国产精品喷水| 国产精品999zyz| 在线观看不卡一区二区三区| 日本成a人v网站在线观看| 好涩综合| 先锋女优在线观看视频| 大逼色网站| 久久风骚城市| 激情视频图片| 美女91网址| 91精品婷婷国产综合久久| 九九自拍伦理| 久久九精品| 久久超碰97中文字幕| 色女99一级片在线观看| 日本伦理一区二区| 久久九九一区二区三区成人| 亚洲欧美综合色| 人妻密肉在线观看| 欧亚第一综合网| 男人干美女| 骚逼一区二区| 九99久久| 欧美成人精品一区| 蜜臀久久99精品久久久久久婷婷 | 久久久久久国产精品| 五月丁香| 久久久精品中文字幕麻豆| 20cm女自慰在线日韩欧美| 久久精品| 91影库| 久久亚洲AV成人精品无码| 国产一级作爱毛片| 婷婷久久综合| yirendaxiangjiashipin| 综合激情97 | 97爱免费插| 伊人97色天使| 伦在线97| 91日韩网站| 久久久96| 强奸国产在线| 97色婷婷| 亚洲一本色码中文字幕| 高清不卡 中文 人妻| 91天堂丝袜美腿| 校园春色综合网| 久久青青草原免费视频| 亚洲综合精品国产一区| 吻戏激情性巴克| 欧美久久婷婷| 欧美色九九| www.99色| 91Chinese在线| 久久嫩草国产成人一区| 中字一区| 亚欧无码线免费观看视频| 久久亚洲AV无码专区首页| www.色婷婷色综合| 少妇与黑人高潮在线| 午夜精品人妻二区三区| 久久久96| 一区在线国产播放| 色九月综合| 男人的天堂Va| 777AV电影| 中文字幕精品一区二区精品| 日韩美女高潮喷水视频| 亚洲自拍97| 韩国午夜理伦三级好看| 色一射色一射| 伊人网在线点播| 国产乱伦亚洲| 精品大久久| 婷婷人妻激情| 欧洲一级性爱视频在线观看| 嗯……啊…嗯嗯…啊…好舒服| 91九色丰满高潮| 内射夫妻三片| 一区二区偷拍拍视频| 亚州九九九精品视频| 亚洲天堂久久久久久粉红视频| 97国产高清视频在线观看| 色婷婷综合久久中文字幕雪峰| 天天综合91入口| AAAAAAAAA黄片| 日韩熟女精品无码专区一区二区 | 人妻熟女一区二区三区在线| 人妻丝袜美腿中文字幕| 中文字幕av亚洲在线| 成人在线永久| 国产福利电影| 久久9久9久99久9久9| 国产熟女无套内射| 婷婷操逼| 一本色道久久综合精品婷婷| 亚洲一区二区性爱电影| 亚洲色图综合网| 久久久久久久伊人精品| 嗯啊啊啊轻点视频 | 另类图片综合| 97久久精品亚洲| 97超级久久| 精品国产肉丝袜在线拍国语| 亚洲怡春院| 欧亚乱色熟女一区二区| 97一区二压| 成人av影院在线观看| 欧美亚洲国产自久久| 国产一级高清免费观看| 99久久com免费视频′| 丝袜足交视频| 老色69| 立川理惠被中出无码| 高清不卡国产| 麻豆视频国产一区二区| 国产天天看| 中文字幕日韩电影人妻| 涩涩久久精品| 国产亚洲色婷婷久久99精品91葵花宝典 | 天天日天天色| 成人羞羞视频国产| 国产av青草| 亚洲无码太久| 色踪合AV| 亚洲色综合| 男人天堂欧美| 午夜精品久久久99| 东京热男人的天堂精品| 欧美最大综合网| 婷婷视频网| 亚洲在线a| 欧洲射精91| 亚洲欧美日韩免费电影| 丝袜色综合| 91久久婷婷| 久久久久亚洲Av无码专区老牛影视| 啊好大好舒服| 岛国片国产成人亚洲播放| 四虎免费视频| 日韩乱码av| 欧美人人曰人人操人人射射| 91亚洲丝袜| 思思热在线视频精品| 97天堂| 日韩一级二级三级免费看完整版国语版| 一级久久久久久久久久久| 深爱伊人影院| 亚洲第一页欧美| 亚洲AV无码国产精品久久久久| 91久久婷婷| 麻豆精品A片免费观看| 黄色网址在线免费观看| 国产传媒日韩| 久久美国毛片| 人人爽天天爽| 8050无码八戒| 精品蜜乳AV免费观看| 日韩97视频| 欧美专区第一页| 国产精品久久久久中文字幕| 97在线看| 天操天操夜操夜月操月年年操操| 人妻夜夜爽天天爽麻豆三区网站| 亚洲第一无码播放立川理惠| 午夜国产综合视频在线观看| 日本国产二线女色| 青青草白白色| 亚州精人品大香蕉| 久久性爱大全| 国产精品ⅴ无码大片在线看.| 欧亚 另类 久| 亚洲精品1区| 97中文天堂| 国产粉嫩出水在线播放| se吧提供91精品国产91久久久久久| 综合网亚洲1| 亚洲少妇在线影音| 国产精品久久久亚洲一区| 91快色色色色色| 中文操逼字幕| 精品人妻av区天天看片| 91精品婷婷国产综合久久| 91丝袜激情在线| 97国产色综合| 人妻熟女午夜精品在线| 婷婷亚洲五月***久久| 精品日韩人妻视频| 蜜臀久久99精品久久久电影| 蜜桃AV天堂| 丁香六月东京热| 99精品久久久久久久婷婷| 亚州欧美另类| 久久黄片国产一区二区| 久久极品伊人| 国产精品视屏| 婷婷五月天成人| 农村女一级毛卡片| 婷婷五月成人| 欧美日韩黄片精品在线| 亚州人妻| 伊人AAA| 欧美日韩中文字幕人妻| 成人综合色网| 欧美AAAA黄片| 91丝袜美腿片| 99碰碰| 久艹日日日| 激情亚洲天堂| 国产免费一区2区3区| 人人妻天天做天天爽| 精品久久久久久中文字幕三区| 天天热精品| 久久婷婷六月综合| 欧美 亚洲精品首页| 婷婷人妻激情| 欧美—性—交—色| 91爱啪| 亚洲色图欧美| 家庭乱伦麻豆| 欧美v亚洲v综合v国产v妖精| 亚洲av综合伊人久久| 男女啪啪网站免费视频| 伊人网免费视频| 亚瑟国产精品久久无码| 99久久婷婷丁香| 爽 好舒服 无码刺激久久| 欧美成人性爱视频大全| 久久婷婷色| 五月婷在线| 久久精品免费| 啊啊啊啊操死我了| 亚洲综合夜色| 久久精品国产99久久,亚洲日韩久久日本一区一区三区 | 国产一级作爱毛片| 九九Av| 曰韩精品九九无码| 亚州再线| 久久人人爽av亚洲精品天堂桃色| 天天影视91看看| 91伊人| 2018天天日天天日| 亚洲暴力强奸AV| 婷婷久久五月| 午夜福利久久久噜久噜久久综合 | 99视频内射三四| 高清不卡视频| 国产精品久久久久999| 色路综合| 在线人成亚洲视频免费观看| 18禁的网站在线| 激情综合五| 干b在线性社区| 人人妻人人色一区二区三区| 天天综合亚洲综合| 国产精品女久久久久av爽| 五月综合久久| 欧美日韩亚洲天堂网| 人妻熟妇一区二区三区| 丁香五六月啪啪| 十八禁啪啦拍视频无遮挡| 亚洲乱色视频一区、二区在线| 男女性扦B| 女人天堂av在线播放| 伦伦成年午夜免费视频| 欧美一区91大爱| 日日干夜夜欢| 欧洲黄色网| 狠狠色丁香| 久神马| 亚洲 暴爽 AV人人爽日日碰| 亚洲第一无码播放立川理惠| 台湾佬中文娱乐自偷自拍| 国产超碰欧美| 日韩中文字幕精品一区在线| 亚洲第一页色| 中文字幕日韩情色| 高清无码在线播放网站| 91国产精品熟女| 黑人精品欧美一区二区蜜桃| 国产一区二区三区免费视频在性观看 | 黄色大片免费在线| 中文啪啪视频| 91天堂丝袜美腿| 多毛小伙内射老太婆| 宅男91视频在线播放| 97超碰超| 99热超碰在线| 精品少妇一区二区三区| 91深夜夜| 91美女在线看| www.亚洲黄色| 大香蕉伊利av| 欧美翘臀视频网站一区二区三区| 爱我干综合| 精品白丝一区| 欧美人妻久久精品二区三区 | 99这里只有精品| 超碰 欧美| 亚洲精品中文字幕一区在线视频 | 欧美成人精品一区二区三区| 91伊人| 亚洲有码 视频一区| 久热这里只有精品9| 日本道久久综合色色| 久久成人午夜狠狠| 最新的亚洲无吗| 日本黄页视频在线观看| 最好看的中文字幕在线2018| 日本东京热大香蕉a片| 国产日韩无码一区二区三区久久区| 国产青一二三| 人人搞人人插人人操| 日本一区二区三区欧美日韩中文字幕| 国产99热| 国产精品乱人伊人网| 日本久久女同性恋视频| 99re这里只有精品3| 夜夜草我| 国精综合一二三区影视| 国产女人和拘做爰视频 | 蜜桃视频一区二区三区在线观看| 秋霞一级鲁丝片A片| 九九热五区| 亚洲伊人a线观看视频| 色欲色香天天天综合网www-亚洲综合国| 午夜.DJ高清在线观看免费7| 中文字幕第23区| 黄片在线免费在线观看| 国产又粗又长又大的视频| 色色无码| 波多野结衣AV无码一区| 国产乱人妻精品入口| 大香蕉免费乱伦视频| 欧美BT 亚洲色图| 97人肏| 伊人精品久久网站| 超碰 国产熟女精品一区| 9999久久久久| 日韩三级伊人| 动漫av中文| 五月婷婷丁香中文字幕| 国产精品一区二区三区四区五区| 美女露胸露尿口| 国产人妖的免费的视频| 亚洲欧美变态| 中文字幕91综合| 人妻 中文 日韩| 国产一线二线三线av| 亚洲精品一二三四区| 欧美性爱日韩性爱| 九九九国产| 神马久久网| 国产精品免费视频不卡| 黄色视频高清无码网站| 色偷综合| 久久久com| 亚洲精品啪视频| 丰满人妻一区二区三区| 天天色粽合合合合合合合| 4虎在线视频| 亚洲欧洲偷拍一区| 不卡一区二区日本视频| 精品亚洲天堂| 中文字幕一区二区三区蜜桃视频| 伊人成人中文字幕久久网| 午夜国产乱伦视频| 精品久久久久久久| 超碰是碰在线观看| 欧洲中文字幕| 激情五月丁香五月| 亚洲一区二区三区播放在线| 91丝袜| 91在线丝袜| 美女裸体麻豆天美蜜桃91| 久久美女福利是上海美女| 国产辣妈在线视频福利| 九久久九九久视频| 青青草久草AV| 亚洲精品天天影视综合网 | 国产67194| 成人精品一区二区91毛片不卡| 97色在线视频| 四虎影视国产精品| 欧美日韩天堂| 91日日| 蜜桃精品一区二区三区ww| 亚洲第一在线视频| 无码日韩人妻av一| 秋霞免费无码视频日韩A片| 亚洲人久久久久日| 深夜激情| 欧美色图在线视频少妇| 蜜臀99999| 日韩欧美成人大香蕉| 中文字幕啊啊啊在线观看视频| 自拍大香蕉乱插| 郑州宾馆老熟女露脸啪啪| 国产成人超碰在线| 国产精品免费久久久久久久久久| 超碰色97| 99精品九九九九九九| 久久久久久免费电影| 久久偷偷色综合蜜桃| 国产精品不卡一区二区三区| 91色综合激情| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 精品人妻一区二区免费蜜桃| 殴美性色a级欧美| 91粉芽高清在线一区二区| 国产无马av| 久久精品性| 久久这里只精品99re66图| 久久一区二区三区入口| 国产福利av精彩对白| japan日本高清乱xxxx| 九月激情婷婷| 美国人人操人人操| 加勒比久久综合网高清| av网页一区二区三区| 97精品熟女少妇一区| 四虎国产精品永久地址入口| 国产日韩在线播放av| 久久久久久人妻一区精品色欧美| 99这里只有精品国产| 99久久久无码精品国产人| 日韩乱伦AⅤ| 多毛小伙内射老太婆| 精品性爱一二三区| 翔田千里av一区二区三区| 婷婷综合久久| 中文字幕av色| 国产高清不卡视频| 日韩精品怡红院| 国产精品高朝久久久久久久| 亚洲精品熟妇1区2区3区。| 大粗鳼巴久久久久| 亚洲91网| 小视频国产| 操逼操网| 狠狠操狠狠| 久久综合日韩亚洲欧美| 欧美日本天堂| 九99久久| 人妻少妇精品久久久久久久| 最新av中文字幕高清| 中国国产精品一区视频| 性爱1区| 伊人网av| 麻豆 亚洲 97| 九九九九热只有精品| 中文字幕丰满人妻日本| 欧美一区二区三区另类精品| 女人爽到高潮潮喷18禁网站| 久草综合京东| 大乔未久88一区| 日韩大香蕉AV影片| 蜜臀AV秘一区翔田千里| 日韩人成网站在线播放| 人妻啊啊人妻啊啊| 啊啊啊啊啊啊啊啊啊啊在线观看| 亚春色色| 亚洲熟女乱色一区二区三区| 8050无码八戒| 国产无遮挡| 97天天插| 日韩精品字幕| 成人av动漫在线观看| 精品无码一区二区| 欧美日韩美女精品久草一区二区三区| 中文久久久| 91高清无码下载| 亚洲影视综合网| 啊啊啊啊好大好硬啊啊啊啊啊| 网友自拍第1页| 岛国免费黄色网址| 久久久久久久一级黄色打同平台| 性色av一区二区| 中文字幕成人乱码熟女精品国50| 波多野结衣被操50分钟免费视频| 99热这里只有精品8| 亚洲日韩少妇一道本视频| 无码人妻1727| 3p国产欧美99热| 久久久久久久久久久999| 97视频免费| 色一色综合网| 亚洲激情天堂网| 91欧美亚洲| 亚洲精品视频在线播放| baiduhicn.com。| 欧美影院一区二区三区| 717影院理论午夜伦八戒| 欧美视频第二页| 国产精品96| 中文字幕成人| 久久精品六区| 国产AV毛片| 天天看特黄的免费网站| 亚洲欧美日韩中文播放| 五月香婷婷| 久9综合在线| 国模不卡| 日日A∨| 黑人精品XXX一区一二区| 久久精品一区二区三区不卡| 老鸭窝在线视频播放| h无码动漫在线观看| 日本东京热大香蕉a片| 欧美日韩国产成人高清| 亚洲91网。| 另类亚洲一区二区三区| 97中文天堂| 亚洲欧美黄| 人妻少妇一区二区| 96超碰网| 九九成人视频| 天天欧美| 天天狠| 亚州欧美色图| 人妻久热在线| 日本影视久久免费| 偷窥自拍亚洲色图| 亚洲国产精品无码AV久久| 欧美乱色| 免费成人自拍视频在线| 日韩99神马视频播放片在线播放| 97视频免费播放| 国产欧美日韩女同性恋ww喷水精品| 欧美亚洲首页| 国产精品老熟女一区二区| 97爱综合| 超碰 另类 欧美| 亚洲精品国产无码高清| 日本黄色裸日本黄色裸体| 欧美精品一区二区少妇免费A片 | 欧洲精品网| 国产探花精品在线| 91精品少妇搡搡搡| 偷窥自拍亚洲天堂网爆| 亚洲AV色图| 不卡超碰护士AV在线免费播放| 九九碰九九爱97超碰| 亚洲综合113页| 夜夜天天噜狠狠爱2021| 国产后入清纯| 人妻少妇色综合| 秋霞Av理论一级在线| 欧美午夜色妇色鬼| 国产av又色又爽又黄| 亚洲女人毛茸茸91| 五月丁香综合| 午夜视频黄| 欧美在线中M| 91婷婷| 一级做受视频免费是看美女| 中文字幕78| 看一级黄色视频| 欧美亚洲天堂| 97精品视频网站| 五月激情视频| 性色AV蜜色av色欲av| 久久久久9| 二色av| 岛国A V在线免费看| 爱丝福利| 99国内精品| 乱伦图一区| 91精品国产一区三一| 精品96久久| 91超级碰| 中字幕人妻一区二区三区| 茄子社区国产精品| 狠狠躁AV| 天天做日日爱夜夜爽| 日本精品一区二区三区四区的功能| 99热在线不卡| 717影院理论午夜伦八戒| 欧美欧美啪啪视频| 久久亚洲日韩国产欧| 欧美AB在线观看| 蜜臀操逼黄色视频操的好爽| 亚洲色图欧美一区二区不卡| 99热日| 嗯阿好爽好紧| 日本在线不卡一二区| 欧美成熟性爱精品| 亚洲图片 欧美电影| 97色视频在线| 日本三级韩三级99久久| 自拍偷拍 高清无码| 色婷婷一区二区三区久久| 一区二三区四区视频大全套| 久久久久久久久久久久久9999| 人妻在线视频| 老外又粗又长一晚做五次| 美女性91| 欧美综合传媒| 欧美曰韩国产精品| 大香蕉宗合网在线| 国产无码一二三区| ji熟女.com| 毛片一区二区| 亚洲少妇视频| WWW美腿丝袜香蕉中文| 久久久久久久78| 91N欧美| 99爱爱| 入口操逼网站| 国产免a费看黄片在线| 国产女大学生AV| 伊人97| 亚洲,欧美,综合网| 91影视亚洲| 天天天天做夜夜夜夜做| 婷婷国产精品九区| 久久久久成人蜜桃精品| 婷婷丁香五月综合| 一个人免费HD91视频| 国产三级多多影院2022国产AA一级毛片无码 | 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 国产超碰在线| 精品一区二区成人动漫| 久久国产热视频97电影| 国产多人在线观看视频| 色综合一本| 蜜臀99久久| 青青色在线观看| 啊啊啊啊啊好多水| 先锋女优在线观看视频| 欧美视频一区二区三区| KK色在线影院| 亚洲激情深爱文学小说网站| 国产AV人人夜夜澡人人爽麻豆| 嗯嗯,好大,好爽,好骚| 99re8免费高清在线| 久久综合精品一区二区三区| ss久久| 很黄很污的免费网站| 精品人人| 夜夜嗨AV蜜臀av| 综合亚洲情色| www.高清无码诱惑一区.com| 精品国产72| 国产成人天堂| 嗯嗯啊啊啊啊轻点视频| 熟女91网| 精品国产乱码久久久影院| 国产后入式在线观看| 欧美九九九| 69一区二区三区| 亚洲福利影院一区久久| 成人五月天丁香激情综合| 另类亚洲一区二区三区| 74成人在线| 精品亚洲国产成人av网站| 日韩国产乱子伦App| 操屄不卡视频| 99视频内射三四| av中文字幕在线熟女| 久久25| 日本人妻天堂网站在线播放| 亚州色图欧美| 天天日骚逼熟女| 欧美劲爆第一页| 凹凸视频在线一区二区| 国产成人99久久亚洲综合| 国产aⅴ无码片毛片一级网站| 立川理惠无码一区二区| caorenqi shipin| 欧美成人精品一区二区三区| 少妇500双飞99| 91网站18+| 久热一区二区| ,成人免费啪啪视频| 日本性爱不卡视频| 狠狠色色| 亚洲综合另类欧美久久久| 亚洲AV无码久久精品蜜桃小说| 98超碰日本| 亚洲天堂2020| 国产和美国毛片| 亚洲制服欧美另类内射| 五月丁香婷婷色| 精彩视频日韩| 在线观看 99热| 麻豆天美一区二区| 免费日韩黄片| 岛国片在线观看视频亚洲| 精精夜夜| 91亚洲欧美综合高清在线| 精…码一二三区| 综合欧美激情网|