你好,
我们使用最后一个版本SDK 5.0.4来创建具有特定功能的新BLE项目。定期,外部MCU传输数据。这些数据将在现场制造商特定数据中重新传输广告消息。当前的广告操作应停止。消息应更新,并再次重新启动广告操作。
问题是:
1.我可以连续执行函数app_easy_gap_advertise_stop()和app_easy_gap_undirected_advertise_start()而无需使用/等待/等待callback user_app_adv_undirect_complete()?在要调用的函数app_easy_gap_underceted_advertise_start()函数app_easy_gap_undirected_advertise_start()之前,将准备新的广告消息。
2.如果我调用函数app_easy_gap_advertise_stop(),并且广告操作已经停止,是否存在问题?
3.新的广告消息与函数app_easy_gap_undirected_advertise_get_active()分配。但是新数据不能在新的广告消息中添加。我们不想继续进行新的广告操作。如何发布静态指针“ adv_cmd”?现在,只有函数app_easy_gap_undirected_advertise_start()才能做到这一点。我们不想更改SDK的源代码。问题是指针是否不是零。函数app_easy_gap_undirected_advertise_get_active()的下一个呼叫将返回旧准备的广告消息。
非常感谢您提前的答案。
设备:
嗨,Angelt,
1.不,如果您执行这种实现,您可能会遇到问题。当使用定义的字符串调用开始广告过程时,您将不得不停止广告过程,并等待堆栈通知您广告过程已停止,以便您更改广告字符串并重新开始广告。如果您不知道上一步是否已停止,则无法启动新的广告程序。
2.我们从来没有尝试过,但是我看不到任何错误。尽管您的广告很可能已经停止,并且您发布了额外的广告停止,直到下次您醒来,它才会执行,并且由于您不会连接,并且您不会(因为它停止)不会进行广告。(对于广告站),如果您从外部中断或内核计时器醒来,将发送到堆栈。当您实际取消广告活动时,广告完整的处理程序将击中。
3.感到很高兴,但我看不到问题到底是什么,因为您开始使用一些数据进行广告(Indoke app_easy_gap_undirected_advertise_start())adv_cmd的指针将是null的。停止广告并重新启动后,get_active将检查指针并填写设备的标准数据,然后将使用APP_ADD_AD_AD_STRUCT()的其他数据更新广告数据。除非您填写广告结构,并且不调用广告操作的开始,并且在调用它之前,应该更改数据?是这样吗?即使adv_cmd不是null,您也可以像app_add_ad_struct()一样更新字符串。此外,您不必使用Easy API函数来执行广告,您可以始终分配GAPM_START_ADVERTISE_CMD填充参数,并使用您想要的数据并将其发送到堆栈中。您可以在用户定义的文件中实现该功能,因此您不会与SDK混乱。
谢谢mt_dialog
嗨mt_dialog,
感谢您的快速答案。
1.这些是要求,尽管我没有看到这两个功能连续执行的任何问题,但它们将被实施。因为我没有修改当前的广告字符串。它通过以前的命令“启动广告”发送到内核,并且按照函数ke_msg_send()的标题编写的“函数被调用,就无法访问其数据,因为内核可能已复制了该数据消息并释放了原始内存。”新的广告字符串分配在堆内存中,尚未发送到内核。可能还有另一个原因。
3.目的不是写我的功能并复制SDK。目的是以最佳方式使用它。在函数app_add_ad_struct()中查看您的示例代码。如果在广告消息中无法添加使用数据,则只有assert_error(0);这就是结局。为什么?如果我们用assert_warning替换断言(0);执行将继续,但是没有使用的数据,广告消息将被传输。指针将被发布,因为将执行函数app_easy_gap_underted_advertise_start()。这就是为什么我的问题是是否有一个功能或方法可以发布分配的消息而无需开始虚拟广告操作。 One additional function in the module app.c could fix the problem.
例如,代码可能是:
如果(adv_cmd!= null)
{
ke_msg_free(adv_cmd);
adv_cmd == null;
}
这个对吗?
嗨,Angelt,
1)这是做到这一点的正确方法,如果您不等待堆栈验证广告的确已经停止并且发布广告无限制,您会遇到问题,它与内存分配无关,而是与广告程序本身以及堆栈如何处理。
2)关于assert_error(0)和广告数据,该功能正在检查额外的数据是否适合广告或扫描响应字符串,如果不是,则必须通知开发人员当时有问题。现在,关于ADV_CMD指针的发布,在当前实施中,如果广告出现问题,并且用户消息不适合广告字符串或扫描响应数据,则当前实现将其视为错误的条件,并且开发人员是应通知,它将不会从这种情况下恢复过来,并且没有用户数据,请继续进行广告。如果您愿意使用这种实现,请释放分配的消息和ADV_CMD指针。或者,您可以删除ASSERT_ERROR并在没有用户数据的情况下保持广告(因为您将调用App_easy_gap_undirected_advertise_start()ADV_CMD将设置回null)。user_barebone.c文件不是SDK核心文件的一部分,因此可以自由更改它。
谢谢mt_dialog