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

Updating Advertisement data in nrf52840 using SDK 16

Hi,

I am trying to update my advertisement data as well as scan response data (i want to put some custom advertisement data and the device name in scan response data).

// Stop advertisement
err_code=sd_ble_gap_adv_stop(m_advertising.adv_handle);
APP_ERROR_CHECK(err_code);


// encoding BLE adv data
new_advdata.adv_data.len = BLE_GAP_ADV_SET_DATA_SIZE_MAX;
err_code = ble_advdata_encode(&init.advdata, new_advdata.adv_data.p_data, &new_advdata.adv_data.len);
APP_ERROR_CHECK(err_code);

// encoding BLE scan response data
new_advdata.scan_rsp_data.len = BLE_GAP_ADV_SET_DATA_SIZE_MAX;
err_code = ble_advdata_encode(&init.srdata, new_advdata.scan_rsp_data.p_data, &new_advdata.scan_rsp_data.len);
APP_ERROR_CHECK(err_code);

//configure advertisement
err_code= sd_ble_gap_adv_set_configure(&m_advertising.adv_handle, &new_advdata, &m_advertising.adv_params);
APP_ERROR_CHECK(err_code);

// start Advertisement
err_code = sd_ble_gap_adv_start(m_advertising.adv_handle, APP_BLE_CONN_CFG_TAG);
APP_ERROR_CHECK(err_code);

After populating ble_advertising_init_t this structure i am using this code, but ble_advdata_encode is returning error code 16.

Parents
  • Hi Akshay,

    It is not clear if you use new buffers for each update of the advertisement data. This is necessary. Take a look at this code snippet, taken from mesh_adv.c from the MESH SDK:

    /**
     * In the SoftDevice v6.0.0 API, the advertisement data buffers are owned by the application.
     * If we want to change the advertisement data while the advertiser is running, we need to double
     * buffer the data.
     */
    static uint8_t m_advdata_raw[2][MESH_ADV_DATA_SIZE_MAX];
    static uint8_t m_srdata_raw[2][MESH_ADV_DATA_SIZE_MAX];
    static uint8_t m_adv_set_index;
    
    void mesh_adv_data_set(uint16_t service_uuid, const uint8_t * p_service_data, uint8_t length)
    {
        memset(&m_gap_adv_data, 0, sizeof(m_gap_adv_data));
        m_gap_adv_data.adv_data.p_data      = m_advdata_raw[m_adv_set_index];
        m_gap_adv_data.scan_rsp_data.p_data = m_srdata_raw[m_adv_set_index];
        m_gap_adv_data.adv_data.len         = sizeof(m_advdata_raw[0]);
        m_gap_adv_data.scan_rsp_data.len    = sizeof(m_srdata_raw[m_adv_set_index]);
        m_adv_set_index = (m_adv_set_index + 1) & 1;
    
        ble_advdata_t advdata;
        memset(&advdata, 0, sizeof(advdata));
        advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
    
        ble_uuid_t uuids[] = {{service_uuid, BLE_UUID_TYPE_BLE}};
        advdata.uuids_complete.uuid_cnt = ARRAY_SIZE(uuids);
        advdata.uuids_complete.p_uuids = uuids;
    
        ble_advdata_service_data_t service_data;
        service_data.service_uuid = service_uuid;
        service_data.data.size = length;
        service_data.data.p_data = (uint8_t *) p_service_data;
    
        advdata.p_service_data_array = &service_data;
        advdata.service_data_count = 1;
    
        /* The application may freely set anything into the scan response data. */
        ble_advdata_t srdata;
        memset(&srdata, 0, sizeof(srdata));
        srdata.name_type = BLE_ADVDATA_FULL_NAME;
    
        APP_ERROR_CHECK(ble_advdata_encode(&advdata, m_gap_adv_data.adv_data.p_data, &m_gap_adv_data.adv_data.len));
        APP_ERROR_CHECK(ble_advdata_encode(&srdata, m_gap_adv_data.scan_rsp_data.p_data, &m_gap_adv_data.scan_rsp_data.len));
    
    #if NRF_SD_BLE_API_VERSION >= 6
    
        uint32_t err_code = sd_ble_gap_adv_set_configure(&m_adv_handle, &m_gap_adv_data, &m_adv_params);
        if (err_code == NRF_ERROR_INVALID_STATE)
        {
            err_code = sd_ble_gap_adv_set_configure(&m_adv_handle, &m_gap_adv_data, NULL);
        }
    #else
    
        uint32_t err_code = sd_ble_gap_adv_data_set(m_gap_adv_data.adv_data.p_data,
                                                    m_gap_adv_data.adv_data.len,
                                                    m_gap_adv_data.scan_rsp_data.p_data,
                                                    m_gap_adv_data.scan_rsp_data.len);
    #endif  /* NRF_SD_BLE_API_VERSION >= 6 */
        APP_ERROR_CHECK(err_code);
    }
    

    Hope this helps.

