精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一篇了解 BLE 藍牙開發詳解

移動開發 Android
Android 4.3(API Level 18)開始引入Bluetooth Low Energy(BLE,低功耗藍牙)的核心功能并提供了相應的 API, 應用程序通過這些 API 掃描藍牙設備、查詢 services、讀寫設備的 characteristics(屬性特征)等操作。

[[432207]]

前言

有老鐵們私信,要講解下藍牙開發,那么今天來了;

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

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

一、BLE開發流程

1、申請權限

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

  1. <!-- 藍牙權限 --> 
  2. <uses-permission android:name="android.permission.BLUETOOTH" /> 
  3. <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 
  4. 為適配安卓6.0以及以上版本需要添加一個模糊定位的權限 
  5.  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
  6. 手機權限管理中允許此權限,否則會出現無法搜索到設備的情況; 

為適配安卓6.0以及以上版本需要添加一個模糊定位的權限

手機權限管理中允許此權限,否則會出現無法搜索到設備的情況;

2、打開藍牙

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

  1. //獲取系統藍牙適配器管理類 
  2.     private BluetoothAdapter mBluetoothAdapter = BluetoothAdapter 
  3.             .getDefaultAdapter(); 
  4.     // 詢問打開藍牙 
  5.     if (mBluetoothAdapter != null && !mBluetoothAdapter.isEnabled()) { 
  6.             Intent enableBtIntent = new Intent( 
  7.                     BluetoothAdapter.ACTION_REQUEST_ENABLE); 
  8.             startActivityForResult(enableBtIntent, 1); 
  9.     } 
  10.       // 申請打開藍牙請求的回調 
  11.     @Override 
  12.     protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
  13.         // TODO Auto-generated method stub 
  14.         super.onActivityResult(requestCode, resultCode, data); 
  15.         if (requestCode == 1) { 
  16.             if (resultCode == RESULT_OK) { 
  17.                 Toast.makeText(this, "藍牙已經開啟", Toast.LENGTH_SHORT).show(); 
  18.             } else if (resultCode == RESULT_CANCELED) { 
  19.                 Toast.makeText(this, "沒有藍牙權限", Toast.LENGTH_SHORT).show(); 
  20.                 finish(); 
  21.             } 
  22.         } 
  23.     } 

3、搜索設備

  1. mBluetoothAdapter.startLeScan(callback); 
  2. private LeScanCallback callback = new LeScanCallback() { 
  3.     @Override 
  4.     public void onLeScan(BluetoothDevice device, int arg1, byte[] arg2) { 
  5.         //device為掃描到的BLE設備 
  6.         if(device.getName() == "目標設備名稱"){ 
  7.             //獲取目標設備 
  8.             targetDevice = device; 
  9.         } 
  10.     } 
  11. }; 

4、連接設備

通過掃描BLE設備,根據設備名稱區分出目標設備targetDevice,下一步實現與目標設備的連接,在連接設備之前要停止搜索藍牙;

mBluetoothAdapter.stopLeScan(callback);

停止搜索一般需要一定的時間來完成,最好調用停止搜索函數之后加以100ms的延時,保證系統能夠完全停止搜索藍牙設備。停止搜索之后啟動連接過程;

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

  1. mBluetoothAdapter.startLeScan(callback); 
  2. private LeScanCallback callback = new LeScanCallback() { 
  3.     @Override 
  4.     public void onLeScan(BluetoothDevice device, int arg1, byte[] arg2) { 
  5.         //device為掃描到的BLE設備 
  6.         if(device.getName() == "目標設備名稱"){ 
  7.             //獲取目標設備 
  8.             targetDevice = device; 
  9.         } 
  10.     } 
  11. }; 

參數說明

返回值 BluetoothGatt: BLE藍牙連接管理類,主要負責與設備進行通信;

boolean autoConnect:建議置為false,能夠提升連接速度;

BluetoothGattCallback callback 連接回調,重要參數,BLE通信的核心部分;

5、設備通信

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

