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.

[参考译文] CC2651R3:BLE 多角色:成功配对后发起服务发现问题

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1612803/cc2651r3-ble-multirole-issue-initiating-service-discovery-after-successful-pairing

器件型号: CC2651R3

尊敬的团队:

我使用的是器件到器件连接的 BLE 多角色示例

设置详细信息:

  • SDK: simplelink_cc13xx_cc26xx_sdk_7_10_02_23

  • 示例: ble5stack/multi_role

我的要求是 在建立链路后立即开始配对和 GATT 服务发现 以事件驱动的方式驱动、而不使用任何基于时钟/计时器的延迟。

当前实现方式:

在中multi_role_processGapMsg()GAP_LINK_ESTABLISHED_EVENT我启动设备到设备链接的配对和服务发现。

服务发现从 MTU 交换开始:

发现问题

  • devi 的配对成功完成 CE 至器件  相匹配

  • 服务发现 失败 当连接后自动触发时

  • GATT API 返回:

    • BLE_NOT_READY

    • BLE_PENDING

不过:

  • IF I 配对后通过 UART 命令手动触发服务发现 、发现工作正常

  • 相同的连接、相同的对等器件、相同的逻辑→ 无错误

我已经尝试过的

  1. 触发发现自:

    • GAP_LINK_ESTABLISHED_EVENT

    • multi_role_processPairState()在以下条件下:

      • GAPBOND_PAIRING_STATE_COMPLETE

      • GAPBOND_PAIRING_STATE_BOND_SAVED

  2. 事件驱动和基于回调的机制(无轮询)

  3. 确保开始发现 仅在配对完成后 对于 M2M 链路

在所有自动情况下:

  • 发现返回 BLE_PENDING

  • 或无法正确进行

约束

 可以了 不会 使用任何一种 基于时钟/计时器的延迟处理程序

问题

  1. 这是 A 已知限制或问题 我们在多角色示例中看到了这一点  连接供电

  2. 是否有 特定的事件或状态 BLE 栈在哪里保证 GATT 为服务发现做好准备?

  3. 是否存在必须在偏差到偏差方案中显式检查的内部依赖关系(例如 ATT/GATT 队列,加密完成)?

  4. 为什么会这样 UART 触发发现成功 、而在相同的 M2M 连接中自动发现失败?

请提供任何指导或建议的方法。

提前感谢。

—Vikas

 

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

    您好、Vikas、

    感谢您联系我们! 这是一个很好的问题!  

    每当两条 BLE 命令背靠背发送时、之间没有任何延迟时、就会发生这种情况。 这就是当自动发现失败时 UART 触发器发现成功的原因。

    不过、只需使用 BLEAppUtil_invokeFunction 或 BLEAppUtil_invokeFunctionNoData 函数即可轻松解决此问题。 这两个 API 对您尝试运行的命令进行排队、而不是即时运行。 我相信这应该能解决您的问题!

    如果您有任何其他问题、或者在项目中实施时需要帮助、敬请告知!

    此致、

    Tarek D

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

    您好 Tarek、

    感谢您的及时回复并解释问题背后的原因。

    如果您能提供一个代码片段BLEAppUtil_invokeFunctionBLEAppUtil_invokeFunctionNoData、演示如何使用 OR API 对命令进行排队、特别是在配对后启动服务发现的上下文中、我将不胜感激。 这将有助于确保我在项目中正确实施解决方案。

    再次感谢您的支持!

    此致、
    Vikas

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

    您好、Vikas、

    绝对是! 我建议使用 BLEAppUtil_invokeFunctionNoData API、因为它更容易格式化和使用、但是、如果正确提供了参数、也可以使用 BLEAppUtil_invokeFunction。

    以下是如何使用此 API 的示例:

    #include "ti/ble/app_util/framework/bleapputil_api.h"
    
    static uint16_t    connHandle;
    
    void MirX2App_M2MServiceDiscovery(uint16_t connHandle)
    {
      uint8_t connIndex = multi_role_getConnIndex(connHandle);
      
      BLEAppUtil_invokeFunctionNoData(wrapper);
    }
    
    void wrapper()
    {
      attExchangeMTUReq_t req;
    
      svcStartHdl = svcEndHdl = 0;
      connList[connIndex].discState = BLE_DISC_STATE_MTU;
    
      req.clientRxMTU = mrMaxPduSize - L2CAP_HDR_SIZE;
      GATT_ExchangeMTU(connHandle, &req, selfEntity)
    }

    我希望这对您有所帮助!

    此致、

    Tarek D

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

    尊敬的 Tarek:

    由于我们的 SDK 不提供BLEAppUtil_invokeFunctionNoData,我尝试改用BLEAppUtil_invokeFunction. 但是、这种方法给我带来了额外的问题。 我现在遇到了配对和绑定问题、并且 UART 接口经常挂起。

    您能否分享一个多角色示例项目的 zip 文件、在建立链路时立即执行配对和服务发现? 我想自行测试、看看它是否解决了这些问题。

    谢谢!

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

    您好、Vikas、

    抱歉、我没有注意到您使用的 SDK 版本。 进一步研究这一点后、我认为实现这一点的最佳方法是增加一点延迟。 我知道您不想使用基于时钟的延迟处理程序、但我认为这是最有效的方法。

    在这种情况下、使用 sleep() 或 usleep() 函数将起作用。 延迟的实际值取决于您的连接参数。

    我希望这对您有所帮助!

    此致、

    Tarek D

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

    您好 Tarek、

    感谢您对使用延迟的建议。 如果可能、您能否分享 该工程、在哪里 BLEAppUtil_invokeFunction证明它有效? 工作参考将会非常有帮助。

    感谢您的支持。

    此致、
    Vikas

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

    嘿、Vikas、

    我应该澄清一下。 BLEAppUtil_invokeFunction 和 BLEAppUtil_invokeFunctionNoData 在该 SDK 版本中都有问题。 最好的实现方式是短延迟或可能启动计时器、计时器的回调执行 GATT 写入。

    此致、

    Tarek D