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.

[参考译文] CC2642R:来自 SimplePeripheral 的按类型读取请求的无限 ATT 循环(CC2640R2F 相同)

Guru**** 2012440 points
Other Parts Discussed in Thread: CC2642R, CC2540, BLE-STACK, CC2640R2F, CC2541
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/786897/cc2642r-endless-loop-of-att-read-by-type-request-from-simpleperipheral-same-for-cc2640r2f

器件型号:CC2642R
Thread 中讨论的其他器件: CC2540BLE-STACKCC2640R2FCC2541

您好!

我已经验证了 CC2642R 以及 CC2640R2 BLE5上的行为。

先决条件:

-已编译的 BLE5堆栈的 SimplePeripheral 示例

- GATT_NO_CLIENT NOT (!) 已定义

- BLE_V42_features =隐私_1_2_CFG+EXT_DATA_LEN_CFG

>>>因此,GapBondMgr 尝试从中央设备读取仅 RPA 和 CAR 属性

在我们的案例中、中央器件是 CC2540 USB TI 软件狗、没有 RPAO 和 CAR 属性。

因此、响应是一个带有错误代码 ATT_ERR_UNSUPPORTED_REQ (0x06)的 ATT 错误响应。

BT5规范规定、如果不支持 ATT 请求、则错误响应中的句柄应为0x0000 (请参阅随附的图片)。

问题是、这个错误响应导致一个来自 BLE5堆栈的无限循环的 ATT ReadByType 请求(附上 Ellisys 文件)。

我深入探讨了它、可以看到  GATT_CLIENT.c 中的函数 gattProcessReadByType()将  lastHandle 设置 为错误响应中存储的句柄、然后...

//记住最后一个句柄
lastHandle = pErrorRsp->Handle;

并且执行新的 ReadByType:

void map_ATT_ReadByTypeReq( pClient->connHandle,&pReq->req );

然后它再次开始...

