ATT(Attribute Protocol)——Protocol requirement

Introduction

每个属性都有一个属性类型,该类型通过UUID(通用唯一标识符)来标识属性所代表的内容,这样客户端就能理解服务器所暴露的属性。每个属性都有一个属性句柄,用于在服务器上访问该属性,以及一个属性值。

属性值是通过其属性句柄来访问的。客户端使用属性协议PDU(协议数据单元)来发现属性句柄。在服务器上,具有相同属性类型的属性可能存在多次。属性还有一组权限,用于控制它们是否可以被读取或写入,或者属性值是否应该通过加密链路发送。属性协议的安全方面在第4节中定义。

简单来说,属性类型使得客户端能够理解属性的含义,而属性句柄则提供了访问服务器上特定属性的方式。属性值代表了属性的具体内容。此外,每个属性都有其权限设置,以确保数据的安全性和访问控制。在属性协议中,安全是一个重要的考虑因素,它确保了数据在传输过程中的机密性和完整性。

Basic concepts

Attribute type

通用唯一标识符(UUID)用于标识每种属性类型。UUID被认为是跨越所有空间和时间都是唯一的。任何人都可以独立创建UUID,并根据需要进行分发或发布。UUID没有中央注册表,因为它们是基于不会重复的唯一标识符生成的。属性协议允许设备在读取或写入请求中使用UUID来识别属性类型,而不论在本地用于标识这些属性的句柄是什么。

通用唯一标识符在SDP(服务发现协议)的第3卷B部分第2.5.1节中定义。当属性UUID包含在ATT(属性协议)PDU中时,所有32位的属性UUID都应转换为128位的UUID。

这意味着,尽管UUID可以以不同的位数(如32位)存在,但在属性协议的通信过程中,为了确保一致性和兼容性,这些较短的UUID会被扩展或转换为128位的UUID格式。这样的设计使得属性协议能够灵活地处理各种大小和格式的属性标识符,同时确保了跨设备和系统的唯一性和互操作性。

 Attribute handle

属性句柄是一个16位的值,由每个服务器分配给其自己的属性,以便客户端能够引用这些属性。在客户端和服务器之间存在ATT承载(bearer)时,属性句柄不应被重复使用。在任何给定的服务器上,属性句柄应具有唯一且非零的值。属性是按照属性句柄的顺序进行排序的。

值为0x0000的属性句柄保留供将来使用。而值为0xFFFF的属性句柄被称为最大属性句柄。

简单来说,属性句柄是服务器用于唯一标识其属性的一个短标识符。客户端通过发送包含特定属性句柄的请求来访问或操作服务器的属性。由于属性句柄在客户端和服务器之间的会话期间是唯一的,因此可以确保请求能够准确地定位到目标属性。同时,属性句柄的排序也便于客户端遍历服务器的属性集合。而保留的属性句柄值则用于特殊目的或未来的扩展

Attribute handle grouping

分组是由一个特定属性定义的,该属性位于其他被分组属性的范围之首,这一分组方式由更高层次的规范所定义。客户端可以请求与一组属性相关联的第一个和最后一个句柄(handle)。

分组机制允许将一系列相关的属性归为一组,并通过特定的属性(即组的首属性)来标识这个组。客户端可以请求这个组的起始和结束属性的句柄,以便进一步操作或访问这些属性。

Attribute value

属性值是一个八位字节(octet)数组,其长度可以是固定的,也可以是可变的。例如,它可以是一个一字节的值、一个四字节的整数,或者是一个可变长度的字符串。一个属性可能包含一个值,该值太大而无法在单个协议数据单元(PDU)中传输,因此可以使用多个PDU来发送。传输的值对于属性协议来说是不透明的,这些八位字节数组的编码由属性类型定义。

在请求、响应、通知或指示中传输属性值时,大多数PDU的任何字段中都不会发送属性值长度。在这些PDU中,可变长度字段的长度是由承载该PDU的数据包的长度隐式给出的。这意味着:

a) 除非属性值的长度由属性类型定义且服务器和客户端都已知,否则单个请求、响应、通知或指示中只能放置一个属性值。

b) 该属性值将始终是请求、响应、通知或指示中的唯一可变长度字段。

c) 承载协议(例如L2CAP)会保留数据报边界。

注意:一些响应包含多个属性值,例如当客户端请求读取多个属性时。为了确定属性值的边界,属性值必须具有由属性类型定义的固定大小。

有些PDU包含作为字段的属性值长度,因此上述含义不适用于这些PDU。

简而言之,属性值在传输时通常不会附带其长度信息,而是依赖于承载协议和数据包边界来确定其完整性和边界。在需要明确区分多个属性值的情况下,属性值必须具有固定的长度或通过其他机制来指示其边界。

