我想根据连接到DA14580的传感器的数据改变广告间隔。我计划通过将app.c中的第209和210行更改为一个可以被另一个函数更新的全局变量来实现这一点。
所以我会在app.c中有这样的东西:
空白app_adv_start(空白)
{
...
cmd - > intv_min = current_app_adv_int_min;/ /是APP_ADV_INT_MIN
cmd - > intv_max = current_app_adv_int_max;/ /是APP_ADV_INT_MAX
....
}
这工作吗?这是完成这件事的最好方法吗?
谢谢你的帮助。
亲爱的Motred,
如果你需要改变广告间隔,app.c中的209和210行都必须更改,你是对的。
你提到的函数没问题。
注意current_app_adv_int_min和current_app_adv_int_max必须相同。
最好的问候,
纪尧姆。
嗨,盖伊表示,
您知道如果将intv_min和intv_max设置为不同会发生什么吗?
从我的测试来看,当intv_min < intv_max时,发布间隔为intv_max。
你知道这样做有什么副作用吗?如果intv_min被忽略,它有什么好处?
(我只是出于好奇才感兴趣)。
谢谢,
奥伦
#定义APP_ADV_INT_MIN 1100
#定义APP_ADV_INT_MAX 1100
1100意思吗? ?单位? ?
你好,hrg,我相信单位是1/100秒。
BR
JE_Dialog
你好,
你应该用1100乘以0.625来得到事件之间的毫秒数。1100 => 688ms。
嗨JE_Dialog
你确定吗?因为这是广告间隔,所以1100*(1/100)= 11秒!!??或者是1100 * 0.625 =687。msec ?因为在检查功率分析时,两个广告事件之间的时间大约是680毫秒!!
嗨Hrg,
请看我上面的回答。
除了设置之外,堆栈必须向广告添加一个随机数,以避免两个独立的设备在空中持续碰撞。所以广告会上下10毫秒左右
你好,hrg,是的,你是对的:我错误地看了我们的信标SW,我们有一个不同的计算。
在main.c中的第81行和83行应用了一个0.625的倍数,所以680mS是正确的值。
#define APP_ADV_INT_MIN 0x20 // *0.625ms(+伪随机advDelay from 0 to 10ms)
BR JE_Dialog
你好,
再加上这个。你将不得不停止,然后重新开始广告,以真正改变间隔。
嗨我,
在#8中,你提到(BLE)堆栈将在APP_ADV_INT_MAX上面添加随机数(0~10ms),而在我们的测试中,我们没有看到这个随机数添加到间隔中:
当我们同时打开3个DA模块(有相同的固件)时,我们很难扫描所有3个模块(有时只能扫描1个,有时2个)
-而如果我们逐个打开3个DA模块,我们每次都可以扫描所有3个模块。
-如果我们用不同的APP_ADV_INT_MAX烧固件到每个模块,并同时启动3个模块,我们也可以每次扫描所有3个模块。
请帮忙检查和建议…
谢谢。
亚历克斯
嗨,亚历克斯,
根据蓝牙规范,广告事件发生的时间间隔是有规律的,稍微修改为随机延迟,以帮助避免干扰。即使没有这种机制,随着时间的推移,不同的广告间隔应该漂移并停止彼此重叠(不管你的广告是如何同时开始的,你的扫描仪多久没有发现其他设备)。你使用不同的域名吗?你的软件版本是什么?
由于MT_dialog
谢谢你太. .
你使用不同的域名吗?
是的,我们每个模块都有不同的BDA。
你的软件版本是什么?
-基于SDK304开发的固件。
亚历克斯。
嗨,亚历克斯,
请尝试定义CFG_TRNG配置,并再次检查发布事件是否重叠?
谢谢MT_dialog。
嗨对话框
我们有与#11相同的问题,我们使用SDK 5.0.2.1
信息:
我们使用“app_easy_gap_non_connectable_advertise_start_create_msg”,它相同地设置cmd->intv_max和cmd->intv_min
cmd - > intv_max = user_non_connectable_advertise_conf.intv;
cmd - > intv_min = user_non_connectable_advertise_conf.intv;
True Random number Generator is enabled in "da1458x_config_advanced.h"
#定义CFG_TRNG
希望您有一个解决方案,因为这是应用程序的一个实际问题。
最好的问候,
Ciano霜
丹麦
嗨ciano,
请确保在580下载的图像中定义了CFG_TRNG,我在一个修改后的模板示例中使用SDK 5.0.2.1测试了您的场景,在不可连接模式下发布广告(不同的广告字符串,不同的bd_addresses和相同的广告间隔)和通过连接两个复位引脚,我发出了一个复位在两个板在同一时间。我可以正确地看到板与嗅嗅和一个正常的android BLE应用程序。我可以得到一个设备和损坏的广告数据的唯一方式是当CFG_TRNG是未定义的。请检查嗅探器附件时,TRNG是定义的,当它不是。
由于MT_dialog
嗨对话框
我忘记提到的一件事是,我正在使用计时器每秒钟重新启动一次广告。我每次都改变广告数据。我使用user_non_connectable_advertise_conf.intv = 16000设置广告,即10秒。所以我的有效间隔是由1秒计时器决定的,在这里我停止并重新启动广告。
现在我的问题是:当蓝牙堆栈每秒钟重新启动它的广告时,是否还会给广告增加一个随机的0- 10ms延迟?
如果在这种情况下没有添加随机延迟,那么这就可以解释我在空中经历的广告碰撞。
期待您的回答。
最好的问候,
Ciano
嗨ciano,
你每1秒发布1个广告包,这是由运行计时器定义的,它发出一个广告开始。这就解释了你所经历的,第一条广告信息并没有延迟。发出app_adv_start后,在以随机延迟重新安排下一个广告事件之后,广告字符串将与另一个DUT在同一时间传输,因此在发送的第一个消息中,两个广告消息之间存在冲突。你正在经历的一个工作是减少广告间隔,使第二个广告字符串在1秒间隔内传输,并随机延迟插入广告间隔,使两个广告字符串不碰撞。
你可以计算你已经发出的广告字符串,并在第二个发出的广告字符串中停止广告(该字符串将被正确接收),你可以捕获广告的完成,并启动计时器,当计时器过期时开始再次发布。
下面是一个关于如何计算你的广告事件的小片段:
enum arch_main_loop_callback_ret count_adv_events(空白)
{
uint8_t temp_last_ble_event;
temp_last_ble_event = arch_last_rwble_evt_get ();
If (app_last_ble_event != temp_last_ble_event)
{
app_last_ble_event = temp_last_ble_event;
if (app_last_ble_event == BLE_EVT_END)
adv_count + +;
If (adv_count == 2) = 1
{
adv_count = 0;
app_easy_gap_advertise_stop ();
}
}
返回GOTO_SLEEP;
}
由于MT_dialog
谢谢你的回答。
一个问题:
根据我的理解,然后随机延迟,这是添加到广告间隔I在10毫秒的范围。有可能将这个范围增加到500或1000毫秒吗?
目前我已经手动完成了这个应用程序计时器设置从固定的延迟加上随机(TRNG)时间从-500ms到500ms…这样广告就及时地传播开来了,我几乎没有看到有很多的碰撞。
最好的问候,
Ciano霜
丹麦
嗨ciano,
根据BLE规范,在广告操作中插入的延迟位于ROM代码中,您不能更改这一点。
由于MT_dialog
非常感谢你提供的信息。
我现在没有其他问题了。
最好的问候,
Ciano霜
丹麦。