蓝牙核心规范V5.2)7.7-深入详解之GATT(2)

网友投稿 804 2022-05-30

蓝牙篇之蓝牙核心规范(V5.2)深入详解汇总

目录

4.GATT功能要求

4.2 功能支持和过程映射

4.3 服务器配置

4.3.1 交换MTU

4.4 主要服务发现

4.4.1发现所有的主要服务

4.4.2通过服务UUID发现主服务

4.5 关系发现

4.5.1 查找包括的服务

4.6 特征性发现

4.6.1 发现一个服务的所有特征

4.6.2通过UUID发现特征

4.7 特征描述符的发现

4.7.1 将发现所有的特征描述符

4.9 特征价值写

4.9.1  没有响应就可以写

4.9.2 没有响应的签名写

4.9.4 写长特征值

4.9.5 可靠的写

4.10 特种值通知

4.10.1通知

4.10.2 多变量长度通知

4.11 特征值指示

4.12 特征描述符

4.12.1 读特征描述符

4.12.2 可以阅读长时间的特征描述符

4.12.3 写特征描述符

4.12.4 编写长时间的特征描述符

4.13 GATT过程映射到ATT协议操作码

4.14 程序超时

5 L2CAP互操作性要求

5.1 BR/EDR L2CAP互操作性要求

5.1.1 ATT_MTU

5.1.2 BR/EDR通道要求

5.2 LE L2CAP 互操作性要求

5.2.1 ATT_MTU

5.2.2 LE通道要求

5.3 增强的ATT承载者L2CAP的互操作性要求

5.3.1 ATT_MTU

5.3.2 通道要求

5.4 L2CAP减轻碰撞

5.5 承载支持

6 GAP的互操作性要求

6.1 BR/EDR GAP互操作性要求

6.1.1 连接建立

6.2 LE GAP的互操作性要求

6.2.1 连接建立

6.2.2 配置文件角色

6.3 断开连接的事件

6.3.1 断开连接时的通知和指示信息

7 通用属性配置文件服务定义

蓝牙核心规范(V5.2)7.7-深入详解之GATT(2)

7.1 服务变更

7.2 客户端支持的功能

7.3 数据库哈希

7.3.1 数据库哈希计算

7.4 服务器支持的特性

8.GATT的安全考虑

8.1 认证要求

8.2 授权要求

9.SDP的互操作性要求

4.GATT功能要求

在GATT配置文件中定义了11个特性:

1.服务器配置

2.主服务发现

3.关系的发现

4.特征发现

5.特征描述符发现

6.读取一个特征值

7.写一个特征值

8.关于一个特征值的通知

9.一个特征值指示

10.阅读一个特征描述符

11.编写一个特征描述符

每个特性都被映射到过程和子过程。这些过程和子过程描述了如何使用属性协议来完成相应的特性。

4.2 功能支持和过程映射

表4.1将每个特性映射到用于该特性的过程,并指示该过程对于该特性是可选的还是强制性的。这些过程在参考部分中描述.

如果在任何ATT承载上都支持ATTPDU,则它在所有支持的ATT承载上都应得到支持,但例外情况除外:

ExchangeMTU子程序应仅在LE固定通道未增强的ATT承载上得到支持。

•无响应签名写子程序仅在LE固定通道无增强ATT承载上得到支持。

4.3 服务器配置

客户端将使用此过程来配置属性协议。此过程只有一个用于设置MTU大小的子程序。

4.3.1 交换MTU

客户端使用此子过程将ATT_MTU设置为大于属性协议的默认ATT_MTU时,将其设置为两个设备可能支持的最大值。此子程序只能在连接期间启动一次。

此子程序不得用于BR/EDR物理链路,因为MTU大小是通过L2CAP通道配置程序进行协商的。

此子过程使用了ATT_EXCHANGE_MTU_REQPDU。客户端RxMTU参数应设置为该客户端可以接收到的最大MTU。

可以从服务器为ATT_-EXCHANGE_MTU_REQPDU发送两个可能的响应:ATT_EXCHANGE_MTU_RSP和ATT_ERROR_RSPPDU。

如果服务器上发生错误,则返回ATT_ERROR_RSPPDU。

服务器应使用ATT_EXCHANGE_MTU_-RSPPDU响应此消息,并将ServerRxMTU参数设置为该服务器可以接收到的最大MTU。

如果ATT_ERROR_RSPPDU由服务器发送,错误代码设置为不支持请求,则不支持属性操作码,并且应使用默认的MTU。

一旦消息被交换,ATT_MTU应被设置为客户端RxMTU和服务器RxMTU值的最小值。

4.4 主要服务发现

客户端使用此过程来发现服务器上的主服务。一旦发现了主服务,就可以使用其他过程访问有关主服务的其他信息,包括特征发现和关系发现,以查找其他相关的主服务和辅助服务。

