Hello all,
Currently I am developing a code in which a central (nRF52840) scans and reads adverisement packets from 2 beacons (no connection required). I decided to use an adress filter to limit the amount of advertisement data received; however, it seems that it is not working because:
1. I´m getting TONS of advertisement packets that don´t look similar to what I´m expecting.
2. The event NRF_BLE_SCAN_EVT_FILTER_MATCH is never triggered.
Below I´ll show you some key points of the code:
Declarition of the target MAC address (AC:23:3F:A9:EF:E2)
static bool is_connect_per_addr = true; /**< If you want to connect to a peripheral with a given address, set this to true and put the correct address in the variable below. */ static ble_gap_addr_t const m_target_periph_addr = { /* Possible values for addr_type: BLE_GAP_ADDR_TYPE_PUBLIC, BLE_GAP_ADDR_TYPE_RANDOM_STATIC, BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE, BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE. */ //.addr_type = BLE_GAP_ADDR_TYPE_RANDOM_STATIC, .addr = {0xE2, 0xEF, 0xA9, 0x3F, 0x23, 0xAC} //.addr = {0x41, 0x8C, 0xFE, 0x05, 0x1C, 0x00} };
Filters settings
static void scan_init(void) { ret_code_t err_code; nrf_ble_scan_init_t init_scan; //static char const test_periph_addr[] = {0xEA, 0xEF, 0xA9, 0x3F, 0x23, 0xAC}; memset(&init_scan, 0, sizeof(init_scan)); init_scan.p_scan_param = &m_scan_param; init_scan.connect_if_match = true; 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); ble_uuid_t uuid = { .uuid = TARGET_UUID, .type = BLE_UUID_TYPE_VENDOR_BEGIN, }; err_code = nrf_ble_scan_filter_set(&m_scan, SCAN_UUID_FILTER, &uuid); APP_ERROR_CHECK(err_code); if (strlen(m_target_periph_name) != 0) { err_code = nrf_ble_scan_filter_set(&m_scan, SCAN_NAME_FILTER, m_target_periph_name); APP_ERROR_CHECK(err_code); } if (is_connect_per_addr) { err_code = nrf_ble_scan_filter_set(&m_scan, SCAN_ADDR_FILTER, m_target_periph_addr.addr); APP_ERROR_CHECK(err_code); } err_code = nrf_ble_scan_filters_enable(&m_scan, NRF_BLE_SCAN_ALL_FILTER, false); APP_ERROR_CHECK(err_code); }
ADV_REPORT EVENT
static void ble_evt_handler(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; switch (p_ble_evt->header.evt_id) { case BLE_GAP_EVT_ADV_REPORT: NRF_LOG_INFO("Advertisement report"); //on_adv_report(&p_gap_evt->params.adv_report); //if( p_gap_evt->params.adv_report.direct_addr.addr == m_target_periph_addr.addr) //{ // NRF_LOG_INFO("Found"); //} uint8_t data_length = p_gap_evt->params.adv_report.data.len; NRF_LOG_INFO("Data length: %d", data_length); uint8_t i; for (i=0; i<=data_length; i++) { uint8_t data = p_gap_evt->params.adv_report.data.p_data[i]; NRF_LOG_INFO("0x%02X", data); } break; ...
Thank you so much in advance