Nordic 中心设备(central)获取 外围设备(peripheral)设备名 (Device Name)

Nordic 中心设备(central)获取 外围设备(peripheral)设备名 (Device Name)

中心设备在扫描到外围设备后,我想知道扫描到设备的设备名称。通过ble_advdata_parse( )可获得外设设备的设备名称,即蓝牙广播名称。

需要的头文件包括:ble_gap.hble_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_MATCHNRF_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()回调中也能进行处理,因为这里从协议栈传出了我们需要的结构体参数。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值