BluetoothGattCallback中主要回調函數如下:

  1. private BluetoothGattCallback gattCallback = new BluetoothGattCallback() { 
  2.         @Override 
  3.         public void onConnectionStateChange(BluetoothGatt gatt, int status, 
  4.                 int newState) { 
  5.         } 
  6.         @Override 
  7.         public void onCharacteristicWrite(BluetoothGatt gatt, 
  8.                 BluetoothGattCharacteristic characteristic, int status) { 
  9.             super.onCharacteristicWrite(gatt, characteristic, status); 
  10.         } 
  11.         @Override 
  12.         public void onDescriptorWrite(BluetoothGatt gatt, 
  13.                 BluetoothGattDescriptor descriptor, int status) { 
  14.         }; 
  15.         @Override 
  16.         public void onServicesDiscovered(BluetoothGatt gatt, int status) { 
  17.         } 
  18.         @Override 
  19.         public void onCharacteristicChanged(BluetoothGatt gatt, 
  20.                 BluetoothGattCharacteristic characteristic) { 
  21.         } 
  22.     }; 

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

6、等待設備連接成功

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

  1. @Override 
  2. public void onConnectionStateChange(BluetoothGatt gatt, int status, 
  3.                 int newState) { 
  4.             if (newState == BluetoothGatt.STATE_CONNECTED) { 
  5.                 Log.e(TAG, "設備連接上 開始掃描服務"); 
  6.                 // 開始掃描服務,安卓藍牙開發重要步驟之一 
  7.                 mBluetoothGatt.discoverServices(); 
  8.             } 
  9.             if (newState == BluetoothGatt.STATE_DISCONNECTED) { 
  10.                 // 連接斷開 
  11.                 /*連接斷開后的相應處理*/       
  12.             } 
  13. }; 

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

7、開啟掃描服務

