实时更新广告地址和数据

⚠️
大家好. .感谢来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台的过程中,它将提供更好的功能,并包含在主对话网站。所有的帖子和账号已经迁移。我们现在只接受新论坛的流量-请发布任何新的帖子在//www.wsdof.com/support.我们会在接下来的几天修复bug /优化搜索和标记。
9个员额/ 0个新员额
最后发表
彼得罗
离线
最后看到:1个月3个星期前
加入:2016-01-17 37
实时更新广告地址和数据

嗨,对话框中,

我们需要在主回路中实时更新广告地址和数据。
附件arch_main.c可以工作,除了有时地址和数据不一致。
例如,根据应用程序逻辑,如果我们这样更新:
ADDR数据
xx: xx: xx: xx: xx: 00 Info00
xx: xx: xx: xx: xx: 01 Info01

我们应该做到以下几点:
ADDR数据
xx: xx: xx: xx: xx: 00 Info00
xx: xx: xx: xx: xx: 01 Info01

事实上,我们有时会得到以下意想不到的结果:
ADDR数据
xx: xx: xx: xx: xx: 01 Info00

我们认为,广告地址的更新(通过写入寄存器BLE_BDADDRL_REG和BLE_BDADDRU_REG)可以立即完成,
广告数据更新(通过GAPM_UPDATE_ADVERTISE_DATA消息)被延迟或不与广告过程同步。

尽管SDK 6中的ble_app_noncon示例可以实现我们的函数,但成本似乎很高,我们想要更新主循环中的任何内容,以减少当前的消耗。

那么,还有其他安全更新的方法吗?

提前谢谢!

最好的问候,
彼得

----------------------------------- arch_main.c ---------------------------------------------
...
Uint8_t fly_update_count __attribute__((section("retention_mem_area0"), zero_init));

外面的空白adv_addr_update(无效);/*更新发布设备地址*/
外面的空白adv_data_update(无效);/*更新广告数据*/
....

int主要(空白)

sleep_mode_t sleep_mode;

//初始化保留模式
init_retention_mode ();

/ /全局初始化
system_init ();

/*
************************************************************************************
*平台初始化
************************************************************************************
*/

而(1)

