1. 程式人生 > >[藍芽]低功耗藍芽之 GAP、GATT

[藍芽]低功耗藍芽之 GAP、GATT

低功耗藍芽之 GAP、GATT

低功耗藍芽之 GAP、GATT

基礎介紹

  1. profile

    profile 可以理解為一種規範,一個標準的通訊協議,它存在於藍芽從機中(服務端);藍芽組織規定了一些標準的 profile,例如 HID OVER GATT,防丟器,心率計等;每個 profile 中會包含多個 service,每個 service 代表從機的一種能力。

  2. service

    service 可以理解為一個服務,在 BLE 從機中有多個服務,例如:電量資訊服務、系統資訊服務等;每個 service 中又包含多個 characteristic 特徵值;每個具體的 characteristic 特徵值才是 BLE 通訊的主題,比如當前的電量是 80%,電量的 characteristic 特徵值存在從機的 profile 裡,這樣主機就可以通過這個 characteristic 來讀取 80% 這個資料。

  3. characteristic

    characteristic 特徵值,BLE 主從機的通訊均是通過 characteristic 來實現,可以理解為一個標籤,通過這個標籤可以獲取或者寫入想要的內容。

  4. UUID

    UUID,統一識別碼,我們剛才提到的 service 和 characteristic 都需要一個唯一的 uuid 來標識;每個從機都會有一個 profile,不管是自定義的 simpleprofile,還是標準的防丟器 profile,他們都是由一些 service 組成,每個 service 又包含了多個 characteristic,主機和從機之間的通訊,均是通過 characteristic 來實現。

BLE

藍芽低能耗(Bluetooth Low Energy,BLE)技術“完成”一次連線(即掃描其它裝置、建立鏈路、傳送資料、認證和適當地結束)只需 3ms。而標準藍芽技術完成相同的連線週期需要數百毫秒。應用 BLE 藍芽 4.0 首先必須瞭解的兩個協議:GAP(通用訪問協議)、GATT(通用屬性協議)。兩個協議都隸屬於 Host 層,直接關係到應用層開發,與 BLE 開發人員的關係比較密切,其分別負責連線前資料廣播和連線後的資料傳輸。

GAP

GAP 協議

GAP(Generic Access Profile)主要用來控制裝置連線和廣播,GAP 使你的裝置被其他裝置可見,並決定了你的裝置是否可以或者怎樣與互動裝置進行通訊。 GAP 層有 4 種不同型別的廣播:通用的、定向的、不可連線的以及可發現的。裝置每次廣播時,會在 3 個廣播通道上傳送相同的報文。這些報文被稱為一個廣播事件。除了定向報文以外,其他廣播事件均可以選擇 20ms - 10.28s 不等的間隔。通常,一個廣播中的裝置會每一秒廣播一次,廣播事件之間的時間稱為廣播間隔,主機可以控制該間隔。例如 Beacon 裝置就只是向外廣播,不支援連線,小米手環就等裝置就可以與中心裝置連線。

GAP 裝置角色

GAP 給裝置定義了若干角色,其中主要的兩個是:外圍裝置(Peripheral - 從機 - 服務端)和中心裝置(Central - 主機 - 客戶端)。

  • 外圍裝置 - 從機:

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

  • 中心裝置 - 主機:

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

GAP 廣播資料

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

GAP 廣播流程

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

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

GAP 廣播的網路拓撲結構

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

在這裡插入圖片描述

GATT

GATT 的全名是 Generic Attribute Profile,他定義兩個 BLE 裝置通過叫做 Service 和 Characteristic 的東西進行通訊。GATT 就是使用了 ATT(Attribute Protocol)協議,ATT 協議把 Service,Characteristic 遺蹟對應的資料儲存在一個查詢表中,次查詢表使用 16bit ID 作為每一項的索引。

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

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

中心裝置和外設需要雙向通訊的話,唯一的方式就是建立 GATT 連線。

GATT 連線的網路拓撲

下圖展示了 GTT 連線網路拓撲結構。這裡很清楚的顯示,一個外設只能連線一箇中心裝置,而一箇中心裝置可以連線多個外設。

在這裡插入圖片描述
一旦建立起了連線,通訊就是雙向的了,對比前面的 GAP 廣播的網路拓撲,GAP 通訊是單向的。如果你要讓兩個裝置外設能通訊,就只能通過中心裝置中轉。

GATT 通訊事務

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

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

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

在這裡插入圖片描述

GATT 結構

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

在這裡插入圖片描述

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

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

    官方通過了一些標準 Service,完整列表可以在網站上找到。以 Heart Rate Service 為例,可以看到它的官方通過 16 bit UUID 是 0x180D,包含 3 個 Characteristic:Heart Rate Measurement, Body Sensor Location 和 Heart Rate Control Point,並且定義了只有第一個是必須的,它是可選實現的。

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

    與 Service 類似,每個 Characteristic 用 16 bit 或者 128 bit 的 UUID 唯一標識。你可以免費使用 Bluetooth SIG 官方定義的標準 Characteristic,使用官方定義的,可以確保 BLE 的軟體和硬體能相互理解。當然,你可以自定義 Characteristic,這樣的話,就只有你自己的軟體和外設能夠相互理解。

    舉個例子, Heart Rate Measurement Characteristic,這是上面提到的 Heart Rate Service 必需實現的 Characteristic,它的 UUID 是 0x2A37。它的資料結構是,開始 8 bit 定義心率資料格式(是UINT8 還是 UINT16?),接下來就是對應格式的實際心率資料。

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