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.

[参考译文] CC2640R2F:较新手机上的 Android 应用无法与 CC2640R2配对

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1405623/cc2640r2f-android-app-on-newer-phones-fails-to-pair-with-cc2640r2

器件型号:CC2640R2F
Thread 中讨论的其他器件:CC2640

工具与软件:

你(们)好

我们正在将我们的产品从 CC2640迁移到 CC2640R2。 我们仍在使用 blestack (不是 ble5stack)。 使用的 SDK 为 simplelink_cc2640r2_sdk_5_30_00_03。 BLE 芯片应用基于 host_test_app、我们的旧版 CC2640应用程序传输了一些自定义代码。 对于开发测试、我们使用 Nordic 的 NRF Connect 手机应用程序。

旧 CC2640成功与 Android 和 IO 上的手机应用配对、我们能够发现 GATT 特性、读取和写入值。 当移动到一个新的芯片,它只能正常工作在 iPhone 和旧的 Android 手机(非常旧的三星 Galaxy S4 ). 使用现代手机时、配对失败、 返回错误34 (0x22) GATT CONN LMP 超时。 在器件控制台上、我们可以看到其不久便开始连接和断开连接。 下面是手机应用程序的 Wireshark 监听日志和屏幕截图。 有什么想法吗?  

为了比较这里是一些日志从旧的 Android 手机,我想应该是预期的行为.

此致

