日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android-Ble蓝牙通讯开发–扫描,连接,发送和接收数据,分包解包(附源码)

發布時間:2023/12/16 Android 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android-Ble蓝牙通讯开发–扫描,连接,发送和接收数据,分包解包(附源码) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

萬物互聯的物聯網時代的已經來臨,ble藍牙開發在其中扮演著舉重若輕的角色。最近剛好閑一點,抽時間梳理下這塊的知識點。

涉及ble藍牙通訊的客戶端(開啟、掃描、連接、發送和接收數據、分包解包)和服務端(初始化廣播數據、開始廣播、配置Services、Server回調操作)整個環節以及一些常見的問題即踩過的一些坑。

比如
1、在Android不同版本或不同手機的適配問題,掃描不到藍牙設備
2、如何避免ble藍牙連接出現133錯誤?
3、單次寫的數據大小有20字節限制,如何發送長數據

藍牙有傳統(經典)藍牙和低功耗藍牙BLE(Bluetooth Low Energy)之分,兩者的開發的API不一樣,本文主講Ble藍牙開發,傳統藍牙不展開,有需要的可以自行了解。

相對傳統藍牙,BLE低功耗藍牙,主要特點是快速搜索,快速連接,超低功耗保持連接和數據傳輸。

Demo效果展示


客戶端

服務端

API

Android4.3(API Level 18)開始引入BLE的核心功能并提供了相應的 API。應用程序通過這些 API 掃描藍牙設備、查詢 services、讀寫設備的 characteristics(屬性特征)等操作。

BLE藍牙協議是GATT協議, BLE相關類不多, 全都位于android.bluetooth包和android.bluetooth.le包的幾個類:
android.bluetooth.
.BluetoothGattService 包含多個Characteristic(屬性特征值), 含有唯一的UUID作為標識
.BluetoothGattCharacteristic 包含單個值和多個Descriptor, 含有唯一的UUID作為標識
.BluetoothGattDescriptor 對Characteristic進行描述, 含有唯一的UUID作為標識

.BluetoothGatt 客戶端相關
.BluetoothGattCallback 客戶端連接回調
.BluetoothGattServer 服務端相關
.BluetoothGattServerCallback 服務端連接回調

android.bluetooth.le.
.AdvertiseCallback 服務端的廣播回調
.AdvertiseData 服務端的廣播數據
.AdvertiseSettings 服務端的廣播設置
.BluetoothLeAdvertiser 服務端的廣播

.BluetoothLeScanner 客戶端掃描相關(Android5.0新增)
.ScanCallback 客戶端掃描回調
.ScanFilter 客戶端掃描過濾
.ScanRecord 客戶端掃描結果的廣播數據
.ScanResult 客戶端掃描結果
.ScanSettings 客戶端掃描設置

BLE設備分為兩種設備: 客戶端(也叫主機/中心設備/Central), 服務端(也叫從機/外圍設備/peripheral)
客戶端的核心類是 BluetoothGatt
服務端的核心類是 BluetoothGattServer 和 BluetoothLeAdvertiser
BLE數據的核心類是 BluetoothGattCharacteristic 和 BluetoothGattDescriptor

下面詳細講解下客戶端和服務端的開發步驟流程

一、BLE客戶端開發流程

1、申請權限

安卓手機涉及藍牙權限問題,藍牙開發需要在AndroidManifest.xml文件中添加權限聲明:

<!-- 藍牙權限 --> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 為適配安卓6.0以及以上版本需要添加一個模糊定位的權限<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 手機權限管理中允許此權限,否則會出現無法搜索到設備的情況;BLE權限增加了BEL支持檢查 (1).在manifest中添加權限 <!-- true 表示手機必須支持BLE,否則無法安裝!這里設為false, 運行后在Activity中檢查--> <uses-featureandroid:name="android.hardware.bluetooth_le"android:required="false" />(2).Activity中設置藍牙 // 檢查是否支持BLE藍牙 if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {Util.toast(this, "本機不支持低功耗藍牙!");finish();return; }

2、打開藍牙

在搜索設備之前需要詢問打開手機藍牙:

//獲取系統藍牙適配器管理類 private BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); // 詢問打開藍牙 if (mBluetoothAdapter != null && !mBluetoothAdapter.isEnabled()) {Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);startActivityForResult(enableBtIntent, 1); }// 申請打開藍牙請求的回調 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stubsuper.onActivityResult(requestCode, resultCode, data);if (requestCode == 1) {if (resultCode == RESULT_OK) {Toast.makeText(this, "藍牙已經開啟", Toast.LENGTH_SHORT).show();} else if (resultCode == RESULT_CANCELED) {Toast.makeText(this, "沒有藍牙權限", Toast.LENGTH_SHORT).show();finish();}} }

3、搜索設備

注意: BLE設備地址是動態變化(每隔一段時間都會變化),而經典藍牙設備是出廠就固定不變了!

BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); // 下面使用Android5.0新增的掃描API,掃描返回的結果更友好,比如BLE廣播數據以前是byte[] scanRecord,而新API幫我們解析成ScanRecord類\ final BluetoothLeScanner bluetoothLeScanner = bluetoothAdapter.getBluetoothLeScanner(); bluetoothLeScanner.startScan(mScanCallback); mHandler.postDelayed(new Runnable() {@Overridepublic void run() {bluetoothLeScanner.stopScan(mScanCallback); //停止掃描isScanning = false;} }, 3000);// 掃描結果Callback private final ScanCallback mScanCallback = new ScanCallback() {@Overridepublic void onScanResult(int callbackType, ScanResult result) {BluetoothDevice dev = result.getDevice() 獲取BLE設備信息// result.getScanRecord() 獲取BLE廣播數據} };// 舊API是BluetoothAdapter.startLeScan(LeScanCallback callback)方式掃描BLE藍牙設備,如下: mBluetoothAdapter.startLeScan(callback); private LeScanCallback callback = new LeScanCallback() {@Overridepublic void onLeScan(BluetoothDevice device, int arg1, byte[] arg2) {//device為掃描到的BLE設備if(device.getName() == "目標設備名稱"){//獲取目標設備targetDevice = device;}} };

4、連接設備

通過掃描BLE設備,根據設備名稱區分出目標設備targetDevice,下一步實現與目標設備的連接,在連接設備之前要停止搜索藍牙;停止搜索一般需要一定的時間來完成,最好調用停止搜索函數之后加以100ms的延時,保證系統能夠完全停止搜索藍牙設備。停止搜索之后啟動連接過程;

BLE藍牙的連接方法相對簡單只需調用connectGatt方法;

public BluetoothGatt connectGatt (Context context, boolean autoConnect, BluetoothGattCallback callback)

參數說明

  • 返回值 BluetoothGatt: BLE藍牙連接管理類,主要負責與設備進行通信;
  • boolean autoConnect:建議置為false,能夠提升連接速度;
  • BluetoothGattCallback callback 連接回調,重要參數,BLE通信的核心部分;

