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.

[参考译文] CC2340R5:如何在不停止/重新启动现有广播的情况下更新广播数据?

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1488648/cc2340r5-how-to-update-adv-data-without-stop-restart-existing-adv

器件型号:CC2340R5

工具与软件:

大家好!

我知道我们可以使用 GapAdv_prepareLoadByBuffer、GapAdv_loadByBuffer 来更新广播数据、但它会导致广播重新启动。

如果我不想更改 ADV 时序、是否可以在不调用 GapAdv_prepareLoadByBuffer 和 GapAdv_loadByBuffer 的情况下直接更改有效负载缓冲区?

(我预计这反映了下一个广播间隔中的变化、它在 CC2640R2 SDK 上工作、但在 CC2340R5 SDK 上似乎不工作)

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

    您好!

    虽然我们建议使用 GAP 函数、从而导致广播重新启动、但如果不更改广播时序至关重要、您可以遵循 CC23XX SDK BLE-STACK 用户指南的"在启用 广播时直接操作缓冲器"部分、以便能够在广播仍在运行时更改广播数据缓冲区。
    请注意、这可能会导致损坏的广播包。

    此致、
    Maxence

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

     您好!

    我测试了这个。 它可以在 CC2640R2 SDK 上运行、但不能在 CC2340R5 SDK 上运行。

    (在 simplelink_lowpower_f3_sdk_8_40_02_01上测试)

    我想知道 GAP ICall 实施是否有差异。

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

    当您说它不起作用时、您是说广播数据不改变、还是广播重新启动? 您如何检查广告是否已重新启动?

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

    我在 CC2640R2 SDK 中直接混合缓冲区、但 simplelink_lowpower_f3_sdk_8_40_02_01中的广播有效载荷会发生变化。

    我设置 ADV 间隔5秒、而我每2.5秒更改一次有效载荷

    如果我使用 GapAdv_prepareLoadByBuffer , GapAdv_loadByBuffer 更新负载,我将看到广播每2.5秒,而不是5秒,因为它重新启动每2.5秒

    我需要的是每2.5秒更新一次广播数据、而 ADV 间隔仍然保持5秒

    我想避免频繁调用 GapAdv_prepareLoadByBuffer , GapAdv_loadByBuffer ,它将花费额外的功耗,持续时间约为5ms 峰值。

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

    您好!

    我尝试在一个新项目上修改缓冲区、但也没有成功使其工作。 我不得不问这是错误还是有意的功能、因为直接修改缓冲区有点粗略、可能会导致意外的影响。

    与此同时、解决您问题的方法可能是每2.5秒更新一次缓冲区、并在广播结束时(即每5秒)使用您的缓冲区调用 GapAdv_prepareLoadByBuffer 和 GapAdv_loadByBuffer。

    若要给出具体示例、在 F3 SDK 的 basic_ble 示例中、可以使用 Peripheral_Adv 境内"352"处理程序"函数的 BLEAPPUTIL_ADV_END 案例来调用 GapAdv_prepareLoadByBuffer 和 GapAdv_loadByBuffer。 不要忘记将 BLEAPPUTIL_ADV_END 放入事件处理程序的事件掩码中。

    下面是一个示例代码:

    void Peripheral_AdvEventHandler(uint32 event, BLEAppUtil_msgHdr_t *pMsgData)
    {
        switch(event)
        {
            // Advertisement just ended so it should be safe to update buffer here
            // without corrupting an advertisement.
            case BLEAPPUTIL_ADV_END:
            {
                GapAdv_prepareLoadByHandle(peripheralAdvHandle_1, GAP_ADV_FREE_OPTION_DONT_FREE);
    
                // Sample buffer modification
                advData2[9] = 0xEF;
                advData2[10] = 0xBE;
                
                GapAdv_loadByHandle(peripheralAdvHandle_1,
                                                GAP_ADV_DATA_TYPE_ADV,
                                                ADV_DATA2_LEN,
                                                advData2);
            }
            default:
            {
                break;
            }
        }
    }


    这不是一个完美的解决方案、因为由于 GapAdv_prepareLoadByBuffer 和 GapAdv_loadByBuffer 的处理时间、广播间隔不会恰好是5秒、但它能为您提供最充分的方法。

    此致、
    Maxence

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

    我说得对、这是回退解决方案、但缺点对功耗的考虑至关重要。

    调用 GapAdv_prepareLoadByBuffer / GapAdv_loadByBuffer 的5S 周期会导致每个 iCall 的5ms 峰值功耗、因此我想避免这种情况。

    TI 是否有关于直接缓冲器改编不起作用问题的一些反馈?

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

    在向研发人员询问后、我们得出结论:直接修改缓冲区而不停止广告不再得到支持、也不是正确的做法。 我发送的 BLE 用户指南中的示例已过时、我们需要将其删除。 很抱歉给您带来不便!

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

    尊敬的 Maxence:

    感谢您的解释并查找文档更新。

    BTW 如果您看一下我的用例、采用某种异步方法来上传广告数据、但出于功耗方面的考虑、这些数据仍然很有价值。