有两个子过程可用于主服务发现:发现所有主服务和通过服务UUID发现主服务。

4.4.1发现所有的主要服务

此子过程用于发现服务器上的所有主服务。

ATT_READ_BY_GROUP_TYPE_REQ PDU应与属性类型参数设置为主服务的UUID一起使用。起始手柄设置为0x0001,结束手柄设置为0xFFFF。

可以从服务器为ATT_READ_BY_-GROUP_TYPE_REQ PDU发送两个可能的响应:ATT_READ_BY_GROUP_TYPE_RSP和ATT_-ERROR_RSP PDU。

如果服务器上发生错误,则返回ATT_ERROR_RSP PDU。

ATT_READ_BY_GROUP_TYPE_RSPPDU返回与服务器支持的服务对应的属性句柄、结束组句柄和属性值元组的列表。响应中包含的每个属性值都是服务器支持的服务的服务UUID。属性句柄是服务声明的句柄。最终句柄是服务定义中的最后一个属性的句柄。设备中最后一个服务的端组句柄可以为0xFFFF。ATT_READ_BY_GROUP_TYPE_REQPDU应再次发出,启动手柄设置为大于ATT_READ_BY_GROUP_TYPE_RSPPDU中的最后一个端组手柄。

当收到ATT_ERROR_RSPPDU且错误代码设置为属性或“按类型读取组响应”中的结束组句柄为0xFFFF时,此子过程将完成。

如果在发现服务器上的所有主服务之前找到了所需的主服务,则允许提前结束子过程。

服务声明指定了服务声明是可读的,不需要身份验证或授权,因此不应出现不足的身份验证或读取不允许的错误。

图4.2:发现所有主节点服务的示例

4.4.2通过服务UUID发现主服务

当只知道服务UUID时,客户端将此子过程用于发现服务器上的特定主服务。特定的主服务可能在服务器上存在多次。正在发现的主服务由服务UUID标识。

ATT_FIND_BY_TYPE_VALUE_REQPDU应与属性类型参数设置为主服务的UUID,属性值设置为16位蓝牙UUID或128位UUID一起使用。起始手柄设置为0x0001,结束手柄设置为0xFFFF。

可以从服务器为ATT_FIND_BY_-TYPE_VALUE_REQPDU发送两个可能的响应:ATT_FIND_BY_TYPE_VALUE_RSP和ATT_ERROR_RSP PDU。

如果服务器上发生错误,将返回ATT_ERROR_RSP PDU。

ATT_FIND_BY_TYPE_VALUE_RSPPDU返回一个属性句柄范围的列表。属性句柄范围是服务定义的起始句柄和结束句柄。设备中最后一个服务的端组句柄可以为0xFFFF。如果返回正在搜索的服务UUID的属性句柄范围,而结束发现句柄不是0xFFFF,则可以再次发出ATT_FIND_BY_TYPE_VALUE_REQ PDU,并将启动句柄设置为大于ATT_FIND_BY_TYPE_VALUE_RSP PDU中的最后一个属性句柄范围的1。

如果在发现服务器上支持的指定服务UUID的所有主服务之前找到了所需的主服务,则允许提前结束子过程。

服务声明指定了服务声明是可读的,不需要身份验证或授权,因此不会出现不足的身份验证或读取不允许的错误。

图4.3:通过服务UUID发现主服务的示例

4.5 关系发现

此过程用于发现与其他服务的服务关系。

有一个子过程可以用于关系发现:查找包含的服务。

4.5.1 查找包括的服务

客户端将此子过程用于查找服务器上的服务定义中的包括服务声明。指定的服务由服务句柄范围进行标识。

ATT_READ_BY_TYPE_REQPDU应与属性类型参数设置为UUID一起使用,包括起始手柄应设置为指定服务的起始句柄,终止手柄应设置为指定服务的终止句柄。如果在发现服务器上支持的指定服务的所有包含服务之前找到所需包含的服务,则允许提前结束子过程。

可以从服务器为ATT_READ_BY_-TYPE_REQPDU发送两个可能的响应:ATT_READ_BY_TYPE_RSP和ATT_ERROR_RSP PDU。

如果服务器上发生错误,将返回ATT_ERROR_RSP PDU。

ATT_READ_BY_TYPE_RSPPDU返回一组与服务定义中包含的服务对应的属性句柄和属性值对。响应中包含的每个属性值都由包含的服务声明的属性句柄和结束组句柄组成。如果服务UUID是一个16位的蓝牙UUID,那么它也会在响应中返回。ATT_READ_BY_TYPE_RSP PDU应再次发出,启动手柄设置为大于ATT_READ_BY_TYPE_RSP PDU中的最后一个属性手柄。