e2e.ti.com/.../endless_5F00_ReadByType_5F00_loop.zip

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

    感谢您发帖、这非常有趣。

    我认为我们对规格的读取有所不同。 正如我看到的、请求受支持(由发送请求的器件)、因此响应应为 ATT_ERROR_RSP、具有相关的 hadle (而不是零)和状态 ATT_ERR_ATTR_NOT FOUND。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Marie、

    另一个器件是 TI CC2540。
    那么、您认为 CC2540中存在错误吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Marie、

    我深入探讨了它、可以向您展示生成了 ATT_ERR_UNSUPPORTED_REQ。

    [删除了代码片段]

    CC2540上的常规中央设备不会调用  GATTServApp_Init() ,因此  reqTaskId 保持其默认 的 INVALID_TASK_ID

    当  在  gattServerProcessMsgCB()中处理服务器消息 并且将此错误代码发送到连接的外围设备时,这将导致返回 ATT_ERR_UNSUPPORTED_REQ。

    它将 GATT_SERVER.c 与最新的 CC26x2 SDK 3.10.00.53与 CC2540的 GATT_SERVER.c 进行了比较、并可以看到  gattServerProcessMsgCB()中的行为仍然相同。

    因此、如果您有一个不调用  GATTServApp_Init()的简单中央设备、则 CC2642R 上也会检测到相同的行为。

    [删除了代码片段]

    因此、无论是 TI 中央器件发送错误的 ATT-Error-Code (CC2540和 CC26x2)、还是 TI 外设器件都存在导致无限请求的错误。

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

    我使用 CSR 的另一个旧 BT4.0中央设备进行了测试。

    当 CC26x2尝试读取 RPAO 和 CAR 时、它会以"未找到属性"进行响应。

    。 因此、我想 TI 在没有 GATT 服务器的情况下实现中央设备的行为是错误的。

    请在下面找到 Ellisys 文件。

    e2e.ti.com/.../RPAO_2B00_CAR-read-from-CSR_2C00_CC2652_2C00_SDK_5F00_2_5F00_40_5F00_00_5F00_81.zip

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

    是的、我同意 CC2540响应不符合我阅读规范的方式。

    您是否能够处理应用中的零句柄?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Marie、

    如果 CC2540不符合要求、那么 CC26x2也不符合要求。
    这在两个堆栈源中都是相同的错误处理。

    因此、如果在没有 GATT 服务器的情况下引导 CC26x2、它的运行方式将类似于 CC2540、正如您提到的、它将不兼容。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Tobias、

    这种情况下的错误似乎是应用程序未正确配置为 GATT 服务器。 我建议您比较简单的 BLE 外设或其他 GATT 服务器示例。 (您也可以参阅 BLE-Stack 软件开发人员指南的第5.4.4节 GATT Server Abstraction (http://www.ti.com/lit/swru271 )。)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Marie、

    这正是我想说的。 如果未调用 GATTServApp_Init(),则会出现问题。

    据我所知、BT 4.0器件不需要 GATT 服务...或者我错了吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    据我所知、BT 4.0器件不需要 GATT 服务...或者我错了吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Tobias、

    对于 TI BLE-Stack GATT 服务器应用、必须使用 GATT Service/GATT 服务器应用。 我们没有任何不使用它的示例。 您可能可以实现不使用 GATT Server 应用但我们不建议使用 GATT Server 应用程序的 GATT Server、并且无法为开发提供支持。

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

    您好、Marie、

    [引用 user="Marie H">我们没有任何不使用它的示例。 [/报价]

    这不是真的。

    请允许我总结一下我们的情况:

    我们的一款产品基于 CC2642R、充当 BLE 外设和 GATT 服务器 (我们也拥有基于 CC2541和 CC2640R2F 且具有相同功能的类似器件;现场器件总数超过10.000.000)。

    另一个产品基于 CC2540、充当 BLE 中央设备和 GATT 客户端。 让我简化一下:它将通知转换为 HID 报告。 此产品基于 BLE-Stack 1.4.1中的示例 HidRemoteDongle (源代码、而不是预编译库)。 此示例根本不支持 GATT 服务器-它不调用 GATTServApp_Init()。

    现在、我们有一个 MP 产品、它基于您的示例 HIDRemoteDongle、该产品没有 GATT 服务器、因此与您最新的 BT5堆栈示例不兼容。

    在 BT5堆栈的 GATT 客户端实现中使用一段代码来防止卡在 ATT 读取请求的无限循环中是否是一个好主意?

    此致、Tobias

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

    很抱歉耽误你的回答。

    默认情况下,简单的中央调用 GATTServApp_Init()(在 osal_iCall_Ble.c 中)。 简单中央也是 GATT 服务器、因为它具有 GGS 和 GATTServApp 服务。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    玛丽、

    您是否看过我提到的示例???
    [引用用户="Tobias_r"] 此产品基于 BLE-Stack 1.4.1中的示例 HidRemoteDongle (源代码、而不是预编译库)。 此示例根本不支持 GATT 服务器-它不调用 GATTServApp_Init()。
    [/报价]

    该示例称为"HidAdvRemoteDongle"、而不是"simple_central "。
    该示例来自德州仪器。
    该示例不调用 GATTServApp_Init()。
    该示例没有 GATT 服务器。
    该示例导致 CC2642R 的 simple_peripheral 出现问题。

    请注意、涉及两种 TI 产品(查看我的帖子)。
    基于 HIDRemoteDongle 的 CC2540 (大规模生产!)
    2. CC2642R 使用了外设。


    CC2642R 与基于 TI 和 TI 示例的 CC2540进行交互时出现问题。
    因此、TI 软件中存在问题。

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

    你是对的、很抱歉。

    我认为最简单的解决方法是检查 CC2640R2端传入 ATT 错误响应的处理方式。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Marie、

    我同意。

    尽管我们有堆栈源、但我们仍会按照建议为我们的大规模生产版本使用您预先构建的库。 这些源代码仅用于调试和故障分析。
    如果您能触发内部 TT、我将不胜感激。

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

    我已提交 CC2540器件的 TT。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Marie:
    谢谢-但是否也可以为 CC264x 修复此问题?
    我只是在问、因为核心规范规定"不支持请求"也是对"按类型读取请求"的有效响应(蓝牙规范版本5.0、第3卷、第 F 部分、3.4.9属性 PDU 响应摘要)。
    谢谢、此致、
    Daniel
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Daniel、您好!

    您好、我也会为 CC2640R2/CC2642R 侧开一个 TT。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Daniel、Tobias、

    我们将在 SimpleLink CC13x2/CC26x2 SDK 4.10中为此添加修复程序。  

    对于 CC2640R2、我们决定不添加修复、而不是 blestack 或 ble5stack、因为在修补相关函数时闪存会增加。