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

你不知道的前端藍牙應用實踐-心率帶

開發 前端
藍牙低能耗技術,實現設備間的連接與通信。顧名思義,能耗與成本都更低,與之相對應的則稱為經典藍牙。基于筆者的開發目的,本文簡單了解設備連接前(GAP)和連接后(GATT)所涉及的兩個協議。

本文為來自 字節教育-成人與創新前端團隊 成員的文章,已授權 ELab 發布。

一、背景

最近開啟了減肥計劃,購入了一條心率帶,期望在使用劃船機過程中監測心率情況。購入后的情況如下:

心率帶不直接顯示數值,需要連接APP或相關設備使用。

官方APP僅實時顯示心率數據,無法生成心率統計圖表。

圖片

圖片

通過咕咚APP連接心率帶,開啟運動后可以監測心率變化,但劃船機不在支持的運動范圍內。

自己簡單實現了一個劃船機節拍器的小程序。

圖片

圖片

圖片

于是萌生了在自己的節拍器小程序內監聽心率數據的想法,即Taro小程序中的藍牙應用實踐。

二、簡單了解藍牙

對于概念類的知識筆者畢竟不是專業的,感興趣的同學可以通過百科、搜索引擎等渠道進行了解。這里僅簡單介紹接下來會運用到的一些知識。

中心設備/外圍設備

客戶端(中心設備):在本次實踐中為筆者的手機。

服務端(外圍設備):在本次實踐中為心率帶、耳機等設備。

BLE(Bluetooth Low Energy)

藍牙低能耗技術,實現設備間的連接與通信。顧名思義,能耗與成本都更低,與之相對應的則稱為經典藍牙。基于筆者的開發目的,本文簡單了解設備連接前(GAP)和連接后(GATT)所涉及的兩個協議。

(了解更多:藍牙低能耗——百度百科[1]、一文讀懂藍牙技術從 1.0 到 5.0 的前世今生[2])

GAP(Generic Access Profile)

主要用來控制設備連接和廣播。通常是由外圍設備主動、間隔性地廣播設備信息,等待中心設備發現并建立連接。需要注意的是,這種連接方式是獨占的,在建立連接后,外圍設備將停止廣播。

另一方面,還存在僅向外廣播而不建立連接的iBeacon設備。

GATT(Generic Attribute Profile)

定義了兩個設備間的數據傳輸方式。GATT中有兩個關鍵概念:service(服務)與characteristic(特征)。

Service就是一個獨立的邏輯項,它包含一個或多個Characteristic。

Characteristic是GATT中最小的邏輯數據單元,其屬性包含properties,標識該特性是否能夠被read、write、notify、indicate。notify與indicate的區別在于,indicate需要有回復才能發送下一個數據包。

每個服務和特性都具有唯一的UUID標識,其中部分是由Bluetooth SIG官方定義的, Assigned Numbers | Bluetooth? Technology Website[3],如設備名、心率數據等常用屬性都是官方定義來統一規范。此外UUID也可以由硬件工程師來自定義實現。

(了解更多:BLE相關協議(GAP&GATT)[4])

三、API簡介

Taro中的藍牙API

Taro.openBluetoothAdapter(option) | Taro 文檔[5]

初始化藍牙模塊

Taro.openBluetoothAdapter({
success: function (res) {
console.log("藍牙環境已啟動:", res);
setInitStatus(true);
},
fail: function (err) {
if (err.errMsg.includes("fail already opened")) {
console.log("藍牙環境原先已啟動:", err);
setInitStatus(true);
} else {
console.log("藍牙環境啟動失敗:", err);
setInitStatus(false);
}
},
});

Taro.getBluetoothDevices(option) | Taro 文檔[6]

獲取在藍牙模塊生效期間所有已發現的藍牙設備。包括已經和本機處于連接狀態的設備。

discoverInterval = setInterval(() => {
Taro.getBluetoothDevices({
success: async function (res) {
const canConnectDevices = res.devices.filter(
(item) =>
// 信號強度大于-80
item.RSSI > -80 &&
// 含有設備名
!["未知設備", "MBeacon"].includes(item.name)
);
console.log("獲取藍牙設備列表成功:", canConnectDevices);

setDeviceList(() => canConnectDevices);
},
});
}, 2000);