{做
//调度所有挂起的事件
schedule_while_ble_on ();

while (app_asynch_proc() != GOTO_SLEEP);//将控制权限授予应用程序,尝试关闭电源
//如果应用程序返回GOTO_SLEEP

//在这里更新!!
fly_update_count + +;
If (((fly_update_count%50) == 0)) / /更新数据

adv_addr_update ();
adv_data_update ();

...

//如果允许的话,等待中断并进入睡眠
如果(((! BLE_APP_PRESENT) & & (check_gtl_state ())) | | (BLE_APP_PRESENT))

/ /禁用中断
GLOBAL_INT_STOP ();

app_asynch_sleep_proc ();

//获取允许的睡眠模式
//从rwip_power_down()到WFI()的时间必须尽可能短!!
sleep_mode = rwip_power_down ();

If (((sleep_mode == mode_ext_sleep) || (sleep_mode == mode_ext_sleep_otp_copy)))

//关掉收音机,做任何允许做的事情
arch_goto_sleep (sleep_mode);

//在扩展睡眠模式下,看门狗定时器被禁用
//(电源域PD_SYS自动关闭)。虽然,如果调试器
//被附加,看门狗定时器保持启用,必须显式地
/ /禁用。
if ((GetWord16(SYS_STAT_REG) & DBG_IS_UP) == DBG_IS_UP

wdg_freeze ();//停止看门狗定时器

//等待中断恢复操作
注射用水();

/ /恢复操作
arch_resume_from_sleep ();

Else if (sleep_mode == mode_idle)

如果(((! BLE_APP_PRESENT) & & check_gtl_state ()) | | (BLE_APP_PRESENT))

//等待中断恢复操作
注射用水();


/ /恢复中断
GLOBAL_INT_START ();

wdg_reload (WATCHDOG_DEFAULT_PERIOD);

关键词:
设备:
MT_dialog
离线
最后看到:7个月3天前
工作人员
加入:2015-06-08 34
嗨,彼得•罗

嗨,彼得•罗

我不确定你的要求到底是什么,关于广告数据更新,据我所知,你的问题是ble_app_nonconn项目不适合你,因为定时器醒了,所以你想要减少额外的唤醒定时器和发送命令,以更新广告数据,当你在主循环。你可以为了不惹SDK是将广告发布时更新命令.app_on_ble_powered回调,然后命令向堆栈可以迫使BLE呆了一段时间,以确保你的命令已经被返回KEEP_POWERED预定,在命令被调度之后,您可以从app_on_ble_powered返回GOTO_SLEEP。

关于修改bd地址,是不建议改变设备的bd地址通过直接写在585的寄存器尤其是设备广告时,你应该让堆栈来处理任何改变,也不建议改变设备的bd地址而广告,所以你必须停止广告过程,改变db地址,然后用新的bd地址做广告。一般来说,BLE规范中关于固定的BLE地址(公共或静态)定义了一个地址,当静态地址可以在ash电源周期后改变时,一个地址可以在产品的生命周期内固定(公共)或在重启期间改变,为了改变bd地址没有处理这样的问题你应该重置堆栈和让app_easy_gap_dev_configure()改变的bd地址你的设备,使用app_easy_gap_dev_config_get_active()为了得到准备的信息,改变bd地址和改变地址。

由于MT_dialog

彼得罗
离线
最后看到:1个月3个星期前
加入:2016-01-17 37
嗨,对话框中,

嗨,对话框中,

非常感谢您提供的如此有用的信息!

BR /彼得

拉。作为
离线
最后看到:2年7个月前
加入:2019-01-16 20:50
嗨,对话框中,

嗨,对话框中,
正如你上面提到的,我正在努力更改BD地址。在启动后,我运行一个计时器,我想保持将BD地址更改为不同的值。我向堆栈发送一个RESET,并在app_easy_dev_configure()断点处着陆。但是我如何使用app_easy_gap_dev_config_get_active()来更改BD地址。感谢你的帮助。谢谢。

PM_Dialog
离线
最后看到:1周5天前
工作人员
加入:2018-02-08 11:03
嗨拉。作为,

嗨拉。作为,

当app_easy_gap_dev_configure()被触发时,你应该像下面这样修改它:

空白app_easy_gap_dev_configure(空白)

uint8_t bd[6] = {0xC2,0x2A,0x35,0xD7,0x7B,0xD3};

Struct gapm_set_dev_config_cmd* CMD = app_easy_gap_dev_config_create_msg();

If (bd_flag) {memcpy(cmd->addr. b0);addr bd 6);}

app_gapm_configure_msg_send (cmd);

set_dev_config_cmd =零;

谢谢,PM_Dialog

拉。作为
离线
最后看到:2年7个月前
加入:2019-01-16 20:50
嗨PM_Dialog

嗨PM_Dialog
谢谢您的回复。我确实做到了。
我尝试每30秒切换我的BD地址使用这个技术使用定时器。
每次重置后,设备地址都会被更改,并且在user_app_adv_start()函数中,我重新启动我的30秒计时器。
但似乎计时器只运行几次迭代……

重置BLE栈有任何限制的次数,我们可以做它。

谢谢。

PM_Dialog
离线
最后看到:1周5天前
工作人员
加入:2018-02-08 11:03
嗨拉。作为,

嗨拉。作为,

不,对计时器运行的次数没有任何限制。计时器运行多少次?当它停止运行时,您会得到任何断言或硬错误吗?你能在调试模式下运行吗?

谢谢,PM_Dialog

拉。作为
离线
最后看到:2年7个月前
加入:2019-01-16 20:50
嗨PM_Dialog,

嗨PM_Dialog,

谢谢您的回复。
我没有得到任何断言。我在调试模式下运行。这似乎是一个多重定时器的问题,许多人已经在其他帖子抱怨。
当我停止第二个计时器并只运行这个主计时器时,一切似乎都工作得很好,没有任何问题。

有多次的例子吗?

谢谢

PM_Dialog
离线
最后看到:1周5天前
工作人员
加入:2018-02-08 11:03
嗨拉。作为,

嗨拉。作为,

我工作在ble_app_beararebone的例子的SDK,我使用定时器是在user_app_adv_start()函数,但我不能复制你的问题。你提到很多人都在抱怨这个问题,所以你能分享一下论坛上抱怨的帖子吗?

谢谢,PM_Dialog