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

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 = =零;

这是正确的吗?

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

嗨AngelT,

1)它的正确的方法,如果你不等待栈验证广告确实是停止和你的问题一个广告immidiatelly你会遇到问题,它没有和内存分配,但广告过程本身和堆栈是如何处理它。

2)关于ASSERT_ERROR(0)和广告数据,函数正在检查是否额外的数据适合广告或扫描响应字符串,如果不是,它必须通知开发人员,在这一点是错误的。现在关于adv_cmd指针的释放,在当前实现中如果出现错误的广告和广告的用户信息不适合字符串或扫描响应数据当前实现认为这是一个错误条件,开发人员应该得到通知如果没有用户数据,它将无法从这种情况中恢复过来,并继续进行广告。如果您愿意,可以使用这种实现,释放分配的消息和adv_cmd指针。或者您可以删除ASSERT_ERROR并在没有用户数据的情况下继续发布(因为您将调用app_easy_gap_undirected_advertise_start(),所以adv_cmd将被设置回NULL)。c文件不是SDK核心文件的一部分,所以可以自由修改它。

由于MT_dialog