【IoT】藍牙 GAP 和 GATT 協議簡析

文章背景:

理論知識是實踐開發的基礎,對於產品研發來說更是如此,理論結合實踐纔可以開發出滿足市場需求的穩定產品。

1、基礎簡介

1.1、profile

profile 可以理解爲一種規範,一個標準的通信協議,它存在於藍牙從機中(服務端);

藍牙組織規定了一些標準的 profile,例如 HID OVER GATT,防丟器,心率計等;

每個 profile 中會包含多個 service,每個 service 代表從機的一種能力。

1.2、service

service 可以理解爲一個服務,在 BLE 從機中有多個服務,例如:電量信息服務、系統信息服務等;

每個 service 中又包含多個 characteristic 特徵值;

每個具體的 characteristic 特徵值纔是 BLE 通信的主題,比如當前的電量是 80%,電量的 characteristic 特徵值存在從機的 profile 裏,這樣主機就可以通過這個 characteristic 來讀取 80% 這個數據。

1.3、characteristic

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

1.4、UUID

UUID,統一識別碼,我們剛纔提到的 service 和 characteristic 都需要一個唯一的 uuid 來標識;

每個從機都會有一個 profile,不管是自定義的 simpleprofile,還是標準的防丟器 profile,他們都是由一些 service 組成,每個 service 又包含了多個 characteristic,主機和從機之間的通信,均是通過characteristic來實現。

2、BLE GATT 簡介

低功耗藍牙 BLE 的連接是建立在 GATT (Generic Attribute Profile) 協議之上的;

GATT 是一個在藍牙連接之上的發送和接收很短的數據段的通用規範,這些很短的數據段被稱爲屬性(Attribute)。

2.1、GAP 協議

詳細介紹 GATT 之前,需要了解 GAP(Generic Access Profile),它在用來控制設備連接和廣播;

GAP 使你的設備被其他設備可見,並決定了你的設備是否可以或者怎樣與合同設備進行交互;

例如:

Beacon 設備就只是向外廣播,不支持連接,小米手環就等設備就可以與中心設備連接。

2.1.1、設備角色

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

外圍設備 - 從機:

這一般就是非常小或者簡單的低功耗設備,用來提供數據,並連接到一個更加相對強大的中心設備,例如小米手環;

中心設備 - 主機:

中心設備相對比較強大,用來連接其他外圍設備。例如手機等;

2.1.2、廣播數據

在 GAP 中外圍設備通過兩種方式向外廣播數據:

Advertising Data Payload(廣播數據)和 Scan Response Data Payload(掃描回覆)

每種數據最長可以包含 31 byte。這裏廣播數據是必需的,因爲外設必需不停的向外廣播,讓中心設備知道它的存在;

掃描回覆是可選的,中心設備可以向外設請求掃描回覆,這裏包含一些設備額外的信息,例如:設備的名字。

2.1.3、廣播的網絡拓撲結構

大部分情況下外設通過廣播自己來讓中心設備發現自己,並建立 GATT 連接,從而進行更多的數據交換;

也有些情況是不需要連接的,只要外設廣播自己的數據即可,用這種方式主要目的是讓外圍設備,把自己的信息發送給多箇中心設備;

因爲基於 GATT 連接的方式的,只能是一個外設連接一箇中心設備,使用廣播這種方式最典型的應用就是蘋果的 iBeacon。

2.2、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 外設同時只能被一箇中心設備連接;

一旦外設被連接,它就會馬上停止廣播,這樣它就對其他設備不可見了,當設備斷開,它又開始廣播;

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

2.2.1、GATT 連接的網絡拓撲

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

2.2.2、GATT 通信事務

GATT 通信的雙方是 C/S 關係,外設作爲 GATT 服務端(Server),它維持了 ATT 的查找表以及 service 和 characteristic 的定義;

中心設備是 GATT 客戶端(Client),它向 Server 發起請求,需要注意的是,所有的通信事件,都是由客戶端(也叫主設備,Master)發起,並且接收服務端(也叫從設備,Slave)的響應;

一旦連接建立,外設將會給中心設備建議一個連接間隔(Connection Interval),這樣中心設備就會在每個連接間隔嘗試去重新連接,檢查是否有新的數據;

但是,這個連接間隔只是一個建議,你的中心設備可能並不會嚴格按照這個間隔來執行,例如你的中心設備正在忙於連接其他的外設,或者中心設備資源太忙;

2.2.3、GATT 結構

GATT 事務是建立在嵌套的Profiles, Services 和 Characteristics之上的的。

Profile 並不是實際存在於 BLE 外設上的,它只是一個被 Bluetooth SIG 或者外設設計者預先定義的 Service 的集合;

例如心率 Profile(Heart Rate Profile)就是結合了 Heart Rate Service 和 Device Information Service;

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

以 Heart Rate Service 爲例,可以看到它的官方通過 16bit UUID 是 0x180D,包含 3 個 Characteristic:Heart Rate Measurement, Body Sensor Location 和 Heart Rate Control Point,並且定義了只有第一個是必須的,它是可選實現的;

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

與 Service 類似,每個 Characteristic 用 16bit 或者 128bit 的 UUID 唯一標識,你可以免費使用 Bluetooth SIG 官方定義的標準 Characteristic,使用官方定義的,可以確保 BLE 的軟件和硬件能相互理解;

舉個例子:

Heart Rate Measurement Characteristic,這是上面提到的 Heart Rate Service 必需實現的 Characteristic,它的 UUID 是 0x2A37。它的數據結構是,開始 8 bit 定義心率數據格式,接下來就是對應格式的實際心率數據;

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

ESP32 Arduino 實現 BLE TX/RX 可以參考博客:

https://blog.csdn.net/liwei16611/article/details/80949777

refer:

https://blog.csdn.net/u013378580/article/details/52891462

 

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