在多个任务中接收BLE事件

⚠️
大家好. .谢谢你来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台,它将提供更好的功能,包含在主对话网站中。所有岗位和账户都已迁移。我们现在只接受新论坛的流量-请在上面发布任何新帖子//www.xmece.com/support.我们将在未来几天修复bug /优化搜索和标记。
6个职位/ 0个新职位
最后发表
火鸟
离线
最后一次露面:1个月7个小时前
加入:2019-07-12 09:48
在多个任务中接收BLE事件

嗨,团队,

我有质疑在网格应用程序中进行分离的扫描,如下线程。

https://support.dialog-seminile.com/forums/post/dialog-smartbond-bluetooth-low-energy-%2%80%93-software/separate-scan-mesh-application.

但当我调用ble_gap_scan_start()和ble_get_event()在单独的任务中获得BLE事件,控制台说另一个扫描已经运行,不仅BLE_EVT_GAP_ADV_REPORT/BLE_EVT_GAP_SCAN_COMPLETED,但其他事件也在同一任务中接收。

最终,MESH应用程序不能工作。

如何在多个任务中分离BLE事件处理?

设备:
PM_DIALOG.
离线
最后一次露面:1天47分钟前
工作人员
加入:2018-02-08 11:03
嗨firebird。

嗨firebird。

我假设你正在做ble_mesh项目。否则,请注明你的工作地点。既然你已经修改了,能否分享一下我们做了哪些修改,你的要求是什么?您是否添加了自定义任务?

谢谢,PM_DIALOG.

火鸟
离线
最后一次露面:1个月7个小时前
加入:2019-07-12 09:48
你好,

你好,

是的,我正在使用带有网格SDK 1.6.1的BLE_MESH示例。

我添加了以下任务,并在设备配置完成后启动它。

目前,这个任务只是开始另一个扫描和检查RSSI强度。稍后我会添加一些用于识别特定设备的代码。

/ ** **************************************************************************************** * * @file scanner_task.c * * @brief Main task + BLE * * Copyright (C) 2019 INFOMARK, Co., Ltd. * This computer program includes Confidential, Proprietary Information * of INFOMARK, Co., Ltd. All Rights Reserved. * **************************************************************************************** */ #include  #include  #include "osal.h" #include "ad_ble.h" #include "ble_common.h" #include "ble_gap.h" #include "ble_bufops.h" #include "ble_uuid.h" #include "sys_watchdog.h" static void start_scan(void) { ble_error_t status; status = ble_gap_scan_start(GAP_SCAN_PASSIVE, GAP_SCAN_GEN_DISC_MODE, BLE_SCAN_INTERVAL_FROM_MS(30), BLE_SCAN_WINDOW_FROM_MS(30), false, false); if (status != BLE_STATUS_OK) { printf("ERROR: application already scanning\r\n"); } printf("SCAN STARTED\r\n"); } static void handle_evt_gap_adv_report(const ble_evt_gap_adv_report_t *evt) { const uint8_t *p; uint8_t ad_len, ad_type; const char *dev_name = NULL; size_t dev_name_len = 0; printf("Device found: %s %s RSSI=%d\r\n", evt->address.addr_type == PUBLIC_ADDRESS ? "public " : "private", ble_address_to_string(&evt->address), (int8_t)evt->rssi); for (p = evt->data; p < evt->data + evt->length; p += ad_len) { ad_len = (*p++) - 1; /* ad_len is length of value only, without type */ ad_type = *p++; /* Device not found so we look for UUID */ if (ad_type == GAP_DATA_TYPE_UUID16_LIST || ad_type == GAP_DATA_TYPE_UUID16_LIST_INC) { size_t idx; for (idx = 0; idx < ad_len; idx += sizeof(uint16_t)) { printf("\tUUID16: %04X\r\n", get_u16(p + idx)); } } /* Look for name and store it to use later, if proper UUID is found */ if (ad_type == GAP_DATA_TYPE_SHORT_LOCAL_NAME || ad_type == GAP_DATA_TYPE_LOCAL_NAME) { dev_name = (const char*)p; dev_name_len = ad_len; printf("\tNAME: %.*s\r\n", dev_name_len, dev_name); } } } static void handle_evt_gap_scan_completed(const ble_evt_gap_scan_completed_t *evt) { printf("SCAN STOPPED\r\n"); start_scan(); } void scanner_main_task(void *pvParameters) { /* Just remove compiler warnings about the unused parameter */ (void)pvParameters; start_scan(); for (;;) { ble_evt_hdr_t *hdr; /* * Wait for a BLE event - this task will block * indefinitely until something is received. */ hdr = ble_get_event(true); if (!hdr) { continue; } switch (hdr->evt_code) { case BLE_EVT_GAP_ADV_REPORT: handle_evt_gap_adv_report((ble_evt_gap_adv_report_t *) hdr); break; case BLE_EVT_GAP_SCAN_COMPLETED: handle_evt_gap_scan_completed((ble_evt_gap_scan_completed_t *) hdr); break; default: printf("Event: %d\r\n", hdr->evt_code); ble_handle_event_default(hdr); break; } /* Free event buffer (it's not needed anymore) */ OS_FREE(hdr); } }

PM_DIALOG.
离线
最后一次露面:1天47分钟前
工作人员
加入:2018-02-08 11:03
嗨Firebird,

嗨Firebird,

你能在调试模式下运行你的代码吗?它会卡在什么地方吗?

谢谢,PM_DIALOG.

火鸟
离线
最后一次露面:1个月7个小时前
加入:2019-07-12 09:48
此代码运行一段时间

此代码运行一段时间和随机卡。

每次卡住,位置都不一样,所以找不出原因。

一些事件,如BLE_EVT_GAP_ADV_COMPLETED,它不是打算接收(与MESH函数相关)。

我想知道的是:

1.这种方法是否正确?即,我可以在不影响彼此的情况下在多个任务中获得BLE事件吗?

2.如果是这样,你可以检查我的代码和建议什么是错误的。

3.如果没有,回到最初的问题,我如何在MESH应用程序中执行单独的扫描?

火鸟
离线
最后一次露面:1个月7个小时前
加入:2019-07-12 09:48
任何更新?

任何更新?