在广告模式下访问物联网加密狗传感器数据

11个岗位/ 0个新岗位
最后发表
jeremynwong
离线
最后看到:4年1个月前
加入:2017-01-16 14:09
在广告模式下访问物联网加密狗传感器数据

你好,

我正在使用Dialog IoT开发工具包。我试图检测加密狗是否在一定的时间间隔内移动,并在广告数据中放置一个标志。做这件事最好的方法是什么?是否有一个中断,我可以为每次加密狗移动写一个处理程序?如果是,我该如何设置呢?或者有一个函数,我可以调用,将告诉我,如果加密狗已经移动或没有(我可以重置后,每次我读取它)

我尝试调用bmo160_get_any_motion_stat()和bmi160_get_step_counter()函数来检测运动,但这似乎不起作用。在广告模式下,我是否可以使用其他功能,或者是否需要其他设置才能使用这些功能?

我正在工作的wrbl_sfl项目。

谢谢,
杰里米

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

嗨jeremynwong,

物联网项目在广告结束后立即获得任何类型的运动中断,在广告完成回调中,user_bmi160_config_anymotion_intr()函数将加速度计设置为该模式,因此当加速度计感知到任何类型的运动触发中断到583时,wkup_intr_non_connected_cb()被触发,以便设备再次开始广告,所以你可以在那个中断处理程序上放置一个标志,或者由于设备每次移动时都会启动广告,您甚至可以在user_adv_start()函数中设置设备移动的标志,并相应地修改广告字符串。如果你想在发布广告时计数,你可以使用这个配置,以便在任何时候都可用,并在任何移动时触发中断。

还要注意,在sfl项目中编写额外代码的空间是非常有限的,如果不是不存在的话,问题是keil的限制,因为它不会在32K上编译额外的代码,所以我建议使用原始项目,除非你想要传感器融合功能。

由于MT_dialog

michaelmeng998
离线
最后看到:4年2个月前
加入:2017-01-11 07:46
嗨MT_dialog !你提到的

嗨MT_dialog !你提到物联网项目会在广告结束后立即中断任何类型的运动,所以如果检测到运动,则会触发中断处理程序,以便设备再次开始广告。如果我们想让中断一直被启用,而不仅仅是在14583进入睡眠状态之后呢?我们目前禁用了14583的睡眠模式。

另外,您提到我们可以在user_adv_start函数中编写一个标志。我们将如何使用anymotion或stepcounter函数来帮助我们实现目标。我们已经尝试使用read_step_counter语句在user_app_adv_undirect_complete函数中写入一个标志,但它根本不起作用。

谢谢,

迈克尔

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

嗨michaelmeng998,

如果你想启用了中断然后你必须配置传感器提供一个中断的时间中断的设备运行和后你可以认为这是一场运动,还你要考虑作为一个运动,取决于你如何配置了IMU的中断,永久BMI中断操作下,暂时锁定模式(请检查BMI160数据表的更多信息)。

关于如何做到这一点,请告知传感器的数据表,模块本身提供了一系列配置和在特定条件下触发的中断,因此您应该检查适合您的配置和在BMI模块中启用相应的功能。关于在user_adv_start_function中写入标志,我所提到的是,如果你想通告设备正在被移动,因为设备在进入永久睡眠时启用中断,在唤醒时通告,你可以设置一个计数器或标志作为设备被移动的指示并通告。

由于MT_dialog

michaelmeng998
离线
最后看到:4年2个月前
加入:2017-01-11 07:46
嗨MT_dialog:

嗨MT_dialog:

我还是有点糊涂。我检查了datasetah .h源文件,它有一些特定的IRQn,比如从低功率中断唤醒,每个接收数据包结束时的接收中断,以及广告中断的结束,但没有对应于我们第一次启动设备的中断。

此外,在在线的bmi160数据表中,它说有一个任意运动中断寄存器(INT_MOTION, 0x5F-0x62)。我正在试图找出如何启用这个中断。另外,我们是否需要编写单独的中断处理程序,或者我们是否可以调用预先编写的中断处理程序之一,如wkup_intr_non_connected_cb?

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

嗨michaelmeng998,

当代码开始在设备上运行时没有中断,如果你想知道在哪里可以设置中断以便被触发,你可以将它放在.app_on_init回调中,甚至可以在广告开始时放置它。

物联网源代码允许在设备停止发布时中断,在user_app_on_adv_undirect_complete中,如果您检查user_init_bmi_nc()函数,您将能够找到一个示例如何设置BMI与任何运动中断,更具体地说,user_bmi160_config_anymotion_intr()是设置中断被触发的函数。您可以检查该功能并将您想要的配置应用到您的项目中。关于中断的处理,在IoT上这个中断连接到唤醒定时器(当设备处于睡眠状态时可用的中断),为了给该中断分配一个ISR,有wkupct_register_callback() api来完成这一点,例如在IoT中anymotion中断和IMU配置后,函数config_da1458x_pin_intr_non_connected()被调用,该函数将wkup_intr_non_connected_cb注册到唤醒计时器,并通过wkupct_enable_irq()函数设置预期中断的引脚。