当收到ATT_ERROR_RSPPDU,错误代码设置为“属性未找到”,或ATT_READ_BY_-TYPE_RSPPDU所包含服务声明的属性句柄与请求的结束句柄相同时,子过程将完成。

当包含的服务使用128位UUID时要获取包含的服务UUID,需要使用ATT_READ_REQPDU。ATT_READ_REQPDU的属性句柄是所包含的服务的属性句柄。

4.6 特征性发现

客户端使用此过程来发现服务器上的服务特性。一旦发现了这些特征,就可以使用其他过程来发现或访问有关这些特征的其他信息。

有两个子过程可以用于特征发现:发现服务的所有特征和通过UUID发现特征。

4.6.1 发现一个服务的所有特征

当只知道服务处理范围时,此子过程用于查找服务器上服务定义内的所有特性声明。指定的服务由服务句柄范围进行标识。

ATT_READ_BY_TYPE_REQP DU应与属性类型参数设置为UUID特性一起使用。开始手柄应设置为指定服务的开始手柄,结束手柄应设置为指定服务的结束句柄。

可以从服务器为ATT_READ_BY_TYPE_REQ PDU发送两个可能的响应:ATT_READ_BY_TYPE_RSP和ATT_ERROR_RSP PDU。

如果服务器上发生错误,则返回ATT_ERROR_RSP PDU.

ATT_READ_BY_TYPE_RSP PDU返回与服务定义中的特征对应的属性句柄和属性值对的列表。属性句柄是特性声明的句柄。属性值为特征属性、特征值手柄和特征UUID。ATT_READ_BY_TYPE_REQ PDU应再次发布,启动手柄设置为大于ATT_READ_BY_TYPE_RSP PDU中的最后一个属性手柄。

当接收到ATT_ERROR_RSPPDU且错误代码设置为“找不到属性”或ATT_READ_BY_TYPE_-RSPPDU具有与请求的结束句柄相同的属性句柄时,子过程将完成。

如果在发现服务器上支持的指定服务的所有特性之前找到了所需的特性,则允许提前结束子过程。

4.6.2通过UUID发现特征

当只知道服务处理范围且已知特征UUID时,客户端使用此子过程来发现服务器上的服务特征。特定的服务可能在服务器上多次存在。所发现的特征可以由特征UUID来识别。

ATT_READ_BY_TYPE_REQPDU用于执行子过程的开始。属性类型被设置为“特性的UUID”,开始手柄和结束手柄参数应被设置为服务手柄范围。

可以从服务器为ATT_READ_BY_TYPE_REQPDU发送两个可能的响应:ATT_READ_BY_TYPE_RSP和ATT_ERROR_RSPPDU。

如果服务器上发生错误,将返回ATT_ERROR_RSPPDU。

ATT_READ_BY_TYPE_RSPPDU返回与提供的句柄范围中包含的特性对应的属性句柄和属性值对的列表。列表中的每个属性值都是特征声明的属性值。属性值包含特征属性、特征值句柄和特征UUID。检查每个属性句柄和属性值对的属性值以有匹配的特性UUID。一旦找到,子过程将继续进行,直到服务处理柄范围结束为止。ATT_READ_BY_-TYPE_REQPDU再次发布,启动句柄设置为大于ATT_READ_BY_TYPE_RSPPDU中的最后一个属性句柄。

如果ATT_ERROR_RSPPDU是由服务器发送的,错误代码设置为属性未找到,则服务器在提供的句柄范围内不存在该特性。

如果在发现服务器上支持的指定服务的所有特性之前找到了所需的特性,则允许提前结束子过程。

第3.3节中描述的特性声明指定了特征声明是可读的,不需要身份验证或授权,因此不会出现不足的身份验证或读取不允许的错误。

图4.6:通过UUID示例发现特征

4.7 特征描述符的发现

客户端使用此过程来发现特征的特征描述符。一旦发现了特征描述符,就可以使用其他过程访问有关特征描述符的其他信息。

有一个子过程可以用于特征描述符的发现:发现所有特征描述符。

4.7.1 将发现所有的特征描述符

4.9 特征价值写

此过程用于将特征值写入服务器。

有五个子过程可以用来写特征值:无响应写、无响应签名写、写特征值、写长特征值和可靠写。

4.9.1  没有响应就可以写

此子过程用于在客户端知道“特征值句柄”,并且客户端不需要确认写入已成功执行时,将特征值写入服务器。此子过程只写入特征值的第一个(ATT_MTU-3)8位字节。此子程序不能用于写入长特征,而应使用“写入长特征值”子程序。

在此子过程中使用了ATT_WRITE_CMD PDU。属性句柄参数应设置为特征值句柄。属性值参数应设置为新的特征值。

如果特征值写入请求的大小错误,或者具有配置文件定义的无效值,则写入将不会成功,服务器也不会产生错误。

4.9.2 没有响应的签名写

