Using Scan Filters for BLE Devices

I am currently trying to set up a filter to connect to a device based on its name. I will attach my scan init and scan start to show how I have this configured. I want to be able to connect to the device in the scan event handler when a match is found, but I am not hitting the breakpoint in that handler. I have set my target device to static char const target_device_name[] = "Bluetooth Pressure"; I have also attached the nRF Connect screen showing the device name. I am using sdk 17.0.2 as well.

static void scan_init(void)
{   
    ret_code_t          err_code;
    nrf_ble_scan_init_t init_scan;

    memset(&init_scan, 0, sizeof(init_scan));
    /**< Scan parameters requested for scanning and connection. */

    init_scan.p_scan_param     = &m_scan_param;
    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);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_ble_scan_filter_set(&m_scan, SCAN_NAME_FILTER, &target_device_name);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_ble_scan_filters_enable(&m_scan, NRF_BLE_SCAN_NAME_FILTER, false);
    APP_ERROR_CHECK(err_code);

}

/**@brief Function for starting scanning. */
static void scan_start(void)
{
    ret_code_t ret;

    ret = nrf_ble_scan_start(&m_scan);
    APP_ERROR_CHECK(ret);
}

static void scan_evt_handler(scan_evt_t const * p_scan_evt)
{
    ret_code_t err_code;

    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);
        } 
            break;

        case NRF_BLE_SCAN_EVT_FILTER_MATCH:
        {
            // THIS IS NEVER HITTING
            err_code = p_scan_evt->params.connecting_err.err_code;
            APP_ERROR_CHECK(err_code);
        }
            break;

        case NRF_BLE_SCAN_EVT_NOT_FOUND:
         {
             uint16_t parsed_name_len;
             uint8_t const * p_parsed_name;
             uint16_t data_offset = 0;
             uint16_t target_name_len= strlen(target_device_name);

             ble_gap_evt_adv_report_t const * adv_report = p_scan_evt->params.p_not_found;

             /* Scan encoded adv. payload for data of type BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME */ 
             parsed_name_len = ble_advdata_search(adv_report->data.p_data, adv_report->data.len, &data_offset, BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME);
             
             /* Name found if parsed_name_len != 0 */
             p_parsed_name = &adv_report->data.p_data[data_offset];            

             // if p_parsed_name == target name, then Connect with peripheral
             if(memcmp(target_device_name, p_parsed_name, target_name_len)== 0)                    // compare only target_name_len chars of advertised name and target name
             {
                //nrf_ble_scan_connect_with_target(&m_scan, adv_report);                              // connect with peripheral
                printf("Here we go");
             }

         }
         break;
        default:
            break;
    }
}

Related