Advertisement

【蓝牙协议栈】【BLE】【ATT】低功耗蓝牙之属性协议介绍

阅读量:

蓝牙协议栈中的ATT(Attribute Protocol)主要用于设备间发现、读写对端设备属性的协议。ATT协议通过属性句柄、属性类型、属性值、权限和句柄范围等核心内容实现对端设备属性的管理。属性句柄用于标识属性,属性类型通过UUID标识,属性值包含属性数据,权限定义了对属性的访问控制,句柄范围则用于管理属性服务端。ATT协议为蓝牙设备提供了一种高效的数据传输机制,支持设备间的特征值和服务端的交互。

精讲蓝牙协议栈

目录

1. ATT概念

1.1 ATT的数据结构

2. ATT部分术语

2.1 属性类型(Attribute type)

2.3 属性句柄组(Attribute handle grouping)

2.4 属性值(Attribute value)

2.5 属性权限(Attribute permissions)

2.6 控制点属性(Control-point attributes)

2.7 协议方法(Protocol methods)

2.8 交互 MTU(Exchanging MTU size)

2.9 长属性值(Long attribute values)

2.10 原子操作(Atomic operations)

2.11 数据库、服务器和客户端


ATT知识总览:

1. ATT概念

ATT,即Attribute Transfer Protocol(ATTP),是一种用于实现设备间属性读写操作的协议(仅限于BLE设备)。ATT由两个角色组成:Server和Client。作为服务端角色,ATT能够提供与关联属性相关的属性集,以便客户端设备能够进行属性的发现、读取和写入操作。同时,服务端角色还能够主动向客户端发送相关属性的更新通知。在蓝牙协议栈中,ATT的定位是与ATT相关的重要协议,其主要功能是实现设备间属性的读写操作。

基于 L2CAP 协议层之上,响应层通过 L2CAP 数据传输机制来通信。对于 BLE 来说,ATT 具有固定的 L2CAP CID,即 0x0004,如图所示。

通过支持 GATT 客户端与服务器之间的 Feature 交互,实现数据传输。

属性协议支持服务器设备向客户端对等设备公开一组属性及其相关值。被称作服务器的设备能够提供这些属性,并且能够被被称作客户端的设备发现、读取和写入。同时,被称作服务器的设备能够指示和通知相关设备。

属性是一个离散值,它具有以下三个特征:

属性类型由唯一标识符UUID表示。
属性句柄在服务器上作为唯一标识符,允许客户端在读或写请求中引用该属性。客户端使用句柄来识别发送过来的通知或指示的属性,从而发现服务器属性的句柄。
属性权限由每个使用该属性的更高层次规范定义的一组权限组成;这些权限不能通过Attribute协议访问。属性可以由更高层次的规范结构指定为可读、可写或两者兼有,并可能具有额外的安全要求。

通过划分每个服务的独立句柄范围,可以在单个服务器上实现多服务暴露。这些句柄范围的确定由更高层次的规范系统来完成。

属性可以被视为被编址并附加标签的一小段数据。每个属性均包含一个唯一标识该属性的句柄、一个用于标识存储数据的类型以及一个值。例如,一个类型为'温度'、值为20.5℃的属性可能存放在句柄为0x01CE的属性中。属性协议未定义任何属性类型,但规定某些属性可以分组,并可通过属性协议识别这些分组的语义。

1.1 ATT的数据结构

注意:这里讨论的数据结构不是通过空中传播的结构,而是由一条属性在存储器中定义的结构。

➢一个ATT 包含以下元素:句柄(Handle)、类型(UUID)、值(Value) 、权限(Permission)

2. ATT部分术语

2.1 属性类型(Attribute type)

通过UUID(唯一标识符)来标识,通常将UUID分为16位、32位和128位。在ATT协议中,32位的UUID必须转换为128位的UUID。此外,16位的UUID可以通过添加一个128位的base UUID来转换为128位的UUID。Base UUID的定义为:00000000-0000-1000-8000-00805F9B34FB。尽管128位的UUID在理论上具有更高的唯一性,但实际应用中多采用16位来发送数据,主要是为了提高传输速度和减少交互次数。