此子过程用于在客户端知道特征值句柄且ATT承载未被加密时将特征值写入服务器。只有当启用了特性属性身份验证位,并且客户端和服务器设备共享[第3卷]C部分通用访问配置文件中定义的节点时,才应使用此子过程。

此子过程只写入属性值的第一个(ATT_MTU-15)字节。此子过程不能用于写入长属性。

图4.14:无响应的已签名写入示例

4.9.3 写特征值

此子过程用于在客户机知道特征值句柄时将特征值写入服务器。此子过程只写入特征值的第一个(ATT_MTU-3)八位节。此子过程不能用于写入长属性,而应使用“写入长特征值”子过程。

ATT_WRITE_REQPDU用于此子过程。属性句柄参数应设置为特征值句柄。属性值参数应设置为新的特性。

如果特征值写入成功,服务器应发送ATT_WRITE_RSP PDU。

如果客户端使用身份验证不足、授权不足、加密密钥大小不足,或者特征值禁止写操作,服务器应发送ATT_ERROR_RSPPDU以响应ATT_WRITE_REQ PDU。错误代码参数按照属性协议中的指定进行设置。如果写入的特征值大小错误,或者具有配置文件定义的无效值,则不写入该值,服务器将发送ATT_ERROR_RSP PDU,并将错误代码发送给应用程序错误。

4.9.4 写长特征值

此子过程用于在客户端知道特性值句柄,但特征值的长度超过在单个ATT_WRITE_REQPDU中可以发送的长度时,将特性值写入服务器。

ATT_PREPARE_WRITE_REQ和ATT_EXECUTE_WRITE_REQ pdu用于执行此子过程。属性句柄参数应设置为要写入的特征值的特征值句柄。零件属性值参数应设置为正在写入的属性值的部分。值偏移量参数应为要写入的特征值范围内的偏移量。要写入完整的特征值,第一个ATT_PREPARE_WRITE_REQ PDU的偏移量应设置为0x0000。后续ATT_PREPARE_WRITE_REQ pdu的偏移量是下一个尚未编写的八重奏。重复ATT_PREPARE_-WRITE_REQ PDU,直到传输完整的特征值,之后使用ATT_EXECUTE_WRITE_REQ PDU写入完整的值。

注意:在此子过程中,不需要对ATT_PREPARE_WRITE_RSPPDU中的值进行验证。

如果客户端使用身份验证不足、授权不足、加密密钥大小不足,或者特征值禁止写操作,服务器应发送ATT_ERROR_RSPPDU以响应ATT_PREPARE_WRITE_REQPDU。错误代码参数按照属性协议中的指定进行设置。如果写入的属性值大小错误,或配置文件定义的值无效,则写入不会成功,服务器将发送ATT_ERROR_RSPPDU,并将错误代码发送为应用程序错误。

4.9.5 可靠的写

此子程序用于在客户知道特征值句柄时将特征值写入服务器,并保证在执行写入之前通过将两个方向写入的特征值来写入正确的特征值。当必须在单个操作中按顺序写入多个值时,也可以使用此子过程。

子过程有两个阶段;第一阶段准备要编写的特征值。为此,客户机会将特征值传输到服务器。服务器会检查特征值的有效性。客户端还会检查每个特征值,以验证服务器是否使用服务器响应正确接收到每个特征值。一旦完成后,第二阶段从该客户端执行服务器上所有准备好的特征值写入。

在第一阶段,使用ATT_PREPARE_WRITE_REQ PDU。属性句柄应设置为要准备写入的特征值句柄。值偏移量和部分属性值参数应设置为新的特征值。

可以从服务器为ATT_PREPARE_-WRITE_REQ PDU发送两个可能的响应:ATT_PREPARE_WRITE_RSP和ATT_ERROR_RSP PDU。

4.10 特种值通知

此过程用于从服务器通知客户端特征值的值。有一个子过程可以用于通知一个值:通知。可以使用客户端特性配置描述符来配置通知。

配置文件定义了何时使用通知。

4.10.1通知

当服务器被配置为向客户端通知特征值,而不期望任何属性协议层确认通知已成功收到时,将使用此子过程。

ATT_HANDLE_VALUE_NTF PDU用于执行此子过程。属性手柄参数应设置为已通知的特征值手柄,而属性值参数应设置为特征值。

4.10.2 多变量长度通知

当服务器被配置为通知客户端多个特征值时,将使用此子过程。

属性协议ATT_MULTIPLE_HANDLE_VALUE_NTFPDU用于执行此子过程。句柄长度值元组列表参数应包括特征值句柄集和相关的属性值。

4.11 特征值指示

此过程用于指示从服务器到客户端的特征值。有一个子程序可以用来指示一个值:指示。指示可以使用客户机特征配置描述符进行配置。

配置文件定义了何时使用指示符。