Maciej

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

    我在上传文件时遇到一些问题。  

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

    这里有一些日志、图像似乎必须是 jpeg、而且不接受 Wireshark 日志、因此应该打包。
      e2e.ti.com/.../pairing_5F00_failed_5F00_with_5F00_new_5F00_android_5F00_phone.pcapng.gze2e.ti.com/.../pairing_5F00_ok_5F00_with_5F00_old_5F00_phone.pcapng.gz


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

    此外、基于 CC2640的旧模块中的一些日志也成功与 Google Pixel 8 Pro 配对

    e2e.ti.com/.../pairing_5F00_with_5F00_old_5F00_module_5F00_pixel_5F00_8_5F00_pro.pcapng.gz

    这些行为可以视为新模块的预期行为、因为在将新模块与旧手机连接时会出现一些错误。 我们不需要支持10年机龄的手机!

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

     可能是连接参数更新失败的原因、nrfConnect UPD 的日志显示了这一点

    iPhone 和旧的 Android 手机正在工作,因为这些不进行该更新。 它在 CC2640模块上能够正常工作、但是在 CC2640R2 1上无法正常工作。

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

    Maciej、您好!

    "我是你的,我是你的。"

    这是有关 从 CC2640迁移到 CC2640R2F 的注意事项的快速指南。 本最后一本指南确认默认情况下启用了"Connection Parameter Update Request"(连接参数更新请求)功能。 从日志中、我可以看到您已经指出的内容、即外设未正确处理从中央(手机)执行的参数 GAP_UpdateLinkParamReq。 我希望在 LL_CONNECTION_PARAM_REQ 之后、中央器件会使用包含首选外设参数的 LL_CONNECTION_PARAM_RSP 进行应答、如果主器件不接受则会使用 LL_RESET_EXT_IND。

    对于完整性检查、您是否可以使用通过 HOST_TEST_APP 和 BTool ( \tools\blestack\btool)而不是移动应用程序?

    此外、我们可以尝试禁用 LL_CONNECTION_PARAM_REQ 功能来强制 L2CAP 连接参数更新请求。 例如、simple_peripheral_cc26xx 示例默认通过不在 simple_peripheral.c 中定义 USE_LL_CONN_PARAM_UPDATE 来实现此功能

    BR、

    David。

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

    你好、David

    感谢您的答复。 首先、我根据在 launchpad 上运行的相同堆栈尝试了运行 simple_peripheral 应用示例、并使用 Android 手机进行了连接。 我可以看到 Android 应用会更新连接参数。 然后、我假设问题不是直接在堆栈中、而是在我们的应用或堆栈设置中。 我曾试图找到 simple_peripheral 和我们的应用之间的差异、但未能成功地将我们的应用连接起来。 我还尝试了 BTool、它与运行我们应用的 CC2640R2连接、但它没有更新连接参数、这是我们的主要问题。 是否有办法使用 BTool 触发该事件?

    此致

    Maciej

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

    只是一个快速的更新:将在 !定义时执行的部分代码( USE_LL_CONN_PARAM_UPDATE )复制到我们应用的相应部分解决了 Android 应用无法更新连接参数的问题。 看起来是一个很好的权变措施。

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

    Maciej、您好!

    很高兴听到您找到了解决方案。 我想您在执行此操作时启用 HCI_LE_ReadLocalSupportedFeaturesCmd (),以及函数(_processStackMsg)内的代码部分,该函数处理前面提到的 HCI 命令从堆栈-HCI_LE_Read_local_supported_features 传入的 msg。 L2CAP 连接参数更新程序用于支持某些 iOS 设备所需的最小和最大连接间隔之间的差值。

    BR、

    David。

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

    你好、David

    是的、我要启用  HCI_LE_ReadLocalSupportedFeaturesCmd ()、然后处理 HCI_LE_Read_local_supported_features cmdOpcode。 我想知道为什么 simplePeripheralApp 不管这些设置如何工作、并且我们基于 hostTestApp 示例的应用仅在 L2CAP 层处理连接参数更新的情况下工作。  

    我所做的另一项检查是查看我们旧的基于 CC2640的模块使用了什么方法、并且该模块在监听器日志中与禁用 LL_CONN_PARAM_UPDATE 时相同。 正常工作时有意义。 配置为外设的 hostTestApp 示例不支持此 LL_CONN_PARAM_UPDATE、是否存在任何已知的问题或原因。 或者在配置外设角色时可能遗漏了一些内容。

    另一个问题是、我们计划根据 TI 的 QDID 来验证我们的器件。 是否需要支持上述2种连接参数更新方法中的任何一种?  

    BR、

    Maciej.

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

    Maciej、您好!

    是否两个应用程序都使用 USE_LL_CONN_PARAM_UPDATE 之间定义的代码段? 对于简单外设、您可以在代码中看到说明(simple_peripheral.c)、其中指出了 未定义 USE_LL_CONN_PARAM_UPDATE 时会发生什么:"此代码将禁止使用 LL_CONNECTION_PARAM_REQ 控制过程(对于连接参数更新、将使用 L2CAP 连接参数更新过程)。 若要重新启用 LL_CONNECTION_PARAM_REQ 控制过程、请定义符号 USE_LL_CONN_PARAM_UPDATE L2CAP 连接参数更新过程用于支持某些 iOS 设备所需的最小和最大连接间隔之间的差值。"

    BR、

    David

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

    你好、David。

    SimplePeripheral 应用和 HostTestApp 在这个问题上有所不同。  原始 HostTestApp 中没有引用 USE_LL_CONN_PARAM_UPDATE。 我已通过复制在 未从 SimplePeripheralApp 定义 USE_LL_CONN_PARAM_UPDATE 时编译的代码部分来启用 L2CAP 层连接参数更新。 另一方面、我没有在  定义 USE_LL_CONN_PARAM_UPDATE 时编译的任何代码段、因此我假设链路层应该用作默认值。 因此、如果这是基于 HostTestApp 的固件上默认失败的原因。  

    此外、我在 profiles 目录中 peripheral.c 的代码部分中找到了另一个名为 L2CAP_CONN_update 的连接参数更新定义、这让我更加困惑:

    #if defined (L2CAP_CONN_UPDATE)
    l2capParamUpdateREQ_t updateReq;

    updateReq.intervalMin = pConnParams->minConnInterval;
    updateReq.intervalMax = pConnParams->maxConnInterval;
    updateReq.slaveLatency = pConnParams->slaveLatency;
    updateReq.timeoutMultiplier = pConnParams->timeoutMultiplier;

    状态= L2CAP_ConnParamUpdateReq (g3874 Role_Connection le、&updateReq、selfEntity);
    #else
    gapUpdateLinkParamReq_t linkParams;

    linkParams.connectionHandle = g博 彩公司 Role_Connection (linkParams.connectionHandle);
    linkParams.intervalMin = pConnParams->minConnInterval;
    linkParams.intervalMax = pConnParams->maxConnInterval;
    linkParams.connLatency = pConnParams->slaveLatency;
    linkParams.connTimeout = pConnParams->timeoutMultiplier;

    Status = GAP_UpdateLinkParamReq (&linkParams);
    #endif // L2CAP_CONN_UPDATE

    非常感谢您提出任何建议。

    BR

    Maciej

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

    Maciej、您好!

    对不起,我错过了最后一篇文章,我看到该线程已解决,但我看到现在不完全。 请让我在星期一之前检查更详细的这一点。

    BR、

    David。

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

    David、您好!

    抱歉、我误单击了"已解决"、但现在已解决为正确。
    因此、首先我们需要从 simplePeripheralApp 清除位中应用该修复程序(负责 LL 特征响应帧中的连接参数更新)。 因此、在这种情况下、主器件不会发送 LL 连接参数请求。 没有执行此修复程序而失败的原因在于我们没有 在主 MCU 应用程序中处理 GAP_LinkParamUpdateRequest。

    software-dl.ti.com/.../gap_api.html

    我们已检查确认我们收到了该事件代码、但未处理该代码。 但实际上我们不需要该功能、我们只会在 LL 特性响应帧中指出不支持该功能。 所以、这不是堆栈、不是 BLE MCU 应用、而是我们的主 MCU 应用。  BLE MCU 应用基于 hostTestApp、所有操作都必须通过 HCI 接口由主 MCU 进行处理。 在 simplePeripheralApp 中、它由 BLE MCU 应用直接 通过 GAP 角色配置文件进行处理、这就是它正常工作的原因。 感谢您的帮助!

    BR

    Maciej

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

    Maciej、您好!

    很高兴听到您找到了答案! 这是有道理的,感谢分享的细节。

    此致、

    David。