介绍
ATT,Attribute Protocol,用于发现、读、写对端设备的协议(针对BLE设备)
ATT允许蓝牙远程设备(比如遥控器)作为服务端提供拥有关联值的属性集,让作为客户端的设备(比如手机、电视)来发现、读、写这些属性;同时服务端能主动通知客户端
ATT定义了两种角色: 服务端(Server)和客户端(Client),一个设备可以同时拥有Server和Client;而一个Server可以支持多个Client。
ATT中的属性包含下面三个内容
- Attribute Type : 由UUID(Universally Unique IDentifier)来定义
- Attribute Handle : 用来访问Attribute Value
- A set of Permissions : 控制是否该Attribute可读、可写、属性值是否通过加密链路发送
相关概念
Attribute Type
Attribute Type由UUID唯一指定,UUID是一个128-bit值。但在使用过程中,为了提高效率,使用的是16-bits Attribute UUID,其他bit都是固定值。
128-bit UUID = 16-bit Attribute UUID*2^96 + Bluetooth_Base_UUID
Bluetooth_Base_UUID = 00000000-0000-1000-8000-00805F9B34FB
更简单的办法如下(xxxx代表十六进制的16-bit UUID)
0000xxxx-0000-1000-8000-00805F9B34FB
TIP: 16-bit Attribute UUIDs与SDP 16-bit UUIDs相同,参考《16-bit UUID Numbers Document.pdf》
Attribute Handle
Attribute Handle是由Server分配的一个唯一且非零16-bit值,用于检索Attribute。
0x0000 : 保留
0xFFFF : 最大Attribute Handle
Attribute Handle Grouping
Attribute Handle Grouping是一组由高层协议定义的属性,他们位于其他属性之前。
可以这么理解:ATT只是提出Grouping概念,并没有具体说明他怎么实现,而它由高层协议来定义,作用是方便组织、管理、访问很多Attribute。
Attribute Value
Attribute Value以字节为最小单位,可以是1byte的数值,4byte数值、字符串等待,当属性值太长时,可通过多个PDUs发送
Attribute Permissions
属性都有一组与之相关联的Permission Values,一个属性的权限由高层协议定义,并对ATT不可见。也就是说ATT只说明了属性可以被附加上什么权限,而不针对具体某个Attribute需要某种权限。
当访问一个安全属性需要一个认证的链路,而Client没有足够的权限,Server则响应一个Error Code(Insufficient Authentication),Client收到Error Code后应该尝试认证该链路,成功后即可访问该安全属性
当访问一个安全属性需要一个加密的链路,而链路没有加密,Server则响应一个Error Response(Insufficient Encryption),Client收到Error Response后应该尝试加密该链路,成功后即可访问该安全属性
当访问一个安全属性需要一个加密的链路,链路有加密,但是对于所需要的安全级别来说加密Key Size太短
Server则响应一个Error Code(Insufficient Encryption Key Size),Client收到Error Response后应该尝试使用更长的Key Size加密该链路,成功后即可访问该安全属性
Attribute Permissions由下列三个权限组合而成
- Access Permissions : 决定Client是否可读、写属性值 ~ Readable ~ Writable ~ Readable and Writable
- Authentication Permissions : 决定是否需要一个认证的物理链路(Authenticated Physical Link) ~ Authentication Required ~ No Authentication Required
- Authorization Permssions : 决定Client在访问属性值前是否需要授权 ~ Authorization Required ~ No Authorization Required
Control-Point Attribute
不可读、可写、可通知(Notified)和可指示(Indicated)的属性被称为Control-Point Attribute。高层协议可使用该属性来使能设备特定过程,比如设备上一个给定过程的命令或指示已经完成。
Exchanging MTU Size
ATT_MTU定义了Client和Server之间数据包的最大值;其默认值由高层协议来定义。Client和Server可通过Exchange MTU Request and Response PDUs来交换最大数据包,然后均使用交换值中的最小值进行通信,同时作为Server和Client的设备应该使用相同的Client Rx MTU和Server Rx MTU。
Long Attribute Value
在单一数据包中可发送最长的属性大小为[ATT_MTU –1] octets;但在一个Attribute PDU中至少包含Attribute Opcode等其他内容,如果属性值比[ATT_MTU-1] octets大则称为Long Attribute,对于Long Attribute
- 使用Read Blob Request来读取整个属性(Attribute > [ATT_MTU-1] octets)
- 使用Prepare Write Request和Execute Write Request来写整个属性(Attribute > [ATT_MTU-3] octets)
ATT无法决定属性值是否大于[ATT_MTU] octets,但是高层协议Can Tell,最大的属性值为512 octets
Atomic Operation
Server应该将Client的每个请求或命令视为不受影像的原子操作。如果一个链路由于某种原因断开,高层协议应当对属性值的修改负责。
Attribute PDU
Attribute PDU格式如下
Opcode:每个Attribute PDU都有一个唯一的操作码,用于区分不同的PDU。
Authentication Signature Flag取值如下:
- 1: PDU包含Authentication Signature(12 octets), X为13
- 0: PDU不包含Authentication Signature, X为1
当Attribute PDU包含Authentication Signature时,则该PDU不应该通过加密链路传输
Command Flag取值如下:
- 1: PDU为一个Command
注意: 只有Write Command可能包含一个Authentication Signature
Method:ATT使用Protocol Methods来发现、读、写、通知、指示属性,方法可分为如下几种。
- Requests : Client->Server, 请求回应 - Responses : Server->Client, 响应请求. - Commands : Client->Server, 命令 - Notifications : Server->Client, 服务端通知 - Indications : Server->Client, 请求确认 - Confirmations : Client->Server, Ind确认
在下文的每个PDU的格式里面第一个域都是opcode。ATT只有十几个Opcode,所有没有必要为这些Opcode按6种Protocol Methods进行分类,只要知道它们有不同的用法。
ATT是一种Sequential Protocol,这意味着在执行下一个动作前应该得到相应的回应
ATT将Request-Response和Indication-Confirmation Pair看出一个单一的事务(Transaction)
常见的Attribute PDU
Error Handing
Error Response用来声明一个给定的请求无法完成,并给出原因
Error Code取值参考core_v4.2 Vol 3, Part F 3.4.1.1, 若Client无法理解(如ErrorCode为更新版本中定义), 则认为是未知原因。
MTU Exchange
-
Exchange MTU Request
Client使用MTU Exchange Request来告知所支持的最大接收MTU size,同时请求Server回应Server所支持的最大接收MTU size。
Client Rx MTU>= default ATT_MTU;
该请求在一个连接中仅发送一次,Client Rx MTU应当设置为Client所能接收ATT PDU的最大值 -
Exchange MTU Response
Server使用Exchange MTU Response来回应来自Client的Exchange MTU Request
Server Rx MTU>= default ATT_MTU;Server Rx MTU应当设置为Server所能接收ATT PDU的最大值
当完成Req-Rsp后,Server和Client将ATT_MTU均设置为Client Rx MTU和Server Rx MTU中的较小值
ATT_MTU生效时机
- Server : Response发送后、其他ATT PDU发送前 - Client : Response接收后、其他ATT PDU发送前
当其中任一值小于默认ATT_MTU大小时认为该值不正确,此时应当将ATT_MTU设置为默认值
当一个设备同时作为Client和Server,不同角色时ATT_MTU值应当相同(详细规则可参看规范)
- Find Information
A. Find Information Request
Find Information Request被用来获取与Attribute Handles相关联的类型,Client使用该请求来发现Server上的Attribute-Type列表。
读取所有Attributes
- Starting Handle : 0x0001 - Ending Handle : 0xFFFF
规则
- Starting Handle <= Ending Handle : Response PDU或Error Response<Attribute Not Found> - Starting Handle > Ending Handle : Server回应Error Response<Invalid Handle> - Starting Handle = 0x0000 : Server回应Error Response<Invalid Handle>
Server不应该回应以下Error Code的Error Response
- <Insufficient Authentication> - <Insufficient Authorization> - <Insufficient Encryption Key Size> - <Application Error>
B. Find Information Response
Response PDU中应当包含完整的Handle-UUID对;这意味着Handle-UUID对应该在单一的回应报文中;同时Response PDU按照Handle的升序回应。
Format参数有两个可能值
当一个Response PDU无法装下所有的Handle-UUID对时;Client以新的Starting Handle发起另一个Find Information Request来获取未回应的信息。
C. Find By Type Value Request
该Req用来获取指定16-bit UUID Attribute Type和Attribute Value的Attribute Handles
读取所有Attributes
- Starting Handle : 0x0001
- Ending Handle : 0xFFFF
其他规则与Find Information Request相似
D. Find by Type Value Response
Handles Information List包含一个或多个Handle Information列表
规则与Find Information Response相似
- Reading Attributes
A. Read By Type Request
Read By Type Request用来获取Attribute Values(Client已知Attribute Type但不知Attribute Handle)
查找所有Attributes
- Starting Handle : 0x0001
- Ending Handle : 0xFFFF
TIP : 所有的Attribute Type通过128-bit UUID进行比较,即使提供的是16-bit UUID
规则
- Starting Handle <= Ending Handle : Response PDU或Error Response<Attribute Not Found>
- Starting Handle > Ending Handle : Server回应Error Response<Invalid Handle>
- Starting Handle = 0x0000 : Server回应Error Response<Invalid Handle>
该报文中Attribute Type的长度应当相同,否则需要重新发起另一次请求
当Client因为安全原因无法访问时,Server应该回应Error Response
- <Insufficient Authentication>
- <Insufficient Authorization>
- <Insufficient Encryption Key Size>
- <Insufficient Encryption>
一些其他权限原因导致无法读时,则回应
- <Read Not Permitted>
B. Read By Type Response
Attribute Data Field字段是Attribute Handle-Value列表
Read By Type Response包含完整的Handle-Value对;这意味着Handle-Value对应该在单一的回应报文中;同时Response PDU按照Handle的升序回应
Handle-Value对的最大长度为255 octets,即Length参数;故最大的Attribute Value为(Length-2)=253 octets
在回应的Handle-Value列表中
- Attribute Value > (ATT_MTU-4)/253 octets部分 : Client重新请求Read Blob Request来获取
- Attribute Value <= (ATT_MTU-4)/253 octets部分 : Rsp PDU中回应
C. Read Request
Read Request用来请求Attribute Value
Attribute Handle应该为一个有效的Handle;否则回应Error Response;因安全问题无法访问的回应同Read By Type Request。
D. Read Response
当Attribute Value长度超过(ATT_MTU-1)时,前(ATT_MTU-1) octets应该被回应;Client发起Read Blob Request来获取剩下数据
E. Read Blob Request
用来获取Handle指定Offset的Attribute Value
F. Read Blob Response
当Value Offset等于Attribute Value的长度时,回应0;当Attribute Value大于(Value Offset + ATT_MTU-1)时,回应Attribute Value从Value Offset开始的(ATT_MTU-1)个octets
G. Read Multiple Request
用来请求两个或更多的属性集的值
H. Read Multiple Response
I. Read by Group Type Request
用来请求已知Attribute Type的属性值
J. Read by Group Type Response
Attribute Data格式如下
- Writing Attributes
A. Write Request
用来写属性值
B. Write Response
用来通知Client属性值已成功写入
C. Write Command
用来写属性值,通常为Control-Point Attribute
D. Signed Write Command
用来写属性值,包含一个Authentication Signature,通常为Control-Point Attribute
-
Queued Writes
将多个属性值写操作以FIFO方式入队,然后再一个原子操作中进行。
省略。。。。 -
Server Initiated
A. Handle Value Notification
Server可以在任何时候向Client发送Attribute Value的通知
B. Handle Value Indication
Server可以发送Attribute Value的指示(Indication)
C. Handle Value Confirmation
用来回应Handle Value Indication,确认Ind已接收