在多个任务中接收BLE事件

⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
6个帖子/ 0新
最后一篇
火鸟
离线
最后一次露面:1个月6小时前
加入: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_REPOR / BLE_EVT_GAP_SCAN_CHOMPLETED,还会在同一任务中收到其他事件。

最终,网格应用程序不起作用。

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

设备:
PM_DIALOG.
离线
最后一次露面:23小时3分钟前
职员
加入:2018-02-08 11:03
嗨firebird。

嗨firebird。

我假设您正在研究BLE_MESH项目。否则,请说明您正在努力的地方。由于您修改了它,请您可以分享我们所做的修改以及您的要求是什么?您是否添加了自定义任务?

谢谢,PM_DIALOG.

火鸟
离线
最后一次露面:1个月6小时前
加入: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.
离线
最后一次露面:23小时3分钟前
职员
加入:2018-02-08 11:03
嗨Firebird,

嗨Firebird,

请在调试模式下运行代码吗?它是否被粘在任何地方?

谢谢,PM_DIALOG.

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

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

每次卡住时,位置都不同,所以无法弄清楚原因。

还收到了一些不旨在接收的(与网格函数相关)这样的一些事件.Pz_evt_gap_adv_Completed。

我想知道以下内容:

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

2.如果是,请您查看我的代码和建议是什么问题。

3.如果没有,回到原始问题,如何在网格应用程序中执行单独的扫描?

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

任何更新?