一峰尝、屬性(Attribute)
用過BLE的同學都知道“屬性”?(簡稱ATT)儒旬,那么什么是屬性呢温兼?寬泛的講秸滴,屬性是一條帶有標簽的、可以被尋址的數據募判。
屬性由3部分組成:屬性句柄荡含、屬性類型、屬性值届垫,如圖1所示释液。
1、屬性句柄(Attribute Handle)
有效的ATT句柄范圍是0x0001 ~ 0xFFFF装处。如圖2所示误债,最左側一列就是ATT句柄,從0x0001開始。
2寝蹈、屬性類型(Attribute Type)
128位通用唯一識別碼(UUID)用來標識ATT的類型糟袁。為了提高傳輸效率,藍牙技術聯盟(SIG)定義了一個128位的“藍牙UUID基數”(00000000-0000-1000-8000-00805F9B34FB)躺盛,結合一個16位的數使用项戴。
例如,圖2中的16位UUID “0x2800”槽惫,完整的128位UUID便是00002800-0000-1000-8000-00805F9B34FB周叮。
低功耗藍牙使用的UUID被分為5組:
0x1800 ~ 0x26FF:服務類型;
0x2700 ~ 0x27FF:計量單位界斜;
0x2800 ~ 0x28FF:屬性類型仿耽;
0x2900 ~ 0x29FF:特性描述;
0x2A00 ~ 0x7FFF:特性類型各薇;
下面是SIG官網對各組UUID定義的鏈接地址:
服務類型: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類型是“主服務”峭判,第4列值為“0x1812”表示服務類型是“HID服務”开缎;
ATT句柄為0x0023的屬性,第2列UUID “0x2803”表示ATT類型是“特性聲明”林螃;
ATT句柄為0x0024的屬性奕删,第2列UUID “0x2A4D”表示ATT類型是“報告”;
ATT句柄為0x0025的屬性疗认,第2列UUID “0x2902”表示特性描述是“客戶端特性配置”完残;
如果自定義一個服務,一般會指定一個128位的UUID横漏,這個UUID不能和SIG已經定義的服務類型相同谨设。
例如,圖4展示了一個未知服務缎浇,包含1個主服務扎拣,UUID為“AB5E0001-5A21-4F05-BC7D-AF01F617B664”。
還包含3個特性华畏,第1個特性聲明了UUID為“AB5E0002-5A21-4F05-BC7D-AF01F617B664”的屬性用于接收客戶端發(fā)來的數據鹏秋,支持寫入操作(ATT句柄為0x0036的屬性,屬性值的第1個字節(jié)為0x08亡笑,即Bit3為1,所以支持寫入操作横朋。參考后面的“特性聲明”部分)仑乌;
第2個特性聲明了UUID為“AB5E0003-5A21-4F05-BC7D-AF01F617B664”的屬性用于發(fā)送數據給客戶端,支持讀取和通知操作(ATT句柄為0x0038的屬性,屬性值的第1個字節(jié)為0x12晰甚。Bit1為1衙传,所以支持讀取操作;Bit4為1厕九,所以支持通知操作蓖捶。參考后面的“特性聲明”部分),從圖中藍色部分可以看出數據長度為20字節(jié)扁远;
第3個特性聲明了UUID為“AB5E0004-5A21-4F05-BC7D-AF01F617B664”的屬性用于發(fā)送數據給客戶端俊鱼,支持讀取和通知操作(ATT句柄為0x003B的屬性,屬性值的第1個字節(jié)為0x12畅买。Bit1為1并闲,所以支持讀取操作;Bit4為1谷羞,所以支持通知操作帝火。參考后面的“特性聲明”部分),從圖中藍色部分可以看出數據長度為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ā)送數據給客戶端神凑。
特性包含3個要素:
聲明;
數值何吝;
描述溉委;
1、特性聲明(Characteristic Declaration)
特性聲明的UUID為0x2803爱榕,即ATT類型為特性聲明(0x2803)瓣喊。
(1)性質(Properties)
長度為8位,確定了特性數值屬性對操作的支持情況黔酥,包括:讀取藻三、寫入洪橘、通知、指示棵帽、廣播熄求、命令、簽名認證逗概。每一位表示一種操作弟晚,Bit位為1表示支持該項操作,為0表示不支持逾苫,如表1所示卿城。
(2)數值句柄(Value Handle)
與客戶端進行數據交互的屬性句柄,即實際用來傳輸數據的屬性句柄隶垮。
(3)特性UUID(Characteristic UUID)
標識特性數值的類型的UUID藻雪。
例如,圖3中ATT句柄為0x002B的屬性就是一個“特性聲明”狸吞,第4列ATT值為“1A:2C:00:4D:2A”勉耀。其中第1個字節(jié)0x1A(0b00011010),表示性質支持讀取蹋偏、寫入和通知便斥;第2和3字節(jié)組合后即0x002C,表示用來傳遞數據的ATT句柄為“0x002C”威始;第4和5字節(jié)組合后即0x2A4D枢纠,表示該特性數值的類型為“0x2A4D”(Report)。
2黎棠、特性數值
也是一個屬性晋渺,屬性類型必須與特性聲明的特性UUID字段一致。
例如脓斩,圖3中ATT句柄為0x002C的屬性就是一個“特性數值”木西,ATT類型UUID為“0x2A4D”,就是在ATT句柄為0x002B的“特性聲明”的ATT值中指定的随静。
3八千、特性描述
“特性描述”的UUID范圍0x2900-0x290F,如表2所示燎猛。一個特性可以包含任意多的描述恋捆。
例如,客戶端特性配置的ATT值長度2個字節(jié)重绷,Bit0表示通知是否使能沸停,Bit1表示指示是否使能,其它14個Bit未定義论寨。在圖3中星立,ATT句柄為0x002D的屬性就是一個“客戶端特性配置”爽茴,其ATT值為“0x0001”葬凳,就表示通知操作已打開绰垂。
三、服務
一個服務就描述了一種數值火焰。例如劲装,電池服務就描述了電量值是如何傳給客戶端的;設備信息服務描述了設備相關信息昌简。HID服務描述了人機交互設備是如何交互數據的占业。從圖2、3纯赎、4谦疾,我們也可以看出服務包含了一個或多個特性,可以簡單的認為服務就是多個特性的集合犬金。
最后念恍,附上所有UUID列表文件下載通道:
鏈接:https://pan.baidu.com/s/1FykSrJKFZrRA2pnM3Wcmaw(提取碼:q46i),這個列表是飛哥辛辛苦苦從SIG官網提取出來的晚顷,方便查閱峰伙,希望對大家有幫助。