Reply
  • Hi Akshay,

    It is not clear if you use new buffers for each update of the advertisement data. This is necessary. Take a look at this code snippet, taken from mesh_adv.c from the MESH SDK:

    /**
     * In the SoftDevice v6.0.0 API, the advertisement data buffers are owned by the application.
     * If we want to change the advertisement data while the advertiser is running, we need to double
     * buffer the data.
     */
    static uint8_t m_advdata_raw[2][MESH_ADV_DATA_SIZE_MAX];
    static uint8_t m_srdata_raw[2][MESH_ADV_DATA_SIZE_MAX];
    static uint8_t m_adv_set_index;
    
    void mesh_adv_data_set(uint16_t service_uuid, const uint8_t * p_service_data, uint8_t length)
    {
        memset(&m_gap_adv_data, 0, sizeof(m_gap_adv_data));
        m_gap_adv_data.adv_data.p_data      = m_advdata_raw[m_adv_set_index];
        m_gap_adv_data.scan_rsp_data.p_data = m_srdata_raw[m_adv_set_index];
        m_gap_adv_data.adv_data.len         = sizeof(m_advdata_raw[0]);
        m_gap_adv_data.scan_rsp_data.len    = sizeof(m_srdata_raw[m_adv_set_index]);
        m_adv_set_index = (m_adv_set_index + 1) & 1;
    
        ble_advdata_t advdata;
        memset(&advdata, 0, sizeof(advdata));
        advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
    
        ble_uuid_t uuids[] = {{service_uuid, BLE_UUID_TYPE_BLE}};
        advdata.uuids_complete.uuid_cnt = ARRAY_SIZE(uuids);
        advdata.uuids_complete.p_uuids = uuids;
    
        ble_advdata_service_data_t service_data;
        service_data.service_uuid = service_uuid;
        service_data.data.size = length;
        service_data.data.p_data = (uint8_t *) p_service_data;
    
        advdata.p_service_data_array = &service_data;
        advdata.service_data_count = 1;
    
        /* The application may freely set anything into the scan response data. */
        ble_advdata_t srdata;
        memset(&srdata, 0, sizeof(srdata));
        srdata.name_type = BLE_ADVDATA_FULL_NAME;
    
        APP_ERROR_CHECK(ble_advdata_encode(&advdata, m_gap_adv_data.adv_data.p_data, &m_gap_adv_data.adv_data.len));
        APP_ERROR_CHECK(ble_advdata_encode(&srdata, m_gap_adv_data.scan_rsp_data.p_data, &m_gap_adv_data.scan_rsp_data.len));
    
    #if NRF_SD_BLE_API_VERSION >= 6
    
        uint32_t err_code = sd_ble_gap_adv_set_configure(&m_adv_handle, &m_gap_adv_data, &m_adv_params);
        if (err_code == NRF_ERROR_INVALID_STATE)
        {
            err_code = sd_ble_gap_adv_set_configure(&m_adv_handle, &m_gap_adv_data, NULL);
        }
    #else
    
        uint32_t err_code = sd_ble_gap_adv_data_set(m_gap_adv_data.adv_data.p_data,
                                                    m_gap_adv_data.adv_data.len,
                                                    m_gap_adv_data.scan_rsp_data.p_data,
                                                    m_gap_adv_data.scan_rsp_data.len);
    #endif  /* NRF_SD_BLE_API_VERSION >= 6 */
        APP_ERROR_CHECK(err_code);
    }
    

    Hope this helps.

Children
No Data
Related