This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

How do I implement an address filter?

I am very new to BLE development, and am building my application on top of the ble_central\ble_app_uart_c example.

I have this tag defined at the start, with the other global variable definitions.

#define NRF_BLE_SCAN_ADDR_FILTER 0x02

This is the function where I am initializing the module: 

/**
 * @brief Parameters used when scanning.
 */
static const ble_gap_scan_params_t m_scan_params =
{
    .active   = 1,
    .interval = SCAN_INTERVAL,
    .window   = SCAN_WINDOW,
    .timeout  = SCAN_TIMEOUT,
    #if (NRF_SD_BLE_API_VERSION == 2)
        .selective   = 0,
        .p_whitelist = NULL,
    #endif
    #if (NRF_SD_BLE_API_VERSION == 3)
        .use_whitelist = 0,
    #endif
};
 

I am calling the module (or setting the filter, unsure of the terminology) here in the scan_start() function:

/**
 * @brief Parameters used when scanning.
 */
static const ble_gap_scan_params_t m_scan_params =
{
    .active   = 1,
    .interval = SCAN_INTERVAL,
    .window   = SCAN_WINDOW,
    .timeout  = SCAN_TIMEOUT,
    #if (NRF_SD_BLE_API_VERSION == 2)
        .selective   = 0,
        .p_whitelist = NULL,
    #endif
    #if (NRF_SD_BLE_API_VERSION == 3)
        .use_whitelist = 0,
    #endif
};

The scan_start() function is called in main(). I have not yet tested this implementation as it is unfinished.

My questions around this are:

  1. Where do I set the address I want to filter for? It merely advertises and I can't connect to it.
  2. Once the address is set, is this implementation correct?

Thank you!

Parents
  • Hello,

    I am experiencing something quite strange - I am getting a 'wrong filter type error' for an address filter, and no error for a uuid filter. (I do not need a uuid filter, am just comparing my implementation of an address filter to the ble_app_uart_c implementation of a uuid filter).

    Here is a comparison of the two implementations:

    UUID FILTER:

    static ble_uuid_t const m_nus_uuid =
    {
    .uuid = BLE_UUID_NUS_SERVICE,
    .type = NUS_SERVICE_UUID_TYPE
    }
    
    //in the scan init function
    err_code = nrf_ble_scan_filter_set(&m_scan, SCAN_UUID_FILTER, &m_nus_uuid);
    APP_ERROR_CHECK(err_code);

    ADDRESS FILTER:

    static ble_gap_addr_t const IM21_ADDRESS =
    {
        .addr_id_peer = 0,
        .addr_type = BLE_GAP_ADDR_TYPE_PUBLIC,
        .addr = {0x6b, 0xc6, 0x51, 0x6f, 0x7c, 0xb8}
    };
    
    // in the scan_init function
    err_code = nrf_ble_scan_filters_set(&m_scan, SCAN_ADDR_FILTER, IM21_ADDRESS.addr);
    APP_ERROR_CHECK(err_code);

    The UUID filter works great. The Address filter gives an NRF_ERROR_INVALID_PARAM error, which means that SCAN_ADDR_FILTER is not being recognized or something similar. I was able to print the values of both SCAN_ADDR_FILTER and SCAN_UUID_FILTER so I know that SCAN_ADDR_FILTER is defined.  Why am I getting an NRF_ERROR_INVALID_PARAM error when I use SCAN_ADDR_FILTER, but not SCAN_UUID_FILTER?

Reply
  • Hello,

    I am experiencing something quite strange - I am getting a 'wrong filter type error' for an address filter, and no error for a uuid filter. (I do not need a uuid filter, am just comparing my implementation of an address filter to the ble_app_uart_c implementation of a uuid filter).

    Here is a comparison of the two implementations:

    UUID FILTER:

    static ble_uuid_t const m_nus_uuid =
    {
    .uuid = BLE_UUID_NUS_SERVICE,
    .type = NUS_SERVICE_UUID_TYPE
    }
    
    //in the scan init function
    err_code = nrf_ble_scan_filter_set(&m_scan, SCAN_UUID_FILTER, &m_nus_uuid);
    APP_ERROR_CHECK(err_code);

    ADDRESS FILTER:

    static ble_gap_addr_t const IM21_ADDRESS =
    {
        .addr_id_peer = 0,
        .addr_type = BLE_GAP_ADDR_TYPE_PUBLIC,
        .addr = {0x6b, 0xc6, 0x51, 0x6f, 0x7c, 0xb8}
    };
    
    // in the scan_init function
    err_code = nrf_ble_scan_filters_set(&m_scan, SCAN_ADDR_FILTER, IM21_ADDRESS.addr);
    APP_ERROR_CHECK(err_code);

    The UUID filter works great. The Address filter gives an NRF_ERROR_INVALID_PARAM error, which means that SCAN_ADDR_FILTER is not being recognized or something similar. I was able to print the values of both SCAN_ADDR_FILTER and SCAN_UUID_FILTER so I know that SCAN_ADDR_FILTER is defined.  Why am I getting an NRF_ERROR_INVALID_PARAM error when I use SCAN_ADDR_FILTER, but not SCAN_UUID_FILTER?

Children
Related