这个章节我们继续来看下ATTRIBUTE PROTOCOL(ATT)和GENERIC ATTRIBUTE PROFILE (GATT)协议。
ATT和GATT分别位于Vol 3: Host中的Part F和Part G部分。
首先先普及下两个名词:Client和Sever。
Client:客户端,需要获取属性attributes数据
Sever:服务器,属性attributes数据的持有者
1. ATT协议简介
The Attribute protocol defines two roles: a server role and a client role.具体含义上面已经解释。
这里所说的属性Attribute,包含以下几个内容:
a) 属性类型 attribute type, defined by a UUID
b) 属性句柄 attribute handle
c) 访问权限:a set of permissions that are defined by each higher layer specification that utilizes the attribute; these permissions cannot be accessed using the Attribute protocol.
其中属性类型是一组UUID标识的,由蓝牙SIG联盟定义的Assigned Numbers:
属性句柄可以理解为端口号,或者理解为内存地址,范围为0x0001~0xFFFF。
访问权限表明了上层是否能够对这个属性句柄进行访问,一般也是由上层application规定的。
2. ATT基本概念
2.1 Attribute type
属性类型可能有许多种,如温度、体积、时间等,任何一个传感器的设备数据类型都可以成为一个属性类型。为了区别这些传感器的属性类型,spec定义了这个128bit的UUID来标识。一般我们在传输UUID时候只使用16bit的UUID,这是因为:
蓝牙UUID基数 + 16bit UUID = 128bit UUID
2.2 Attribute handle
属性句柄是指同等属性类型下,有多个数据需要传输的情况。例如某个设备具有两个温度传感器,为了区分这两个温度传感器,我们使用相同的属性类型,但是不一样的属性句柄。
这里还有一个Attribute handle grouping的概念,即属性句柄组。代表着一组属性句柄的意思。
2.3 Attribute value
属性值,这其实是最关键的数据。传输的数据实体被写入在属性值中。它的长度是不固定的,由上层appl规定数据长度。属性值的长度不固定,但是有一点需要注意:如果属性值数据长度较长,L2CAP会对其进行分割。无论L2CAP将ATT的数据如何分割,必须保证一次传输只能传输一个属性类型的数据。
2.4 Attribute permissions
属性权限可以理解为对属性值能够进行操作的权限,可以包括access permissions, encryption permissions, authentication permissions和authorization permissions.
access permissions有以下3种情况:
• Readable 可读
• Writeable 可写
• Readable and writable 可读可写
举个简单的例子,当客户端需要读取一个服务器的属性值时候。服务器在收到请求后,首先检查这个属性的access permissions,如果不可读,那么就会回馈一个属性不可读的错误。
encryption permission