一、屬性(Attribute)
用過BLE的同學(xué)都知道“屬性”?(簡稱ATT),那么什么是屬性呢?寬泛的講,屬性是一條帶有標(biāo)簽的、可以被尋址的數(shù)據(jù)。
屬性由3部分組成:屬性句柄、屬性類型、屬性值,如圖1所示。
1、屬性句柄(Attribute Handle)
有效的ATT句柄范圍是0x0001 ~ 0xFFFF。如圖2所示,最左側(cè)一列就是ATT句柄,從0x0001開始。
2、屬性類型(Attribute Type)
128位通用唯一識別碼(UUID)用來標(biāo)識ATT的類型。為了提高傳輸效率,藍(lán)牙技術(shù)聯(lián)盟(SIG)定義了一個128位的“藍(lán)牙UUID基數(shù)”(00000000-0000-1000-8000-00805F9B34FB),結(jié)合一個16位的數(shù)使用。
例如,圖2中的16位UUID “0x2800”,完整的128位UUID便是00002800-0000-1000-8000-00805F9B34FB。
低功耗藍(lán)牙使用的UUID被分為5組:
0x1800 ~ 0x26FF:服務(wù)類型;
0x2700 ~ 0x27FF:計(jì)量單位;
0x2800 ~ 0x28FF:屬性類型;
0x2900 ~ 0x29FF:特性描述;
0x2A00 ~ 0x7FFF:特性類型;
下面是SIG官網(wǎng)對各組UUID定義的鏈接地址:
服務(wù)類型:https://www.bluetooth.com/specifications/gatt/services
屬性類型:https://www.bluetooth.com/specifications/gatt/declarations
特性描述:https://www.bluetooth.com/specifications/gatt/descriptors
特性類型:https://www.bluetooth.com/specifications/gatt/characteristics
例如,在圖3中
ATT句柄為0x0022的屬性,第2列UUID “0x2800”表示ATT類型是“主服務(wù)”,第4列值為“0x1812”表示服務(wù)類型是“HID服務(wù)”;
ATT句柄為0x0023的屬性,第2列UUID “0x2803”表示ATT類型是“特性聲明”;
ATT句柄為0x0024的屬性,第2列UUID “0x2A4D”表示ATT類型是“報告”;
ATT句柄為0x0025的屬性,第2列UUID “0x2902”表示特性描述是“客戶端特性配置”;

如果自定義一個服務(wù),一般會指定一個128位的UUID,這個UUID不能和SIG已經(jīng)定義的服務(wù)類型相同。
例如,圖4展示了一個未知服務(wù),包含1個主服務(wù),UUID為“AB5E0001-5A21-4F05-BC7D-AF01F617B664”。
還包含3個特性,第1個特性聲明了UUID為“AB5E0002-5A21-4F05-BC7D-AF01F617B664”的屬性用于接收客戶端發(fā)來的數(shù)據(jù),支持寫入操作(ATT句柄為0x0036的屬性,屬性值的第1個字節(jié)為0x08,即Bit3為1,所以支持寫入操作。參考后面的“特性聲明”部分);
第2個特性聲明了UUID為“AB5E0003-5A21-4F05-BC7D-AF01F617B664”的屬性用于發(fā)送數(shù)據(jù)給客戶端,支持讀取和通知操作(ATT句柄為0x0038的屬性,屬性值的第1個字節(jié)為0x12。Bit1為1,所以支持讀取操作;Bit4為1,所以支持通知操作。參考后面的“特性聲明”部分),從圖中藍(lán)色部分可以看出數(shù)據(jù)長度為20字節(jié);
第3個特性聲明了UUID為“AB5E0004-5A21-4F05-BC7D-AF01F617B664”的屬性用于發(fā)送數(shù)據(jù)給客戶端,支持讀取和通知操作(ATT句柄為0x003B的屬性,屬性值的第1個字節(jié)為0x12。Bit1為1,所以支持讀取操作;Bit4為1,所以支持通知操作。參考后面的“特性聲明”部分),從圖中藍(lán)色部分可以看出數(shù)據(jù)長度為1字節(jié);

3、屬性值(Attribute Value)
ATT值長度從0字節(jié)到最長512字節(jié),但某些類型的ATT值長度是固定的。例如,圖4中ATT句柄為0x003A的屬性,UUID“0x2902”表示ATT類型是“客戶端特性配置”,該屬性的ATT值就是固定的2個字節(jié)長度(參考后面的“特性描述”部分)。
二、特性(Characteristic)
特性就是把一些屬性組合在一起,歸為一類。例如,圖3中ATT句柄從0x002B到0x002E的4個屬性就組成了一個特性,其行為就是要發(fā)送數(shù)據(jù)給客戶端。
特性包含3個要素:
聲明;
數(shù)值;
描述;
1、特性聲明(Characteristic Declaration)
特性聲明的UUID為0x2803,即ATT類型為特性聲明(0x2803)。

(1)性質(zhì)(Properties)
長度為8位,確定了特性數(shù)值屬性對操作的支持情況,包括:讀取、寫入、通知、指示、廣播、命令、簽名認(rèn)證。每一位表示一種操作,Bit位為1表示支持該項(xiàng)操作,為0表示不支持,如表1所示。

(2)數(shù)值句柄(Value Handle)
與客戶端進(jìn)行數(shù)據(jù)交互的屬性句柄,即實(shí)際用來傳輸數(shù)據(jù)的屬性句柄。
(3)特性UUID(Characteristic UUID)
標(biāo)識特性數(shù)值的類型的UUID。
例如,圖3中ATT句柄為0x002B的屬性就是一個“特性聲明”,第4列ATT值為“1A:2C:00:4D:2A”。其中第1個字節(jié)0x1A(0b00011010),表示性質(zhì)支持讀取、寫入和通知;第2和3字節(jié)組合后即0x002C,表示用來傳遞數(shù)據(jù)的ATT句柄為“0x002C”;第4和5字節(jié)組合后即0x2A4D,表示該特性數(shù)值的類型為“0x2A4D”(Report)。
2、特性數(shù)值
也是一個屬性,屬性類型必須與特性聲明的特性UUID字段一致。
例如,圖3中ATT句柄為0x002C的屬性就是一個“特性數(shù)值”,ATT類型UUID為“0x2A4D”,就是在ATT句柄為0x002B的“特性聲明”的ATT值中指定的。
3、特性描述
“特性描述”的UUID范圍0x2900-0x290F,如表2所示。一個特性可以包含任意多的描述。

例如,客戶端特性配置的ATT值長度2個字節(jié),Bit0表示通知是否使能,Bit1表示指示是否使能,其它14個Bit未定義。在圖3中,ATT句柄為0x002D的屬性就是一個“客戶端特性配置”,其ATT值為“0x0001”,就表示通知操作已打開。
三、服務(wù)
一個服務(wù)就描述了一種數(shù)值。例如,電池服務(wù)就描述了電量值是如何傳給客戶端的;設(shè)備信息服務(wù)描述了設(shè)備相關(guān)信息。HID服務(wù)描述了人機(jī)交互設(shè)備是如何交互數(shù)據(jù)的。從圖2、3、4,我們也可以看出服務(wù)包含了一個或多個特性,可以簡單的認(rèn)為服務(wù)就是多個特性的集合。
最后,附上所有UUID列表文件下載通道:
鏈接:https://pan.baidu.com/s/1FykSrJKFZrRA2pnM3Wcmaw(提取碼:q46i),這個列表是飛哥辛辛苦苦從SIG官網(wǎng)提取出來的,方便查閱,希望對大家有幫助。