Attribute permissions

属性具有一组与其关联的权限值。与属性关联的权限指定可以读取和/或写入属性。与该属性关联的权限指定了用于读取和/或写入访问以及通知和/或指示的所需的安全级别。给定属性的权限由更高层规范定义,使用属性协议无法发现

如果访问安全属性需要经过身份验证的链接,并且客户端尚未通过具有足够安全性的服务器进行身份验证,则应发送ATT_ERROR_RSP PDU,并将错误代码参数设置为身份验证不足(0x05)。当客户端收到此错误代码时,它可能会尝试对链接进行身份验证,如果身份验证成功,则可以访问安全属性。

如果访问安全属性需要加密链接,而该链接未加密,则应发送ATT_ERROR_RSP PDU,并将错误代码参数设置为加密不足(0x0F)。当客户端收到此错误代码时,它可能会尝试加密链接,如果加密成功,则可以访问安全属性。

如果访问安全属性需要加密链接,并且该链接是加密的,但加密密钥大小对于所需的安全级别来说太短,则应发送ATT_ERROR_RSP PDU,并将错误代码参数设置为加密密钥大小太短(0x0C)。当客户端收到此错误代码时,它可能会尝试用更长的密钥大小加密链接,如果加密成功,它就可以访问安全属性。

属性权限是访问权限、加密权限、身份验证权限和授权权限的组合。

可能有以下访问权限:可读,可写,可读和可写

可能有以下加密权限:需要加密,不需要加密

可能有以下身份验证权限:要求身份验证,不需要身份验证

可能有以下授权权限:需要授权,不需要授权

加密、身份验证和授权权限可能有不同的可能性,例如,特定属性可能需要特定类型的认证或某个最小加密密钥长度。一个属性可以有多个适用的权限组合;例如,特定属性可以允许以下任何一项:

•加密时读取(不需要身份验证)

•验证和加密时写入

•验证和授权时读取或写入(不考虑加密)

服务器使用访问权限来确定客户端是否可以读取和/或写入属性值。

服务器使用身份验证权限来确定客户端尝试访问属性时是否需要经过身份验证的物理链接。服务器还使用身份验证权限来确定在向客户端发送通知或指示之前是否需要经过身份验证的物理链接

授权权限决定客户端在访问属性值之前是否需要授权。

同一客户端的不同承载可能位于具有不同安全属性的链路上。因此,服务器不能假设当客户端在承载一个承载的链路上经过身份验证时,它在所有承载上都经过了身份验证。不同的安全属性可能具有实现需要考虑的其他含义

Control-point attributes

无法读取但只能写入、通知或指示的属性称为控制点属性。这些控制点属性可由更高层使用,以启用特定于设备的程序,例如在设备上完成给定程序时写入命令或指示。

Protocol methods

属性协议使用第3.4节中定义的方法来查找、读取、写入、通知和指示属性。方法分为命令、请求、响应、通知、指示或确认;见第3.3节。一些属性协议PDU还可以包括身份验证签名,以允许对该PDU的发起者进行身份验证,而不需要加密。该方法和带符号位被称为操作码。

 Exchanging MTU size

ATT_MTU定义为客户端和服务器之间发送的任何数据包的最大大小。更高层规范定义了默认的ATT_MTU值。

当使用具有固定连接标识符(CID)的L2CAP通道时,客户端和服务器可以选择性地通过ATT_EXCHANGE_MTU_REQ和ATT_EXCHANGE_MTU_RSP协议数据单元(PDU)交换能够接收的最大数据包大小。然后,这两个设备在后续的所有通信中都使用这些交换值中的最小值(参见第3.4.2节)。同时充当服务器和客户端的设备应为客户端接收MTU(Client Rx MTU)和服务器接收MTU(Server Rx MTU)使用相同的值。

当使用具有动态分配CID的L2CAP通道时,ATT_MTU应设置为L2CAP MTU大小

ATT_MTU值是针对每个ATT承载的值。具有多个ATT承载的设备可能为每个ATT承载具有不同的ATT_MTU值。

简而言之,ATT_MTU(最大传输单元)是ATT协议中用于确定单个ATT PDU可以携带的最大数据量的参数。当使用L2CAP作为传输层时,ATT_MTU的值可能受到L2CAP MTU大小的限制,并且可以通过协商来确定。对于具有多个ATT承载的设备,每个承载可能有不同的ATT_MTU值,这取决于该承载所使用的L2CAP通道的特性。通过交换MTU请求和响应PDU,客户端和服务器可以协商并确定它们之间通信时使用的ATT_MTU值。

Long attribute values

在单个数据包中能够发送的最长属性大小为(ATT_MTU-1)个字节(octet)。至少,属性操作码(Opcode)会被包含在属性协议数据单元(PDU)中。如果一个属性值的定义大小超过了(ATT_MTU-1)个字节,那么这些属性就被称为长属性。