当服务器被配置为向客户端指示一个特征值,并期望一个属性协议层确认已成功接收到该指示时,将使用此子过程。

ATT_HANDLE_VALUE_IND PDU用于执行此子过程。属性手柄参数应设置为所指示的特征值手柄,而属性值参数应设置为特征值。一旦客户端接收到ATT_HANDLE_VALUE_IND PDU,客户端应使用ATT_HANDLE_VALUE_CFM PDU进行响应。

4.12 特征描述符

此过程用于读写服务器上的特征描述符。有两个子过程可以用来读写特征描述符:读特征描述符和写特征描述符。

4.12.1 读特征描述符

此子过程用于在客户端知道特征描述符声明的属性句柄时从服务器上读取特性描述符。

在此子过程中使用了ATT_READ_REQPDU。ATT_READ_REQ PDU与属性句柄参数设置为特征描述符句柄一起使用。ATT_READ_RSP PDU返回属性值参数中的特征描述符值。

如果客户端使用身份验证不足、授权不足、加密密钥大小不足,或者特征值禁止读取操作,服务器应发送ATT_ERROR_RSPPDU以响应ATT_READ_REQ PDU。错误代码参数。

4.12.2 可以阅读长时间的特征描述符

当客户端知道特征描述符声明的属性句柄,并且特征描述符声明的长度超过在单个ATT_READ_RSP PDU中可以发送的长度时,此子过程用于从服务器读取特征描述符。

ATT_READ_BLOB_REQ PDU用于执行此子过程。属性句柄参数应设置为特征描述符句柄。值偏移量参数应是要读取的特征描述符内的偏移量。要读取完整的特征描述符,第一个ATT_READ_BLOB_REQ PDU的偏移量应该设置为0x00。后续ATT_READ_BLOB_REQ pdu的偏移量是下一个尚未读取的八位。重复ATT_READ_BLOB_REQ PDU,直到ATT_READ_BLOB_RSP PDU的部件属性值参数为零,或者服务器发送ATT_ERROR_RSP PDU,错误代码设置为“无效偏移”。

对于每个ATT_READ_BLOB_REQPDU,都会接收到一个ATT_READ_BLOB_RSPPDU,其中包含在部件属性值参数中的部分特征描述符值。

如果客户端使用身份验证不足、授权不足、加密密钥大小不足,或者特征描述符禁止读取操作,服务器应发送ATT_ERROR_RSP PDU以响应ATT_READ_BLOB_REQ PDU。已相应地设置了错误代码参数。

注意:ATT_READ_BLOB_REQPDU可用于读取特征描述符值的其余部分,其中第一部分是使用简单的ATT_READ_REQPDU读取。

4.12.3 写特征描述符

此子过程用于在客户端知道特征描述符句柄时,将特征描述符值写入服务器。

在此子过程中使用了ATT_WRITE_REQ PDU。属性句柄参数应设置为特征描述符句柄。属性值参数应设置为新的特征描述符值。

如果特征描述符值写入成功,服务器应发送ATT_WRITE_RSP PDU。

如果客户端使用身份验证不足、授权不足、加密密钥大小不足,或者特征值禁止写操作,服务器应发送ATT_ERROR_RSPPDU以响应ATT_WRITE_REQ PDU。错误代码参数应按照属性协议中的规定进行设置。如果写入的特征描述符值是错误的大小,或者具有配置文件定义的无效值,或者此时不允许该操作,则不应写入该值,ATT_ERROR_RSPPDU应通过服务器将错误代码发送给应用程序错误。

4.12.4 编写长时间的特征描述符

此子过程用于在客户端知道特征描述符句柄,但特征描述符值的长度超过在单个ATT_WRITE_REQ PDU中可以发送的长度时,将特征描述符值写入服务器。

ATT_PREPARE_WRITE_REQ和ATT_EXECUTE_WRITE_REQ pdu用于执行此子过程。属性句柄参数应设置为要写入的特征值的特征描述符句柄。零件属性值参数应设置为正在写入的属性值的部分。值偏移量参数应为要写入的特征值范围内的偏移量。要写入完整的特征值,第一个ATT_PREPARE_WRITE_REQ PDU的偏移量应设置为0x0000。后续ATT_PREPARE_WRITE_REQ pdu的偏移量是下一个尚未编写的八位。重复ATT_PREPARE_WRITE_REQ PDU,直到传输完整的特征值,之后使用ATT_EXECUTE_WRITE_REQ PDU写入完整的值。

注意:在此子过程中的值不需要在ATT_PREPARE_WRITE_RSPPDU中进行验证。

