低功耗蓝牙(BLE) - 属性(实例说明)

一、属性(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位的数使用。

例如,图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”表示特性描述是“客户端特性配置”;


图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,我们也可以看出服务包含了一个或多个特性,可以简单的认为服务就是多个特性的集合。

最后,附上所有UUID列表文件下载通道:

链接:https://pan.baidu.com/s/1FykSrJKFZrRA2pnM3Wcmaw(提取码:q46i),这个列表是飞哥辛辛苦苦从SIG官网提取出来的,方便查阅,希望对大家有帮助。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,165评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,720评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,849评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,245评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,596评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,747评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,977评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,708评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,448评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,657评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,141评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,493评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,153评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,890评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,799评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,685评论 2 272

推荐阅读更多精彩内容