藍牙BLE: GATT Profile 簡介(GATT 與 GAP)


一. 引言

現在低功耗藍牙(BLE)連接都是建立在 GATT (Generic Attribute Profile) 協議之上。GATT 是一個在藍牙連接之上的發送和接收很短的數據段的通用規范,這些很短的數據段被稱為屬性(Attribute)。

二. GAP

詳細介紹 GATT 之前,需要了解 GAP(Generic Access Profile),它在用來控制設備連接和廣播。GAP 使你的設備被其他設備可見,並決定了你的設備是否可以或者怎樣與合同設備進行交互。例如 Beacon 設備就只是向外廣播,不支持連接,小米手環就等設備就可以與中心設備連接。

2.1 設備角色

GAP 給設備定義了若干角色,其中主要的兩個是:外圍設備(Peripheral)和中心設備(Central)。

外圍設備:這一般就是非常小或者簡單的低功耗設備,用來提供數據,並連接到一個更加相對強大的中心設備。例如小米手環。
中心設備:中心設備相對比較強大,用來連接其他外圍設備。例如手機等。

2.2 廣播數據

在 GAP 中外圍設備通過兩種方式向外廣播數據: Advertising Data Payload(廣播數據)和 Scan Response Data Payload(掃描回復),每種數據最長可以包含 31 byte。這里廣播數據是必需的,因為外設必需不停的向外廣播,讓中心設備知道它的存在。掃描回復是可選的,中心設備可以向外設請求掃描回復,這里包含一些設備額外的信息,例如設備的名字。(廣播的數據格式我將另外專門寫一個篇博客來講。)

2.3 廣播流程

GAP 的廣播工作流程如下圖所示。

 

 

從圖中我們可以清晰看出廣播數據和掃描回復數據是怎么工作的。外圍設備會設定一個廣播間隔,每個廣播間隔中,它會重新發送自己的廣播數據。廣播間隔越長,越省電,同時也不太容易掃描到。

2.4 廣播的網絡拓撲結構

大部分情況下,外設通過廣播自己來讓中心設備發現自己,並建立GATT連接,從而進行更多的數據交換。也有些情況是不需要連接的,只要外設廣播自己的數據即可。用這種方式主要目的是讓外圍設備,把自己的信息發送給多個中心設備。因為基於GATT連接的方式的,只能是一個外設連接一個中心設備。使用廣播這種方式最典型的應用就是蘋果的iBeacon。廣播工作模式下的網絡拓撲圖如下:

 

 

三. GATT

GATT 的全名是 Generic Attribute Profile(姑且翻譯成:普通屬性協議),它定義兩個 BLE 設備通過叫做 Service 和 Characteristic 的東西進行通信。GATT 就是使用了 ATT(Attribute Protocol)協議,ATT 協議把 Service, Characteristic遺跡對應的數據保存在一個查找表中,次查找表使用 16 bit ID 作為每一項的索引。

一旦兩個設備建立起了連接,GATT 就開始起作用了,這也意味着,你必需完成前面的 GAP 協議。這里需要說明的是,GATT 連接,必需先經過 GAP 協議。實際上,我們在 Android 開發中,可以直接使用設備的 MAC 地址,發起連接,可以不經過掃描的步驟。這並不意味不需要經過 GAP,實際上在芯片級別已經給你做好了,藍牙芯片發起連接,總是先掃描設備,掃描到了才會發起連接。

GATT 連接需要特別注意的是:GATT 連接是獨占的。也就是一個 BLE 外設同時只能被一個中心設備連接。一旦外設被連接,它就會馬上停止廣播,這樣它就對其他設備不可見了。當設備斷開,它又開始廣播。

中心設備和外設需要雙向通信的話,唯一的方式就是建立 GATT 連接。

3.1 GATT連接的網絡拓撲

下圖展示了 GTT 連接網絡拓撲結構。這里很清楚的顯示,一個外設只能連接一個中心設備,而一個中心設備可以連接多個外設。

 

 

 一旦建立了連接,通信就是雙向的了,對比前面的GAP廣播的網絡塔撲,GAP通信是單向的。如果你要讓兩個外圍設備能通信,就只能通過中心設備中轉

3.2 GATT 通信事務

GATT通信的雙方是C/S關系。外設作為GATT服務端(Server),它維持了ATT的查找表以及service和characteristic的定義。中心設備是GATT客戶端(Client),他向Server發起請求。需要注意的是,所有的通信事件,都是由客戶端(也叫主設備,Master)發起,並且接收服務端(也叫從設備,Slava)的響應。
一旦連接建立,外設將會給中心設備建議一個連接間隔(Connection Interval),這樣,中心設備就會在每個連接間隔嘗試去重新連接,檢查是否有新的數據。但是,這個連接間隔只是一個建議,你的中心設備可能並不會嚴格按照這個間隔來執行,例如你的中心設備正在忙於連接其他的外設,或者中心設備資源太忙。

下圖展示一個外設(GATT服務端)和中心設備(GATT客戶端)之間的數據交流流程,可以看到的是,每次都是主設備發起請求:

 

 

3.3 GATT 結構

GATT事務是建立在嵌套的Profiles,Services和Characteristics之上的,如下如所示:

 

  • Profile Profile並不是實際存在於BLE外設上的,它只是一個被Bluetooth SIG或者外設設計者預先定義的Service的集合。例如心率Profile(Heart Rate Profile)就是結合了Heart Rate Service和Device Information Sercvice。所有官方通過GATT Profile的列表可以從這里找到。

  • Service Service是把數據分成一個個的獨立邏輯項,它包含一個或者多個Characteristic。每個Service有一個UUID唯一標識。UUID有16bit的,或者128bit的。16bit的UUID是官方通過認證的,需要花錢購買,128bit是自定義的,這個就可以自己隨便設置。
    官方通過了一些標准Service,完整列表在這里。以Heart Rate Service為例,可以看到它的官方通過16bitUUID是0x180D,包含3個Characteristic:Heart Rate Measurement,Body Sensor Location和Heart Control Point,並且定義了只有一個第一個必須的,它是可選實現的。

  • Characteristic 在GATT事務中的最低界別的是Characteristic,Characteristic是最小的邏輯數據單元,當然它可能包含一個組關聯的數據,例如加速度計的X/Y/Z三軸值。與Service類似,每個Characteristic用16bit或者128bit的UUID唯一標識。你可以免費使用Bluetooth SIG官方定義的標准Characteristic,使用官方定義的,可以確保BLE的軟件和硬件能相互理解。當然,你可以自定義Characteristic,這樣的話,就只有你自己的軟件和外設能夠相互理解。
    舉個例子,Heart Rate Measurement Characteristic,這是上面提到的Heart Rate Service必需實現的Characteristic,它的UUID是0x2A37。它的數據結構是,開始8bit定義心率數據格式(是UINT8還是UINT16?),接下來就是對應格式的實際心率數據。
    實際上,和BLE外設打交道,主要是通過Characteristic。你可以從Characteristic讀取數據,也可以往Characteristic寫數據。這樣就實現了雙向的通信。所以你可以自己實現一個類似串口(UART)的service,這個Service中包含兩個Characteristic,一個被配置只讀的通道(RX),另一個配置為只寫的通道(TX)。

更多內容

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM