一文帶你認識藍芽 GATT 協議

語言: CN / TW / HK

持續創作,加速成長!這是我參與「掘金日新計劃 · 10 月更文挑戰」的第30天,點選檢視活動詳情

磨刀不誤砍柴工,本文了解一些基本的藍芽協議基礎知識

前言

但是對於藍芽 GATT 概念,我們還是隻停留留在 藍芽協議棧基本框架層面的內容,對於更具體的理解我們還不知道,所以針對示例來說,我們也無從修改測試。

正所謂磨刀不誤砍柴工,我們有必要先深入的學習一下 GATT 以及 GATT 相關的一些知識。

本文我們就來了解一下 藍芽 GATT 到底是什麼?同時瞭解下我們使用的 ESP32-C3 GATT示例的工程的程式碼結構。


一、概念導圖

☆ 即便看完了很多資料,博主自己還是感覺藍芽協議的專有名詞定義有點複雜(相對其他很多物聯網無線協議來說),如果不是專門從事藍芽行業的人,即便官方有資料,對於這些專有名詞專有定義也難以全部理解到位。

☆ 但是我們系列博文最終是以應用為目的,使用藍芽最終還是使用藍芽做一些資料的傳輸互動應用。所以對於專有名詞暫時不用研究那麼深,知道一些基本概念的的作用和意義即可。

對於基本的概念知識,查閱了很多相關的資料後多少有了一個初步的認識,對於藍芽 GATT 來說,以應用為主所需要的瞭解的基本概念,主要就是 GATT,GAP,ATT 這幾個協議,在系列博文第一篇《ESP32-C3 學習測試 藍芽 篇(一、認識 ESP-IDF 的藍芽框架、簡單的瞭解藍芽協議棧)》關於藍芽協議的說明對於這幾個協議的簡單說明,如下圖:

圖片.png

對於我們的應用來說,藍芽無非是用來進行資料互動,我們直接從應用說起,我們使用手機和開發板進行藍芽通訊,對應的 手機就是 Client 裝置,開發板就是 Server 裝置。

對於我的學習來說,就是從 BLE通訊的這兩種裝置入手的 :Client 和 Server。

GATT 的結構

對於 Client 和 Server 的通訊,先來看一張圖:

圖片.png

從上面的示意圖可以看出,對於 GATT server 有很多分支,可想而知對於他的協議規定會有很多專有名詞,我們的應用程式也大多是對 GATT server 這些引數進行修改配置,我總結了幾張概念導圖。

圖片.png

圖中用的是 GATT Server 後面的分支應該是 Service!!

Service 的結構

圖中用的是 Server(伺服器),應該用 Service ,做圖的時候估計還有點蒙:

圖片.png

上圖中雖然以 Server 作為開頭,其實 Server 可組成一個叫 profile 的概念(下面概念說明會講到 )。

Profile 的結構

藍芽官方文件中對於 Profile 說明圖:

圖片.png

二、概念說明

雖然上面上了一張概念導圖,但是對於裡面的一些基本概念我們有必要一個一個單獨說明一下。

2.1 名詞解釋

對概念導圖中提到的專有名詞進行單獨的說明。

Server

  • Service可以理解為一個服務,提供資料的服務,比如從機裝置,但是在一個 Ble 從機中,可以有多個服務。

Server 和 Client 通過ATT PDU進行互動。

Server通過characteristic對資料進行封裝,每個service中又包含多個characteristic特徵值。

profile

  • 如果上面說的 service 是一個藍芽聯盟定義的標準服務,也可以稱其為profile。

profile 可以理解為一種規範,一個標準的通訊協議,它存在於從機中。

藍芽組織規定了一些標準的profile,比如HID/心率計/體溫計/血糖儀等,都是標準藍芽服務,因此都有相應的profile規格書。

每個從機都會有一個叫做profile的東西存在,不管是的自定義的simpleprofile,還是標準的心率計profile。

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

characteristic

  • 上面講到: Server通過characteristic對資料進行封裝,每個service中又包含多個 characteristic 特徵值。

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

一個characteristic包含三種條目:characteristic宣告,characteristic的值以及characteristic的描述符。

這3個條目的含義可參考上面的概念導圖,這裡需要說明的是它們是用attribute來表達的,它們每一個都是一個 attribute 。

 <font color=#0033FF>Characteristic是在GATT規範中最小的邏輯資料單元,由一個Value和多個描述特性的Desciptior組成。實際上,在與藍芽裝置打交道,主要就是讀寫Characteristic的value來完成。

attribute

  • Attribute 是屬於 ATT屬性層的東西,它是 ATT層 的核心。

Attribute其實就是一條一條的資料。前面說過,每個藍芽裝置就是用來提供服務的,而服務就是眾多資料的合集,這個合集可以稱為資料庫,資料庫裡面每個條目都是一個attribute。

Attribute 由以下 4 部分組成:屬性控制代碼(Attribute Handler)、屬性型別(Attribute Type)、屬性值(Attribute Value)、屬性許可權(Attribute Permissions)。

