Nordic 中心设备(central)获取 外围设备(peripheral)设备名 (Device Name)
Nordic 中心设备(central)获取 外围设备(peripheral)设备名 (Device Name)
中心设备在扫描到外围设备后,我想知道扫描到设备的设备名称。通过ble_advdata_parse( )
可获得外设设备的设备名称,即蓝牙广播名称。
需要的头文件包括:ble_gap.h
,ble_advdata.h
在ble_gap_evt_t
结构体中有adv_report
字段。通过上面的接口可从这个字段中获取到设备名。
typedef struct
{
uint16_t conn_handle; /**< Connection Handle on which event occurred. */
union /**< union alternative identified by evt_id in enclosing struct. */
{
ble_gap_evt_connected_t connected; /**< Connected Event Parameters. */
ble_gap_evt_disconnected_t disconnected; /**< Disconnected Event Parameters. */
ble_gap_evt_conn_param_update_t conn_param_update; /**< Connection Parameter Update Parameters. */
ble_gap_evt_sec_params_request_t sec_params_request; /**< Security Parameters Request Event Parameters. */
ble_gap_evt_sec_info_request_t sec_info_request; /**< Security Information Request Event Parameters. */
ble_gap_evt_passkey_display_t passkey_display; /**< Passkey Display Event Parameters. */
ble_gap_evt_key_pressed_t key_pressed; /**< Key Pressed Event Parameters. */
ble_gap_evt_auth_key_request_t auth_key_request; /**< Authentication Key Request Event Parameters. */
ble_gap_evt_lesc_dhkey_request_t lesc_dhkey_request; /**< LE Secure Connections DHKey calculation request. */
ble_gap_evt_auth_status_t auth_status; /**< Authentication Status Event Parameters. */
ble_gap_evt_conn_sec_update_t conn_sec_update; /**< Connection Security Update Event Parameters. */
ble_gap_evt_timeout_t timeout; /**< Timeout Event Parameters. */
ble_gap_evt_rssi_changed_t rssi_changed; /**< RSSI Event Parameters. */
ble_gap_evt_adv_report_t adv_report; /**< Advertising Report Event Parameters. */
ble_gap_evt_adv_set_terminated_t adv_set_terminated; /**< Advertising Set Terminated Event Parameters. */
ble_gap_evt_sec_request_t sec_request; /**< Security Request Event Parameters. */
ble_gap_evt_conn_param_update_request_t conn_param_update_request; /**< Connection Parameter Update Parameters. */
ble_gap_evt_scan_req_report_t scan_req_report; /**< Scan Request Report Parameters. */
ble_gap_evt_phy_update_request_t phy_update_request; /**< PHY Update Request Event Parameters. */
ble_gap_evt_phy_update_t phy_update; /**< PHY Update Parameters. */
ble_gap_evt_data_length_update_request_t data_length_update_request; /**< Data Length Update Request Event Parameters. */
ble_gap_evt_data_length_update_t data_length_update; /**< Data Length Update Event Parameters. */
ble_gap_evt_qos_channel_survey_report_t qos_channel_survey_report; /**< Quality of Service (QoS) Channel Survey Report Parameters. */
} params; /**< Event Parameters. */
} ble_gap_evt_t;
这里有两个地方都可以进行这个处理。
一是在nRF_BLE\nrf_ble_scan
中,通过nRF_BLE\ble_advdata.c
中的接口bel_advdata_parse()
进行获取。
在BLE_GAP_EVT_ADV_REPORT
事件中进行处理。但是这个文件我们尽量不要进行更改,会影响到SDK中的其它文件。
二是在scan_evt_handler()
扫描回调中进行处理。NRF_BLE_SCAN_EVT_FILTER_MATCH
,NRF_BLE_SCAN_EVT_NOT_FOUND
都是可以进行处理的。只要包含ble_gap_evt_adv_report_t
这个参数的地方都可以进行处理。
static void scan_evt_handler(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;
ble_gap_evt_connected_t const * p_connected = p_scan_evt->params.connected.p_connected;
ble_gap_evt_adv_report_t const * p_not_found = p_scan_evt->params.p_not_found;
switch(p_scan_evt->scan_evt_id)
{
case NRF_BLE_SCAN_EVT_FILTER_MATCH:
{
NRF_LOG_INFO("match ");
NRF_LOG_INFO("scan to target %02x%02x%02x%02x%02x%02x",
p_adv->peer_addr.addr[0],
p_adv->peer_addr.addr[1],
p_adv->peer_addr.addr[2],
p_adv->peer_addr.addr[3],
p_adv->peer_addr.addr[4],
p_adv->peer_addr.addr[5]
);
}
break;
case NRF_BLE_SCAN_EVT_NOT_FOUND:
{
if ( 1 == get_scan_list(p_not_found, (ble_gap_scan_params_t *)(p_scan_param)))
{
uint8_t * adv_data = p_not_found->data.p_data;
uint16_t adv_data_size = p_not_found->data.len;
uint8_t * device_name = ble_advdata_parse(adv_data, \
adv_data_size, \
BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME);
if (!device_name)
{
device_name = ble_advdata_parse(adv_data, \
adv_data_size, \
BLE_GAP_AD_TYPE_SHORT_LOCAL_NAME);
if (device_name)
NRF_LOG_INFO("BLE_GAP_AD_TYPE_SHORT_LOCAL_NAME");
}
if (device_name)
{
char device_name_buff[128] = {0};
uint16_t data_len = (adv_data + adv_data_size - device_name) / sizeof(uint8_t);
NRF_LOG_INFO("size: %d", data_len);
memcpy(device_name_buff, device_name, data_len);
NRF_LOG_INFO("device name: %s", device_name_buff);
}
}
打印出扫描到的设备的MAC地址和设备名。
另外的,当连接的时候也能获取到设备名。在ble_evt_handler()
回调中也能进行处理,因为这里从协议栈传出了我们需要的结构体参数。