尊敬的所有人:
我在主机 MCU 中运行应用程序以及在此主机 MCU 中定义 GATT 数据库时使用 HostTest 项目。 我的设备充当 GATT 服务器。
我的问题与 ATT_ReadBlobRequest()和 GATT_ReadLongChar()命令有关,它们几乎是等效的(GATT 命令重新使用 ATT 命令)。
根据蓝牙核心规范、我对这些命令的理解是、想要读取长度大于(ATT_MTU-1)字节的特征值的客户端必须使用这些命令数次并使用 OFFSET 参数。 客户端将发送第一个偏移量为"0"的命令、获取带"ATT-MTU-1"字节的 ReadBlobResponse、发送第二个偏移量为"ATT_MTU-1"的命令、获取响应等、直到所有字节都已被读取。 这可以通过使用'InvalidOffset'的 ATT_ErrorResp 或使用小于'ATT_MTU-1'字节的 ReadBlobResponse 实现。 下图对此进行了说明。
使用 HostTest 项目、我更喜欢观察以下内容:
使用此代码、CC2540接收来自 GATT 客户端的第一个 ReadBlobRequest、并将命令通过串行接口转发到主机 MCU、该 MCU 将使用 ATT_ReadBlobRsp ()进行应答、从而提供第一个'ATT_MTU-1'字节。 然后 CC2540将第一个片段无线发送到 GATT 客户端。 同时、CC2540还将一个 CommandStatus 发送回主机 MCU 以成功地确认 ATT_ReadBlobRsp ()。 之后、CC2540本身将通过串行接口发送第二个 ReadBlobRequest 来托管 MCU、偏移量增加到"ATT_MTU-1"。 主机 MCU 将应答、获取 CommandStatus、接收第三个 ReadBlobRequest 等、直到读取完整的特征值。 最后、CC2540将向 GATT 客户端发送状态为"过程已完成"的 ATT_ReadBlobRsp() OTA。
但是、在这一涉及 CC2540和我的主机 MCU 之间多个事务的整个过程中、GATT 客户端仅发送一个 ReadBlobRequest。
我可以将 HostTest 项目中的部分代码更改为具有其他行为。 但是、由于所有这些过程都在 TI 库中实现(ATT_ParseReadBlobReq ()和 GATT_ReadLongCharValue ())、我的问题是确保我对内核规范的理解是正确的、在这种情况下、该默认 TI 实现与规范不一致、 或者、这是核心规范提供的灵活性、客户不会被迫自行启动整个流程。
如果有人对此发表评论,那就太棒了。
此致、
Cedric A