如果客户端使用的身份验证不足、授权不足、加密密钥大小不足,或者不允许对特征值进行写操作,服务器应响应ATT_PREPARE_WRITE_REQ或ATT_EXECUTE_WRITE_REQ PDU发送ATT_ERROR_RSP PDU。错误代码参数按照属性协议中的指定进行设置。如果写入的属性值大小错误,或配置文件定义的值无效,则写入不会成功,服务器将发送ATT_ERROR_RSP PDU,并将错误代码发送为应用程序错误。

4.13 GATT过程映射到ATT协议操作码

表4.2描述了将ATT协议操作码映射到GATT程序和子程序。只需要执行强制性或支持的可选子程序所需的那些ATT协议请求、响应、通知或指示的部分。

4.14 程序超时

GATT过程不发生故障。

如果属性协议交易超时,则认为该程序失败,并通知本地高层。不得对该ATT载体进行进一步的GATT程序。一个新的GATT程序只能在另一个ATT载体上执行。

5 L2CAP互操作性要求

以下配置文件的实现应使用以下默认值。根据正在发送属性协议的物理通道,所使用的默认值可能会有所不同。

5.1 BR/EDR L2CAP互操作性要求

当使用未增强的ATT承载时,不处于增强流控制模式的BR/EDR的L2CAP连接通道可用于传输属性协议PDU。这些通道使用从L2CAP开始的通道建立程序,使用ATT固定PSM,包括配置程序来确定ATT_MTU。因此,在这种情况下,ATT承载(或属性协议中提到的逻辑链接)是一个已建立的面向L2CAP连接的通道。

5.1.1 ATT_MTU

在L2CAP配置阶段结束时,在过渡到打开状态时,该ATT承载的ATT_MTU应设置为协商的最大传输单元配置选项的最小值。

注意:BR/EDR的最小ATT_MTU为48八进制。

5.1.2 BR/EDR通道要求

GATT通过L2CAP通道发送的所有属性协议消息都是通过使用固定的PSM连接导出的动态通道ID发送的。使用一个固定的PSM允许快速重新连接L2CAP属性协议通道,因为不需要一个初步的SDP查询。

在此L2CAP通道上发送的所有数据包都应为属性pdu。

pdu应被可靠地发送。

属性协议的流程规范应尽力努力。

如果在基本L2CAP模式下运行,则L2CAPB帧的信息有效载荷应为单个属性PDU。

该通道应进行加密。Key_Type应为未经身份验证的组合密钥或已经认证的组合密钥。

L2CAP连接可以由客户端或服务器启动。

5.2 LE L2CAP 互操作性要求

当使用未增强的ATT承载时,用于通过LE携带属性协议PDU的通道是属性L2CAP固定通道。

注意:要删除ATT承载,必须断开物理通道。

5.2.1 ATT_MTU

GATT客户端和服务器实现都应支持不小于默认值的ATT_MTU。

5.2.2 LE通道要求

属性协议应使用L2CAP固定CID 0x0004。在此固定通道上发送的所有数据包都应为属性协议pdu。

pdu应可靠地发送,且不进行flush。

该通道的再传输和流量控制模式应为基本的L2CAP模式.

L2CAP B-帧的有效载荷的默认参数应为单个属性PDU。

5.3 增强的ATT承载者L2CAP的互操作性要求

当在BR/EDR或LE上使用增强ATT承载时,使用增强基于信用流量控制模式的L2CAP连接通道传输属性协议pdu。这些通道是使用EATT固定PSM的来自L2CAP的基于信用的连接请求信令包建立的。因此,在这种情况下,ATT承载是已建立的面向L2CAP连接的通道。

在客户端和服务器之间可以建立多个L2CAP通道。

5.3.1 ATT_MTU

增强型ATT承载的ATT_MTU应设置为两个设备的最低MTU字段值;这些值来自L2CAP_CREDIT_BASED_CONNECTION_REQ和L2CAP_CREDIT_BASED_CONNECTION_RSP信令数据包或最新的L2CAP_CREDIT_BASED_RECONFIGURE_REQ数据包。

注意:增强型ATT承载的最小ATT_MTU为648字节。

5.3.2 通道要求

GATT通过L2CAP增强的基于信用的流量控制模式通道发送的所有属性协议消息都是使用一个使用固定的PSM连接导出的动态通道id之一发送的。使用固定的PSM允许快速重新连接L2CAP通道,因为不需要初步的SDP或GATT查询。

在此L2CAP通道上发送的所有数据包都应为属性pdu。

属性协议的流程规范应尽力努力。

L2CAPK帧的信息有效载荷应为单个属性PDU。

该通道应进行加密该通道应进行加密。

5.4 L2CAP减轻碰撞

如果两个设备同时请求L2CAP连接,并且两个设备具有有限的资源,则设备可以拒绝传入的请求并发现其自己的请求也被拒绝。在这种情况下,主服务器可以立即重试,但从服务器应等待至少100ms才能重试;在LE连接上,从服务器应等待至少2×(连续延迟+1)×连续间隔更长。

