Browse Source

蓝牙扫描支持不添加过滤器就可以扫描任意设备

master
zhaohe 11 months ago
parent
commit
a8cbed05af
  1. 6
      .gitmodules
  2. 2
      app/src/main.c
  3. 123
      app/src/service/sdk_initer.c
  4. 10
      app/src/service/sdk_initer.h
  5. 23
      app/src/service/zble_nus_c.c
  6. 8
      app/src/service/zble_nus_c.h
  7. 2
      sdk

6
.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

2
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);

123
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();
}

10
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);

23
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);

8
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;

2
sdk

@ -1 +1 @@
Subproject commit ce0c31496e9269273bdad1e162951f65b99779b8
Subproject commit bfa0eb96e03057a12232392066bb4e051277788a
Loading…
Cancel
Save