也可以使用 Taro.onBluetoothDeviceFound(callback) | Taro 文檔[7]來發現設備。

Taro.createBLEConnection(option) | Taro 文檔[8]

連接低功耗藍牙設備。

若小程序在之前已有搜索過某個藍牙設備,并成功建立連接,可直接傳入之前搜索獲取的 deviceId 直接嘗試連接該設備,無需進行搜索操作。

Taro.createBLEConnection({
deviceId,
success: function (res) {
console.log("設備連接成功", res);
setConnectDeviceId(deviceId);

Taro.onBLEConnectionStateChange(function (res) {
// 該方法回調中可以用于處理連接意外斷開等異常情況
console.log(
`設備 ${res.deviceId}連接狀態發生變化: ${res.connected}`
);
if (!res.connected) {
setConnectDeviceId("");
}
});
},
});

Taro.getBLEDeviceServices(option) | Taro 文檔[9]

獲取藍牙設備所有服務(service)。

Taro.getBLEDeviceServices({
// 這里的 deviceId 需要已經通過 createBLEConnection 與對應設備建立鏈接
deviceId,
success: function (res) {
console.log('device services:', res.services)
}
})

Taro.getBLEDeviceCharacteristics(option) | Taro 文檔[10]

獲取藍牙設備某個服務中所有特征值(characteristic)。

Taro.getBLEDeviceCharacteristics({
// 這里的 deviceId 需要已經通過 createBLEConnection 與對應設備建立鏈接
deviceId,
// 這里的 serviceId 需要在 getBLEDeviceServices 接口中獲取
serviceId,
success: function (res) {
console.log('device getBLEDeviceCharacteristics:', res.characteristics)
}
})

Taro.readBLECharacteristicValue(option) | Taro 文檔[11]

讀取低功耗藍牙設備的特征值的二進制數據值。注意:必須設備的特征值支持 read 才可以成功調用。

接口讀取到的信息需要在onBLECharacteristicValueChange 方法注冊的回調中獲取。

Taro.notifyBLECharacteristicValueChange(option) | Taro 文檔[12]

啟用低功耗藍牙設備特征值變化時的 notify 功能,訂閱特征值。注意:必須設備的特征值支持 notify 或者 indicate 才可以成功調用。

另外,必須先啟用 notifyBLECharacteristicValueChange 才能監聽到設備 characteristicValueChange 事件

Taro.onBLECharacteristicValueChange(callback) | Taro 文檔[13]

監聽低功耗藍牙設備的特征值變化事件。必須先啟用 notifyBLECharacteristicValueChange 接口才能接收到設備推送的 notification。

WEB藍牙API

此處貼一些資料,感興趣可自行閱讀

Web Bluetooth API - Web APIs | MDN[14]

通過 JavaScript 與藍牙設備通信[15]

四、設備名稱(Device Name)詳解

首先getBLEDeviceServices獲取到服務列表:

圖片

查詢資料

圖片

可知0x1800是我們需要的服務。getBLEDeviceCharacteristics獲取其特征列表:

圖片

查詢資料

圖片

可知0x2A00是我們需要的特征。此時可以看到read屬性為true,我們通過onBLECharacteristicValueChange和readBLECharacteristicValue讀一下數據看看。

Taro.onBLECharacteristicValueChange(function (characteristic) {
const buffer = characteristic.value
const unit8Array = new Uint8Array(buffer);
console.log("unit8Array: ", unit8Array);

// 轉字符串
const encodedString = String.fromCodePoint.apply(null, unit8Array);
console.log('設備名:', encodedString)
});

Taro.readBLECharacteristicValue({
deviceId,
serviceId: DeviceNameService,
characteristicId: DeviceNameCharacteristics,
});

得到輸出,某米耳機:

圖片

圖片

大家應該已經發現,給到的特征值其實是ArrayBuffer格式。

(了解更多:談談JS二進制:File、Blob、FileReader、ArrayBuffer、Base64 - 掘金[16])

此時需要我們將其轉化為字符串。除了上面的方法外,還可以先轉16進制,再轉字符串:

