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