5.5 承载支持

支持BR/EDR的GATT实现载体应至少支持支持BR/EDR的未增强和增强ATT载体,并可能支持这两者。

支持LE上的GATT实现承载应支持LE上的未增强ATT承载,并可能支持LE上的增强ATT承载。

注:因此,支持BR/EDR和LE的GATT实现可以支持承载的任何组合,只要它支持LE的未增强ATT承载和BR/EDR的至少一种类型的ATT承载。

6 GAP的互操作性要求

6.1 BR/EDR GAP互操作性要求

6.1.1 连接建立

为了建立未增强的ATT承载,通道建立程序应与PSM设置为ATT一起使用。

任何一种设备都可以随时建立一个ATT承载器。

任何一个设备都可以随时终止一个链接。

此配置文件没有定义任何空闲模式过程或模式。

6.2 LE GAP的互操作性要求

6.2.1 连接建立

为建立未增强的ATT载体,应使用连接建立程序。

任何一种设备都可以随时终止ATT承载器。

此配置文件没有定义任何空闲模式过程或模式.

6.2.2 配置文件角色

此配置文件可用于以下配置文件角色中

中心设备

外围设备

6.3 断开连接的事件

6.3.1 断开连接时的通知和指示信息

如果客户端已将服务器配置为向客户端发送通知或指示,则应将其配置为允许在断开连接时重新建立连接。

如果客户端断开,但打算成为连接的中心,它应执行GAP连接建立过程。如果客户端已断开连接,但打算成为连接中的外围设备,则应进入GAP可连接模式。

当事件或触发操作向客户端发出通知或指示时,服务器应与客户端重新建立连接。

如果服务器已断开连接,但打算成为连接中的外围设备,则应进入GAP可连接模式。如果服务器断开,但打算成为连接的中心,它应执行GAP连接建立过程。

如果服务器无法重新建立连接,则应丢弃此事件的通知或指示,并且不再发生进一步的连接重建,直到发生其他事件。

7 通用属性配置文件服务定义

7.1 服务变更

服务更改特性是一个控制点属性,应用于向连接的设备指示服务已更改(即添加、删除或修改)。该特性应用于在基于GATT的服务重新连接到服务器时基于GATT发生更改时指示与服务器有信任关系(即绑定)的客户端。

此特征值应配置为使用客户端特征配置描述符进行指示。如果客户错误地未启用客户特征配置描述符中的指示,则由“服务变更特征值”更改引起的指示应被视为丢失。

服务更改特征值是两个16位属性处理连接在一起,指示受服务器上基于gatt的服务的添加、删除或修改影响的开始和结束属性处理。更改特征值并不被认为是对服务的修改。如果对“服务更改特征值”和“客户端支持的功能”特征值以外的任何GATT服务定义特征值进行了更改,则该范围还应包括GATT服务定义的开始和结束属性句柄。

在GATT服务定义中,应该只有一个服务改变特征的实例。每个具有信任关系的客户应存在服务更改的特征值。

如果基于GATT协定的服务列表和服务定义不能在设备的使用寿命内发生变化,则该特性应不存在,否则该特性应存在。

如果服务器上存在“服务更改”特性,则服务器上必须提供“特征值指示”支持。

客户应支持服务改变特征的特征值指示。

如果服务器与任何客户端有受信任的关系,则服务器上的服务更改特征属性句柄不得更改。

7.2 客户端支持的功能

客户端使用客户机支持的特性特性来通知服务器客户端支持哪些特性。如果该特征存在于在服务器上,客户端可以更新客户端支持的特性位字段。如果一个客户端特性位是由客户端设置的,并且服务器支持该特性,则服务器在与该客户端通信时应满足与此特性相关联的所有要求。

客户端支持的特性特性值的默认值应将所有位设置为零。

GATT服务定义中只有一个客户端支持的特性实例。

每个连接的客户端都应存在一个客户端支持的特性特征值。对于具有受信任关系的客户端,特征值应跨连接持久化。对于没有可信关系的客户端,特征值应设置为每个连接处的默认值。

在连接期间,服务器上客户端支持的特性的属性句柄,或者如果服务器与任何客户端有信任关系,则不得更改。

客户不得清除其设置的任何位。服务器应响应任何此类请求,错误代码设置为不允许。

7.3 数据库哈希

数据库哈希特性包含应用于GATT数据库中的服务定义的哈希函数的结果。客户端可以随时读取该特征,以确定服务是否已被添加、删除或修改。如果哈列函数的任何输入字段发生更改,服务器应计算新的数据库哈列并更新特征值。

数据库哈希特性是一个只读属性。

该特征值为一个128位的无符号整数。

在GATT服务定义中,只有数据库哈希特性的一个实例。无论是否存在受信任的关系,所有客户端都使用相同的数据库哈希值。