mBluetoothGatt.discoverServices();

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

  1. @Override 
  2. public void onServicesDiscovered(BluetoothGatt gatt, int status) { 
  3.     private List<BluetoothGattService> servicesList; 
  4.     //獲取服務列表 
  5.     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負責寫入數據;

具體操作方式如下:

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

9、開啟監聽

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

  1. mBluetoothGatt.setCharacteristicNotification(notifyCharacteristic, true
  2. BluetoothGattDescriptor descriptor = characteristic 
  3.                             .getDescriptor(UUID 
  4.                                     .fromString 
  5. ("00002902-0000-1000-8000-00805f9b34fb")); 
  6. descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); 

若開啟監聽成功則會回調BluetoothGattCallback中的onDescriptorWrite()方法,處理方式如下:

  1. @Override 
  2. public void onDescriptorWrite(BluetoothGatt gatt, 
  3.                 BluetoothGattDescriptor descriptor, int status) { 
  4.         if (status == BluetoothGatt.GATT_SUCCESS) { 
  5.             //開啟監聽成功,可以像設備寫入命令了 
  6.             Log.e(TAG, "開啟監聽成功"); 
  7.         } 
  8. }; 

10、寫入數據

監聽成功后通過向 writeCharacteristic寫入數據實現與下位機的通信。寫入方式如下:

  1. //value為上位機向下位機發送的指令 
  2. writeCharacteristic.setValue(value); 
  3. mBluetoothGatt.writeCharacteristic(writeCharacteristic) 

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

11、接收數據

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

  1. @Override 
  2. public void onCharacteristicWrite(BluetoothGatt gatt, 
  3.             BluetoothGattCharacteristic characteristic, int status) { 
  4.             if (status == BluetoothGatt.GATT_SUCCESS) { 
  5.                 Log.e(TAG, "發送成功"); 
  6.             }    
  7.             super.onCharacteristicWrite(gatt, characteristic, status); 

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

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

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

12、斷開連接

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

  1. mBluetoothGatt.disconnect(); 
  2.  
  3. mBluetoothGatt.close(); 

二、藍牙操作的注意事項

  • 藍牙的寫入操作, 讀取操作必須序列化進行. 寫入數據和讀取數據是不能同時進行的, 如果調用了寫入數據的方法, 馬上調用又調用寫入數據或者讀取數據的方法,第二次調用的方法會立即返回 false, 代表當前無法進行操作;
  • Android 連接外圍設備的數量有限,當不需要連接藍牙設備的時候,必須調用 BluetoothGatt#close 方法釋放資源;
  • 藍牙 API 連接藍牙設備的超時時間大概在 20s 左右,具體時間看系統實現。有時候某些設備進行藍牙連接的時間會很長,大概十多秒。如果自己手動設置了連接超時時間在某些設備上可能會導致接下來幾次的連接嘗試都會在 BluetoothGattCallback#onConnectionStateChange 返回 state == 133;
  • 所有的藍牙操作使用 Handler 固定在一條線程操作,這樣能省去很多因為線程不同步導致的麻煩;

總結

 

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

 

責任編輯:武曉燕 來源: Android開發編程
相關推薦

2022-10-26 07:39:36

MVCC數據庫RR

2022-12-19 08:14:30

注解開發配置

2021-05-20 06:57:16

RabbitMQ開源消息

2020-10-09 08:15:11

JsBridge

2021-10-28 19:15:02

IPUARM

2021-07-10 09:02:42

編程語言 TypeScript

2021-07-14 10:08:30

責任鏈模式加工鏈

2015-09-22 11:04:24

藍牙4.0開發

2022-06-08 00:10:33

數據治理框架

2023-05-12 08:19:12

Netty程序框架

2021-12-30 09:38:51

DDoS攻擊防范

2021-06-30 00:20:12

Hangfire.NET平臺

2021-07-14 08:24:23

TCPIP 通信協議

2021-07-28 10:02:54

建造者模式代碼

2021-08-11 07:02:21

npm包管理器工具

2021-11-24 08:51:32

Node.js監聽函數

2021-11-08 08:42:44

CentOS Supervisor運維

2021-08-02 06:34:55

Redis刪除策略開源

2021-12-15 11:52:34

GPLLinuxGNU

2022-07-31 20:00:59

云原生云計算
點贊
收藏

51CTO技術棧公眾號

91麻豆免费看| av一区二区在线播放| 亚洲午夜免费电影| 久久一区二区精品| 一女二男一黄一片| 亚洲第一区色| 一二三av在线| 50度灰在线| youjizz国产精品| 国产精品精品一区二区三区午夜版 | 特级西西人体高清大胆| 久久一级大片| 一本久久精品一区二区| 日韩video| 成人欧美亚洲| 成人av在线看| 成人久久久久久| 黄色在线免费观看| 欧美 日韩 国产一区二区在线视频| 亚洲国产精品久久久久秋霞不卡| 亚洲精品久久久中文字幕| 成人影音在线| 亚洲男同1069视频| 亚洲高清资源综合久久精品| 色呦呦免费观看| 国产乱子伦视频一区二区三区| 人体精品一二三区| 国产亚洲精品久久久久久打不开| 国产精品久久占久久| 亚洲视频在线观看| 免费看黄色片的网站| 国产精品一区二区精品视频观看| 在线观看一区日韩| 亚洲中文字幕无码专区| 国产精品69xx| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲免费不卡| 成人高清免费在线播放| www国产精品av| 国产亚洲精品美女久久久m| 国产999久久久| 国产一区二区不卡老阿姨| 国产精品久久久久9999| 五月激情六月丁香| 一区二区国产精品| 97超级碰在线看视频免费在线看| 青青草国产在线观看| 无码一区二区三区视频| 日韩亚洲欧美成人| 九九热免费在线| 黑人操亚洲人| 永久免费精品影视网站| 亚洲成人黄色av| 经典一区二区| 一区二区三区四区在线观看视频 | 欧美国产一区在线| 日韩av电影免费在线观看| 久久久久久久久亚洲精品| 91在线你懂得| 黑人中文字幕一区二区三区| 手机看片一区二区| 99久久综合狠狠综合久久| 好吊色欧美一区二区三区四区| 丰满少妇一级片| av在线播放成人| 精品无码久久久久久久动漫| 天堂av在线播放| 2021中文字幕一区亚洲| 欧美日韩电影一区二区| 蜜芽tv福利在线视频| 久久久久99精品一区| 日本福利一区二区三区| 3p视频在线观看| 亚洲摸摸操操av| www.亚洲视频.com| 中文字幕在线看片| 欧美视频一区二| 手机av在线网站| 第四色中文综合网| 国产视频自拍一区| 日韩一区二区三区四区视频| 午夜日韩激情| 欧美一级黄色网| 亚洲欧美另类在线视频| 蜜臀av在线播放一区二区三区| 成人在线精品视频| 天天射天天操天天干| 久久久久久久久久久久久夜| 一区二区三区电影| av不卡高清| 欧美三级三级三级爽爽爽| 91精产国品一二三产区别沈先生| 午夜久久av| 亚洲欧美一区二区三区久久 | 视频污在线观看| 欧美韩日一区二区三区| 久久久国内精品| 欧美日韩视频免费观看| 欧美一区二区三区在线视频| 91黄色免费视频| 国产精品国产一区| 欧美亚洲激情视频| 99热这里只有精品9| 91丨九色porny丨蝌蚪| 在线综合视频网站| 伊人成综合网站| 4438成人网| 精品夜夜澡人妻无码av | 久久久精品综合| 91社在线播放| 成人天堂yy6080亚洲高清 | 韩国精品视频| 亚洲一区二区在线观看视频| 午夜免费高清视频| 欧美日韩导航| 久久99精品视频一区97| 自拍偷拍第八页| 91亚洲国产成人精品一区二三| 制服诱惑一区| 久久夜夜操妹子| 亚洲丁香久久久| 欧美日韩偷拍视频| 精一区二区三区| 亚洲高清乱码| 三级成人在线| 日韩精品免费在线观看| 不卡的免费av| 国产一区二区久久| 中文字幕欧美日韩一区二区| 亚洲第一二三四区| 亚洲欧美日韩图片| 国产精品久久久久久99| 成人午夜视频在线| 狠狠干视频网站| 色999韩欧美国产综合俺来也| 亚洲社区在线观看| 三级视频在线观看| 99久久精品国产精品久久| 50度灰在线观看| 国产精品无码专区av在线播放 | 久久久一本精品99久久精品| 性xxxfreexxxx性欧美| 欧美日韩你懂得| 秋霞网一区二区三区| 麻豆亚洲精品| 久久精品人成| 亚洲美女炮图| 亚洲免费伊人电影在线观看av| 日韩精品无码一区二区| 成人免费观看男女羞羞视频| 老司机激情视频| 成人盗摄视频| 久久久久久久久久久亚洲| www.激情五月.com| 亚洲一区二区三区在线看| 91丨porny丨九色| 亚洲欧美文学| 国产精品区一区| www.51av欧美视频| 日韩国产欧美区| 国产性生活视频| 国产精品视频看| 欧美日韩理论片| 欧美久久一区| 精品国产免费久久久久久尖叫| 麻豆视频在线看| 亚洲情综合五月天| 在线观看免费中文字幕| 亚洲日本欧美天堂| 麻豆av免费看| 免费视频一区二区三区在线观看| 欧美日韩免费高清| 国产亚洲欧美日韩精品一区二区三区| 日韩在线观看成人| 成人福利小视频| 黄色精品一区二区| 日韩视频在线观看免费视频| 九色综合国产一区二区三区| 伊人网在线免费| 日韩美脚连裤袜丝袜在线| 日韩免费在线免费观看| 欧美私人网站| 亚洲韩国欧洲国产日产av| 中文字幕免费观看| 中文字幕视频一区二区三区久| 四虎成人免费视频| 日日夜夜免费精品视频| 精品日韩在线播放| 秋霞蜜臀av久久电影网免费| 国产精品久久久久国产a级| 精品自拍一区| 亚洲老头同性xxxxx| 在线免费观看高清视频| 亚洲午夜久久久| 国产黄色录像视频| 成人高清视频免费观看| 国内自拍视频网| 国产一区二区中文| 午夜午夜精品一区二区三区文| 亚洲精品不卡在线观看| 日韩免费观看av| 免费看一级大片| 日本欧美一区二区在线观看| 亚洲 欧洲 日韩| 九九热hot精品视频在线播放| 国产精品96久久久久久| 欧美videossex另类| 亚洲性无码av在线| 国产黄色一级大片| 欧美最猛性xxxxx直播| 久久午夜无码鲁丝片午夜精品| 久久久久久久久久久久久夜| 久久久久亚洲av无码网站| 蜜桃视频在线观看一区| 777精品久无码人妻蜜桃| 伊人情人综合网| 手机成人在线| 婷婷成人综合| 国产一区二区黄色| 国产精选久久| 国产精品日本精品| 伊人久久国产| 97av在线视频免费播放| 男女视频在线| 久久中文字幕视频| 五月婷婷在线视频| 亚洲精品自在久久| 神马午夜精品95| 日韩精品一区二区三区四区 | 在线国产91| 亚洲欧美另类人妖| 青青青免费视频在线2| 精品不卡在线视频| 亚洲AV无码一区二区三区少妇| 欧美日韩一级二级| 中文字幕在线观看视频一区| 色综合一个色综合亚洲| 在线观看亚洲天堂| 午夜久久久影院| 国产在线视频卡一卡二| 亚洲精品免费看| 久久久久久久久久网站| 中文字幕欧美一区| 大地资源高清在线视频观看| 国产精品欧美久久久久一区二区| 国产中年熟女高潮大集合| 97久久人人超碰| 久久久久久久无码| 91亚洲精品久久久蜜桃| 丰满圆润老女人hd| 国产亚洲一区二区三区在线观看| 自拍视频一区二区| 久久综合久久综合亚洲| 少妇精品一区二区三区| 久久网站最新地址| 国产精品国产三级国产专业不 | 亚洲免费视频一区| 久久在线免费| 蜜臀av.com| 激情综合电影网| 97国产在线播放| 久久福利一区| 狠狠躁狠狠躁视频专区| 久久99精品视频| 精品人妻一区二区三| 风流少妇一区二区| 波多野结衣加勒比| 久久视频一区二区| 特级西西人体高清大胆| 亚洲女同女同女同女同女同69| 国产一级生活片| 狠狠色噜噜狠狠狠狠97| 欧美一区二区三区网站| 欧美日韩久久一区| 国产极品久久久| 日韩av一区二区在线观看| 国产女人在线视频| 日韩中文字幕免费视频| 色a资源在线| 欧美中文在线观看国产| 国产精品99精品一区二区三区∴| 成人a在线视频| 久久久久影视| 亚洲毛片aa| 99pao成人国产永久免费视频| 18岁视频在线观看| 国产在线观看一区二区| 日本一卡二卡在线| 国产精品色哟哟网站| 久久久久成人片免费观看蜜芽| 欧美日韩在线影院| 亚洲最大成人av| 精品成人一区二区三区| 粉嫩av在线播放| 欧美激情一区二区三区久久久| 免费毛片b在线观看| 国产自产女人91一区在线观看| 国产精品对白| 一区二区冒白浆视频| 91久久亚洲| 五月激情五月婷婷| av电影在线观看一区| 欧美激情精品久久久久久免费| 亚洲福利视频导航| 一本一道精品欧美中文字幕| 日韩成人在线免费观看| 麻豆tv免费在线观看| 欧美一级免费看| 爱高潮www亚洲精品| 尤物一区二区三区| 久久精品麻豆| 国产+高潮+白浆+无码| 日韩美女视频一区| 久久永久免费视频| 亚洲级视频在线观看免费1级| 国产美女av在线| 国产精品精品一区二区三区午夜版 | 欧美videosex性欧美黑吊| 国产欧美日韩中文字幕| 日本天堂一区| www.国产在线视频| 国产黄色精品网站| 精品少妇一区二区三区密爱| 日韩欧美亚洲成人| 无码国产精品高潮久久99| 九九精品视频在线| 香蕉久久一区| 亚洲一区二区三区午夜| 日韩中文字幕不卡| 欧美丰满少妇人妻精品| 性做久久久久久久免费看| wwwxxxx国产| 麻豆乱码国产一区二区三区| 香蕉久久一区| 黄色a级在线观看| 麻豆国产精品一区二区三区 | 国产精品美女午夜av| 午夜精品福利影院| 波多野结衣家庭教师在线播放| 成人一区二区在线观看| 黄色一级片在线免费观看| 欧美一区二区三区啪啪| 成人在线观看亚洲| 国产精品视频资源| 欧美aaaa视频| 视频免费1区二区三区| 国产精品久久久久久久岛一牛影视| 国产情侣免费视频| 综合网日日天干夜夜久久| 韩日一区二区| 正在播放91九色| 国内精品免费**视频| 日本福利片在线观看| 欧美一级黄色片| 欧美四级在线| 国产一区二区精品免费| aa亚洲婷婷| 久久久视频6r| 欧美日韩精品高清| 成年人网站在线| 国产精品国产精品国产专区蜜臀ah| 好吊日精品视频| 中国一级特黄录像播放| 色综合久久66| a√在线中文网新版址在线| 成人黄色av播放免费| 一本到12不卡视频在线dvd| 国产精品99久久久精品无码| 亚洲国产一区二区三区 | 色妞在线综合亚洲欧美| 4438五月综合| cao在线观看| 91老司机福利 在线| 自拍偷拍色综合| 美日韩精品视频免费看| 麻豆成人入口| 亚洲精品一二三四五区| 亚洲色图都市小说| 蜜桃av中文字幕| 欧美一级视频在线观看| 日韩欧美国产精品综合嫩v| 黄色片子免费看| 天天免费综合色| av在线免费观看网| 91成人在线看| 久久亚洲电影| 成人观看免费视频| 亚洲国产成人91精品| 免费在线观看一区| 蜜臀av.com| 国产日韩欧美综合在线| www.色日本| 国产精品高清在线观看| 女主播福利一区| 一级黄色片网址| 欧美成人一区二区| 99久久久国产精品免费调教网站| 成年在线观看视频| 国产免费成人在线视频| 国产91久久久|