低功耗藍芽——GATT協議詳解

語言: CN / TW / HK

GATT協議建立了通過BLE傳輸user data的方式。GAP協議定義了裝置直接互動的協議,而GATT專注於資料傳輸。GATT使用ATT(Attribute Protocol)傳輸資料,而ATT利用一組characteristics傳輸資料,後面會詳細介紹。

1.角色

藍芽協議經常通過定義角色,來開始制定規則。GATT的角色定義為:Client和Server。

Client

Client傳送一個requests(and server-initiated updates),並收到responses。BLE連線建立後,由於GATT Client事先無法知道GATT Server的任何屬性(attributes),所以Client需要先查詢Server提供了哪些服務(Service),這個服務,可以理解為包含一系列characteristics的面向物件的類,Service具體代表什麼服務,是根據實際應用場景,雙方約定的。在完成了服務搜尋之後,如果Client找到了自己需要的Service,就可以對它進行讀寫操作了。

Server

Server收取Client傳送的request,傳送responses給Client。服務端也會發送server-initiated updates(這個後面會說明)。Server負責儲存和向Client提供這些資料,每一個在銷售的BLE裝置,都必須包含至少一個GATT Server,甚至是返回error的response。

GATT的這兩種角色,和GAP的central/peripheral角色是相互獨立的,它們都能作為Client或者Server,甚至能同時作為Client和Server。

2.UUID

UUID是一個128-bit(16bytes)的全球唯一的數字。128-bit佔用Link Layer的空間太多,為了提高效率,SIG提供了16-bit和32-bit版本的UUID,這些UUID由Bluetooth SIG管理。

蘋果公司的UUID: image.png 心率Service的UUID: image.png GATT Characteristic的UUID: image.png Protocol Identifier的UUID: image.png 要將其轉換回128-bitUUID,將其插入xxxxxxxx-0000-1000-8000-00805F9B34FB 即可。 可以看到,公司名稱、Service、Characteristic、甚至協議本身、Service的修飾符等等都有一個UUID來表示。 沒有在SIG註冊的UUID叫做vendor-specific UUIDs,只能全程使用128-bit的值。

3.Attributes

Attributes是GATT中資料的最小單元,Attributes是一段可定址的、可包含user data的資訊。Client和Server互動的所有資訊都必須用這種格式。Attributes只是一種概念上的定義,並沒有規定一個特定的儲存格式。因為其中包含的user data通常是感測器傳送的某種資料,這種資料的格式應當保證靈活多變。總的來說,Attributes一般包含Attributes自身的資訊和實際資料。以下是Attributes的組成部分: image.png

Handle(控制代碼)

Handle是一個獨特的不可變的16-bit identifier(識別符號),handle使得每個Attribute是可定址的,直接這麼說會讓人感到迷惑。我們想一下,client端在第一次連線GATT server的時候,不知道server提供了哪些service,客戶端可以指定一個handle range,在找到第一個Service之後。

Type

attribute type是個16-, 32-, or 128-bit的UUID,service 、 characteristic就是一種type,廠商自己定義的代表公司名稱或者心率等資料的UUID也是一種type。

Permissions

Permissions規定了某個ATT操作是否能在特定的Attributes上執行,Permissions包含:

Access Permissions

規定了client端的讀寫許可權: - None - 該attribute不能被client讀或寫

  • Readable - 該attribute能被client讀

  • Writable - 該attribute能被client寫

  • Readable and writable - 該attribute能被client讀或寫

Encryption

決定了加密等級: - No encryption required (Security Mode 1, Level 1) - 不加密,明文傳輸

  • Unauthenticated encryption required (Security Mode 1, Level 2) - 需要加密,但是祕鑰可以不用authenticated

  • Authenticated encryption required (Security Mode 1, Level 3) - 需要一個authenticated key

Authorization

是否需要授權: - - No authorization required 無需授權

-   Authorization required 需要授權

server可以決定attribute之間獨立授權或者組合授權

Value

用於放實際資料,沒有資料型別限制,大小限制在512位元組。使用者在有相關許可權的情況下,可以自由讀寫這部分資料。Attribute的其他組成部分則不能修改,也不能直接access,可以通過handle和UUID來訪問。 下面看一個# Attribute的整體層級圖:

image.png

Attribute在GATT server中必定以上圖組合的形式組織:一個GATT server擁有1到多個service,一個service有0到多個characteristics,一個characteristic可以包含0到多個descriptors, 所有使用BLE傳輸的資料都必須遵循此格式。 Indications and Notifications的區別:

Indications and Notifications are a way for a GATT Client to subscribe to data provided by a GATT Server. A Notification is an unacknowledged message or update while an Indication is an acknowledged message or update. These Notifications and Indications are sent any time the relevant data in the GATT table on the GATT Server is updated. (You must "subscribe" to the data that you would like to be Notified or Indicated of) In a way Indications and Notifications are much like TCP and UDP packets. TCP requires that when data is sent, the receiver acknowledges that the data has been received by sending back an ACKnowledgement packet. UDP just sends off data without any concern whether it is actually confirmed to be received or not. In this sense Indications are akin to TCP and Notifications are akin to UDP.