天天看點

微信小程式低功耗藍牙能力

在無線通信領域,藍牙是最基礎又常用的能力。藍牙組網十分簡單,兩裝置間做個配對就可以建立起連接配接,其通信距離理論值為10米至100米以内,是近距離通信應用場景的首選。今天我們想跟大家分享小程式連接配接藍牙的能力。

目前藍牙最為普遍的兩種規格為藍牙基礎率/增強資料率 (BR/EDR) 和低功耗 (LE) 藍牙。

藍牙基礎率/增強資料率 (BR/EDR) 是經典的藍牙協定,常用在對資料傳輸帶寬有一定要求的場景上,比如需要傳輸音頻資料的藍牙音箱等;

低功耗 (LE) 藍牙是從藍牙4.0起支援的協定,特點就是耗電極低、傳輸速度更快,常用在對續航要求較高且隻需小資料量傳輸的各種智能電子産品中,包括心率監測儀器、體溫計、血糖儀、智能穿戴裝置、胎壓監測和電子煙等等,應用場景廣泛,是以小程式在很早的版本(基礎庫 1.1.0)就優先支援了低功耗藍牙能力。

我們在開發基于低功耗藍牙接口的小程式時,需要先了解一下藍牙在連接配接和通信過程中的一些概念。

工作模式

低功耗藍牙協定給裝置定義了若幹角色,其中最主要的角色是:外圍裝置(Peripheral)與中心裝置(Central)。

1

外圍裝置是用來提供資料,通過不停地向外廣播資料,讓中心裝置發現自己。

2

中心裝置會掃描外圍裝置,發現有外圍裝置存在後,可以與之建立連接配接,之後就可以使用外圍裝置提供的服務(Service)。一般而言,手機會擔任中心裝置的角色,利用外圍裝置提供的資料進行處理或展示等等。是以,小程式提供低功耗藍牙接口是預設設定手機為中心裝置的。

通信協定

在兩個藍牙裝置建立連接配接之後,雙方的資料互動是基于一個叫做 GATT (Generic Attribute Profile) 的規範,根據該規範可以定義出一個個配置檔案(Profile),描述該藍牙裝置提供的服務(Service)。

在整個通信過程中,有三個最主要的概念:配置檔案(Profile)、服務(Service)、特性(Characteristic)。

1

Profile 并不真實存在于藍牙裝置中,它隻是被藍牙标準預先定義的一些 Service 的集合,如果藍牙裝置之間要互相相容,它們隻要支援相同的 Profile 即可。一個藍牙裝置可以支援多個 Profile。

2

Service 可以了解為藍牙裝置提供的服務,一個裝置可以提供多個服務,比如電量資訊服務、系統資訊服務等。每個 Service 又包含多個 Characteristic 特性值,比如電量資訊服務就會有個 Characteristic 表示電量資料,同時還會有一個 16bit 或 128bit 的 UUID 唯一辨別該服務,像微信硬體平台的藍牙智能燈的主服務 UUID 為 0xFEE7。16 bit 的 UUID 實際上是 128 bit 的縮短版,接收方收到後會補上藍牙的 UUID 基數,目的是為了提高傳輸效率。

3

Characteristic 是在 GATT 規範中最小的邏輯資料單元,由一個 value 和多個描述特性的 Desciptor 組成。實際上,在與藍牙裝置打交道,主要就是通過讀寫 Characteristic 的 value 完成。同樣的,Characteristic 也是通過一個 16bit 或 128bit 的 UUID 唯一辨別。

總結一下,如下圖所示,我們可以簡單地了解為:每個藍牙裝置可能提供多個 Service,每個 Service 可能有多個 Characteristic,我們根據藍牙裝置的協定用對應的 Characteristic 進行讀寫即可達到與其通信的目的。

微信小程式低功耗藍牙能力

在了解了上面的模式和概念後,接下來我們看看如何可以使用小程式提供的藍牙接口。

Step 1 :掃描并發現藍牙外圍裝置

掃描并發現藍牙外設。如果藍牙功能未開啟,可監聽藍牙狀态變化以便自動進入下一步,提升使用者體驗。

微信小程式低功耗藍牙能力

Step 2 :連接配接藍牙外圍裝置

若之前連接配接過某個裝置,可跳過掃描步驟,直接傳入 deviceId 連接配接。

微信小程式低功耗藍牙能力

Step 3 :查找藍牙外圍裝置的服務

微信小程式低功耗藍牙能力

Step 4 : 讀寫指定服務的特性值

微信小程式低功耗藍牙能力

基本上,小程式暴露出來的藍牙接口都是系統級 API ,但在使用流程上對安卓和 iOS 兩個平台做了統一,是以在使用這一套接口時也會出現一些因系統限制而導緻的問題,在這裡我們整理了一些常見的問題供開發者參考:

1

在安卓上,部分機型無定位權限或者是定位開關未打開時會搜不到裝置。原因是藍牙功能是可以擷取到定位的,系統基于安全考量,使用藍牙接口時必須要有定位權限,否則搜尋不到;

2

在安卓上,部分機型擷取裝置服務時會多出 00001800 和 00001801 UUID 的服務,這是系統行為,注意不要使用這兩個服務;

3

建立連接配接和關閉連接配接必須要成對調用。如果未能及時關閉連接配接釋放資源,容易導緻 state 133 GATT ERROR的異常;

4

與藍牙裝置通信的 MTU(最大傳輸單元)系統限定為 20 位元組,如果超過則會出錯,這裡應該根據藍牙裝置協定進行分片傳輸。

更多有關小程式連接配接藍牙功能的資訊,可查閱[接口文檔]。