I have a question about how to connect to the manual scan.

I'm a user using nrf52832 s132.
I am adjusting the BLE connection range.
scan_init is init_scan.connect_if_match = false and adv report tried to connect the device to if(p_adv_report->rssi > SET_RSSI).

But here's the question.
SCAN_NAME_FILTER already specified in scan_init in nrf_scan_filter_set, but NAMEFILTER in init_scan.connect_if_match = false seems meaningless.

When I add ble_advdata_name_find() in on_adv_report, it connects to the advertiser.

Is nrf_ble_scan_filter_set and nrf_ble_scan_filter_enable valid only if init_scan.connect_if_match = true?

It's my code:

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

    memset(&init_scan, 0, sizeof(init_scan));

    init_scan.connect_if_match = false; // auto connect : 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);

    for(int i = 0 ; i < NRF_BLE_SCAN_NAME_CNT; i++)
    {
        err_code = nrf_ble_scan_filter_set(&m_scan, SCAN_NAME_FILTER, m_target_periph_name[i]);
        APP_ERROR_CHECK(err_code);
    }

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


}

static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
{
    ret_code_t err_code;

    // For readability.
    ble_gap_evt_t const * p_gap_evt = &p_ble_evt->evt.gap_evt;
    ble_gap_evt_adv_report_t const * p_adv_report = &p_ble_evt->evt.gap_evt.params.adv_report;

    switch (p_ble_evt->header.evt_id)
    {
         case BLE_GAP_EVT_CONNECTED:
#ifdef DEBUG   
            printf("Connection 0x%x established, starting DB discovery. \n\r", p_gap_evt->conn_handle);
#endif
            err_code = ble_nus_c_handles_assign(&m_ble_nus_c[p_gap_evt->conn_handle], p_ble_evt->evt.gap_evt.conn_handle, NULL);
#ifdef DEBUG 		
            printf("ble_evt_handler ID = %d MAC = ", p_gap_evt->conn_handle);
            printf("%02X",p_gap_evt->params.connected.peer_addr.addr[5]);
            printf(":%02X",p_gap_evt->params.connected.peer_addr.addr[4]),
            printf(":%02X",p_gap_evt->params.connected.peer_addr.addr[3]),
            printf(":%02X",p_gap_evt->params.connected.peer_addr.addr[2]),
            printf(":%02X",p_gap_evt->params.connected.peer_addr.addr[1]),
            printf(":%02X",p_gap_evt->params.connected.peer_addr.addr[0]),                

            printf("\n\r ble_nus_c_handles_assign %d \n\r",err_code);
#endif
            //APP_ERROR_CHECK(err_code);            

            err_code = ble_db_discovery_start(&m_db_disc, p_gap_evt->conn_handle);       
#ifdef DEBUG   
            printf("\n\r ble_db_discovery_start %d \n\r",err_code);
#endif          
            break;

         case BLE_GAP_EVT_ADV_REPORT:
            on_adv_report(&p_gap_evt->params.adv_report);
            break;

         ...
    }
}

static void on_adv_report(ble_gap_evt_adv_report_t const * p_adv_report)
{
    ret_code_t err_code;
    int parsed_name_len = ble_advdata_search(p_adv_report->data.p_data, p_adv_report->data.len, &data_offset, BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME);
    uint8_t *buf = ble_advdata_parse(p_adv_report->data.p_data, p_adv_report->data.len, BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME);

    for(int i = 0; i < NRF_BLE_SCAN_NAME_CNT ; i++)
    {
        if(ble_advdata_name_find(p_adv_report->data.p_data, parsed_name_len, m_target_periph_name[i]) == 1)
        {
            if(p_adv_report->rssi > SET_RSSI)
            {
                sd_ble_gap_connect(&p_adv_report->peer_addr,&m_scan_params,&m_connection_param,APP_BLE_CONN_CFG_TAG);

                scan_stop();
                scan_start();
                
            }
            else
            {
                scan_stop();
                scan_start();
            }        
        }
    }


    
}

Please understand my poor English. :)

Parents Reply Children
No Data
Related