![圖片.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/29f11e8061a0437a9422f8558aa0cc68~tplv-k3u1fbpfcp-watermark.image?)

UUID

  • UUID(universally uniqueidentifier,通用唯一識別碼)是一個軟體構建標準,一個合法的UUID,一定是隨機的、全球唯一的。(UUID並不是BLE獨有的概念)

上面提到的 service 和 characteristic,都需要一個唯一的uuid來標識。

UUID是128 bit的。

藍芽聯盟採用為官方的UUID:0000xxxx-0000-1000-8000-00805F9B34FB(上面概念圖和推薦博文有詳細說明)

2.2 GATT (Generic Attribute Profile)

GATT (通用屬性配置) ,它定義兩個 BLE 裝置通過 Service 和 Characteristic 進行通訊;

GATT 就是使用了 ATT(Attribute Protocol)協議,ATT層定義了一個通訊的基本框架,資料的基本結構,以及通訊的指令,Service 和 characteristic 就是GATT層定義的, GATT層用來賦予每個資料一個具體的內涵,讓資料變得有結構和意義。

前面說過 server 端提供服務,服務就是資料,而資料就是一條一條的attribute,而service和characteristic 就是資料的邏輯呈現,或者說使用者能看到的資料最終都轉化為 service 和 characteristic。

一旦兩個裝置建立起了連線,GATT 就開始起作用了,這裡需要說明的是,GATT 連線必需先經過 GAP 協議。

GATT 連線需要特別注意的是:GATT 連線是獨佔的。也就是一個 BLE 外設同時只能被一箇中心裝置連線;

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

2.3 GAP(Generic Access Profile)

Generic Access Profile(通用訪問規範) 它在用來控制裝置連線和廣播,用於提供藍芽裝置的通用訪問功能,包括裝置發現、連線、鑑權、服務發現等等。

GATT是建立連線後通訊規範, 而藍芽是通過GAP建立通訊的。

GAP 使你的裝置被其他裝置可見,並決定了你的裝置是否可以或者怎樣與合同裝置進行互動。

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

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

2.4 ATT(Attribute Protocol)

ATT(Attribute Protocol)屬性層是 GATT 和 GAP 的基礎,它定義了BLE協議棧上層的資料結構和組織方式。

ATT協議定義了兩種角色:伺服器角色和客戶端角色。

站在藍芽協議棧角度來看,ATT層定義了一個通訊的基本框架,資料的基本結構,以及通訊的指令,而GATT層就是前文所述的service和characteristic,GATT層用來賦予每個資料一個具體的內涵,讓資料變得有結構和意義。

GATT 是脫胎於 ATT ,ATT 是 Attribute Protocol Specification 屬性規範協議,注意ATT是協議,而GATT是規範,兩者不同點在於 ATT規定了資料格式,而 GATT 則是按照 ATT 的格式將具體資料填充進去。

三、Client 裝置連線說明

我們上面講了很多關於藍芽 GATT 的概念知識,我們開發板使用了 GATT server 示例後,就是一個 Server 裝置,我們的手機就是 Client 裝置。

當我們連線上以後,其實可以檢視 Server 的資訊的,為了加深對上面的概念的理解,我們使用手機連線後的圖片來說明一些概念:

圖片.png

圖片.png

圖片.png

在上圖中有一點,結合上面第一小節《一、概念導圖》 中的 Profile的結構 說明,每個 characteristic 都帶有Properties,這個 Properties 為藍芽特徵值的讀寫許可權: |屬性名稱| 描述 | |--|--| | read | 支援 read 操作 | | write | 支援 write 操作 | | notify | 支援 notify 操作 | | indicate | 支援 indicate 操作 |

上面是手機客戶端與我們燒錄示例的 ESP32-C3 開發板連線後的截圖,配合本文的上面一些說明,可以讓我們更直觀的理解上面提到的概念。

結語

在寫本文前,博主自己確實對藍芽的這些概念不太理解,當初看這些概念的時候也參考了很多很多文章,花了很多時間去記住整理這些概念,到現在使用起來還是需要對著概念圖看,尷尬 = =!

所謂開發藍芽應用程式,其實就是開發 service 和 characteristic。通過API,新增自己需要的characteristic 和 service,一個藍芽裝置就誕生了。

只要 characteristic 和 service 是符合GATT規範的,你可以隨意新增任何characteristic和service,並將他們組合成一個專門的藍芽裝置。由於這個藍芽裝置是按照規範來定義的,所以它可以與任何其他藍芽裝置,比如手機,互聯互通,並完成所要求的的互動動作。

本文我們基本上把藍芽 GATT 的概念認識了一遍,就算從來沒接觸過藍芽,從本文入手,應該也能算是入門瞭解過了一些。 當然,本文並沒有深入的闡述每一個概念,一來對於藍芽協議,博主也是初學者;二來博主還是以應用為目的,應用就是先能夠使用修改起來,再談深入。

那麼藍芽系列的下一篇文章,我們就要回到示例 GATT server ,分析一下示例程式程式碼,通過實際的程式加深我們對藍芽 GATT的理解,同時開始進行初步的修改測試 。