5、設備通信

與設備建立連接之后與設備通信,整個通信過程都是在BluetoothGattCallback的異步回調函數中完成;

BluetoothGattCallback中主要回調函數如下:

private BluetoothGattCallback gattCallback = new BluetoothGattCallback() {@Overridepublic void onConnectionStateChange(BluetoothGatt gatt, int status,int newState) {//連接狀態改變的Callback}@Overridepublic void onServicesDiscovered(BluetoothGatt gatt, int status) {//服務發現成功的Callback}@Overridepublic void onCharacteristicWrite(BluetoothGatt gatt,BluetoothGattCharacteristic characteristic, int status) {//寫入Characteristic}@Overridepublic void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {//讀取Characteristic }@Overridepublic void onCharacteristicChanged(BluetoothGatt gatt,BluetoothGattCharacteristic characteristic) {//通知Characteristic}@Overridepublic void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {//寫入Descriptor}@Overridepublic void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {//讀取Descriptor}};

上述幾個回調函數是BLE開發中不可缺少的;

6、等待設備連接成功

當調用targetdDevice.connectGatt(context, false, gattCallback)后系統會主動發起與BLE藍牙設備的連接,若成功連接到設備將回調onConnectionStateChange方法,其處理過程如下:

@Override public void onConnectionStateChange(BluetoothGatt gatt, int status,int newState) {if (newState == BluetoothGatt.STATE_CONNECTED) {Log.e(TAG, "設備連接上 開始掃描服務");// 連接成功后,開始掃描服務mBluetoothGatt.discoverServices();}if (newState == BluetoothGatt.STATE_DISCONNECTED) {// 連接斷開/*連接斷開后的相應處理*/ } };

判斷newState == BluetoothGatt.STATE_CONNECTED表明此時已經成功連接到設備;

7、開啟掃描服務

mBluetoothGatt.discoverServices();

掃描BLE設備服務是安卓系統中關于BLE藍牙開發的重要一步,一般在設備連接成功后調用,掃描到設備服務后回調onServicesDiscovered()函數,函數原型如下:

@Override public void onServicesDiscovered(BluetoothGatt gatt, int status) {private List<BluetoothGattService> servicesList;//獲取服務列表servicesList = mBluetoothGatt.getServices(); }
  • BLE藍牙協議下數據的通信方式采用BluetoothGattService、BluetoothGattCharacteristic和BluetoothGattDescriptor三個主要的類實現通信;
  • BluetoothGattService 簡稱服務,是構成BLE設備協議棧的組成單位,一個藍牙設備協議棧一般由一個或者多個BluetoothGattService組成;
  • BluetoothGattCharacteristic 簡稱特征,一個服務包含一個或者多個特征,特征作為數據的基本單元;
  • 一個BluetoothGattCharacteristic特征包含一個數據值和附加的關于特征的描述;
  • BluetoothGattDescriptor:用于描述特征的類,其同樣包含一個value值;

8、獲取負責通信的BluetoothGattCharacteristic

BLE藍牙開發主要有負責通信的BluetoothGattService完成的。當且稱為通信服務。通信服務通過硬件工程師提供的UUID獲取。獲取方式如下:

  • BluetoothGattService service = mBluetoothGatt.getService(UUID.fromString(“藍牙模塊提供的負責通信UUID字符串”));
  • 通信服務中包含負責讀寫的BluetoothGattCharacteristic,且分別稱為notifyCharacteristic和writeCharacteristic。其中notifyCharacteristic負責開啟監聽,也就是啟動收數據的通道,writeCharacteristic負責寫入數據;

具體操作方式如下:

BluetoothGattService service = mBluetoothGatt.getService(UUID.fromString("藍牙模塊提供的負責通信服務UUID字符串"));// 例如形式如:49535343-fe7d-4ae5-8fa9-9fafd205e455notifyCharacteristic = service.getCharacteristic(UUID.fromString("notify uuid"));writeCharacteristic = service.getCharacteristic(UUID.fromString("write uuid"));

9、開啟監聽

開啟監聽,即建立與設備的通信的首發數據通道,BLE開發中只有當客戶端成功開啟監聽后才能與服務端收發數據。開啟監聽的方式如下:

mBluetoothGatt.setCharacteristicNotification(notifyCharacteristic, true) BluetoothGattDescriptor descriptor = characteristic .getDescriptor(UUID.fromString("00002902-0000-1000-8000-00805f9b34fb")); descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); //若開啟監聽成功則會回調BluetoothGattCallback中的onDescriptorWrite()方法,處理方式如下: @Override public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {if (status == BluetoothGatt.GATT_SUCCESS) {//開啟監聽成功,可以向設備寫入命令了Log.e(TAG, "開啟監聽成功");} };

10、寫入數據

BLE單次寫的數據量大小是有限制的,通常是20字節,可以嘗試通過requestMTU增大,但不保證能成功。分包寫是一種解決方案,需要定義分包協議,假設每個包大小20字節,分兩種包,數據包和非數據包。對于數據包,頭兩個字節表示包的序號,剩下的都填充數據。對于非數據包,主要是發送一些控制信息。
監聽成功后通過向 writeCharacteristic寫入數據實現與服務端的通信。寫入方式如下:

//value為客戶端向服務端發送的指令 writeCharacteristic.setValue(value); mBluetoothGatt.writeCharacteristic(writeCharacteristic)

其中:value一般為Hex格式指令,其內容由設備通信的藍牙通信協議規定;

11、接收數據

若寫入指令成功則回調BluetoothGattCallback中的onCharacteristicWrite()方法,說明將數據已經發送給下位機;

@Override public void onCharacteristicWrite(BluetoothGatt gatt,BluetoothGattCharacteristic characteristic, int status) {if (status == BluetoothGatt.GATT_SUCCESS) {Log.e(TAG, "發送成功");} }

若發送的數據符合通信協議,則服務端會向客戶端回復相應的數據。發送的數據通過回調onCharacteristicChanged()方法獲取,其處理方式如下:

@Override public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {// value為設備發送的數據,根據數據協議進行解析byte[] value = characteristic.getValue(); }

通過向服務端發送指令獲取服務端的回復數據,即可完成與設備的通信過程;

12、斷開連接

當與設備完成通信之后之后一定要斷開與設備的連接。調用以下方法斷開與設備的連接:

mBluetoothGatt.disconnect(); mBluetoothGatt.close();

二、BLE服務端開發流程

1、設置廣播以及初始化廣播數據

//廣播設置(必須) AdvertiseSettings settings = new AdvertiseSettings.Builder().setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY) //廣播模式: 低功耗,平衡,低延遲.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH) //發射功率級別: 極低,低,中,高.setTimeout(0).setConnectable(true) //能否連接,廣播分為可連接廣播和不可連接廣播.build();//廣播數據(必須,廣播啟動就會發送) AdvertiseData advertiseData = new AdvertiseData.Builder().setIncludeDeviceName(true) //包含藍牙名稱.setIncludeTxPowerLevel(true) //包含發射功率級別.addManufacturerData(1, new byte[]{23, 33}) //設備廠商數據,自定義.build();//掃描響應數據(可選,當客戶端掃描時才發送) AdvertiseData scanResponse = new AdvertiseData.Builder().addManufacturerData(2, new byte[]{66, 66}) //設備廠商數據,自定義.addServiceUuid(new ParcelUuid(UUID_SERVICE)) //服務UUID // .addServiceData(new ParcelUuid(UUID_SERVICE), new byte[]{2}) //服務數據,自定義.build();

2、開始廣播

BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); //BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter(); BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();// ============啟動BLE藍牙廣播(廣告) =============== mBluetoothLeAdvertiser = bluetoothAdapter.getBluetoothLeAdvertiser(); mBluetoothLeAdvertiser.startAdvertising(settings, advertiseData, scanResponse, mAdvertiseCallback);// BLE廣播Callback private AdvertiseCallback mAdvertiseCallback = new AdvertiseCallback() {@Overridepublic void onStartSuccess(AdvertiseSettings settingsInEffect) {logTv("BLE廣播開啟成功");}@Overridepublic void onStartFailure(int errorCode) {logTv("BLE廣播開啟失敗,錯誤碼:" + errorCode);} };

3、配置Services以及Characteristic

// 注意:必須要開啟可連接的BLE廣播,其它設備才能發現并連接BLE服務端! // =============啟動BLE藍牙服務端====================================== BluetoothGattService service = new BluetoothGattService(UUID_SERVICE, BluetoothGattService.SERVICE_TYPE_PRIMARY);//添加可讀+通知characteristic BluetoothGattCharacteristic characteristicRead = new BluetoothGattCharacteristic(UUID_CHAR_READ_NOTIFY,BluetoothGattCharacteristic.PROPERTY_READ | BluetoothGattCharacteristic.PROPERTY_NOTIFY, BluetoothGattCharacteristic.PERMISSION_READ); characteristicRead.addDescriptor(new BluetoothGattDescriptor(UUID_DESC_NOTITY, BluetoothGattCharacteristic.PERMISSION_WRITE)); service.addCharacteristic(characteristicRead);//添加可寫characteristic BluetoothGattCharacteristic characteristicWrite = new BluetoothGattCharacteristic(UUID_CHAR_WRITE, BluetoothGattCharacteristic.PROPERTY_WRITE, BluetoothGattCharacteristic.PERMISSION_WRITE); service.addCharacteristic(characteristicWrite);if (bluetoothManager != null){mBluetoothGattServer = bluetoothManager.openGattServer(this, mBluetoothGattServerCallback); }mBluetoothGattServer.addService(service);

4、Server回調以及操作

/** * 服務事件的回調 */ private BluetoothGattServerCallback mBluetoothGattServerCallback= new BluetoothGattServerCallback() {/*** 1.連接狀態發生變化時*/@Overridepublic void onConnectionStateChange(BluetoothDevice device, int status, int newState) {Log.e(TAG, String.format("1.onConnectionStateChange:device name = %s, address = %s", device.getName(), device.getAddress()));Log.e(TAG, String.format("1.onConnectionStateChange:status = %s, newState =%s ", status, newState));}@Overridepublic void onServiceAdded(int status, BluetoothGattService service) {Log.e(TAG, String.format("onServiceAdded:status = %s", status));}@Overridepublic void onCharacteristicReadRequest(BluetoothDevice device, int requestId, int offset, BluetoothGattCharacteristic characteristic) {Log.e(TAG, String.format("onCharacteristicReadRequest:device name = %s, address = %s", device.getName(), device.getAddress()));Log.e(TAG, String.format("onCharacteristicReadRequest:requestId = %s, offset = %s", requestId, offset));mGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, offset, characteristic.getValue());}/*** 3. onCharacteristicWriteRequest,接收具體的字節*/@Overridepublic void onCharacteristicWriteRequest(BluetoothDevice device, int requestId, BluetoothGattCharacteristic characteristic, boolean preparedWrite, boolean responseNeeded, int offset, byte[] requestBytes) {Log.e(TAG, String.format("3.onCharacteristicWriteRequest:device name = %s, address = %s", device.getName(), device.getAddress()));Log.e(TAG, String.format("3.onCharacteristicWriteRequest:requestId = %s, preparedWrite=%s, responseNeeded=%s, offset=%s, value=%s", requestId, preparedWrite, responseNeeded, offset, requestBytes.toString()));mGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, offset, requestBytes);//4.處理響應內容onResponseToClient(requestBytes, device, requestId, characteristic);}/*** 2.描述被寫入時,在這里執行 bluetoothGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS... 收,觸發 onCharacteristicWriteRequest*/@Overridepublic void onDescriptorWriteRequest(BluetoothDevice device, int requestId, BluetoothGattDescriptor descriptor, boolean preparedWrite, boolean responseNeeded, int offset, byte[] value) {Log.e(TAG, String.format("2.onDescriptorWriteRequest:device name = %s, address = %s", device.getName(), device.getAddress()));Log.e(TAG, String.format("2.onDescriptorWriteRequest:requestId = %s, preparedWrite = %s, responseNeeded = %s, offset = %s, value = %s,", requestId, preparedWrite, responseNeeded, offset, value.toString()));// now tell the connected device that this was all successfullmGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, offset, value);}/*** 5.特征被讀取。當回復響應成功后,客戶端會讀取然后觸發本方法*/@Overridepublic void onDescriptorReadRequest(BluetoothDevice device, int requestId, int offset, BluetoothGattDescriptor descriptor) {Log.e(TAG, String.format("onDescriptorReadRequest:device name = %s, address = %s", device.getName(), device.getAddress()));Log.e(TAG, String.format("onDescriptorReadRequest:requestId = %s", requestId));mGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, offset, null);}@Overridepublic void onNotificationSent(BluetoothDevice device, int status) {super.onNotificationSent(device, status);Log.e(TAG, String.format("5.onNotificationSent:device name = %s, address = %s", device.getName(), device.getAddress()));Log.e(TAG, String.format("5.onNotificationSent:status = %s", status));}@Overridepublic void onMtuChanged(BluetoothDevice device, int mtu) {super.onMtuChanged(device, mtu);Log.e(TAG, String.format("onMtuChanged:mtu = %s", mtu));}@Overridepublic void onExecuteWrite(BluetoothDevice device, int requestId, boolean execute) {super.onExecuteWrite(device, requestId, execute);Log.e(TAG, String.format("onExecuteWrite:requestId = %s", requestId));} };/** * 4.處理響應內容 * * @param reqeustBytes * @param device * @param requestId * @param characteristic */ private void onResponseToClient(byte[] reqeustBytes, BluetoothDevice device, int requestId, BluetoothGattCharacteristic characteristic) {Log.e(TAG, String.format("4.onResponseToClient:device name = %s, address = %s", device.getName(), device.getAddress()));Log.e(TAG, String.format("4.onResponseToClient:requestId = %s", requestId));Log.e(TAG, "4.收到:");String str = new String(reqeustBytes) + " hello>";characteristicRead.setValue(str.getBytes());mGattServer.notifyCharacteristicChanged(device, characteristicRead, false);Log.i(TAG, "4.響應:" + str);MainActivity.handler.obtainMessage(MainActivity.DEVICE, new String(reqeustBytes)).sendToTarget(); }

三、源碼下載

源碼上傳在CSDN上了,有需要的可以借鑒。

=====> Android藍牙Ble通訊Demo示例源碼–掃描,連接,發送和接收數據,分包解包

四、藍牙操作的注意事項

1、如何避免ble藍牙連接出現133錯誤?

  • Android 連接外圍設備的數量有限,當不需要連接藍牙設備的時候,必須調用 BluetoothGatt#close 方法釋放資源;
  • 藍牙 API 連接藍牙設備的超時時間大概在 20s 左右,具體時間看系統實現。有時候某些設備進行藍牙連接的時間會很長,大概十多秒。如果自己手動設置了連接超時時間在某些設備上可能會導致接下來幾次的連接嘗試都會在 BluetoothGattCallback#onConnectionStateChange 返回 state == 133;
  • 能否避免android設備與ble設備連接/斷開時上報的133這類錯誤?
    1、在連接失敗或者斷開連接之后,調用 close 并刷新緩存
    2、盡量不要在startLeScan的時候嘗試連接,先stopLeScan后再去連
    3、對同一設備斷開后再次連接(連接失敗重連),哪怕調用完close,需要等待一段時間(400毫秒試了1次,結果不 行;1000毫秒則再沒出現過問題)后再去connectGatt
    4、可以在連接前都startLeScan一下,成功率要高一點

2、單次寫的數據大小有20字節限制,如何發送長數據?

BLE單次寫的數據量大小是有限制的,通常是20字節,可以嘗試通過requestMTU增大,但不保證能成功。分包寫是一種解決方案,需要定義分包協議,假設每個包大小20字節,分兩種包,數據包和非數據包。對于數據包,頭兩個字節表示包的序號,剩下的都填充數據。對于非數據包,主要是發送一些控制信息。
總體流程如下:
1、定義通訊協議,如下(這里只是個舉例,可以根據項目需求擴展)

消息號(1個字節)功能(1個字節)子功能(1個字節)數據長度(2個字節)數據內容(N個字節)CRC校驗(1個字節)
01010100002D

2、封裝通用發送數據接口(拆包)
該接口根據會發送數據內容按最大字節數拆分(一般20字節)放入隊列,拆分完后,依次從隊列里取出發送

3、封裝通用接收數據接口(組包)
該接口根據從接收的數據按協議里的定義解析數據長度判讀是否完整包,不是的話把每條消息累加起來

4、解析完整的數據包,進行業務邏輯處理

5、協議還可以引入加密解密,需要注意的選算法參數的時候,加密后的長度最好跟原數據長度一致,這樣不會影響拆包組包

3、在Android不同版本或不同的手機掃描不到藍牙設備

一般都是Android版本適配以及不同ROM機型(小米/紅米、華為/榮耀等)(EMUI、MIUI、ColorOS等)的權限問題

4、其它

  • 藍牙的寫入操作, 讀取操作必須序列化進行. 寫入數據和讀取數據是不能同時進行的, 如果調用了寫入數據的方法, 馬上調用又調用寫入數據或者讀取數據的方法,第二次調用的方法會立即返回 false, 代表當前無法進行操作;

總結

藍牙開發中有很多問題,要靜下心分析問題,肯定可以解決的,一起加油;

總結

以上是生活随笔為你收集整理的Android-Ble蓝牙通讯开发–扫描,连接,发送和接收数据,分包解包(附源码)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

久久久久麻豆v国产 | 97在线免费观看视频 | 国产精品永久免费在线 | av韩国在线| 成人天堂网 | 欧美日韩高清在线 | 91精品一| 五月婷婷导航 | 最近中文字幕在线 | 国产精品欧美日韩 | 日韩网站在线免费观看 | 五月婷婷综合在线视频 | 三级黄免费看 | 免费av电影网站 | 精品免费观看视频 | 亚洲日韩中文字幕 | 日韩成人免费在线观看 | 久久久久国产成人免费精品免费 | 亚洲国产成人精品在线观看 | 成人午夜片av在线看 | 日本性视频| 午夜精品视频一区 | 插久久 | 中文字幕免费不卡视频 | 成人福利在线播放 | 久久免费黄色 | 成人性生交大片免费观看网站 | 久久久久国产视频 | 人人草在线观看 | 亚洲天堂精品视频在线观看 | 成人在线视频网 | 伊在线视频 | 激情电影影院 | 国产亚洲精品久久久久久久久久 | 国产精品一区二区三区久久久 | 国产精品第 | 色a综合 | 国产成人在线网站 | www日韩视频 | 亚洲 成人 欧美 | 2021久久 | 免费久久久久久 | 免费视频黄 | 亚洲闷骚少妇在线观看网站 | 蜜臀久久99精品久久久无需会员 | 久草影视在线 | 国产免费又爽又刺激在线观看 | 蜜桃av久久久亚洲精品 | 亚洲午夜精品久久久久久久久久久久 | 亚洲精品网站 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 草免费视频 | 国产免费又黄又爽 | 在线黄色国产 | 91精品国产高清自在线观看 | 欧美一级艳片视频免费观看 | 国产精品 中文字幕 亚洲 欧美 | 成人av资源站 | 一区二区在线电影 | 91传媒在线观看 | 中文av网站| 亚洲专区免费观看 | 日本一区二区高清不卡 | 欧美国产一区二区 | 精品久久久久久综合 | 国产福利一区二区三区视频 | 久久艹国产 | 国产精品久久久久久婷婷天堂 | 日p在线观看 | 国产精品久久久久久久久久直播 | 国产在线精品一区二区不卡了 | www黄色 | 欧美天堂视频在线 | 欧美日韩免费网站 | 久久呀| 在线中文日韩 | 在线婷婷| 蜜桃视频在线观看一区 | 免费看成年人 | 激情五月亚洲 | 国产午夜三级 | 成人黄色在线观看视频 | 黄色三级视频片 | 在线观看av片 | 成年人免费看片网站 | 国产在线精品一区二区 | 欧洲精品码一区二区三区免费看 | 欧美在线观看视频一区二区 | 视频在线一区二区三区 | 免费成人黄色 | 色视频在线看 | 成人毛片一区二区三区 | 激情综合网五月 | 免费色网站 | 国产精品视频你懂的 | 黄色软件在线看 | 在线观看中文字幕dvd播放 | 亚洲乱码中文字幕综合 | 天天干天天操天天操 | 夜夜操夜夜干 | 久草视频资源 | 免费看片黄色 | 999国产在线| 成年人在线观看免费视频 | 亚洲视屏在线播放 | 91黄站| 亚洲经典在线 | 国产高清无线码2021 | 涩五月婷婷| 狠狠色噜噜狠狠狠 | 日韩av中文字幕在线免费观看 | 九九精品视频在线看 | 亚洲精品午夜久久久久久久久久久 | 日韩免费在线视频 | 久久久久久久久久久久久影院 | 91av视频观看 | 五月婷婷爱| 国产一区二区在线影院 | 91香蕉视频色版 | 亚洲国产黄色 | 久久久久综合 | 国产玖玖在线 | 午夜资源站 | 久久成电影 | 日韩亚洲国产中文字幕 | 91香蕉亚洲精品 | 国产不卡在线观看视频 | 国产精品theporn | 精品国产精品一区二区夜夜嗨 | 成人黄大片视频在线观看 | 中国精品少妇 | 日韩美在线 | 操操综合网 | 国产一级在线 | 日韩中文字幕免费 | 色综合天天综合网国产成人网 | 91久久电影| 日韩在线观看视频网站 | 久草影视在线观看 | 91久久久久久久一区二区 | 日韩欧美有码在线 | 九月婷婷人人澡人人添人人爽 | 日韩手机在线 | 黄色h在线观看 | 婷婷激情综合五月天 | 久久韩国免费视频 | 国产1级毛片 | 中文字幕av一区二区三区四区 | www亚洲一区 | 婷婷六月在线 | 97国产视频 | 日韩一区二区久久 | 在线观看的av网站 | 中文字幕视频 | 免费看国产精品 | 国产高清永久免费 | 欧美精品久久久久久久久久久 | 成人国产精品久久久 | 五月天丁香 | 婷婷精品国产欧美精品亚洲人人爽 | 超碰97在线资源 | 亚洲一区精品人人爽人人躁 | 在线中文字幕播放 | 成人网看片 | 视频三区在线 | 国产亚洲一区二区在线观看 | 日韩在线观看a | 色激情五月 | 97精品国产97久久久久久粉红 | 免费一级片久久 | 精品国产1区 | 97色涩| 国产一区二区在线免费观看 | 国产精品久久久久久影院 | 日韩午夜在线播放 | 久久久国产网站 | 久久国产精品久久久 | 日韩精品视频久久 | 久久久久久亚洲精品 | 久草男人天堂 | 国产视频第二页 | 视频三区 | 不卡av电影在线观看 | 日色在线视频 | 久久国产精品99久久久久久丝袜 | 激情久久伊人 | 999热视频| 国产毛片久久 | 国产资源中文字幕 | 亚洲经典精品 | 麻豆一区在线观看 | 久久精品国产亚洲a | 久久99精品久久久久久清纯直播 | 久久毛片网 | 国产婷婷久久 | 最近高清中文在线字幕在线观看 | 国内精品亚洲 | 免费在线观看成年人视频 | av中文字幕在线免费观看 | av先锋中文字幕 | 亚洲国产精品电影 | 男女视频久久久 | 欧美色图一区 | 黄色小说视频网站 | 欧美激情第一区 | 亚洲最大av网站 | 中中文字幕av在线 | 久久久午夜精品理论片中文字幕 | 精品视频久久 | 国内丰满少妇猛烈精品播 | 992tv在线观看 | 精品一区二区在线播放 | 国产视频导航 | 国产精品免费av | 亚洲精品在线免费观看视频 | 波多野结衣在线播放视频 | 亚洲va欧美| 久在线观看视频 | 日韩a在线 | 欧美一区二区在线免费观看 | 中文字幕av免费在线观看 | 久草久草久草久草 | 天天干天天操天天干 | 国产日产精品一区二区三区四区 | 三级av在线 | 国产精品一区二区三区在线播放 | 亚洲一区日韩 | 最近久乱中文字幕 | 一区二区三区中文字幕在线 | 99精品热视频只有精品10 | 九九综合九九综合 | 涩涩成人在线 | 又色又爽又黄高潮的免费视频 | 狠狠色丁香久久婷婷综合_中 | 国产精品2020 | 在线观看av不卡 | 日本在线免费看 | 国产精品免费久久 | 激情欧美在线观看 | 美国人与动物xxxx | 亚洲精品a区 | 日韩精品在线观看视频 | 免费在线一区二区三区 | 天天综合五月天 | 狠狠的操你| 日韩av电影网站在线观看 | 日日夜夜噜 | 日韩一区二区三区不卡 | 人人舔人人爱 | 激情久久综合网 | 超碰人人在 | 99re久久资源最新地址 | 中文字幕123区 | 午夜精品视频免费在线观看 | 69亚洲精品 | 日韩精品高清不卡 | 国语自产偷拍精品视频偷 | 亚洲日本三级 | 一区 二区电影免费在线观看 | 精品美女国产在线 | 99久久精品免费看国产一区二区三区 | 国产精品色婷婷视频 | 日韩一三区| 国产精品久久免费看 | 91av99| 色av网站| 日韩精品视频在线观看网址 | 亚洲一级在线观看 | 国产手机在线观看 | 天天操网 | 欧美日韩在线网站 | 欧美精品亚州精品 | 狠狠搞,com | 亚洲色影爱久久精品 | 精品视频在线播放 | 国产精品久久99综合免费观看尤物 | 国产一区二区观看 | 99re国产 | 色伊人网 | 午夜国产一区二区三区四区 | 色人久久 | 伊人手机在线 | 日本成人中文字幕在线观看 | 99久久精品免费看国产麻豆 | www视频在线播放 | 手机av永久免费 | 欧美91成人网 | 人人要人人澡人人爽人人dvd | 免费看黄的 | 久久99久久99精品免视看婷婷 | 亚洲视频电影在线 | 精品99久久| 婷婷丁香狠狠爱 | 国产黄色av网站 | 国产亚洲一区二区在线观看 | 人人爽人人爽人人爽学生一级 | 999国产在线 | 国产自产在线视频 | 国产成人精品亚洲 | 91九色精品女同系列 | 国产日产在线观看 | 免费又黄又爽视频 | 久久综合色播五月 | 久久久久在线视频 | 蜜臀av免费一区二区三区 | 在线久草视频 | 97色综合 | 久久久久久久久久久久电影 | 国产91综合一区在线观看 | 美女视频黄免费的 | 九色精品免费永久在线 | 黄色软件视频网站 | 色五婷婷| 丁香婷婷射 | 在线视频1卡二卡三卡 | 激情在线网站 | 日本黄色大片免费看 | 亚洲日本欧美 | 在线亚洲高清视频 | 婷婷激情综合五月天 | 在线观看国产亚洲 | 亚洲免费成人av电影 | 国产黄色电影 | 综合色站导航 | 日韩二区三区在线观看 | 国产 中文 日韩 欧美 | 精品久久久久久久久久久久久久久久久久 | 久久99精品热在线观看 | 在线国产小视频 | 亚洲一区二区高潮无套美女 | 久久伊人免费视频 | 免费亚洲视频 | 日韩中文字幕免费看 | 久久无码av一区二区三区电影网 | 99久久综合国产精品二区 | 最新av中文字幕 | 久久区二区 | 午夜精品久久 | 香蕉视频在线免费 | 国产成人精品一区二区三区在线观看 | 国产美女无遮挡永久免费 | 国产成人一区二区三区电影 | av网站免费看 | 91精品1区2区 | 亚洲精品国产自产拍在线观看 | 中日韩免费视频 | 超碰在线97免费 | 午夜狠狠操 | 亚洲一区黄色 | 99国产精品一区二区 | 黄色亚洲在线 | 91精品1区| 超碰99在线 | 欧美日韩国产一区二区在线观看 | 人人草在线视频 | 国产亚洲成av片在线观看 | 久久艹艹 | 国产高清在线一区 | 最近更新中文字幕 | 久久婷婷久久 | 中文字幕在线观看你懂的 | 国产破处视频在线播放 | 久久99久久精品国产 | 成人国产网址 | 国产亚洲91 | 一区在线观看 | 日日夜夜狠狠 | 国产伦精品一区二区三区照片91 | 黄色成人在线观看 | 久久精品视频在线观看免费 | 亚洲精品tv| 国产精品自产拍在线观看蜜 | www亚洲精品 | 中文字幕色在线视频 | 亚洲精品国产精品国自产观看 | 国产精品久久久久久婷婷天堂 | 国产在线a视频 | 九色激情网 | 欧美精品成人在线 | 久久视频在线观看 | 国产成人精品久久久久蜜臀 | 首页国产精品 | 在线一区av | 欧美精品一区在线发布 | 天天色天天上天天操 | av成人在线网站 | 亚洲精品在线资源 | 91麻豆网| 亚洲欧美日韩一级 | 亚洲欧美日韩精品久久奇米一区 | 日本aa在线 | 69久久久久久久 | 欧美日本国产在线观看 | 99爱在线观看 | 亚洲精品免费在线视频 | 视频一区在线播放 | 欧美日韩国产综合一区二区 | 在线观看久久久久久 | 久久免费中文视频 | 成人av免费在线 | 成人精品亚洲 | 91亚洲精品久久久蜜桃借种 | 久久久久视 | 国产精久久久久久妇女av | 国产69精品久久久久9999apgf | 久久国产亚洲视频 | 超碰97在线人人 | 超碰人人干人人 | 亚洲一区黄色 | 中文字幕人成一区 | 一区二区 不卡 | 成人动态视频 | 欧美日韩国内在线 | 亚洲免费av在线播放 | 日韩在线观看电影 | 久久精品电影 | 2023亚洲精品国偷拍自产在线 | 国产一级视频在线观看 | 亚洲精品乱码久久久久久蜜桃动漫 | 中文十次啦 | 精品美女在线视频 | 日本精品一区二区 | 国产色视频一区 | 精品综合久久久 | 五月婷婷开心中文字幕 | 五月香视频在线观看 | 欧美精品在线观看免费 | 国产亚洲精品久久久久久无几年桃 | 日韩精品一区二区在线观看视频 | 日韩v在线91成人自拍 | 青青草国产免费 | 一级黄色av | 天天艹日日干 | 天天干,天天射,天天操,天天摸 | 不卡的av中文字幕 | 午夜国产一区二区三区四区 | 黄色网址中文字幕 | 日韩精品一二三 | 欧美日韩免费观看一区二区三区 | 中文字幕乱在线伦视频中文字幕乱码在线 | 国产成人精品a | 国产视频一区二区三区在线 | 正在播放国产精品 | 日本精品视频免费观看 | 亚洲精品国产精品国自产 | 日韩色区| 最近中文字幕在线中文高清版 | 久久精品视频网址 | 色婷婷狠狠五月综合天色拍 | 国产精品嫩草影视久久久 | 国产a网站 | 四虎影视精品成人 | 精品在线视频一区二区三区 | 综合在线观看色 | 国内一级片在线观看 | 久久精品女人毛片国产 | av成人免费在线观看 | 亚洲精品五月 | 久久影院亚洲 | 射九九| 日本在线观看黄色 | 色婷婷狠狠五月综合天色拍 | 色夜影院 | 福利视频第一页 | 久久婷婷国产色一区二区三区 | 国产一区免费在线 | 亚洲精品视频免费观看 | 欧美一区二区三区四区夜夜大片 | 人人dvd| 碰超在线观看 | 99久久精品国产免费看不卡 | 免费观看v片在线观看 | 亚洲黄色精品 | 一级久久精品 | 亚洲欧美成人综合 | 午夜在线资源 | 天天天在线综合网 | 久久国产精品影片 | 成人av观看| 99久久久久成人国产免费 | 久久久久久久久久网 | 亚洲精品视频一二三 | 国产在线视频一区 | 91丨九色丨国产丨porny精品 | 黄色av一区 | 久久免费视频一区 | 午夜视频在线网站 | 最近中文字幕大全 | 国产999精品久久久久久麻豆 | 美女福利视频一区二区 | 一级欧美一级日韩 | 午夜精品一区二区三区免费 | 天天射网站 | 国产 日韩 欧美 在线 | 五月婷香蕉久色在线看 | 中文字幕在线免费 | 亚洲成年人免费网站 | 狠狠干激情 | 五月婷婷婷婷婷 | 日日爽天天爽 | 国产精品毛片一区二区 | 国产精品毛片久久久 | 一级黄毛片 | 色综合婷婷久久 | 天堂av在线网站 | 亚洲日韩精品欧美一区二区 | 欧美久草视频 | 日韩欧美在线视频一区二区三区 | 久久久久久久久久久久国产精品 | 亚洲激情在线观看 | 天天躁日日躁狠狠躁av麻豆 | 成人黄色大片 | 在线国产一区二区 | 九九视频一区 | 99婷婷| 天天色天天射天天综合网 | 黄色av网站在线观看 | 五月开心六月伊人色婷婷 | 亚洲一区天堂 | 最新中文字幕 | 亚洲精品小视频 | 国产亚洲精品久久 | 99热国产在线 | 久草视频首页 | 欧美一区在线观看视频 | 欧美日韩不卡在线视频 | 久久精品96| 99精品国产一区二区三区麻豆 | 亚洲人在线视频 | 亚洲激情一区二区三区 | 2023亚洲精品国偷拍自产在线 | 国产高清视频免费最新在线 | 国产精品a成v人在线播放 | 最近中文字幕在线 | 中文字幕一区2区3区 | 亚洲永久免费av | 国产中文字幕国产 | 国产欧美最新羞羞视频在线观看 | 色偷偷中文字幕 | 色五月色开心色婷婷色丁香 | 制服丝袜一区二区 | 欧美日韩另类视频 | 日日摸日日 | 国产日韩精品一区二区三区在线 | 色中文字幕在线观看 | 午夜精品一二三区 | 西西4444www大胆无视频 | 成年人免费在线观看 | 天天干天天操天天射 | 中文字幕婷婷 | 99热这里 | 免费在线观看av网站 | 操综合 | 天天色综合1 | 久久综合亚洲鲁鲁五月久久 | 国产精品一区二区三区久久久 | 波多野结衣小视频 | 国产在线观看 | 97碰碰精品嫩模在线播放 | 亚洲成人资源在线观看 | www免费看 | www.色就是色 | 欧美日韩亚洲在线观看 | 久久久久久久av | 久久久久久国产精品久久 | 麻豆免费在线视频 | 国产成人精品免高潮在线观看 | 国产又粗又猛又黄又爽视频 | 亚洲综合视频在线观看 | 麻豆国产在线播放 | 六月色 | 操操综合 | 欧美99热 | 亚洲成a人片77777kkkk1在线观看 | 国产免费小视频 | 国产中文在线观看 | 久草com| 丁香网婷婷 | 久久大片 | 亚洲免费资源 | 亚洲天天 | 国内亚洲精品 | 91成人精品一区在线播放69 | 免费v片| 国产日韩欧美视频 | 亚洲免费精品视频 | 五月天久久激情 | 天天干,天天干 | 中文字幕av在线免费 | av电影一区二区三区 | 黄色小说在线观看视频 | 亚洲男模gay裸体gay | www国产一区 | 在线国产视频一区 | 00av视频 | 久久精品视频日本 | 欧美日韩国产一区二区三区 | 精品国产黄色片 | 亚洲视频免费在线观看 | 日韩毛片精品 | 日本在线观看黄色 | 亚洲一级理论片 | 麻豆一区在线观看 | 成年人免费在线播放 | 久久久免费在线观看 | 久操视频在线 | 中文不卡视频在线 | 五月天六月色 | 丝袜+亚洲+另类+欧美+变态 | 国产午夜免费视频 | 久久综合狠狠综合久久综合88 | 中文字幕在线播放av | 亚洲高清精品在线 | 在线观看第一页 | 亚洲欧美精品在线 | 国产伦理一区 | 97超碰精品 | 黄色大片视频网站 | 久久人人干 | 免费a网址 | 永久免费毛片在线观看 | 国产精品欧美久久久久天天影视 | 国产色婷婷精品综合在线手机播放 | 国产精品久久一区二区无卡 | 亚洲综合色婷婷 | 精品久久久久久久久久久久久久久久久久 | 欧美巨大| 不卡的av在线 | 欧美日韩国内在线 | 四虎在线免费 | 国产中文字幕在线免费观看 | 成年人免费在线看 | 五月激情av | 成人97人人超碰人人99 | 在线免费三级 | 黄色一级在线观看 | 丝袜+亚洲+另类+欧美+变态 | 成年人视频在线免费观看 | 国产探花视频在线播放 | av黄色一级片 | 精品国模一区二区 | 狠狠干中文字幕 | 黄色三级在线看 | 91污污视频在线观看 | 一级a性色生活片久久毛片波多野 | 97视频成人| 色资源在线观看 | 麻豆视频在线看 | 欧美视频日韩视频 | 992tv成人免费看片 | 国产在线毛片 | 日韩在线 | 中文字幕一区二区三区精华液 | 爱爱av网 | 久久久这里有精品 | 国产精品理论片在线播放 | av在线网站大全 | 国产免费嫩草影院 | 国产视频一区在线播放 | 中文字幕韩在线第一页 | 久久精品国产99 | 日韩激情网 | 日韩特黄一级欧美毛片特黄 | 丰满少妇在线观看网站 | 日韩欧美高清视频在线观看 | 99r在线精品 | 91黄色在线看 | 黄色av网站在线观看免费 | 国产精品久久久免费看 | 欧美性极品xxxx娇小 | 国产伦理精品一区二区 | 日韩精品亚洲专区在线观看 | 成人午夜性影院 | 91污在线观看 | 亚洲三级在线免费观看 | 97福利| 中文字幕刺激在线 | 国产激情免费 | 久久在线观看 | 日本精品视频一区二区 | 日韩黄色网络 | 麻豆影视在线播放 | 91视频传媒 | 九九久久久久久久久激情 | 国产美女精品久久久 | 国产在线观看 | 伊人色综合网 | 国产男女爽爽爽免费视频 | 日韩在线观看小视频 | 国产午夜剧场 | 成人免费看片98欧美 | 亚洲精品免费在线播放 | www.国产精品| 99久久精品免费看国产麻豆 | 香蕉看片| 在线免费观看视频一区二区三区 | 99精品视频免费全部在线 | 丝袜+亚洲+另类+欧美+变态 | 手机色站 | 久黄色 | 日韩在线观看免费 | 国产在线观看网站 | 久热爱 | 亚洲一区二区精品视频 | 麻豆视频在线观看 | 中文字幕视频一区二区 | 中文字幕精品三级久久久 | 狠狠操狠狠干天天操 | 色 免费观看 | 国产精品videoxxxx | 亚洲一级片免费观看 | 亚洲理论在线观看 | 97综合网| 综合久久五月天 | 久久久高清免费视频 | 日韩高清dvd | 亚洲国产精品一区二区久久,亚洲午夜 | 午夜精品久久久久久久99无限制 | 婷婷色伊人 | 久久久久久免费 | 久草在线中文视频 | 久久精品99北条麻妃 | 91视频在线观看下载 | 黄污污网站 | 久久久天天操 | 精品国产乱码久久久久久久 | 国产精品免费小视频 | 久久夜视频 | 久久精品视频免费 | 91一区二区三区久久久久国产乱 | 在线有码中文字幕 | 久久高视频 | 91亚洲精品国偷拍自产在线观看 | 插插插色综合 | 欧美一级特黄aaaaaa大片在线观看 | 欧洲一区二区在线观看 | 国产视频精选 | 右手影院亚洲欧美 | 成人av免费在线看 | 久热电影 | 国产精品久久久久一区二区三区 | 91视频免费国产 | 91人人澡人人爽人人精品 | 日本精品久久久久中文字幕 | 久久精品欧美 | 麻豆视频免费播放 | 毛片一区二区 | 天天操天天射天天操 | 国产精品视频免费观看 | 高清有码中文字幕 | 国产免费观看高清完整版 | 国产精品99久久99久久久二8 | 国产精品ⅴa有声小说 | 久久免费视频网 | 日韩午夜精品 | 91探花在线| 久草在线欧美 | 一二三久久久 | 色综合天天色综合 | 亚洲我射av | 又爽又黄又刺激的视频 | 少妇自拍av | 日本久久中文 | 亚洲国产网站 | 天天草天天干 | 日韩18p| 久久久久免费网站 | 国产资源精品在线观看 | 88av色| 97在线观看免费高清 | 亚洲1级片| 精品人人人| 黄色一级大片在线免费看国产一 | 色插综合 | 久久夜色精品国产欧美一区麻豆 | 国产精品永久久久久久久久久 | 日韩精品中文字幕在线 | 欧美久草网 | 成人动漫精品一区二区 | 在线亚洲欧美视频 | 在线不卡中文字幕播放 | 久久久久久久久亚洲精品 | 日韩精品免费专区 | 日日日日 | 99精品在线直播 | 中文字幕黄色网址 | 日韩视频图片 | 免费看的av片 | 99精品系列| 国产无区一区二区三麻豆 | 久久综合中文色婷婷 | 五月天天色| 91在线观看高清 | 亚洲黄色在线观看 | 亚洲国产精彩中文乱码av | 色五月色开心色婷婷色丁香 | 国产精品美女久久久网av | 欧美成人手机版 | 色视频成人在线观看免 | a黄色一级片 | 中国一级片在线观看 | 欧美日韩中文字幕综合视频 | 亚洲综合婷婷 | 在线观看成人一级片 | 久久午夜羞羞影院 | 日韩久久精品 | 狠狠操天天操 | 日韩字幕 | 99热精品久久| 欧美日本日韩aⅴ在线视频 插插插色综合 | 超碰在线观看97 | 999一区二区三区 | 久久理论影院 | 色狠狠操| 亚洲综合在线视频 | 中文字幕视频一区二区 | 99在线观看免费视频精品观看 | 国产69熟| 99这里精品 | 九九激情视频 | 亚州精品在线视频 | 国产精品一区免费看8c0m | 91精品伦理 | 最新av在线播放 | 99久久精品免费看国产 | 碰天天操天天 | 人人干免费 | 欧美日韩另类视频 | 亚洲成av人片在线观看www | 国产一二区在线观看 | 欧美性生交大片免网 | 精品国产乱码 | 亚洲国产偷| 中文字幕网址 | 国产精品一区二区三区电影 | 国产精品毛片一区二区 | 最近的中文字幕大全免费版 | 在线观看一区 | 欧美精品久久久久久久久老牛影院 | av在线一| 国产精品久久久久久久久久久杏吧 | 精品国产午夜 | 国产精品久久久免费 | 2019国产精品 | 亚洲人片在线观看 | 成人福利在线观看 | 色香蕉视频| 99热免费在线 | 久久精品人人做人人综合老师 | 久久99在线 | 国产成人三级三级三级97 | 国产黄色大全 | 丰满少妇一级片 | 亚洲成人精品在线观看 | 成人黄视频 | 亚洲最大成人免费网站 | 日本护士三级少妇三级999 | 亚洲欧洲精品一区二区精品久久久 | 日批视频在线 | 狠狠狠色丁香婷婷综合激情 | 伊人日日干| 麻豆国产露脸在线观看 | 久久精品小视频 | 亚洲精品乱码久久久久 | 美女在线免费观看视频 | 狠狠躁日日躁 | 欧美激精品 | 日本一区二区三区视频在线播放 | 在线你懂 | 亚洲日本精品视频 | 精品久久精品久久 | 日韩激情精品 | 国产精品久久网 | 日本在线观看视频一区 | 最新中文在线视频 | 欧美激情视频一区二区三区 | 亚洲欧美经典 | 精品一区二区免费视频 | 午夜精选视频 | 免费中文字幕视频 | 午夜久久久久久久 | 欧美经典久久 | 久热只有精品 | 日韩中文字幕电影 | 激情五月亚洲 | av免费看网站 | 特黄特黄的视频 | 国产资源免费在线观看 | 波多野结衣精品 | 亚洲一区不卡视频 | 亚洲成人午夜在线 | www免费看片com| 亚洲成人av一区 | 国产经典三级 | 久久九九精品 | 亚洲区二区| 国产一级视频在线免费观看 | 久久久久欠精品国产毛片国产毛生 | 国产精品1区2区3区 久久免费视频7 | 精品久久美女 | 欧美日韩在线精品一区二区 | 黄色免费网站 | 精品日韩在线 | 欧美精彩视频在线观看 | 日韩伦理一区二区三区av在线 | 成人动漫精品一区二区 | 天天操夜夜看 | 亚洲电影一区二区 | 亚洲精品高清视频在线观看 | 国产不卡视频在线播放 | 中文字幕av在线电影 | 中文字幕在线观看视频免费 | 黄色一级大片在线免费看产 | 国产伦理久久 | 久久黄色美女 | 超碰个人在线 | 亚洲精品视频网站在线观看 | 69视频在线 | 中文字幕在线观看完整版 | 久草视频在| 欧美黑吊大战白妞欧美 | 日本精品视频免费 | 国产 欧美 日产久久 | 欧洲色吧| 亚洲欧美日韩国产一区二区三区 | 91九色在线观看视频 | 亚洲成a人片在线观看网站口工 | 天天操天天舔天天爽 | 午夜av激情| 国产日韩中文在线 | 久久精品久久99 | 久久艹在线观看 | 蜜桃传媒一区二区 | 久久国产免费看 | 在线国产高清 | 中文在线天堂资源 | 国产青草视频在线观看 | 欧美午夜理伦三级在线观看 | 日精品在线观看 | 色在线视频 | 日韩久久一区二区 | 成年人在线播放视频 | 91片网| 中文字幕久久精品亚洲乱码 | 黄色毛片电影 | 特黄特黄的视频 | 国产成人精品电影久久久 | 超碰人人草人人 | 丁香久久 | 在线亚洲欧美日韩 | 99精品视频网 | 国产精品人成电影在线观看 | 一区二区视频免费在线观看 | 人人爽人人爽人人爽学生一级 | 亚洲成人黄色在线观看 | 亚洲va在线va天堂 | 国产999精品久久久影片官网 | 亚洲一本视频 | 欧美专区国产专区 | 免费观看第二部31集 | 久久亚洲区 | 天天搞天天干天天色 | 精品在线观看一区二区三区 | 在线免费观看黄色 | 91大神免费在线观看 | 97国产大学生情侣酒店的特点 | 成人在线黄色电影 | 丁香婷婷综合色啪 | 天天夜夜亚洲 | 亚洲精品久久久蜜臀下载官网 | 欧美色综合久久 | x99av成人免费| 国内精品久久久久久中文字幕 | 亚洲一区 影院 | 91.麻豆视频| 综合五月婷婷 | 国产一区二区三区免费在线 | 国产中文视 | 免费成人黄色 | 久久精品日产第一区二区三区乱码 | 欧美精品一区二区三区一线天视频 | 亚洲视频 中文字幕 | 久久久免费观看视频 | 国产小视频在线观看免费 | 欧美国产在线看 | 日本黄色免费大片 | 99久久99久久精品 | 婷婷六月天丁香 | 免费高清在线视频一区· | 久久99精品国产99久久 | 久久久国产精品电影 | 在线免费观看麻豆视频 | 成人av高清在线 | 国产精品一区二区av日韩在线 | 999成人免费视频 | 中文字幕在线观看第一区 | 国产视频综合在线 | 色开心|