我使用Beacon示例项目作为基础,但是我想向广告数据包添加更改数据。
例如,来自ADC的一些值,甚至只是一个递增计数器。
我发现这个例子的结构令人困惑-我猜它在app_dialog beacon_project .c中的app_adv_func中设置了广告包,但它并不能立即看出它实际上是从哪里调用的。我认为它只在设置时调用一次,然后它就会做广告。
所以我的问题是,当我有新数据时,我如何再次调用此功能。我必须首先停止广告,然后重建包装,还是我可以重建包装?
我应该在程序的什么地方做这个,做这个的最好的方法是什么?
非常感谢
你好,
你完全正确。
以下是对你问题的回答:
如何动态改变广告数据?
首先,必须停止BLE收音机,然后可以更新ADV数据。
在一定的时间之后,必须使用KERNEL定时器来更新广告字符串。
内核定时器函数示例:app_timer_set(APP_ADV_TIMER, TASK_APP, 300);
必须在app_adv_func()中调用的函数。
时间一过,就必须向内核发送一个GAPM_CANCEL消息。
这将在发布新参数之前取消正在进行的活动。
这是通过在BLE计时器处理程序中调用app_adv_stop()来完成的。
广告可以重新开始
在gapm_cmp_evt_handler()(以GAPM_ADV_NON_CONN为例)中,必须调用函数app_adv_start()来再次开始发布。
问候,
对话框的团队。
你好,
我还试图修改广告数据包(序列号)每条广告信息,
从上面的解释我不明白该怎么办?
设置app_timer_set(APP_ADV_TIMER, TASK_APP, 300);在app_adv_func()。时间一过,app_adv_timer_handler(..)函数就启动了,
并在gapm_cmp_evt_handler()处再次设置app_adv_start(),以GAPM_ADV_UNDIRECT为例。
问候,
帮我
嗨,对话框的团队,
所以,没有*回拨*类型函数可用于在BLE堆栈将要发送新数据包之前更改ADV数据包,对吧?
嗨Hardy.chen,
你的意思是在发送完一个广告包后将被调用的回调函数?不,没有这样的复试。如果你想实现这种功能,请检查app_async_trm()函数中的app_sleep.h文件中的信标参考设计,这可能会有帮助。只有完成提供广告操作的回调。
由于MT_dialog
嗨MT_dialog,
是否有任何文档解释app_last_rwble_evt_get报告的事件?
即何时事件BLE_EVT_END可用?每个发送的ADV包?或终止BLE连接?还是每包PDU的连接?
嗨Hardy.chen,
也请参考你的其他帖子,http://support.dialog-semiconductor.com/please-explain-last-ble-event-enum.当一个传输结束时,BLE_EVT_END将可用,这意味着在每个BLE事件结束时,你将为每个广告事件完成和每个连接间隔完成获得一个BLE_EVT_END。
由于MT_dialog
嗨,对话框的团队,
那么,通过连接事件BLE_EVT_END(也是通过检查前面的事件代码)来更新广告内容是否可能。即BLE_EVT_TX),这应该是在每个传输完成产生?
但是我想知道是否应该考虑*延迟*,因为*app_adv_stop*和*app_adv_start*应该总是被调用来更改广告内容。我是否应该等待任何回调或事件报告从内核完成每个调用*app_adv_stop*和*app_adv_start*?如果这样改变广告内容,那么在*每个ADV包*中(以ADV_NONCONN为例)DA14580支持改变广告内容的最大速度(或者说最小间隔)是多少?
简而言之,如果我想在20ms的间隔内拥有信标,并在每个广告中旋转3个不同的消息,这将是可能的吗?
嗨Hardy.chen,
我相信你可以做到这一点,检查last_ble_evt的BLE_EVT_END,当它发生时发出一个广告停止,以改变广告字符串。停止发布过程完成后,您可以在gapm_cmp_evt_handler中捕获发布结束消息,以GAPM_ADV_UNDIRECT或GAPM_ADV_NON_CONN为例,更改发布字符串并重新开始发布。我不认为命令(app_adv_stop和app_adv_start)的延迟会那么大,以便被考虑在内。您可以查看app_asynch_trm()函数中的app_sleep.h文件中的信标实现,以获得一些想法。
由于MT_dialog
嗨,对话框的团队,
谢谢,是的,我根据这种方式成功完成了此功能。
干杯!