Attribute
屬性(Attribute)由以下三部分組成:
- Handle:可以理解為屬性表中的地址
- UUID:16bit(需要購買)或128bit
- Value:UUID不同,含義不同
UUID
可以將屬性進(jìn)行初級(jí)的分類:
- 0x1800 ~ 0x26FF: 服務(wù)識(shí)別碼,用來識(shí)別具體是哪個(gè)服務(wù)。
- 0x2700 ~ 0x27FF: 度量單位,如:km/h, kg。
- 0x2800 ~ 0x28FF: 區(qū)分屬性類型,首要/次要/包含/特性。
- 0x2900 ~ 0x29FF: 特性描述,如:CCCD/User Description。
- 0x2A00 ~ 0x2AFF: 區(qū)分特性類型,DeviceName/Version等。
Property
提供訪問控制,每個(gè)屬性都有一個(gè)許可,許可的分類:
- 使用許可:可讀/可寫/讀寫。
- 認(rèn)證許可:需要認(rèn)證/不需要認(rèn)證。需要認(rèn)證 時(shí),客戶端可以發(fā)起認(rèn)證請求。
- 授權(quán)許可:由服務(wù)器決定,客戶端無法改變,只能等待,并重新發(fā)起請求。
Characteristic
由多條屬性(Attribute)可以組成一個(gè)特性(Characteristic),特性由以下三部分組成:
- 特性申明:如果一個(gè)屬性是特性申明,其屬性值由性質(zhì)、句柄、UUID組成。申明了該特性的讀寫性質(zhì),句柄,UUID。
- 特性數(shù)值:必須查詢該特性的服務(wù)規(guī)格書才知道其具體意義。
- 特性描述符(并不是必須的,可以沒有):
- 特性擴(kuò)展性質(zhì):可靠地寫入數(shù)值的能力,以及寫入“特性用戶描述”的能力。
- 特性用戶描述:用來描述該特性行為,如用一串字符串“溫度特性”。
- 客戶端特性配置:用來通知或指示客戶端。
- 服務(wù)器特性配置:與客戶端特性配置類似,但多一個(gè)廣播位,用于廣播該特性所屬服務(wù)的相關(guān)數(shù)據(jù)。
- 特性表示格式:表明客戶端按什么樣的格式理解數(shù)據(jù)。
- 特性聚合格式:將不同的特性表示格式組合成一個(gè)新的格式,如經(jīng)度,緯度組合成經(jīng)緯度數(shù)據(jù)。
Service
由0條或多條特性可以組成服務(wù)(Service),也可以通過以下方法重用服務(wù)。
- 拓展(Extend)
比如,一臺(tái)舊設(shè)備支持A服務(wù),新的設(shè)備在A的基礎(chǔ)上擴(kuò)展了服務(wù)A,并定義了新的服務(wù)AB,新設(shè)備和舊設(shè)備通訊時(shí)會(huì)先去發(fā)現(xiàn)AB服務(wù),若失敗,則使用通用的服務(wù)A,這樣保證舊設(shè)備的兼容性。 - 引用(Reference)
可以在新的服務(wù)中直接引用其他服務(wù)。可以理解為C語言中的指針,并沒有在新的服務(wù)中重新實(shí)現(xiàn)或擴(kuò)展,而是一個(gè)指針指向了引用的服務(wù)。
*結(jié)合(Combine)
一個(gè)服務(wù)引用另外兩個(gè)服務(wù),從而結(jié)合成新的服務(wù)。并具備了新的行為。 - 服務(wù)申明
服務(wù)申明的屬性值指明該服務(wù)具體是什么服務(wù),UUID是多少? - 包含(Include)
次要服務(wù)必須逐個(gè)發(fā)現(xiàn),所以每個(gè)服務(wù)可以有0個(gè)或多個(gè)包含屬性。
包含服務(wù)的屬性值包括服務(wù)句柄、組結(jié)束句柄、服務(wù)UUID。
實(shí)例

BLE_GATT.png
這是一張BLE的屬性表,里面有4個(gè)Service。
- 紅色背景的屬性:
UUID:0x2800,表明這條屬性是主服務(wù)的申明。
Value:表明了這條服務(wù)分組具體對(duì)應(yīng)的是哪一個(gè)服務(wù)。其中0x1800為設(shè)備發(fā)現(xiàn)服務(wù),0x1801為GATT服務(wù),0x180A為設(shè)備服務(wù)。另外一條128bit的服務(wù)是自定義的數(shù)據(jù)服務(wù)。 - 黃色背景的屬性:
UUID: 0x2803,表明這條屬性是特性的申明。
Value:申明了特性的Handle和UUID信息。 - 其他白色
背景的屬性:
UUID: 0x2902,表明這條是特性描述符中的客戶端特性配置,0x0000關(guān)閉,0x0001打開通知,0x0002打開指示。
屬性協(xié)議
決定了客戶端如何獲取和使用屬性。
六種基本操作:
- 請求(Request)
- 響應(yīng)(Response)
- 命令(Command)
sequenceDiagram
客戶端->>服務(wù)器: 請求
服務(wù)器->>客戶端: 響應(yīng)
sequenceDiagram
客戶端->>服務(wù)器: 命令
請求和命令的區(qū)別在于:請求需要響應(yīng),而命令不需要。
- 指示(Indicate)
- 確認(rèn)(Confirm)
- 通知(Notification)
sequenceDiagram
客戶端->>服務(wù)器: 指示
服務(wù)器->>客戶端: 確認(rèn)
sequenceDiagram
服務(wù)器->>客戶端: 通知
通知和指示的區(qū)別在于:通知不需要確認(rèn),而指示需要。
- 交換MTU請求
屬性協(xié)議默認(rèn)的MTU長度為23字節(jié),如果想要發(fā)送更大的數(shù)據(jù)包,就需要協(xié)商MTU長度。
GATT協(xié)議
如果只有ATT協(xié)議,用戶使用起來還是比較麻煩,所以添加了GATT協(xié)議方便應(yīng)用層使用,GATT協(xié)議定義了如何發(fā)現(xiàn)和使用服務(wù)的一些標(biāo)準(zhǔn)方法。有以下三種規(guī)程:
- 發(fā)現(xiàn)規(guī)程
- 發(fā)現(xiàn)服務(wù):發(fā)現(xiàn)所有首要服務(wù)、按UUID發(fā)現(xiàn)首要服務(wù)、查找包含服務(wù)。
- 發(fā)現(xiàn)特性:發(fā)現(xiàn)所有特性、發(fā)現(xiàn)所有特性描述符。
- 客戶端發(fā)起規(guī)程:讀/寫特性值、讀/寫特性描述符。
- 服務(wù)端發(fā)起規(guī)程:通知/指示。