// 轉16進制
const hexString = Array.prototype.map
.call(unit8Array, function (bit) {
return ("00" + bit.toString(16)).slice(-2);
})
.join("");
console.log("hexString: ", hexString);

// 16進制轉字符串
const hex2String = (hexString:string) => {
if (hexString.length % 2) return "";
var tmp = "";
for (let i = 0; i < hexString.length; i += 2) {
tmp += "%" + hexString.charAt(i) + hexString.charAt(i + 1);
}
return decodeURI(tmp);
}

五、心率測量(Heart Rate Measurement)詳解

同樣,首先我們拿到了所需的服務和特征如下。

export const HEART_RATE_SERVICE_UUID =
"0000180D-0000-1000-8000-00805F9B34FB";
export const HEART_RATE_CHARACTERISTIC_UUID =
"00002A37-0000-1000-8000-00805F9B34FB";

在設備連接后,通過onBLECharacteristicValueChange和notifyBLECharacteristicValueChange訂閱特征值變化。

export const blueToothGetHeartRate = (
deviceId: string,
onHeartRateChange: (newHeartRate: number) => void
) => {
Taro.onBLECharacteristicValueChange(function (characteristic) {
const heartRateValue = getHeartRateValue(characteristic.value);
onHeartRateChange(heartRateValue);
});
Taro.notifyBLECharacteristicValueChange({
state: true, // 啟用 notify 功能
deviceId,
serviceId: HEART_RATE_SERVICE_UUID,
characteristicId: HEART_RATE_CHARACTERISTIC_UUID,
});
};

此時我們已經能夠獲取到心率帶發送的心率數據如下。

圖片

但是此時如果按照上文解析設備名稱的方式,將其轉化為字符串,將得到一串亂碼。

圖片

