一、属性(Attribute)
用过BLE的同学都知道“属性” (简称ATT),那么什么是属性呢?宽泛的讲,属性是一条带有标签的、可以被寻址的数据。
属性由3部分组成:属性句柄、属性类型、属性值,如图1所示。
图1 属性结构
1、属性句柄(Attribute Handle)
有效的ATT句柄范围是0x0001 ~ 0xFFFF。如图2所示,最左侧一列就是ATT句柄,从0x0001开始。
图2 通用属性
2、属性类型(Attribute Type)
128位通用唯一识别码(UUID)用来标识ATT的类型。为了提高传输效率,蓝牙技术联盟(SIG)定义了一个128位的“蓝牙UUID基数”(00000000-0000-1000-8000-00805F9B34FB),结合一个16位的数使用。
低功耗蓝牙使用的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”表示特性描述是“客户端特性配置”;
图3 HID服务
如果自定义一个服务,一般会指定一个128位的UUID,这个UUID不能和SIG已经定义的服务类型相同。
例如,图4展示了一个未知服务,包含1个主服务,UUID为“AB5E0001-5A21-4F05-BC7D-AF01F617B664”。
还包含3个特性,第1个特性声明了UUID为“AB5E0002-5A21-4F05-BC7D-AF01F617B664”的属性用于接收客户端发来的数据,支持写入操作(ATT句柄为0x0036的属性,属性值的第1个字节为0x08,即Bit3为1,所以支持写入操作。参考后面的“特性声明”部分);
第2个特性声明了UUID为“AB5E0003-5A21-4F05-BC7D-AF01F617B664”的属性用于发送数据给客户端,支持读取和通知操作(ATT句柄为0x0038的属性,属性值的第1个字节为0x12。Bit1为1,所以支持读取操作;Bit4为1,所以支持通知操作。参考后面的“特性声明”部分),从图中蓝色部分可以看出数据长度为20字节;
第3个特性声明了UUID为“AB5E0004-5A21-4F05-BC7D-AF01F617B664”的属性用于发送数据给客户端,支持读取和通知操作(ATT句柄为0x003B的属性,属性值的第1个字节为0x12。Bit1为1,所以支持读取操作;Bit4为1,所以支持通知操作。参考后面的“特性声明”部分),从图中蓝色部分可以看出数据长度为1字节;
图4 未知服务
3、属性值(Attribute Value)
ATT值长度从0字节到最长512字节,但某些类型的ATT值长度是固定的。例如,图4中ATT句柄为0x003A的属性,UUID“0x2902”表示ATT类型是“客户端特性配置”,该属性的ATT值就是固定的2个字节长度(参考后面的“特性描述”部分)。
二、特性(Characteristic)
特性就是把一些属性组合在一起,归为一类。例如,图3中ATT句柄从0x002B到0x002E的4个属性就组成了一个特性,其行为就是要发送数据给客户端。
特性包含3个要素:
声明;
数值;
描述;
1、特性声明(Characteristic Declaration)
特性声明的UUID为0x2803,即ATT类型为特性声明(0x2803)。
图5 特性声明
(1)性质(Properties)
长度为8位,确定了特性数值属性对操作的支持情况,包括:读取、写入、通知、指示、广播、命令、签名认证。每一位表示一种操作,Bit位为1表示支持该项操作,为0表示不支持,如表1所示。
表1 特性的性质
(2)数值句柄(Value Handle)
与客户端进行数据交互的属性句柄,即实际用来传输数据的属性句柄。
(3)特性UUID(Characteristic UUID)
标识特性数值的类型的UUID。
例如,图3中ATT句柄为0x002B的属性就是一个“特性声明”,第4列ATT值为“1A:2C:00:4D:2A”。其中第1个字节0x1A(0b00011010),表示性质支持读取、写入和通知;第2和3字节组合后即0x002C,表示用来传递数据的ATT句柄为“0x002C”;第4和5字节组合后即0x2A4D,表示该特性数值的类型为“0x2A4D”(Report)。
2、特性数值
也是一个属性,属性类型必须与特性声明的特性UUID字段一致。
例如,图3中ATT句柄为0x002C的属性就是一个“特性数值”,ATT类型UUID为“0x2A4D”,就是在ATT句柄为0x002B的“特性声明”的ATT值中指定的。
3、特性描述
“特性描述”的UUID范围0x2900-0x290F,如表2所示。一个特性可以包含任意多的描述。
表2 特性描述
例如,客户端特性配置的ATT值长度2个字节,Bit0表示通知是否使能,Bit1表示指示是否使能,其它14个Bit未定义。在图3中,ATT句柄为0x002D的属性就是一个“客户端特性配置”,其ATT值为“0x0001”,就表示通知操作已打开。
三、服务
一个服务就描述了一种数值。例如,电池服务就描述了电量值是如何传给客户端的;设备信息服务描述了设备相关信息。HID服务描述了人机交互设备是如何交互数据的。从图2、3、4,我们也可以看出服务包含了一个或多个特性,可以简单的认为服务就是多个特性的集合。
领取专属 10元无门槛券
私享最新 技术干货