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

Updating Advertising Parameters

Hello,

I'm writing a BLE app that acts as a peripheral and a broadcaster. If a connection is established, I'd like to continue advertising but update the advertising parameters from connectable to non-connectable. Following the broadcaster example I wrote the following code to setup and start advertising.

static int advertising_init(void)
{
    uint32_t err_code;
    ble_advdata_t advdata;

    memset(&advdata, 0, sizeof(ble_advdata_t));

    advdata.name_type          = BLE_ADVDATA_FULL_NAME;
    advdata.flags              = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
    
    ble_uuid_t adv_uuid = {BLE_UUID_NUS_SERVICE, m_nus.uuid_type};
    advdata.uuids_complete.uuid_cnt = 1;
    advdata.uuids_complete.p_uuids  = &adv_uuid;
    
    // encode the adv data for use when updating adv data
    m_adv_data.adv_data.len = BLE_GAP_ADV_SET_DATA_SIZE_MAX;
    err_code = ble_advdata_encode(&advdata, m_encoded_adv_data[0], &m_adv_data.adv_data.len);
    APP_VIEWER_ERROR_CHECK(err_code);
    err_code = ble_advdata_encode(&advdata, m_encoded_adv_data[1], &m_adv_data.adv_data.len);
    APP_VIEWER_ERROR_CHECK(err_code);

    // Initialize advertising parameters (used when starting advertising).
    memset(&m_adv_params, 0, sizeof(m_adv_params));

    m_adv_params.properties.type = BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED;
    m_adv_params.p_peer_addr     = NULL;
    m_adv_params.filter_policy   = BLE_GAP_ADV_FP_ANY;
    m_adv_params.interval        = MSEC_TO_UNITS(1000, UNIT_0_625_MS);
    m_adv_params.duration        = 0;

    err_code = sd_ble_gap_adv_set_configure(&m_adv_handle, &m_adv_data, &m_adv_params);
    APP_ERROR_CHECK(err_code);

    err_code = sd_ble_gap_adv_start(m_adv_handle, 1);
    APP_ERROR_CHECK(err_code);

    return 0;
}

When a connection is established, the below function is called to update the advertising parameters.

void app_viewer_on_connected(uint16_t ch)
{
    uint32_t err_code;

    NRF_LOG_INFO("Viewer Connected.");
    conn_handle = ch;

    m_adv_params.properties.type = BLE_GAP_ADV_TYPE_NONCONNECTABLE_SCANNABLE_UNDIRECTED;
    err_code = sd_ble_gap_adv_set_configure(&m_adv_handle, &m_adv_data, &m_adv_params);
    APP_ERROR_CHECK(err_code);
    
    err_code = sd_ble_gap_adv_start(m_adv_handle, 1);
    APP_ERROR_CHECK(err_code);
}

The issue I'm encountering is that the device still advertises as a connectable device. I'm not seeing any errors returned from the Softdevice. Is sd_ble_gap_adv_set_configure() the correct function to update advertising parameters and am I using it properly? 

I'm using:

  • nRF52832
  • SDK 15.2
  • S132 6.1.0

Thanks,

Eric

Related