This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC2540:具有 HostTest 项目和 GATT_DB_OFF_CHIP 的 ATT_ReadBlobRequest():TI 堆栈的自动处理而不是由客户端触发?

Guru**** 2562990 points
Other Parts Discussed in Thread: CC2540

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/586582/cc2540-att_readblobrequest-with-hosttest-project-and-gatt_db_off_chip-feature-automatic-process-of-ti-stack-rather-than-triggered-by-client

器件型号:CC2540

尊敬的所有人:

我在主机 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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的所有人:
    抱歉、对于我之前的帖子、我使用 BTool 作为 GATT 客户端、并信任日志窗口、在该窗口中我无法看到其他 ATT_ReadBlobRequest 的跟踪。 我使用了监听器、我可以看到、正是 GATT Client 触发所有这些请求、但它被堆栈隐藏。
    我不确定这个自动过程是核心规范中指定的。 可以有人评论一下吗?

    BR
    Cedric
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    您能否发布监听器文件和 BTool 日志?

    祝你一切顺利
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 JXS:

    感谢您的回答。 请找到所需的附件。

    BTool 日志跟踪的 PDF: e2e.ti.com/.../log_5F00_BTool_5F00_ATT_5F00_ReadBlob_5F00_255B.psd.pdf

    来自 TI 数据包监听器的捕获文件: e2e.ti.com/.../log_5F00_PacketSniffer_5F00_ATT_5F00_ReadBlob_5F00_255B.psd

    简单地说、以下是过程:

    0)扫描/广播=> BTool [13]/监听器[8-116]

    1) 1)建立链路=> BTool [20] /监听器[117]

    2)从机发送 Slave_SecurityRequest、然后发送 LinkParamUpdate => BTool [25;26] /监听器[119;311]

    =>我们决定忽略从机安全请求、但 BTool 接受链路参数更新、因为可以通过帧#312看到它、甚至从帧#328开始

    3)主器件触发"服务发现"=> BTool [27-34] /监听器[2805-2829]

    4)主器件更新连接参数=> BTool [35-37]/Sniffer [7379]

    =>实际上这是无用的,因为预期的设置已经被应用了!!

    5) 5)主器件对句柄0x0D => BTool [38-52] /监听器[10'575-10'645]执行 ReadATT BlobReq

    从器件将以255字节全部设置为0x00进行响应。

    从 BTool:

    主控方发出一个请求[38]、一个 ACK [39]、11个22字节的 ATT ReadBlobRsp、1个13字节(11*22+13=255字节)的 ReadATT BlobSsp 和1个具有'The Procedure is completed'状态的 ReadATT BlobRsp。

    来自 PacketSniffer:

    存在偏移量为0x0的初始请求[10'575]、然后是服务器响应的连续响应和客户端新请求的更新偏移量(+22字节)、最后一个响应仅13字节。

    我的问题如下:

    -一个具有给定偏移的单个 ATT_ReadBlobRequest 在完成特性值读取之前触发 BTool 中的自动过程是否正常? 我本以为 ATT_ReadBlobReq()是一个'Atomic '请求,直到客户端应用程序在更新偏移时触发所有连续的 ATT_ReadBlobReq()。 但是、对 BTool 来说、实现自动化一点并使用户更容易、这也许是一种方便的实施方案。

    - BTool 上的最后一条布线"过程已完成"似乎只是一个乘法信息、因为不发送 OTA、对吧?

    BR

    C é dric