为了读取大小超过(ATT_MTU-1)个字节的属性的整个值,需要使用ATT_READ_BLOB_REQ PDU。使用ATT_READ_REQ PDU可以读取长属性值的前(ATT_MTU-1)个字节。

对于写入大小超过(ATT_MTU-3)个字节的属性的整个值,需要使用ATT_PREPARE_WRITE_REQ和ATT_EXECUTE_WRITE_REQ PDU。使用ATT_WRITE_CMD PDU可以写入长属性值的前(ATT_MTU-3)个字节。

根据此协议,无法确定一个属性值是否超过(ATT_MTU-3)个字节。更高层的规范将规定某个属性是否具有超过(ATT_MTU-3)个字节的最大长度。

属性值的最大长度应为512个字节。

注意:当使用多个属性协议数据单元读取属性值时,属性值在读取过程中发生改变的保护责任由更高层承担。这意味着,如果需要确保读取过程中属性值的一致性,可能需要采取额外的措施来防止在读取过程中属性值被修改。这些措施可能包括锁定属性值、使用事务处理或其他同步机制。

Atomic operations

服务器应将每个请求或命令视为一个原子操作,不受另一个ATT载体同时发送请求或命令的影响。如果ATT承载因任何原因(用户操作或无线电链路丢失)而终止,则任何修改属性的值都是更高层规范的责任。

长属性不能在单个原子操作中读取或写入

ATT bearers

ATT承载(ATT bearer)是用于发送属性协议数据单元(PDU)的通道。每个ATT承载都使用L2CAP通道,这个通道可以是动态分配的通道,也可以是LE属性协议的固定通道(参见[第3卷]第A部分,第2.1节)。一个设备可能对等设备有多个动态分配的通道作为ATT承载,但最多只能有一个固定通道作为ATT承载。

ATT承载将一个设备上的ATT客户端连接到对等设备上的ATT服务器,并且也可能将第一个设备上的ATT服务器连接到对等设备上的ATT客户端。接收到的属性PDU是为ATT客户端还是为ATT服务器准备的,这取决于PDU的类型(参见第3.3节)。

L2CAP通道模式决定了在该ATT承载上属性协议的行为。如果L2CAP通道模式使用基于增强信用的流控制模式,则该ATT承载被称为增强ATT承载。任何不是增强ATT承载且使用任何其他L2CAP通道模式的ATT承载都被称为非增强ATT承载。

除非明确说明,否则使用基于增强信用的流控制模式的增强ATT承载的行为应与不使用基于增强信用的流控制模式的ATT承载的行为相同。

当L2CAP通道(如果是动态分配的)或底层物理链路断开时,ATT承载将终止。

LE固定通道只能通过断开物理链路来终止。

更高层的规范可能要求使用增强ATT承载。

简而言之,ATT承载是属性协议在L2CAP通道上的实现,它允许设备之间交换属性数据。根据L2CAP通道模式的不同,ATT承载可以是增强的或非增强的。增强ATT承载使用基于增强信用的流控制模式,以提供更有效的数据传输。ATT承载的终止与L2CAP通道或物理链路的断开有关。

Attribute PDU

属性PDU有六种类型之一,如表3.1所示,由PDU名称的后缀表示

服务器应能够接收并正确响应以下请求PDU:

•ATT_FIND_INFORMATION_REQ

•ATT_READ_REQ

服务器中所有其他PDU类型的支持可以在更高层规范中指定,见第3.4.8节。

如果客户端发送请求,则客户端应支持该请求的所有可能的响应PDU。

如果服务器收到它不支持的请求,则服务器应使用ATT_ERROR_RSP PDU进行响应,其中错误代码参数设置为请求不支持(0x06),属性句柄错误设置为0x0000。

如果服务器收到它不支持的命令,如PDU的命令标志设置为1所示,则服务器应忽略该命令。

如果服务器收到无效请求,例如PDU长度错误,则服务器应使用ATT_ERROR_RSP PDU进行响应,其中错误代码参数设置为无效PDU(0x04),属性句柄错误设置为0x0000。

如果服务器没有足够的资源来处理请求,则服务器应使用ATT_ERROR_RSP PDU进行响应,其中错误代码参数设置为资源不足(0x11),属性句柄错误设置为0x0000。

如果服务器在处理此请求时遇到错误而无法处理请求,则服务器应使用ATT_ERROR_RSP PDU进行响应,其中错误代码参数设置为不太可能错误(0x0E),属性句柄错误设置为0x0000

Attribute PDU format

属性PDU具有以下格式:

属性协议中的多字节字段应首先发送最低有效八位字节(小

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值