From a8cbed05afdb2bc5f6103e3873b8ac153ebfa023 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Sat, 31 Aug 2024 23:08:11 +0800 Subject: [PATCH] =?UTF-8?q?=E8=93=9D=E7=89=99=E6=89=AB=E6=8F=8F=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E4=B8=8D=E6=B7=BB=E5=8A=A0=E8=BF=87=E6=BB=A4=E5=99=A8?= =?UTF-8?q?=E5=B0=B1=E5=8F=AF=E4=BB=A5=E6=89=AB=E6=8F=8F=E4=BB=BB=E6=84=8F?= =?UTF-8?q?=E8=AE=BE=E5=A4=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitmodules | 6 +-- app/src/main.c | 2 +- app/src/service/sdk_initer.c | 123 +++++++++++++++++++++++-------------------- app/src/service/sdk_initer.h | 10 +--- app/src/service/zble_nus_c.c | 23 -------- app/src/service/zble_nus_c.h | 8 +-- sdk | 2 +- 7 files changed, 77 insertions(+), 97 deletions(-) diff --git a/.gitmodules b/.gitmodules index 89753da..6ecac07 100644 --- a/.gitmodules +++ b/.gitmodules @@ -3,13 +3,13 @@ url = zwsd@192.168.1.3:p_chinagoldgroup_hand_acid/blelib_sdk.git [submodule "bootloader"] path = bootloader - url = zwsd@192.168.1.3:p_chinagoldgroup_hand_acid/blelib_bootloader.git + url = zwsd@192.168.1.3:p_chinagoldgroup_hand_acid_libs/blelib_bootloader.git [submodule "pemkey"] path = pemkey - url = zwsd@192.168.1.3:p_chinagoldgroup_hand_acid/blelib_pemkey.git + url = zwsd@192.168.1.3:p_chinagoldgroup_hand_acid_libs/blelib_pemkey.git [submodule "libznordic"] path = libznordic - url = zwsd@192.168.1.3:p_chinagoldgroup_hand_acid/blelib_libznordic.git + url = zwsd@192.168.1.3:p_chinagoldgroup_hand_acid_libs/blelib_libznordic.git [submodule "app_protocols"] path = app_protocols url = zwsd@192.168.1.3:p_chinagoldgroup_hand_acid/hand_acid_app_protocols.git diff --git a/app/src/main.c b/app/src/main.c index 7e2fe83..172af8b 100644 --- a/app/src/main.c +++ b/app/src/main.c @@ -166,7 +166,7 @@ int main(void) { zappcore_init(); board_init(); - zble_master_sdk_init("AciDisp", NULL, false, on_sdk_event_cb); + zble_master_sdk_init("", false, on_sdk_event_cb); uart_initer_init(on_uart_data); diff --git a/app/src/service/sdk_initer.c b/app/src/service/sdk_initer.c index d7b58e8..9eeca5b 100644 --- a/app/src/service/sdk_initer.c +++ b/app/src/service/sdk_initer.c @@ -19,8 +19,8 @@ static ble_uuid_t const m_nus_uuid = {.uuid = BLE_UUID_NUS_SERVICE, static on_sdk_event_t m_onSdkEvent; static uint16_t m_ble_connect_handle; static char m_bleScanFilterName[40]; -static char m_slaveName[40]; -static bool m_autoConnect = false; +// static char m_slaveName[40]; +static bool m_autoConnect = false; void assert_nrf_callback(uint16_t line_num, const uint8_t* p_file_name) { app_error_handler(0xDEADBEEF, line_num, p_file_name); } static void nus_error_handler(uint32_t nrf_error) { APP_ERROR_HANDLER(nrf_error); } @@ -37,12 +37,13 @@ static void scan_start(void) { const char* ble_find_name(uint8_t const* p_encoded_data, uint16_t data_len) { static char name[40] = {0}; memset(name, 0, sizeof(name)); - uint16_t parsed_name_len; - uint8_t const* p_parsed_name; - uint16_t data_offset = 0; - parsed_name_len = ble_advdata_search(p_encoded_data, data_len, &data_offset, BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME); - p_parsed_name = &p_encoded_data[data_offset]; - memcpy(name, p_parsed_name, parsed_name_len); + uint16_t parsed_name_len; + uint16_t data_offset = 0; + parsed_name_len = ble_advdata_search(p_encoded_data, data_len, &data_offset, BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME); + if (parsed_name_len != 0) { + memcpy(name, &p_encoded_data[data_offset], parsed_name_len); + return name; + } return name; } @@ -71,14 +72,28 @@ static ble_gap_conn_params_t m_conn_param = { static sdk_event_t connectEventCache; +static bool nameIsEqWithHeader(const char* header, const char* name) { + if (!header) { + return true; + } + + if (strlen(name) < strlen(header)) return false; + for (int i = 0; i < strlen(header); i++) { + if (header[i] != name[i]) return false; + } + return true; +} + static void onScanEvent(scan_evt_t const* p_scan_evt) { static sdk_event_t reportEvent; memset(&reportEvent, 0, sizeof(reportEvent)); ret_code_t err_code; - ble_gap_evt_adv_report_t const* p_adv = p_scan_evt->params.filter_match.p_adv_report; - ble_gap_scan_params_t const* p_scan_param = p_scan_evt->p_scan_params; - if (NRF_BLE_SCAN_EVT_NOT_FOUND != p_scan_evt->scan_evt_id) NRF_LOG_INFO("on onScanEvent %d", p_scan_evt->scan_evt_id); + ble_gap_evt_adv_report_t const* p_adv = p_scan_evt->params.filter_match.p_adv_report; + ble_gap_scan_params_t const* p_scan_param = p_scan_evt->p_scan_params; + const char* bleclientName = NULL; + // if (NRF_BLE_SCAN_EVT_NOT_FOUND != p_scan_evt->scan_evt_id) NRF_LOG_INFO("on onScanEvent %d", p_scan_evt->scan_evt_id); + switch (p_scan_evt->scan_evt_id) { case NRF_BLE_SCAN_EVT_CONNECTING_ERROR: { APP_ERROR_CHECK(p_scan_evt->params.connecting_err.err_code); @@ -101,28 +116,32 @@ static void onScanEvent(scan_evt_t const* p_scan_evt) { case NRF_BLE_SCAN_EVT_FILTER_MATCH: { reportEvent.event = kevent_onScanResult; - strcpy(reportEvent.data.on_scan_result.blename, ble_find_name(p_adv->data.p_data, p_adv->data.len)); - reportEvent.data.on_scan_result.rssi = p_adv->rssi; - reportEvent.data.on_scan_result.tx_power = p_adv->tx_power; - memcpy(reportEvent.data.on_scan_result.peeradd, p_adv->peer_addr.addr, BLE_GAP_ADDR_LEN); - m_onSdkEvent(&reportEvent); - - if (m_autoConnect) { - if (strcmp(ble_find_name(p_adv->data.p_data, p_adv->data.len), m_slaveName) == 0) { - NRF_LOG_INFO("Device \"%s\" found, sending a connection request.", ble_find_name(p_adv->data.p_data, p_adv->data.len)); - err_code = sd_ble_gap_connect(&p_adv->peer_addr, p_scan_param, &m_conn_param, APP_BLE_CONN_CFG_TAG); - if (err_code != NRF_SUCCESS) { - NRF_LOG_ERROR("sd_ble_gap_connect() failed: 0x%x.", err_code); + bleclientName = ble_find_name(p_adv->data.p_data, p_adv->data.len); + if (bleclientName && strlen(bleclientName) != 0) { + // report scan result + strcpy(reportEvent.data.on_scan_result.blename, bleclientName); + reportEvent.data.on_scan_result.rssi = p_adv->rssi; + reportEvent.data.on_scan_result.tx_power = p_adv->tx_power; + memcpy(reportEvent.data.on_scan_result.peeradd, p_adv->peer_addr.addr, BLE_GAP_ADDR_LEN); + m_onSdkEvent(&reportEvent); + + if (m_autoConnect) { + if (nameIsEqWithHeader(m_bleScanFilterName, bleclientName)) { + NRF_LOG_INFO("Device \"%s\" found, sending a connection request.", bleclientName); + err_code = sd_ble_gap_connect(&p_adv->peer_addr, p_scan_param, &m_conn_param, APP_BLE_CONN_CFG_TAG); + if (err_code != NRF_SUCCESS) { + NRF_LOG_ERROR("sd_ble_gap_connect() failed: 0x%x.", err_code); + } + + connectEventCache.event = kevent_connected; + strcpy(connectEventCache.data.on_connect.blename, bleclientName); + connectEventCache.data.on_connect.rssi = p_adv->rssi; + connectEventCache.data.on_connect.tx_power = p_adv->tx_power; + memcpy(connectEventCache.data.on_connect.peeradd, p_adv->peer_addr.addr, BLE_GAP_ADDR_LEN); } - - connectEventCache.event = kevent_connected; - strcpy(connectEventCache.data.on_connect.blename, ble_find_name(p_adv->data.p_data, p_adv->data.len)); - connectEventCache.data.on_connect.rssi = p_adv->rssi; - connectEventCache.data.on_connect.tx_power = p_adv->tx_power; - memcpy(connectEventCache.data.on_connect.peeradd, p_adv->peer_addr.addr, BLE_GAP_ADDR_LEN); - // 延后上报 } } + } break; default: break; @@ -152,12 +171,6 @@ static void onBleNusEvent(ble_nus_c_t* p_ble_nus_c, ble_nus_c_evt_t const* p_ble event.data.on_ble_data.length = p_ble_nus_evt->data_len; m_onSdkEvent(&event); break; - case BLE_NUS_C_EVT_NUS_TX_EVT_2: - event.event = kevent_onRxData; - event.data.on_ble_data.data = p_ble_nus_evt->p_data; - event.data.on_ble_data.length = p_ble_nus_evt->data_len; - m_onSdkEvent(&event); - break; case BLE_NUS_C_EVT_DISCONNECTED: NRF_LOG_INFO("Disconnected."); @@ -235,6 +248,7 @@ static void ondbDiscoveryEvent(ble_db_discovery_evt_t* p_evt) { ble_nus_c_on_db_ /*********************************************************************************************************************** * BLE_INIT * ***********************************************************************************************************************/ + static void scan_init(void) { ret_code_t err_code; nrf_ble_scan_init_t init_scan; @@ -247,9 +261,14 @@ static void scan_init(void) { err_code = nrf_ble_scan_init(&m_scan, &init_scan, onScanEvent); APP_ERROR_CHECK(err_code); - APP_ERROR_CHECK(nrf_ble_scan_filter_set(&m_scan, SCAN_NAME_FILTER, m_bleScanFilterName)); - err_code = nrf_ble_scan_filters_enable(&m_scan, NRF_BLE_SCAN_NAME_FILTER, false); - APP_ERROR_CHECK(err_code); + // err_code = nrf_ble_scan_filter_set(&m_scan, SCAN_UUID_FILTER, &m_nus_uuid); + // APP_ERROR_CHECK(err_code); + // nrf_ble_scan_filters_enable(&m_scan, NRF_BLE_SCAN_UUID_FILTER, false); + + // APP_ERROR_CHECK(err_code); + // strcpy(m_bleScanFilterName, "AciDisp"); + // APP_ERROR_CHECK(nrf_ble_scan_filter_set(&m_scan, SCAN_NAME_FILTER, m_bleScanFilterName)); + // err_code = nrf_ble_scan_filters_enable(&m_scan, NRF_BLE_SCAN_NAME_FILTER, false); } static void ble_stack_init(void) { ret_code_t err_code; @@ -286,12 +305,11 @@ static void nus_c_init(void) { APP_ERROR_CHECK(err_code); } -void zble_master_sdk_init(const char* bleScanFilterName, const char* slaveName, bool autoConnect, on_sdk_event_t onSdkEvent) { +void zble_master_sdk_init(const char* bleScanFilterName, bool autoConnect, on_sdk_event_t onSdkEvent) { // APP_ERROR_HANDLER(onSdkEvent != NULL); // APP_ERROR_HANDLER(bleScanFilterName != NULL); - + if (!bleScanFilterName) bleScanFilterName = ""; memcpy(m_bleScanFilterName, bleScanFilterName, strlen(bleScanFilterName)); - if (slaveName) memcpy(m_slaveName, slaveName, strlen(slaveName)); m_onSdkEvent = onSdkEvent; m_autoConnect = autoConnect; @@ -318,30 +336,21 @@ void zble_master_sdk_init(const char* bleScanFilterName, const char* slaveName, } void zble_master_sdk_ble_tx(uint8_t* data, int32_t len) { ble_nus_c_string_send(&m_ble_nus_c, data, len); } + void zble_master_sdk_rescan(const char* slaveName, bool autoConnected) { // uint16_t connect_handle = 0; CRITICAL_REGION_ENTER(); - if (slaveName == NULL) { - memset(m_slaveName, 0, sizeof(m_slaveName)); - } else { - memcpy(m_slaveName, slaveName, strlen(slaveName)); + memset(m_bleScanFilterName, 0, sizeof(m_bleScanFilterName)); + if (!slaveName) { + memcpy(m_bleScanFilterName, slaveName, strlen(slaveName)); } m_autoConnect = autoConnected; connect_handle = m_ble_connect_handle; CRITICAL_REGION_EXIT(); if (connect_handle != 0) { - sd_ble_gap_disconnect(connect_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION); - } -} - -void zble_master_sdk_set_slave_name(const char* slaveName) { - CRITICAL_REGION_ENTER(); - if (slaveName == NULL) { - memset(m_slaveName, 0, sizeof(m_slaveName)); - } else { - memcpy(m_slaveName, slaveName, strlen(slaveName)); + uint32_t ecode = sd_ble_gap_disconnect(connect_handle, BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION); + NRF_LOG_DEBUG("sd_ble_gap_disconnect ecode:%d", ecode); } - CRITICAL_REGION_EXIT(); } diff --git a/app/src/service/sdk_initer.h b/app/src/service/sdk_initer.h index 503ca94..c0ca790 100644 --- a/app/src/service/sdk_initer.h +++ b/app/src/service/sdk_initer.h @@ -70,7 +70,7 @@ typedef struct { * @param autoConnect 是否自动连接 * @param onSdkEvent 事件回调 */ -void zble_master_sdk_init(const char* bleScanFilterName, const char* slaveName, bool autoConnect, on_sdk_event_t onSdkEvent); +void zble_master_sdk_init(const char* bleScanFilterName, bool autoConnect, on_sdk_event_t onSdkEvent); void zble_master_sdk_ble_tx(uint8_t* data, int32_t len); /** @@ -79,10 +79,4 @@ void zble_master_sdk_ble_tx(uint8_t* data, int32_t len); * @param slaveName * @param autoconnected */ -void zble_master_sdk_rescan(const char* slaveName, bool autoconnected); -/** - * @brief 设置从机设备 - * - * @param slaveName - */ -void zble_master_sdk_set_slave_name(const char* slaveName); +void zble_master_sdk_rescan(const char* slaveName, bool autoconnected); \ No newline at end of file diff --git a/app/src/service/zble_nus_c.c b/app/src/service/zble_nus_c.c index 35a0ddb..db2ca55 100644 --- a/app/src/service/zble_nus_c.c +++ b/app/src/service/zble_nus_c.c @@ -84,11 +84,6 @@ void ble_nus_c_on_db_disc_evt(ble_nus_c_t *p_ble_nus_c, ble_db_discovery_evt_t * nus_c_evt.handles.nus_tx_handle = p_chars[i].characteristic.handle_value; nus_c_evt.handles.nus_tx_cccd_handle = p_chars[i].cccd_handle; break; - case BLE_UUID_NUS_TX_CHARACTERISTIC_2: - nus_c_evt.handles.nus_tx_handle_2 = p_chars[i].characteristic.handle_value; - nus_c_evt.handles.nus_tx_cccd_handle_2 = p_chars[i].cccd_handle; - break; - default: break; } @@ -123,17 +118,7 @@ static void on_hvx(ble_nus_c_t *p_ble_nus_c, ble_evt_t const *p_ble_evt) { NRF_LOG_DEBUG("Client sending data."); } - if ((p_ble_nus_c->handles.nus_tx_handle_2 != BLE_GATT_HANDLE_INVALID) && (p_ble_evt->evt.gattc_evt.params.hvx.handle == p_ble_nus_c->handles.nus_tx_handle_2) && (p_ble_nus_c->evt_handler != NULL)) { - ble_nus_c_evt_t ble_nus_c_evt; - - // ble_nus_c_evt.evt_type = BLE_NUS_C_EVT_NUS_TX_EVT_2; - ble_nus_c_evt.evt_type = BLE_NUS_C_EVT_NUS_TX_EVT_2; - ble_nus_c_evt.p_data = (uint8_t *)p_ble_evt->evt.gattc_evt.params.hvx.data; - ble_nus_c_evt.data_len = p_ble_evt->evt.gattc_evt.params.hvx.len; - p_ble_nus_c->evt_handler(p_ble_nus_c, &ble_nus_c_evt); - NRF_LOG_DEBUG("Client sending data."); - } } uint32_t ble_nus_c_init(ble_nus_c_t *p_ble_nus_c, ble_nus_c_init_t *p_ble_nus_c_init) { @@ -155,7 +140,6 @@ uint32_t ble_nus_c_init(ble_nus_c_t *p_ble_nus_c, ble_nus_c_init_t *p_ble_nus_c_ p_ble_nus_c->evt_handler = p_ble_nus_c_init->evt_handler; p_ble_nus_c->error_handler = p_ble_nus_c_init->error_handler; p_ble_nus_c->handles.nus_tx_handle = BLE_GATT_HANDLE_INVALID; - p_ble_nus_c->handles.nus_tx_handle_2 = BLE_GATT_HANDLE_INVALID; p_ble_nus_c->handles.nus_rx_handle = BLE_GATT_HANDLE_INVALID; p_ble_nus_c->p_gatt_queue = p_ble_nus_c_init->p_gatt_queue; @@ -232,7 +216,6 @@ static uint32_t cccd_configure_2(ble_nus_c_t *p_ble_nus_c, bool notification_ena cccd_req.type = NRF_BLE_GQ_REQ_GATTC_WRITE; cccd_req.error_handler.cb = gatt_error_handler; cccd_req.error_handler.p_ctx = p_ble_nus_c; - cccd_req.params.gattc_write.handle = p_ble_nus_c->handles.nus_tx_cccd_handle_2; cccd_req.params.gattc_write.len = BLE_CCCD_VALUE_LEN; cccd_req.params.gattc_write.offset = 0; cccd_req.params.gattc_write.p_value = cccd; @@ -248,9 +231,6 @@ uint32_t ble_nus_c_tx_notif_enable(ble_nus_c_t *p_ble_nus_c) { if ((p_ble_nus_c->conn_handle == BLE_CONN_HANDLE_INVALID) || (p_ble_nus_c->handles.nus_tx_cccd_handle == BLE_GATT_HANDLE_INVALID)) { return NRF_ERROR_INVALID_STATE; } - if ((p_ble_nus_c->conn_handle == BLE_CONN_HANDLE_INVALID) || (p_ble_nus_c->handles.nus_tx_cccd_handle_2 == BLE_GATT_HANDLE_INVALID)) { - return NRF_ERROR_INVALID_STATE; - } cccd_configure(p_ble_nus_c, true); return cccd_configure_2(p_ble_nus_c, true); } @@ -291,9 +271,6 @@ uint32_t ble_nus_c_handles_assign(ble_nus_c_t *p_ble_nus, uint16_t conn_handle, if (p_peer_handles != NULL) { p_ble_nus->handles.nus_tx_cccd_handle = p_peer_handles->nus_tx_cccd_handle; p_ble_nus->handles.nus_tx_handle = p_peer_handles->nus_tx_handle; - p_ble_nus->handles.nus_tx_cccd_handle_2 = p_peer_handles->nus_tx_cccd_handle_2; - p_ble_nus->handles.nus_tx_handle_2 = p_peer_handles->nus_tx_handle_2; - p_ble_nus->handles.nus_rx_handle = p_peer_handles->nus_rx_handle; } return nrf_ble_gq_conn_handle_register(p_ble_nus->p_gatt_queue, conn_handle); diff --git a/app/src/service/zble_nus_c.h b/app/src/service/zble_nus_c.h index 680845b..abac519 100644 --- a/app/src/service/zble_nus_c.h +++ b/app/src/service/zble_nus_c.h @@ -103,7 +103,7 @@ extern "C" { #define BLE_UUID_NUS_SERVICE 0x0001 /**< The UUID of the Nordic UART Service. */ #define BLE_UUID_NUS_RX_CHARACTERISTIC 0x0002 /**< The UUID of the RX Characteristic. */ #define BLE_UUID_NUS_TX_CHARACTERISTIC 0x0003 /**< The UUID of the TX Characteristic. */ -#define BLE_UUID_NUS_TX_CHARACTERISTIC_2 0x0004 /**< The UUID of the TX Characteristic. */ +// #define BLE_UUID_NUS_TX_CHARACTERISTIC_2 0x0004 /**< The UUID of the TX Characteristic. */ #define OPCODE_LENGTH 1 #define HANDLE_LENGTH 2 @@ -120,7 +120,7 @@ extern "C" { typedef enum { BLE_NUS_C_EVT_DISCOVERY_COMPLETE, /**< Event indicating that the NUS service and its characteristics were found. */ BLE_NUS_C_EVT_NUS_TX_EVT, /**< Event indicating that the central received something from a peer. */ - BLE_NUS_C_EVT_NUS_TX_EVT_2, /**< Event indicating that the central received something from a peer. */ + // BLE_NUS_C_EVT_NUS_TX_EVT_2, /**< Event indicating that the central received something from a peer. */ BLE_NUS_C_EVT_DISCONNECTED /**< Event indicating that the NUS server disconnected. */ } ble_nus_c_evt_type_t; @@ -128,8 +128,8 @@ typedef enum { typedef struct { uint16_t nus_tx_handle; /**< Handle of the NUS TX characteristic, as provided by a discovery. */ uint16_t nus_tx_cccd_handle; /**< Handle of the CCCD of the NUS TX characteristic, as provided by a discovery. */ - uint16_t nus_tx_handle_2; /**< Handle of the NUS RX characteristic, as provided by a discovery. */ - uint16_t nus_tx_cccd_handle_2; /**< Handle of the CCCD of the NUS TX characteristic, as provided by a discovery. */ + // uint16_t nus_tx_handle_2; /**< Handle of the NUS RX characteristic, as provided by a discovery. */ + // uint16_t nus_tx_cccd_handle_2; /**< Handle of the CCCD of the NUS TX characteristic, as provided by a discovery. */ uint16_t nus_rx_handle; /**< Handle of the NUS RX characteristic, as provided by a discovery. */ } ble_nus_c_handles_t; diff --git a/sdk b/sdk index ce0c314..bfa0eb9 160000 --- a/sdk +++ b/sdk @@ -1 +1 @@ -Subproject commit ce0c31496e9269273bdad1e162951f65b99779b8 +Subproject commit bfa0eb96e03057a12232392066bb4e051277788a