广告消息的连续停止和开始

4个职位/ 0个新
最后发表
AngelT
离线
最后看到:1年2个月前
加入:2016-03-24需要
广告消息的连续停止和开始

你好,

我们使用最新版本的SDK 5.0.4来创建一个具有特定功能的新BLE项目。外部MCU定期进行数据传输。这些数据将与制造商特定数据中的广告信息一起重新传输。当前的广告操作应停止,广告消息应更新,并再次重新启动广告操作。
问题是:
1.我可以连续执行函数app_easy_gap_advertise_stop()和app_easy_gap_undirected_advertise_start()而不使用/等待回调user_app_adv_undirect_complete()?新的广告消息将在函数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的源代码。问题是如果指针不是NULL。函数app_easy_gap_undirected_advertise_get_active()的下一次调用将返回旧的准备好的广告消息。

非常感谢您的提前回答。

设备:
MT_dialog
离线
最后看到:2个月前3个星期前
工作人员
加入:2015-06-08 34
嗨AngelT,

嗨AngelT,

1.不,如果你做这种实现,你很可能会遇到问题。当使用已定义的字符串调用启动广告过程时,您必须停止广告过程并等待堆栈通知您广告过程已停止,以便更改广告字符串并重新开始广告。如果您不知道前一个广告过程是否已停止,则不能启动新的广告过程。

2.我们从来没有试过,但我看不出有什么问题。尽管大多数情况下,如果您的广告已经停止,并且您发出了一个额外的广告停止,它将直到下次您醒来时才会执行,并且由于您将不会被连接,并且您将不会发布广告(因为它已停止),如果您从外部中断或内核计时器唤醒,则(关于广告停止的)消息将被发送到堆栈。当您实际取消广告事件时,广告完整处理程序将被命中。

3.抱歉,但我不知道问题到底是什么,因为你已经开始广告与一些数据(调用app_easy_gap_undirected_advertise_start())指向adv_cmd的指针将为空。在停止发布并重新启动之后,get_active将检查指针并填充设备的标准数据,然后发布数据将使用来自app_add_ad_struct()的额外数据进行更新。除非你填写广告结构,你不调用广告操作的开始,直到你调用它的数据应该被改变?是这样吗?即使adv_cmd不是NULL,你也可以像app_add_ad_struct()一样更新你的字符串。此外,你不必使用简单的api函数来执行广告,你总是可以分配GAPM_START_ADVERTISE_CMD填充参数与你想要的数据,并将其发送到堆栈。你可以在用户定义的文件中实现这个功能,这样你就不会混淆SDK了。

由于MT_dialog

AngelT
离线
最后看到:1年2个月前
加入:2016-03-24需要
嗨MT_dialog,

嗨MT_dialog,
谢谢你的快速回答。

1.这些是需求,它们将被实现,尽管我不认为这两个函数连续执行有任何问题。因为我没有修改当前的广告字符串。它与前面的命令“start advertise”一起发送到内核,并写入函数ke_msg_send()的头文件中一旦函数被调用,就不可能再访问它的数据了,因为内核可能已经复制了消息并释放了原始内存。新的广告字符串分配在堆内存中,还没有发送到内核。可能还有另一个原因。

3.目的不是编写函数和复制SDK。目的是用最好的方式使用它。请参阅函数app_add_ad_struct()中的示例代码。如果不能在广告消息中添加使用数据,则只有ASSERT_ERROR(0);这就是结局。为什么?如果将assert替换为ASSERT_WARNING(0);执行将继续进行,但广告信息将在没有使用的数据的情况下传输。指针将被释放,因为函数app_easy_gap_undirected_advertise_start()将被执行。 That is why my question was whether there is a function or way to release the allocated message without to start a dummy advertising operation. One additional function in the module app.c could fix the problem.
例如,代码可以是:

if (adv_cmd != NULL)

KE_MSG_FREE (adv_cmd);
adv_cmd == NULL;

这对吗?

MT_dialog
离线
最后看到:2个月前3个星期前
工作人员
加入:2015-06-08 34
嗨AngelT,

嗨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