由于MT_dialog

michaelmeng998
离线
最后看到:4年2个月前
加入:2017-01-11 07:46
嘿MT_dialog。谢谢你

嘿MT_dialog。谢谢你的回复。我还有几个问题。你提到user_init_bmi_nc()函数是用任意运动中断设置BMI的函数?当我检查user_wrbl.c文件时,在发布完成后,user_app_on_adv_undirect_complete函数中调用了user_init_bmi_nc()函数。因此,如果我们想在发布开始时设置中断,我们是否只是将user_init_bmi_nc()函数移动到user_adv_start()函数?

此外,由于我想访问加密狗的运动状态(无论它是否移动),然后配置我们的广告包携带是否移动,(我们已经有能力修改广告包的大小,我们只需要正确访问运动状态信息)在bmi160检测到运动后,运动状态存储在哪里?是否有一个特定的队列保存我们可以访问的信息?

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

嗨michaelmeng998,

不仅是user_init_bmi_nc(),它只在传感器端设置配置,你还必须在user_app_on_adv_undirect_complete中配置583的中断,还有一些额外的配置代码用于配置IMU设备,请阅读并尝试理解代码。如果你只是放置user_init_bmi_nc(),它就不会工作。

关于你的第二个问题,你将能够在IMU的数据表中找到答案和更多信息,然而,当中断被触发时,你可以在wkup_intr_non_connected_cb()中看到,设备读取一些寄存器(INT_STATUS_寄存器- 0x1C, 0x1D, 0x1E),以确定触发的中断是什么。

由于MT_dialog

jeremynwong
离线
最后看到:4年1个月前
加入:2017-01-16 14:09
嗨MT_Dialog,

嗨MT_Dialog,

我们已经设置了当加密狗移动时触发的中断。这部分是有效的。我们希望运行另一个类似但不同的函数,而不是执行默认的user_adv_start操作。

原因是我们将user_adv_start函数设置为使用0x00标记开始发布,该标记在程序初始化时被调用,因为“未移动”应该是我们的初始状态。

然而,中断表示运动已经发生,我们希望开始发布,但标记为0x01。我们创建了一个单独的函数restart_adv,并从中断处理程序中调用它,如下所示。然而,即使调用了这个函数(我们在调试器中验证了这一点),加密狗仍然使用0x00重新启动广告,即使我们将0x01作为参数传递给我们的开始广告函数。

相关代码如下所示。

谢谢,
杰里米

//在user_platform.c
Void wkup_intr_non_connected_cb(Void) //当加密狗移动时,该函数被成功调用

restart_adv ();

//在user_wrbl.c
Void user_adv_start(Void){//这是在程序初始化时调用的,使用0x00发布
user_easy_gap_undirected_advertise_start(FAST_ADV_INTERVAL, 0x00);

Void restart_adv(Void){//这是我们想从中断处理程序调用的,应该用0x01通告
user_easy_gap_undirected_advertise_start(FAST_ADV_INTERVAL, 0x01);

//函数开始广告,我们添加了一个额外的参数为我们想要广告的用户数据
静态void user_easy_gap_undirected_advertise_start(uint16_t adv_intv, uint8_t user_data)

Struct gapm_start_advertise_cmd* cmd;
Timer_hnd app_adv_data_update_timer_used = app_easy_timer(1000, adv_data_update_timer_cb);

CMD = app_easy_gap_undirected_advertise_get_active();
Cmd ->intv_max = adv_intv;
Cmd ->intv_min = adv_intv;
user_add_adv_info (cmd - > info.host。Scan_rsp_data, 10);
user_add_accel_info (cmd - > info.host。scan_rsp_data user_data);//修改我们用于广告数据的字节

app_easy_gap_undirected_advertise_start ();

//我们现在是可连接的
ke_state_set (TASK_APP APP_CONNECTABLE);

Uint8_t user_add_accel_info(Uint8_t *padv, Uint8_t user_data){
Padv [7] = user_data;
返回0;

jeremynwong
离线
最后看到:4年1个月前
加入:2017-01-16 14:09
嗨MT_Dialog,

嗨MT_Dialog,

我们知道问题出在哪里了。谢谢!

杰里米

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

嗨jeremynwong,

谢谢你的提示,如果你觉得上面的答案有用,请接受它们,或者甚至可以自由地分享你的解决方案,以便其他人在类似的问题上得到帮助。

由于MT_dialog