每个属性都对应一个类型,该类型由UUID标识。例如,温度、压强、体积、距离、功率、时间等属性各自对应一个独特的UUID标识。任何用户都可以轻松生成UUID,并根据需要将其分发或暴露给客户端。由于UUID基于不重复的唯一标识符,因此无需依赖中央注册中心。

UUID是一种16字节的数据类型,为了满足数据类型的需求,需要发送长达16字节的数据。为了进一步提高传输效率,SIG引入了蓝牙UUID基数这一128位通用唯一识别码,并结合一个16位短数使用。这种组合方式与通用唯一识别码的分配规则一致,仅在传输过程中采用16位版本时,接收端需补充蓝牙UUID基数。例如,若要发送16位识别码为0x2A01,则完整128位的UUID为:00002A01-0000-1000-8000-00805F9B34FB。蓝牙UUID基数的具体示例如下:0x0000xxxx-0000-1000-8000-00805F9B34FB。

对于16位的UUID,一般不直接使用其数值,而是前缀一个名称并用书名号标注。例如,数值为0x2802的UUID可前缀名为《Include》。类似的前缀名称还有很多,例如《Type》、《Hash》等。需要注意的是,UUID本身并未定义自身的用法,为此需要通过特定的规则或约定来实现。

我们使用16位数值来标识属性,其范围为0x0000至0xffff。其中,0x0000用于保留数值,而0xffff则表示最大数值。因此,我们通常不会使用这种方法。

长度
UUID是16个字节的字符串,为什么这里只使用了2字节?

为了降低数据传输量,BLE协议制定了一个转换规则,指定一种固定的16字节模板,其中仅保留2个字节作为变化字段,其余部分保持不变。在系统内部,2字节的UUID会被替换为标准格式,从而生成符合规范的16字节UUID。该UUID模板为:

0000XXXX-0000-1000-8000-00805F9B34FB

其中从左数第3、4个字节“XXXX”就是变化位,其他为固定位。

如:UUID=0x2A00在系统内部会转换成00002A00-0000-1000-8000-00805F9B34FB。

相反地,如果一个16-byte UUID的特征值,在系统内部其属性类型可能以第3和4字节组成的双字节形式存在,例如UUID=1234ABCD-0000-1000-8000-00805F9B34FB,其属性类型在系统内部由ABCD表示。

主机端对该属性类型进行检测,该属性类型会被认为是“用户自定义”的类型,随后,该UUID的真实值将通过其他途径获取。

属性类型
该UUID包含了一些基本属性类型,主要应用于GATT规范,而非具体服务。因此,BLE的属性类型主要分为四个大类,包括服务类型、服务状态、服务权限和数据类型。

首级服务项:0x2800
次级服务项:0x2801
包含项:0x2802
特征值:0x2803

Attribute type通常由service和characteristic规格进行定义。从蓝牙协议栈的角度来看,ATT层为蓝牙通信提供了基本框架,明确了数据的基本结构以及通信指令的定义。GATT层则专注于服务和特征的规范,通过赋予数据类型特定的含义,使得数据在传输过程中能够获得结构和意义。若无GATT层,蓝牙技术虽能实现通信,但会面临兼容性挑战以及通信效率的低下问题。

特性扩展属性 «Characteristic Extended Attributes»: 0x2900
用户特性描述 «User Characteristic Description» : 0x2901
客户端特性配置描述符 «Client Characteristic Configuration Descriptor» : 0x2902
服务器特性配置描述符 «Server Characteristic Configuration Descriptor»: 0x2903
特性表示格式描述符 «Characteristic Presentation Format Descriptor»: 0x2904
特性聚合格式描述符 «Characteristic Aggregate Format Descriptor» : 0x2905
特性用户描述描述符:
为用户配置的描述性信息,通常以字符串形式与特定特性相关联
客户端特性配置描述符:
为需要进行通知或指示的特性配置必须采用客户端特性配置描述符
服务器特性配置描述符:
支持进行通知或指示的特性配置必须采用服务器特性配置描述符
特性表示格式描述符:
用于描述特性的表示方式,通常以特定编码形式标识
特性聚合格式描述符:
用于描述特性的聚合方式,通常以特定编码形式标识

