Android BLE 藍牙開發指南(一)入門基礎

隨着智能設備的普及,基於IoT的“萬物互聯”時代越來越近。低功耗藍牙(Bluetooth Low Energy,簡稱BLE) 作爲近距離無線傳輸的重要手段之一,相對於傳統藍牙顯著地降低了功耗,所以未來可能會在IoT領域大展身手。剛好最近開發了 BLE 相關的功能,遇到了一些困難,所以整了個基於 Android平臺 的 低功耗藍牙開發指南,希望幫助大家更好的入坑。

關鍵術語和概念

1. Generic Attribute Profile(GATT):

GATT profile是一種關於發送和接收簡短數據片段的一般規範,這種簡短數據片段例如在BLE的連接上衆所周知的“attribute(屬性)”等。當前所有低功耗應用程序的profile都基於GATT。另外,藍牙技術聯盟(Bluetooth SIG)已經爲很多BLE設備定義了profile。profile就是一種在指定的應用程序中定義設備如何工作的規範。注意,一臺設備可以實現多個profile。例如,一臺設備可以包含心率監視器和電池電量探測器。

2. Attribute Protocol(ATT,屬性協議):

GATT構建在ATT的基礎之上,因此也總被成爲GATT/ATT。ATT針對BLE設備的運行進行了優化。爲此,它會盡可能的使用更少的字節數據。每一個屬性都通過UUID來唯一確定。UUID就是一個標準128位格式的字符串ID,用於唯一確定一個信息。屬性通過ATT協議格式化爲characteristics和services後進行傳輸。

3. Service:

一個service包含一個或多個characteristic。例如,你可以持有一個名爲“心率監視器”的service,它包含一個characteristic例如“心率測量”。你可以在bluetooth.org上找到一系列基於GATT的profile和service

4. Characteristic:

一個characteristic中包含一段數據,以及0個或多個用於描述characteristic值的descriptor。可以將characteristic認爲是一種類型,類似於一個類。

5. Descriptor:

Descriptor(描述符)中定義的屬性用於描述一個characteristic值。例如,一個descriptor可以爲一個characteristic的值指定一個在可接受範圍內的可讀性描述,或者爲一個characteristic的值指定一個計量單位。

Tips: 對於 BLE 應用開發而言,比較重要的是後面三個概念。在應用開發時,中心設備與外圍設備建立連接後,找到外圍設備BLE程序中運行的對應 service ,然後取出 service 中包含的 characteristic ,通過characteristic攜帶數據進行傳遞而實現設備間數據的通信。

那麼,what is 中心設備 or 外圍設備?來往下看

角色和職能

對於 BLE 而言,要完成連接和數據通信必須擁有兩種角色: 中心(central)設備外圍(peripheral)設備

  • 中心設備:負責掃描和連接附近的BLE設備,屬於主動掃描和主動連接的角色。一般手機就是作爲 BLE 中的中心設備,去連接各種藍牙設備的。
  • 外圍設備:負責向外發送廣播包,屬於被掃描和被連接的角色。如小米智能手環等藍牙設備。

對於Android上層應用開發而言,通常只會涉及到中心設備端程序的開發,一般外圍設備端程序的開發需求並不多見。但是基於學習的目的,接下來會分別對中心設備端和外圍設備端的程序開發進行講解。

另外,BLE功能對Android系統版本是有要求的:
Android 4.3(API Level 18) 開始提供了中心設備需要的掃描和連接等API;
Android 5.0 (API Level 21) 開始才提供了外圍設備需要的向外發送廣播包的API。
所以,低於這兩個版本的系統,目前是無法實現對應功能的。

設備間的數據通信

數據通信原理

這裏簡單描述下BLE底層的數據傳輸原理。假設設備A(中心設備)和設備B(外圍設備)已經成功建立連接,設備A將週期性以CI(connection interval)爲間隔向設備B發送數據包,而設備B也週期性地以CI爲間隔打開射頻接收窗口以接收設備A的數據包。同時按照藍牙spec要求,設備B收到設備A數據包150us後,設備B切換到發送狀態,把自己的數據發給設備A;設備A則切換到接收狀態,接收設備B發過來的數據。由此可見,連接狀態下,設備A和設備B的射頻發送和接收窗口都是週期性地有計劃地開和關,而且開的時間非常短,從而顯著地降低了系統功耗。
BLE數據傳輸示意圖

數據傳輸限制

基於BLE協議棧的實現,所以數據通信時,每次只能發送最大爲 20 byte 的數據。如果有傳輸大於20byte數據的需求,就需要通過數據分包來解決了。

End-----

接下來計劃分幾篇文章,通過兩個Android終端之間實現數據通信的實例,來講解中心設備端和外圍設備端的程序開發以及數據分包發送的實現,並附上源碼。
有問題歡迎一起探討哦!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章