天天看點

iOS - GATT Profile 簡介1、引言2、GAP3、GATT

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

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

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

外圍裝置:這一般就是非常小或者簡單的低功耗裝置,用來提供資料,并連接配接到一個更加相對強大的中心裝置。例如小米手環。

中心裝置:中心裝置相對比較強大,用來連接配接其他外圍裝置。例如手機等。

在 GAP 中外圍裝置通過兩種方式向外廣播資料:Advertising Data Payload(廣播資料)和 Scan Response Data Payload(掃描回複),每種資料最長可以包含 31 byte。這裡廣播資料是必需的,因為外設必需不停的向外廣播,讓中心裝置知道它的存在。掃描回複是可選的,中心裝置可以向外設請求掃描回複,這裡包含一些裝置額外的資訊,例如裝置的名字。

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

iOS - GATT Profile 簡介1、引言2、GAP3、GATT

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

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

iOS - GATT Profile 簡介1、引言2、GAP3、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 連接配接。

下圖展示了 GATT 連接配接網絡拓撲結構。這裡很清楚的顯示,一個外設隻能連接配接一個中心裝置,而一個中心裝置可以連接配接多個外設。

iOS - GATT Profile 簡介1、引言2、GAP3、GATT

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

GATT 通信的雙方是 C/S 關系。外設作為 GATT 服務端(Server),它維持了 ATT 的查找表以及 service 和 characteristic 的定義。中心裝置是 GATT 用戶端(Client),它向 Server 發起請求。需要注意的是,所有的通信事件,都是由用戶端(也叫主裝置,Master)發起,并且接收服務端(也叫從裝置,Slave)的響應。

一旦連接配接建立,外設将會給中心裝置建議一個連接配接間隔(Connection Interval),這樣,中心裝置就會在每個連接配接間隔嘗試去重新連接配接,檢查是否有新的資料。但是,這個連接配接間隔隻是一個建議,你的中心裝置可能并不會嚴格按照這個間隔來執行,例如你的中心裝置正在忙于連接配接其他的外設,或者中心裝置資源太忙。

下圖展示一個外設(GATT 服務端)和中心裝置(GATT 用戶端)之間的資料交換流程,可以看到的是,每次都是主裝置發起請求:

iOS - GATT Profile 簡介1、引言2、GAP3、GATT

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

iOS - GATT Profile 簡介1、引言2、GAP3、GATT

2、Service 是把資料分成一個個的獨立邏輯項,它包含一個或者多個 Characteristic。每個 Service 有一個 UUID 唯一辨別。 UUID 有 16 bit 的,或者 128 bit 的。16 bit 的 UUID 是官方通過認證的,需要花錢購買,128 bit 是自定義的,這個就可以自己随便設定。

3、Characteristic 是在 GATT 事務中的最低界别的,Characteristic 是最小的邏輯資料單元,當然它可能包含一組關聯的資料,例如加速度計的 X/Y/Z 三軸值。

實際上,和 BLE 外設打交道,主要是通過 Characteristic。你可以從 Characteristic 讀取資料,也可以往 Characteristic 寫資料。這樣就實作了雙向的通信。是以你可以自己實作一個類似序列槽(UART)的 Sevice,這個 Service 中包含兩個 Characteristic,一個被配置隻讀的通道(RX),另一個配置為隻寫的通道(TX)。

Bluetooth SIG 官方文檔

<a href="https://www.bluetooth.org/en-us/specification/adopted-specifications">藍牙核心協定文檔</a>

<a href="https://developer.bluetooth.org/Pages/default.aspx">Bluetooth Developer Portal</a>

移動開發資源

繼續閱讀