取值范围

0x1800 – 0x26FF :服务项的类型
0x2700 – 0x27FF :单位类别
0x2800 – 0x28FF :属性类型的说明
0x2900 – 0x29FF :描述符的类型
0x2A00 – 0x7FFF :特征值的类型

假如UUID=0x1800,就表示它是一个首要服务项。

16位UUID的定义请参考这里: https://www.bluetooth.com/specifications/assigned-numbers/#assignedNumbers

2.3 属性句柄组(Attribute handle grouping)

属性句柄(Attribute Handle)类似于指向属性实体的指针,端设备能够通过属性句柄来访问该属性。

属性句柄值的范围:0x0001~0xFFFF

Grouping是一组由高层协议定义的属性,其排列在其他属性组之前,客户可以获取与该属性组连接的第一个和最后一个Handle。

2.4 属性值(Attribute value)

Attribute value由字节构成,其长度可能为固定值或可变值,具体包括1个字节的单一值、4字节的整数类型数据,或可变长度的字符串类型数据。在某些情况下,单个attribute value的大小可能超过单个PDU的传输容量,因此需要将其分割为多个PDU进行传输。在attribute value数组的编码过程中,编码规则由attribute type决定。在request、response、notification、indication等消息类型中传输attribute value时,PDU数据包中不包含attribute value length字段,可以通过PDU数据包的长度来推算attribute value length的值,这意味着:

(1)在一个request、response、notification、indication中只能有一个attribute value,除非server和client都可以通过attribute type确attribute value的长度。

(2)在一个request、response、notification、indication中只有attribute value字段的长度是可变的

(3)bearer protocol (e.g. L2CAP)会保留数据包的边界 注意:有些response包含多个attribute value,但是这些attribute value的长度都是attribute type定义好的固定长度。

部分服务公开的数据中包含了一些额外的信息。我们称这种额外的信息为特性描述符。例如,数值格式信息(包括单位和表示方式)通常被称为描述符。

2.5 属性权限(Attribute permissions)

Attribute permissions由access permissions、encryption permissions、authentication permissions以及authorization permissions组成。

access permissions用于表示attribute是否支持对client进行读取和写入操作,具体取值包括Readability、Writeability,以及Readability和Writeability的结合。

(2)加密权限设置用于指示是否需要加密,其取值范围包括:需要加密、无需加密。

(3)authentication permissions用于表示,当客户端访问属性值或服务器发送notification和indication时,是否需要一个已认证的物理链路。其取值包括:Authentication Required和No Authentication Required。

该术语用于指示客户端在访问属性值时是否需要进行授权。其取值包括:授权必要、授权可选。

(1)当设置Authentication Required权限时,若客户端链路未通过认证流程,客户端试图访问attribute value时,系统将返回错误码:Insufficient Authentication。此时,客户端需进行链路认证,认证成功后方能访问attribute value。

(2)当设置Encryption required权限时,若客户端链路未进行加密处理,客户端访问attribute value时,系统将返回错误码:Insufficient Encryption。此时,客户端需进行链路加密,加密成功后方能访问attribute value。

(3)当设置Encryption required权限时,若客户端链路已实现加密,但所使用的key size未达到规定长度,客户端访问attribute value时,系统将返回错误码:Insufficient Encryption Key Size。此时,客户端需采用符合长度要求的link key进行加密操作,加密成功后方能访问attribute value。

权限属性总结:

访问权限分为只读、只写和读写三种类型。禁止访问权限指的是禁止读取或写入操作。加密权限有两种类型:加密和不加密。认证权限分为需要认证和无需认证两种类型。授权权限分为需要授权和无需授权两种类型。签名权限要求操作者在读取或写入前需进行签名认证,这种权限的使用较为少见。访问权限较为直观,仅读权限不允许对数据进行写入操作,其他类型权限则类似。认证(Authentication)是双方确认彼此身份的过程。完成认证流程的两个设备将建立信任关系,其通信通道可视为安全通道。在BLE协议中,认证过程即为设备配对。授权(Authorization)是指对授权设备提供访问权限。

