|
|
@ -18,6 +18,7 @@ static uint16_t m_ble_nus_max_data_len = BLE_GATT_ATT_MTU_DEFAULT - OPC |
|
|
|
static ble_uuid_t const m_nus_uuid = {.uuid = BLE_UUID_NUS_SERVICE, .type = NUS_SERVICE_UUID_TYPE}; |
|
|
|
static on_sdk_event_cb_t m_on_sdk_event_cb; |
|
|
|
static char m_target_periph_name0[20] = BLE_CLIENT_NAME; |
|
|
|
static uint16_t m_ble_connect_handle; |
|
|
|
|
|
|
|
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); } |
|
|
@ -30,44 +31,48 @@ static void scan_start(void) { |
|
|
|
APP_ERROR_CHECK(ret); |
|
|
|
} |
|
|
|
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]; |
|
|
|
return p_parsed_name; |
|
|
|
memcpy(name, p_parsed_name, parsed_name_len); |
|
|
|
return name; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* @brief |
|
|
|
* |
|
|
|
* |
|
|
|
* scan_evt_handler 扫描事件处理 |
|
|
|
* |
|
|
|
* |
|
|
|
* |
|
|
|
* ble_nus_c_evt_handler ble服务事件上报 |
|
|
|
* |
|
|
|
* |
|
|
|
* |
|
|
|
* |
|
|
|
* |
|
|
|
* |
|
|
|
* onScanEvent 扫描事件处理 |
|
|
|
* |
|
|
|
* onBleNusEvent ble服务事件上报 |
|
|
|
* |
|
|
|
*/ |
|
|
|
|
|
|
|
static void scan_evt_handler(scan_evt_t const* p_scan_evt) { |
|
|
|
#define CONN_INTERVAL_MIN (uint16_t)(MSEC_TO_UNITS(7.5, UNIT_1_25_MS)) /**< Minimum acceptable connection interval, in units of 1.25 ms. */ |
|
|
|
#define CONN_INTERVAL_MAX (uint16_t)(MSEC_TO_UNITS(500, UNIT_1_25_MS)) /**< Maximum acceptable connection interval, in units of 1.25 ms. */ |
|
|
|
#define CONN_SUP_TIMEOUT (uint16_t)(MSEC_TO_UNITS(4000, UNIT_10_MS)) /**< Connection supervisory timeout (4 seconds). */ |
|
|
|
#define CONN_INTERVAL_DEFAULT \ |
|
|
|
(uint16_t)(MSEC_TO_UNITS(7.5, UNIT_1_25_MS)) /**< Default connection interval used at connection establishment by central side. \ |
|
|
|
*/ |
|
|
|
#define SLAVE_LATENCY 0 /**< Slave latency. */ |
|
|
|
static ble_gap_conn_params_t m_conn_param = { |
|
|
|
.min_conn_interval = CONN_INTERVAL_MIN, // Minimum connection interval. |
|
|
|
.max_conn_interval = CONN_INTERVAL_MAX, // Maximum connection interval. |
|
|
|
.slave_latency = SLAVE_LATENCY, // Slave latency. |
|
|
|
.conn_sup_timeout = CONN_SUP_TIMEOUT // Supervisory timeout. |
|
|
|
}; |
|
|
|
|
|
|
|
static void onScanEvent(scan_evt_t const* p_scan_evt) { |
|
|
|
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 scan_evt_handler %d", p_scan_evt->scan_evt_id); |
|
|
|
|
|
|
|
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: { |
|
|
|
err_code = p_scan_evt->params.connecting_err.err_code; |
|
|
|
APP_ERROR_CHECK(err_code); |
|
|
|
APP_ERROR_CHECK(p_scan_evt->params.connecting_err.err_code); |
|
|
|
} break; |
|
|
|
|
|
|
|
case NRF_BLE_SCAN_EVT_CONNECTED: { |
|
|
@ -82,15 +87,18 @@ static void scan_evt_handler(scan_evt_t const* p_scan_evt) { |
|
|
|
} break; |
|
|
|
|
|
|
|
case NRF_BLE_SCAN_EVT_FILTER_MATCH: { |
|
|
|
NRF_LOG_INFO("scan result: %s", ble_find_name(p_adv->data.p_data, p_adv->data.len)); |
|
|
|
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); |
|
|
|
} |
|
|
|
} break; |
|
|
|
|
|
|
|
default: |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static void ble_nus_c_evt_handler(ble_nus_c_t* p_ble_nus_c, ble_nus_c_evt_t const* p_ble_nus_evt) { |
|
|
|
static void onBleNusEvent(ble_nus_c_t* p_ble_nus_c, ble_nus_c_evt_t const* p_ble_nus_evt) { |
|
|
|
ret_code_t err_code; |
|
|
|
static sdk_event_t event; |
|
|
|
|
|
|
@ -127,7 +135,7 @@ static void ble_nus_c_evt_handler(ble_nus_c_t* p_ble_nus_c, ble_nus_c_evt_t cons |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
static void ble_evt_handler(ble_evt_t const* p_ble_evt, void* p_context) { |
|
|
|
static void onBleEvent(ble_evt_t const* p_ble_evt, void* p_context) { |
|
|
|
ret_code_t err_code; |
|
|
|
ble_gap_evt_t const* p_gap_evt = &p_ble_evt->evt.gap_evt; |
|
|
|
|
|
|
@ -137,31 +145,24 @@ static void ble_evt_handler(ble_evt_t const* p_ble_evt, void* p_context) { |
|
|
|
APP_ERROR_CHECK(err_code); |
|
|
|
err_code = ble_db_discovery_start(&m_db_disc, p_ble_evt->evt.gap_evt.conn_handle); |
|
|
|
APP_ERROR_CHECK(err_code); |
|
|
|
m_ble_connect_handle = p_gap_evt->conn_handle; |
|
|
|
break; |
|
|
|
|
|
|
|
case BLE_GAP_EVT_DISCONNECTED: |
|
|
|
|
|
|
|
NRF_LOG_INFO("Disconnected. conn_handle: 0x%x, reason: 0x%x", p_gap_evt->conn_handle, p_gap_evt->params.disconnected.reason); |
|
|
|
m_ble_connect_handle = -1; |
|
|
|
break; |
|
|
|
|
|
|
|
case BLE_GAP_EVT_TIMEOUT: |
|
|
|
if (p_gap_evt->params.timeout.src == BLE_GAP_TIMEOUT_SRC_CONN) { |
|
|
|
NRF_LOG_INFO("Connection Request timed out."); |
|
|
|
} |
|
|
|
break; |
|
|
|
|
|
|
|
case BLE_GAP_EVT_SEC_PARAMS_REQUEST: |
|
|
|
// Pairing not supported. |
|
|
|
err_code = sd_ble_gap_sec_params_reply(p_ble_evt->evt.gap_evt.conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL); |
|
|
|
APP_ERROR_CHECK(err_code); |
|
|
|
APP_ERROR_CHECK(sd_ble_gap_sec_params_reply(p_ble_evt->evt.gap_evt.conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL)); |
|
|
|
break; |
|
|
|
|
|
|
|
case BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST: |
|
|
|
// Accepting parameters requested by peer. |
|
|
|
err_code = sd_ble_gap_conn_param_update(p_gap_evt->conn_handle, &p_gap_evt->params.conn_param_update_request.conn_params); |
|
|
|
APP_ERROR_CHECK(err_code); |
|
|
|
APP_ERROR_CHECK(sd_ble_gap_conn_param_update(p_gap_evt->conn_handle, &p_gap_evt->params.conn_param_update_request.conn_params)); |
|
|
|
break; |
|
|
|
|
|
|
|
case BLE_GAP_EVT_PHY_UPDATE_REQUEST: { |
|
|
|
NRF_LOG_DEBUG("PHY update request."); |
|
|
|
ble_gap_phys_t const phys = { |
|
|
@ -173,14 +174,12 @@ static void ble_evt_handler(ble_evt_t const* p_ble_evt, void* p_context) { |
|
|
|
} break; |
|
|
|
|
|
|
|
case BLE_GATTC_EVT_TIMEOUT: |
|
|
|
// Disconnect on GATT Client timeout event. |
|
|
|
NRF_LOG_DEBUG("GATT Client Timeout."); |
|
|
|
err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gattc_evt.conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION); |
|
|
|
APP_ERROR_CHECK(err_code); |
|
|
|
break; |
|
|
|
|
|
|
|
case BLE_GATTS_EVT_TIMEOUT: |
|
|
|
// Disconnect on GATT Server timeout event. |
|
|
|
NRF_LOG_DEBUG("GATT Server Timeout."); |
|
|
|
err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gatts_evt.conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION); |
|
|
|
APP_ERROR_CHECK(err_code); |
|
|
@ -191,14 +190,14 @@ static void ble_evt_handler(ble_evt_t const* p_ble_evt, void* p_context) { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static void gatt_evt_handler(nrf_ble_gatt_t* p_gatt, nrf_ble_gatt_evt_t const* p_evt) { |
|
|
|
static void onGattEvent(nrf_ble_gatt_t* p_gatt, nrf_ble_gatt_evt_t const* p_evt) { |
|
|
|
if (p_evt->evt_id == NRF_BLE_GATT_EVT_ATT_MTU_UPDATED) { |
|
|
|
NRF_LOG_INFO("ATT MTU exchange completed."); |
|
|
|
m_ble_nus_max_data_len = p_evt->params.att_mtu_effective - OPCODE_LENGTH - HANDLE_LENGTH; |
|
|
|
NRF_LOG_INFO("Ble NUS max data length set to 0x%X(%d)", m_ble_nus_max_data_len, m_ble_nus_max_data_len); |
|
|
|
} |
|
|
|
} |
|
|
|
static void db_disc_handler(ble_db_discovery_evt_t* p_evt) { ble_nus_c_on_db_disc_evt(&m_ble_nus_c, p_evt); } |
|
|
|
static void ondbDiscoveryEvent(ble_db_discovery_evt_t* p_evt) { ble_nus_c_on_db_disc_evt(&m_ble_nus_c, p_evt); } |
|
|
|
|
|
|
|
/*********************************************************************************************************************** |
|
|
|
* BLE_INIT * |
|
|
@ -212,7 +211,7 @@ static void scan_init(void) { |
|
|
|
init_scan.connect_if_match = false; |
|
|
|
init_scan.conn_cfg_tag = APP_BLE_CONN_CFG_TAG; |
|
|
|
|
|
|
|
err_code = nrf_ble_scan_init(&m_scan, &init_scan, scan_evt_handler); |
|
|
|
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_target_periph_name0)); |
|
|
@ -232,12 +231,12 @@ static void ble_stack_init(void) { |
|
|
|
err_code = nrf_sdh_ble_enable(&ram_start); |
|
|
|
APP_ERROR_CHECK(err_code); |
|
|
|
|
|
|
|
NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL); |
|
|
|
NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, onBleEvent, NULL); |
|
|
|
} |
|
|
|
|
|
|
|
void gatt_init(void) { |
|
|
|
ret_code_t err_code; |
|
|
|
err_code = nrf_ble_gatt_init(&m_gatt, gatt_evt_handler); |
|
|
|
err_code = nrf_ble_gatt_init(&m_gatt, onGattEvent); |
|
|
|
APP_ERROR_CHECK(err_code); |
|
|
|
err_code = nrf_ble_gatt_att_mtu_central_set(&m_gatt, NRF_SDH_BLE_GATT_MAX_MTU_SIZE); |
|
|
|
APP_ERROR_CHECK(err_code); |
|
|
@ -246,7 +245,7 @@ static void nus_c_init(void) { |
|
|
|
ret_code_t err_code; |
|
|
|
ble_nus_c_init_t init; |
|
|
|
|
|
|
|
init.evt_handler = ble_nus_c_evt_handler; |
|
|
|
init.evt_handler = onBleNusEvent; |
|
|
|
init.error_handler = nus_error_handler; |
|
|
|
init.p_gatt_queue = &m_ble_gatt_queue; |
|
|
|
|
|
|
@ -264,7 +263,7 @@ void sdk_initer(on_sdk_event_cb_t on_sdk_event_cb) { |
|
|
|
APP_ERROR_CHECK(app_timer_init()); |
|
|
|
{ |
|
|
|
ble_db_discovery_init_t db_init = {0}; |
|
|
|
db_init.evt_handler = db_disc_handler; |
|
|
|
db_init.evt_handler = ondbDiscoveryEvent; |
|
|
|
db_init.p_gatt_queue = &m_ble_gatt_queue; |
|
|
|
APP_ERROR_CHECK(ble_db_discovery_init(&db_init)); |
|
|
|
} |
|
|
|