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.

[参考译文] LP-EM-CC2340R53:如何在 CC2340R53 上定期安全地更新 BLE 广播数据?

Guru**** 2419530 points


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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1541144/lp-em-cc2340r53-how-to-safely-update-ble-advertising-data-periodically-on-cc2340r53

器件型号:LP-EM-CC2340R53


工具/软件:

我正在使用 CC2340R53 通信 基本 BLE 示例 ,我想定期用传感器值更新 BLE 广播数据。

为此、我使用了一个单独的应用线程、该线程设置标志或向 BLE 线程发送消息。 在 BLE 线程中、我尝试:

  1. 调用 GapAdv_disable(peripheralAdvHandle_1)

  2. 然后调用GapAdv_prepareLoadByHandle()GapAdv_loadByHandle()以更新 Adv 数据

  3. 然后使用再次开始广播 GapAdv_enable()

然而,GapAdv_disable()返回bleAlreadyInRequestedMode (0x11),这似乎表明广告已经停止。

下面是我用于停止、初始化并再次开始广播的函数(在调用以下函数本身之前,我更改了 advData1 缓冲区):

bStatus_t post_ble_Adv_data_update (void)
  bStatus_t STATUS =成功;

  //停止当前广播
  状态= BLEAppUtil_advStop(外设 AdvHandle_1);
   printf(“BLEAppUtil_advStop 错误代码:%d\n“,状态)
  //如果 Adv 已停止、则可以、但仅在真实错误时阻止
  if ((status != success)&&(status != bleAlreadyInRequestedMode))
  {
    返回状态;
  }

  睡眠 (1);

  //重新初始化广播集
  状态= BLEAppUtil_initAdvSet (&peripheralAdvHandle_1、&advSetInitParamsSet_1);
  if (status != success){
    printf(“BLEAppUtil_initAdvSet 错误代码:%d\n“、status);
    返回状态;
  }

  //开始使用新参数进行广播
  状态= BLEAppUtil_advStart(外设 AdvHandle_1、&advSetStartParamsSet_1);
  if (status != success){
    printf(“BLEAppUtil_advStart 错误代码:%d\n“,状态)
  }
返回状态;
}
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    感谢您联系我们。 为了安全地更新广播数据、我会等到 收到 BLEAPPUTIL_ADV_START_AFTER_DISABLE 事件。 堆栈完全禁用广播后、此事件会发布到应用。  启用广播后、接收到 BLEAPPUTIL_ADV_START_AFTER_ENABLE 事件。

    此致、

    1 月

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

    太棒了! 1 月 

    感谢您的建议。

    我尝试了推荐的方法,BLEAPPUTIL_ADV_START_AFTER_DISABLE在尝试更新广告数据之前等待事件。 这确实解决了bleAlreadyInRequestedMode错误—我现在能够停止广告没有任何问题。

    但是、我面临一个新问题:重新初始化广播数据后、制造商特定的数据在广播有效载荷中不再可见。 我只看到广播的 0x09(完整本地名称)类型数据。 其余的自定义字段(尤其是制造商数据)似乎缺失。

    您能否指导我如何确保在重新启动广告后正确设置和显示特定于制造商的数据?

    此致、
    Shivam Singh

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

    尊敬的 Shivam:

    很高兴听到我们取得了一些进展! 您能分享如何重新初始化广告数据吗? 通常、制造商数据存储在扫描响应中。 您是否也设置了扫描响应?

    此致、

    1 月

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

    您好、Jan、

    感谢您的留言!

    是的、当前我有两个线程正在运行、mainThread也是 TI 示例中的 BLE 任务。 每 30 秒、会mainThread使用以下命令触发一个计时器、向 BLE 线程发送自定义命令:   BLEAppUtil_enqueueMsg (BLEAPPUTIL_EVT_application、NULL);

    在中bleapputil_task.c、我为添加了一个处理程序BLEAPPUTIL_EVT_APPLICATION、执行以下步骤:
    1.停止当前广告:  BLEAppUtil_advStop(外设 AdvHandle_1);
    2.等待一秒钟,以确保清洁停止。
    3.重新初始化广播集:  BLEAppUtil_initAdvSet (&peripheralAdvHandle_1、&advSetInitParamsSet_1);
    4.再次短暂地等待。
    5、用新参数开始广告:  BLEAppUtil_advStart(外设 AdvHandle_1、&advSetStartParamsSet_1);

    我也尝试不添加 睡眠 (1) 还尝试等待代码到达  BLEAPPUTIL_ADV_END_AFTER_DISABLE  在这种切换情况下再次初始化 Adv 之前。

    目前、我正在更新广播包本身中的制造商数据、而不是在扫描响应中更新。 如果需要、我计划了解如何设置扫描响应数据。

    如果您看到此方法的任何改进或替代建议、请告诉我。

    此致、
    Shivam

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

    尊敬的 Shivam:

    明白。 如果您正在使用手机进行扫描、则可能是问题所在、而不是更新扫描响应。 大多数手机在扫描时报告扫描响应数据、而不是广播数据。 能否将制造商数据添加到扫描响应中以查看问题是否消失?

    此致、

    1 月

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

    您好、Jan、

    感谢您的澄清!

    我确实尝试了在运行时修改扫描响应数据、但观察到它在尝试更新后也会被清除或消失。 我怀疑在动态更新扫描响应时可能缺少所需的特定步骤或顺序。

    是否有任何示例或示例工程可以演示如何在运行时定期正确更新广播和扫描响应数据? 这将真正帮助我验证我的方法并确保我正确处理更新。

    感谢您的持续支持。

    此致、
    Shivam

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

    尊敬的 Shivam:

    我们没有这样做的预制代码、但如果您分享最新的代码片段、我很乐意查看! 另一个需要考虑的问题是、智能手机通常会缓存从特定设备看到的第一个扫描响应数据和 Adv 数据对、并且除非完成全新扫描、否则不会报告任何更改。 要强制清除缓存、请退出您的 BLE 应用程序、然后在手机上关闭并打开 BLE 功能。 您还可以使用 BLE 监听器来确认数据包是否真正更改。

    此致、

    1 月

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

    您好、Jan、

    再次感谢您的建议!

    我尝试了关闭和打开 BLE、以及重新启动扫描应用以清除智能手机端任何潜在的缓存。 但是、这并没有任何区别、更新的广播或扫描响应数据仍然不可见。

    我还使用 BLE 监听器进行了测试、并能够识别其中的问题。 我附加了相关的监听器屏幕截图以及代码片段和bleapputil_task.c文件以供您参考。

    请更改  Adv_offset  在 sensor_task.c 文件中设置为 7。

    如果您能看一看、告诉我是否有任何突出之处或需要以不同的方式处理、我将非常感激。

    此致、
    Shivam

    e2e.ti.com/.../1122.bleapputil_5F00_task.ce2e.ti.com/.../bleapputil_5F00_internal.he2e.ti.com/.../basic_5F00_ble_5F00_oad_5F00_dual_5F00_image_5F00_LP_5F00_EM_5F00_CC2340R53_5F00_freertos_5F00_ticlang-_2800_2_2900_.zip

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

    您好、Jan、

    添加以下代码片段、解决了我的问题:

    // Free the buffer (to avoid double copying) since we're loading a new buffer
    // However, only free the buffer if it's allocated in the application.
    // Using out of box example, the buffer is a global array and can not be freed
    GapAdv_prepareLoadByHandle(peripheralAdvHandle_1, GAP_ADV_FREE_OPTION_ADV_DATA);


    此致、
    Shivam Singh