2.6 控制点属性(Control-point attributes)

不可读的属性,但也可写、可通知(Notified)和可指示(Indicated)的属性被称为Control-Point Attribute。高层协议可利用该属性来启用设备特定过程,例如设备上一个给定过程的命令或指示已实现。

2.7 协议方法(Protocol methods)

ATT通过Protocol Methods实现属性的读写、通知和指示功能。具体来说,这些方法可以分为Request/Response/Command/Notification/Indication/Confirmation六大类,如图所示,在后续内容中将进行详细讲解。

  • 命令,客户端发送给服务端,不要求服务端回复
    • 请求,客户端发送给服务端,要求服务端回复
    • 响应,客户端发送了一个请求,服务端用此响应
    • 通知,服务端发给客户端的数据,不要求客户端回复
    • 指示,服务端发给客户端的数据,要求客户端回复
    • 确认,服务端发给客户端的数据,客户端用此进行回复

某些属性协议 PDU 还可以包含一个认证签名字段,以在无需加密的情况下对 PDU 发起者的认证提供支持。

2.8 交互 MTU(Exchanging MTU size)

ATT_MTU规定了Client与Server间数据包的最大容量。其默认值由高层协议指定。Client和Server通过Exchange MTU Request和Response PDU进行交互,随后均采用交换值中的最小值作为通信依据。同时,作为Server和Client的设备,它们应使用相同的Client Rx MTU和Server Rx MTU;每个ATT Bearer都具有特定的ATT_MTU。此外,当一个设备管理多个ATT Bearer时,这些Bearer的ATT_MTU可能各不相同。

2.9 长属性值(Long attribute values)

在数据包中,最大的attribute长度为ATT_MTU减一的字节数。其中,Attribute Opcode必须占用至少一个字节的空间。当attribute value的长度超过ATT_MTU减一的字节数时,我们称其为Long Attribute。

(2)读取长度超过ATT_MTU-1字节的属性,必须使用read blob request。使用read request可能会读取到前面的ATT_MTU-1字节。

(3)如果write的长度超过ATT_MTU-3个字节的限制,可以使用prepare write request和execute write request两种方式来处理。当使用write request时,可能会写入前面的ATT_MTU-3个字节。

在ATT协议中,无法判定一个attribute的长度是否能超过ATT_MTU-3字节。而在上层协议中,允许声明给定属性的最大长度超过(ATT_MTU-3)字节。

ATT协议未对属性值的最大长度进行规定。更高层次的协议则明确了这一数值。属性值的最长长度不应超过512字节。

2.10 原子操作 (Atomic operations)

在协议设计中,Server应当将Client的所有请求和命令视为不被影响的原子操作。如果一个链路因某种原因中断,高层协议层应对其属性值的修改负责。长属性不能单独地被原子操作读写。

2.11 数据库、服务器和客户端

属性集合即为数据库。数据库可以很小,小至仅包含6种属性,同样也可以非常复杂。最小的属性数据库必须包含下面6种属性:

该GAP服务的主要服务项目为首要服务。
该设备的特性信息包括:设备名称、设备型号、设备状态等关键参数。
该设备的设备信息参数为:设备名称、设备型号、设备状态等关键参数。
该设备外观的特性信息包括:外观尺寸、外观颜色、外观材质等关键参数。
该设备外观的设备信息参数为:外观尺寸、外观颜色、外观材质等关键参数。
该GATT服务的主要服务项目为首要服务。

属性数据库始终驻留在属性服务器内部。通过属性协议、属性客户端以及属性服务器实现数据传输。无论采用低功耗蓝牙还是经典蓝牙,每台设备最多配备一个属性服务器和一个属性数据库。对于低功耗蓝牙设备,由于必须支持通用访问规范(GAP)服务,因此每个低功耗蓝牙设备都需要配备一个属性服务器和一个属性数据库。为了满足加入电量指示服务的需求,每个设备只需额外增加3种或更多属性即可。

全部评论 (0)

还没有任何评论哟~