所以需要根據協議文檔(https://www.bluetooth.com/specifications/specs/heart-rate-service-1-0/)來解讀這幾個數據。

標志字段:

  • 二進制:10110、十進制:22、十六進制:16
  • 其中位0為心率格式位,決定心率數據是uint8(位0 === 0)還是unit16(位0 === 1)

圖片

  • 位1、位2為傳感器接觸狀態位。11表示支持皮膚接觸檢測且接觸正常。
  • 位3為能量消耗狀態位,0表示能量消耗字段不存在.
  • 位4為RR-Interval狀態位,1表示存在一個或多個 RR-Interval 值。

心率數值:

  • 二進制:1100101、十進制:101、十六進制:65
  • 當心率小于255時,unit8足以。但如果需要支持更高的心率值(某些動物),則需要為unit16

圖片

  • 此時我們根據標志字段0,已經能夠獲取到需要的心率值:101。那么還剩下兩個字段代表什么意思呢?

RR-intreval 心率間隔:

  • 從前面的標志字段分析中,我們發現該設備不支持能量消耗狀態但支持RR-interval。且RR-interval可能是一位也可能是多位。那么我們該怎么讀取這個數字呢?
  • 首先我們顧名思義,心率間隔就是兩次心跳間的間隔時長,從上面的心率值推算:
  • 60*1000/101 ≈594ms
  • 接下來看這兩個數字。
  • 二進制:1010010、十進制:82、十六進制:52
  • 二進制:10、十進制:2、十六進制:02
  • 嘗試2*256+82 = 594,謎團解開了~

圖片

六、總結與疑惑

至此整個藍牙心率設備數據獲取的實現就完成了,可以在使用節拍器的同時監控自身的心率數據了。

圖片

整體來說整個開發過程還是比較簡單的,畢竟API文檔描述的非常清晰,主要時間耗費在解讀心率數據這個過程,后來知道應該從協議文檔出發解讀就好說了。

由于是在業余時間實現的上述能力,開發過程中存在不少疑惑沒來得及研究。這里先拋兩個問題出來,希望了解相關知識的同學能夠不吝賜教。

  • 在arraybuffer轉16進制過程中("00" + bit.toString(16)).slice(-2);?,為什么要先"00" +?,然后再.slice(-2)??直接bit.toString(16)是否可行?
  • 針對某米耳機,筆者暫時沒有在服務和特征中找到電量信息相關的數據,那么手機設備又是如何獲取到耳機電量的呢?

猜測電池服務和特性分別是0x180F Battery service 和 0x2A19 Battery Level ,但上圖耳機返回的service列表中沒找到該服務。

圖片

本文作者正在等待你的幫助。

參考資料

[1]藍牙低能耗——百度百科: https://baike.baidu.com/item/%E8%93%9D%E7%89%99%E4%BD%8E%E8%83%BD%E8%80%97

[2]一文讀懂藍牙技術從 1.0 到 5.0 的前世今生: https://zhuanlan.zhihu.com/p/37717509

[3]Assigned Numbers | Bluetooth? Technology Website: https://www.bluetooth.com/specifications/assigned-numbers/

[4]BLE相關協議(GAP&GATT): https://www.jianshu.com/p/62eb2f5407c9

[5]Taro.openBluetoothAdapter(option) | Taro 文檔: https://docs.taro.zone/docs/apis/device/bluetooth/openBluetoothAdapter

[6]Taro.getBluetoothDevices(option) | Taro 文檔: https://docs.taro.zone/docs/apis/device/bluetooth/getBluetoothDevices

[7]Taro.onBluetoothDeviceFound(callback) | Taro 文檔: https://docs.taro.zone/docs/apis/device/bluetooth/onBluetoothDeviceFound

[8]Taro.createBLEConnection(option) | Taro 文檔: https://docs.taro.zone/docs/apis/device/bluetooth-ble/createBLEConnection

[9]Taro.getBLEDeviceServices(option) | Taro 文檔: https://docs.taro.zone/docs/apis/device/bluetooth-ble/getBLEDeviceServices

[10]Taro.getBLEDeviceCharacteristics(option) | Taro 文檔: https://docs.taro.zone/docs/apis/device/bluetooth-ble/getBLEDeviceCharacteristics

[11]Taro.readBLECharacteristicValue(option) | Taro 文檔: https://docs.taro.zone/docs/apis/device/bluetooth-ble/readBLECharacteristicValue

[12]Taro.notifyBLECharacteristicValueChange(option) | Taro 文檔: https://docs.taro.zone/docs/apis/device/bluetooth-ble/notifyBLECharacteristicValueChange

[13]Taro.onBLECharacteristicValueChange(callback) | Taro 文檔: https://docs.taro.zone/docs/apis/device/bluetooth-ble/onBLECharacteristicValueChange

[14]Web Bluetooth API - Web APIs | MDN: https://developer.mozilla.org/en-US/docs/Web/API/Web_Bluetooth_API

[15]通過 JavaScript 與藍牙設備通信: https://web.dev/i18n/zh/bluetooth/

[16]談談JS二進制:File、Blob、FileReader、ArrayBuffer、Base64 - 掘金: https://juejin.cn/post/7148254347401363463#heading-9

責任編輯:武曉燕 來源: ELab團隊
相關推薦

2018-12-06 09:12:58

2020-06-12 09:20:33

前端Blob字符串

2020-07-28 08:26:34

WebSocket瀏覽器

2009-12-10 09:37:43

2022-10-13 11:48:37

Web共享機制操作系統

2021-02-01 23:23:39

FiddlerCharlesWeb

2011-09-15 17:10:41

2010-08-23 09:56:09

Java性能監控

2011-05-29 17:04:10

筆記本體驗

2022-11-04 08:19:18

gRPC框架項目

2020-09-15 08:35:57

TypeScript JavaScript類型

2021-10-17 13:10:56

函數TypeScript泛型

2012-11-23 10:57:44

Shell

2021-12-29 11:38:59

JS前端沙箱

2021-12-22 09:08:39

JSON.stringJavaScript字符串

2020-08-11 11:20:49

Linux命令使用技巧

2015-06-19 13:54:49

2015-10-23 08:51:18

應用暗知識發現

2025-03-17 00:45:00

JavaScriptAPI頁面

2019-11-20 10:25:06

sudoLinux
點贊
收藏

51CTO技術棧公眾號

久久久久久久国产精品毛片| 成人日韩在线视频| 人人妻人人澡人人爽精品日本| 亚洲视频免费| 亚洲欧美日韩一区在线| 亚洲精品一二三四五区| 国产欧美久久久久久久久| 国内精品国产三级国产a久久 | 国产农村妇女精品久久| 欧美寡妇性猛交xxx免费| 久久久久久综合| 亚洲一区二区三区久久| 精品欧美一区二区三区免费观看 | 国产精品亚洲а∨天堂免在线| 国内免费精品永久在线视频| 少妇av片在线观看| 国产精品调教| 欧美日韩高清在线播放| 缅甸午夜性猛交xxxx| 国产成人高清精品| 久久久久99精品一区| 91高跟黑色丝袜呻吟在线观看| 成年人视频在线免费看| 日本一区二区在线看| 亚洲黄一区二区| 欧美日韩精品区别| 台湾佬中文娱乐久久久| 亚洲一二三区不卡| 超碰成人在线免费观看| 黄色在线网站| 成人国产精品免费观看视频| 国产日韩专区在线| 无码一区二区三区| 日韩一区二区久久| 欧美精品福利视频| 青青青在线免费观看| 日韩一区二区三区免费播放| 日韩精品在线免费观看| 稀缺呦国内精品呦| 精品视频一二| 欧美另类z0zxhd电影| 美女喷白浆视频| 亚洲电影观看| 精品久久久中文| 男人天堂手机在线视频| av片哪里在线观看| 中文字幕一区二区视频| 日韩精品一区二区三区色偷偷| 天天干,天天操,天天射| 成人精品视频网站| 国产精品99久久久久久久| 91精品中文字幕| 麻豆精品一区二区av白丝在线| 日韩免费不卡av| 成人免费毛片视频| 久久婷婷av| 国产精品久久不能| 中文字幕精品在线观看| 奇米影视一区二区三区| 国产精品久久久久久久久久免费 | 欧美一a一片一级一片| 草草草在线视频| 亚洲小少妇裸体bbw| 欧美性高潮床叫视频| 日韩欧美国产免费| av资源亚洲| 欧洲人成人精品| 一区二区三区韩国| www.成人在线.com| 日韩一区二区在线免费观看| 熟妇女人妻丰满少妇中文字幕| 国产精品亚洲综合在线观看| 日韩欧美黄色影院| 波多野结衣办公室双飞| 日韩欧美中文字幕电影| 亚洲欧洲国产精品| 亚洲一级理论片| 亚洲精品成人无限看| 欧美福利视频在线| 黄色免费av网站| 热久久一区二区| 国产综合在线观看视频| 成人高潮片免费视频| 亚洲精品一二三**| 日韩欧美一级二级三级久久久| 日本久久久久久久久久| 一区二区美女| 久久精品成人欧美大片古装| 欧美日韩一级在线观看| 国产精品毛片一区二区三区| 国产精品第七十二页| 国产精品久久久久久久免费| 成人午夜av在线| 欧美日韩成人一区二区三区| 日本在线观看www| 亚洲一区二区三区美女| 激情网站五月天| 亚洲国产一区二区久久| 亚洲精品一区二区三区福利| 少妇久久久久久久久久| 欧美在线高清| 日韩av手机在线| www.久久久久久| 91蜜桃免费观看视频| 99热这里只有精品7| 色在线中文字幕| 欧美精品在线一区二区三区| 国产草草浮力影院| 91精品一区国产高清在线gif | 最新av电影网站| 亚洲国产高清视频| 国产精品一二三视频| 少妇精品高潮欲妇又嫩中文字幕 | 亚洲成人aaa| a资源在线观看| 亚洲精品少妇| 亚洲自拍偷拍福利| 国产二区视频在线观看| 亚洲国产综合91精品麻豆| 色婷婷.com| 国产中文字幕一区二区三区 | 水蜜桃亚洲精品| 国内激情视频在线观看| 日韩欧美视频一区| av片在线免费看| 亚洲综合欧美| 国产精品成人一区二区三区| 日本高清视频在线播放| 色综合久久88色综合天天6| 亚洲午夜精品在线观看| 久久免费精品视频在这里| 欧美一区三区三区高中清蜜桃| www视频在线| 国产精品福利一区二区| 91激情视频在线| 九九在线高清精品视频| 97av在线视频| 天天干天天做天天操| 亚洲精选视频免费看| 免费精品99久久国产综合精品应用| 美女毛片一区二区三区四区| 91精品国产乱码久久久久久蜜臀| 亚洲精品一区二区三区新线路| 中文字幕欧美一| 亚洲不卡视频在线| 欧美精品一区二区久久| 国产成人福利视频| 精品av中文字幕在线毛片| 色综合天天综合网国产成人综合天 | 谁有免费的黄色网址| 亚洲影音一区| 久久99精品久久久久久水蜜桃| 91福利在线免费| 精品少妇一区二区三区视频免付费| 91香蕉视频在线播放| 久久福利视频一区二区| 亚洲 欧洲 日韩| 95精品视频| 久久亚洲精品视频| 精品人妻少妇嫩草av无码专区| 亚洲激情av在线| 丰满人妻一区二区三区大胸| 欧美日韩精品| 黄色99视频| 性欧美freesex顶级少妇| 亚洲天堂第二页| 日本三级一区二区三区| 国产精品网站在线播放| 国产又黄又猛的视频| 欧美~级网站不卡| 国产高清自拍一区| 亚洲天堂资源| 中日韩午夜理伦电影免费| 一级黄色片在线观看| 亚洲免费av高清| 国产十八熟妇av成人一区| 99热精品在线| 色一情一区二区三区四区| 日韩福利在线观看| 欧美高清视频在线观看| 性猛交xxxx| 欧美性色欧美a在线播放| 精品国产视频在线观看| 成人午夜av在线| 国产精品无码av无码| 日韩欧美国产精品综合嫩v| 亚洲伊人久久综合| 中文字幕在线免费观看视频| 中文字幕亚洲一区在线观看| www.五月婷| 色94色欧美sute亚洲线路一久| 色哟哟一一国产精品| av欧美精品.com| 久久这里只精品| 91久久亚洲| 一区二区不卡视频| 欧美有码在线| 亚洲精品欧美日韩专区| 亚洲天堂免费电影| 欧美成人精品h版在线观看| 亚洲色图另类小说| 91精品国产欧美日韩| 天堂а√在线中文在线新版 | 九九热最新地址| 久久综合久久99| 青娱乐国产精品视频| 日韩在线a电影| 国产中文字幕二区| 欧美一区国产在线| 欧美xxxx黑人又粗又长密月| 香蕉成人app| 国产精品网站入口| 不卡一二三区| 久久久噜噜噜久久| 成人免费网址| 在线a欧美视频| 午夜小视频在线播放| 日韩区在线观看| 在线免费观看高清视频| 欧美性猛交xxxx乱大交极品| 欧美黄色免费看| 国产精品久久免费看| 国产精品揄拍100视频| 国产成人精品一区二区三区四区 | 亚洲第一综合| 欧美日韩播放| 国内外成人免费视频| 天堂精品在线视频| 91久久精品国产91久久性色| 亚洲精品粉嫩美女一区| 97超级碰碰碰久久久| 黑人精品视频| 九九热这里只有在线精品视| 麻豆最新免费在线视频| 一色桃子一区二区| 国产在线高清| 亚洲欧洲在线看| 免费在线黄色电影| 亚洲欧美国产日韩中文字幕| 五月天丁香视频| 亚洲变态欧美另类捆绑| 国产刺激高潮av| 精品久久久久久久久久久院品网| 国产精品久久久久久免费免熟| 欧美视频一区二区三区| 潘金莲一级淫片aaaaaa播放| 欧美视频在线观看免费| 一级片中文字幕| 欧美日韩亚洲视频| 一级黄色免费网站| 欧美性猛交xxxx乱大交蜜桃| 潘金莲一级淫片aaaaaa播放| 在线国产电影不卡| 中文字幕日韩第一页| 欧美精品日韩精品| 99热这里只有精品在线| 日韩一区二区三区视频| 成人免费公开视频| 亚洲国产日韩欧美在线动漫| 视频二区在线观看| 亚洲美女www午夜| 免费一级在线观看播放网址| 中文字幕精品久久| 国内精品久久久久国产| 欧美国产日本在线| 1024在线看片你懂得| 全亚洲最色的网站在线观看| 五月婷婷在线观看视频| 亚洲国产精品视频在线观看| 亚洲人视频在线观看| 国产亚洲视频中文字幕视频| jizz在线观看中文| 欧美日韩第一视频| 国产色播av在线| 国产成人综合精品| 欧洲午夜精品| 国产精品一区二区av| 久久不见久久见国语| 一区二区三区不卡在线| 国内久久视频| 国产又大又硬又粗| 久久99国产乱子伦精品免费| 四虎国产精品免费| 久久久久久电影| 26uuu成人网| 欧美性xxxxxxxxx| 一起草av在线| 亚洲成人黄色网| 色多多视频在线观看| 欧美精品久久久久久久免费观看| 亚洲精品mv| 91久久精品www人人做人人爽| 秋霞影视一区二区三区| 尤物一区二区三区| 亚洲国产黄色| 日韩一区二区三区久久| 波多野结衣在线一区| 国产黄色录像视频| 红桃av永久久久| 国产精品一级二级| 亚洲精品一区av在线播放| 黄色成人影院| 热久久这里只有| 综合激情网...| 亚洲欧美久久久久一区二区三区| 黄色在线一区| caoporm在线视频| 26uuu国产在线精品一区二区| 青青青在线免费观看| 欧美在线观看禁18| 亚洲 欧美 自拍偷拍| 欧美精品免费在线| 久久精品超碰| 日本一区二区三区www| 亚洲国产高清一区二区三区| 特黄视频免费观看| 欧美激情一区二区三区| 五月婷婷亚洲综合| 精品久久久久久久久久久久久久久 | 丰满亚洲少妇av| 开心激情五月网| 在线影院国内精品| 青青久在线视频免费观看| 久久久久久国产精品| 国产日韩在线观看视频| 亚洲欧洲一区二区在线观看| 久久久久久久尹人综合网亚洲| 高清中文字幕mv的电影| 亚洲精选视频在线| 一区二区三区www污污污网站| 亚洲欧美国产制服动漫| 性国裸体高清亚洲| 久久综合九色欧美狠狠| 国产一区成人| 屁屁影院国产第一页| 亚洲成人www| 凸凹人妻人人澡人人添| 欧美日韩福利在线观看| 日韩高清二区| 99久久99久久精品| 风间由美一区二区三区在线观看| 日韩a级片在线观看| 91精品国产欧美一区二区| www视频在线看| 亚洲在线观看视频网站| 婷婷六月综合| 午夜诱惑痒痒网| 亚洲欧美色图小说| 99精品国产99久久久久久97| 另类专区欧美制服同性| 韩国一区二区三区视频| 亚洲区成人777777精品| 国产剧情一区二区| 久久精品视频9| 日韩精品视频免费专区在线播放 | 久久国产精品高清一区二区三区| 91成人福利在线| 神马电影久久| 日韩高清第一页| 亚洲美女视频一区| 国产一区二区三区中文字幕| 欧美成人免费在线视频| a级日韩大片| 国产极品尤物在线| 久久久美女毛片| 夜夜嗨aⅴ一区二区三区| 久久精品久久久久电影| 一区二区亚洲视频| 日韩激情免费视频| 欧美韩日一区二区三区四区| 国产精品无码久久av| 国语自产在线不卡| 精品产国自在拍| 久国产精品视频| 亚洲国产欧美在线| 成人jjav| 91国产在线免费观看| 欧美一级二区| 欧美特黄一级片| 亚洲国产成人久久综合| 亚洲mmav| 国产精品第157页| 国产日韩欧美综合一区| 国产深喉视频一区二区| 国产91精品久| 久久久久久久久久久久久久| 人妻换人妻a片爽麻豆| 在线观看不卡一区| 青青青国内视频在线观看软件| 噜噜噜噜噜久久久久久91| 久久精品国产免费| 自拍偷拍欧美亚洲| 日韩在线观看免费高清| 青草久久视频| 天天操夜夜操很很操| 91精品1区2区| 国产第一页在线视频| 四虎永久在线精品免费一区二区| 国产mv日韩mv欧美| 亚洲熟妇av乱码在线观看|