为了读取该特性的值,客户应始终使用使用特征UUID读取GATT子程序。

如果客户端在更改数据库后服务器重新计算散列时读取此特性的值,服务器将返回新的散列,从而延迟其响应,直到它可用。

7.3.1 数据库哈希计算

数据库散列应根据RFC-4493进行计算。此RFC使用AES-128作为块密码函数,定义了基于密码的消息身份验证代码(CMAC),也被称为AES-CMAC。

到AES-CMAC的输入是:m是要散希的可变长度数据,k是128位密钥,它应全部为零

(0x00000000_00000000_00000000_00000000)

128位数据库哈希值生成如下:

数据库Hash=AES-CMACk(m),其中m计算如下:

按照属性句柄的升序,从第一个句柄开始,如果属性具有以下类型之一连接属性句柄,连接属性类型和属性值:主服务、辅助服务、包括服务、特性或特性扩展属性,如果属性具有以下类型之一连接字段属性句柄和属性类型:特征用户描述、客户端特征配置、服务器特征配置、特征格式或特征聚合格式、如果该属性具有任何其他类型(这些属性不是连接的一部分),则忽略该属性。对于每个属性句柄,这些字段应按照上述顺序进行连接。每个字段或子字段值所使用的字节顺序应为小中位数。如果一个字段包含子字段,则这些子字段应按照第3节(服务互操作性要求)中出现的顺序进行连接。例如,连接后的{0x02、0x0005、0x2A00}的特征声明值表示为02 05 00 002A。

上面列出的属性类型的属性句柄、属性类型和属性值等字段的格式在第3节(服务互操作性要求)中定义。

如果m的长度不是AES-CMAC块长度128位的倍数,则应按照RFC-4493第2.4节的规定进行填充。

7.4 服务器支持的特性

服务器支持的特性特性是一个只读特性,应用于表示对服务器特性的支持。只有在支持相应的功能时,服务器才应该设置一点。

服务器支持的特性是八进制数组,每个字节都是一个位字段。所有未列出的位都被保留以供将来使用。数组不应该有任何尾零8进制。

在GATT服务定义中,应该只有一个服务器支持特性特性的实例。

8.GATT的安全考虑

8.1 认证要求

GATT配置文件中的身份验证将独立地应用于每个特性。身份验证要求在本配置文件中指定,相关的高层规范,如果没有另行指定,则特定于实现。

GATT配置文件程序用于访问可能需要在读写特性之前对客户端进行身份验证并具有加密连接的信息。

如果在物理链路未经身份验证或未加密时发出此类请求,服务器应发送ATT_ERROR_RSPPDU。想要读取或写这个特性的客户端可以请求使用GAP身份验证过程对物理链接进行身份验证,一旦完成,就再次发送请求。

设备支持的服务和特性列表不被视为私人或机密信息,因此服务应始终允许发现程序和特性。这意味着不应在查找信息请求的ATT_ERROR_RSPPDU中使用身份验证不足的错误代码。

注意:任何设备都可以读取一个特征,但只能由经过身份验证的设备写入。一个实现应该考虑到这一点,而不是假设如果它可以读取一个特征值,它也将能够写入特征值。类似地,如果可以写一个特征,它并不意味着特征也可以读取。每个单独特性都可能具有不同的安全属性。

一旦建立了足够的客户端身份验证以允许访问服务定义中的一个特征,服务器还可以允许根据更高级别或实现的特定需求访问服务定义中的其他特征。

一旦执行了足够的身份验证,服务器可以允许访问服务定义中的大多数特征,但限制对同一服务定义中的其他特征的访问。这可能是由于某些特性需要比当前启用的更强的身份验证要求。

一旦服务器对客户端进行了身份验证以访问一个服务定义中的特征,它就可以自动允许访问其他服务定义中的特征。

8.2 授权要求

GATT配置文件中的授权独立应用于每个特性。授权要求可以在本配置文件中、相关的高层规范中指定,或者如果没有另有说明,则是特定于实现的。

如果这样的请求被发布给未经授权的服务定义中包含的特性,响应者应发送一个错误代码设置为授权不足的ATT_ERROR_RSP PDU。

一旦服务器授权客户端访问一个组或服务定义中的特征,它就可以自动允许访问其他服务定义中的特征。

9.SDP的互操作性要求

在BR/EDR上支持GATT的设备应发布以下SDP记录。GATT开始句柄应设置为“通用属性概要文件”服务声明的属性句柄。GATT端句柄应设置为“通用属性配置文件”服务定义组中的最后一个属性的属性句柄。

TCP/IP

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:论文阅读《通过注意力转移提升神经网络性能》(神经网络的注意力机制)
下一篇:机器人的分类、发展史、现状及国内外发展趋势(简述机器人的发展趋势)
相关文章