微信邦

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

掃一掃,訪問微社區

返回列表 發新帖
查看: 4302|回復: 0
打印 上一主題 下一主題

小程序•小故事(11)——低功耗藍牙能力

[復制鏈接]
跳轉到指定樓層
樓主
發表于 2018-5-26 09:02:43 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
生活圈制作
在無線通信領域,藍牙是最基礎又常用的能力。藍牙組網十分簡單,兩設備間做個配對就可以建立起連接,其通信距離理論值為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 字節,如果超過則會出錯,這里應該根據藍牙設備協議進行分片傳輸。

更多有關小程序連接藍牙功能的信息,可查閱[接口文檔]



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友 微信微信
收藏收藏
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

微信邦網聯系QQ|Archiver|手機版|小黑屋|魯公網安備 37082802000167號|微信邦 ( 魯ICP備13013993號-5

GMT+8, 2019-6-28 17:25 , Processed in 0.149097 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2013 Wxuse Inc. | Style by ytl QQ:1400069288

快速回復 返回頂部 返回列表
赛马会图标