安卓蓝牙ATT协议介绍

介绍

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

  1. 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的最大值

  2. 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值应当相同(详细规则可参看规范)

  1. 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相似

  1. 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格式如下
在这里插入图片描述

  1. Writing Attributes
    A. Write Request
    用来写属性值
    在这里插入图片描述
    B. Write Response
    用来通知Client属性值已成功写入
    在这里插入图片描述
    C. Write Command
    用来写属性值,通常为Control-Point Attribute
    在这里插入图片描述
    D. Signed Write Command
    用来写属性值,包含一个Authentication Signature,通常为Control-Point Attribute

在这里插入图片描述

  1. Queued Writes
    将多个属性值写操作以FIFO方式入队,然后再一个原子操作中进行。
    省略。。。。

  2. 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已接收

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/suwen8100/article/details/131300496