Updating Advertisement data - Noaman-strat/nrf5 GitHub Wiki
Data can be updated during advertisement with:
static void advertiseInit(void) {
// Only call once at start of program.
// Set handler so payloads can be changed between radio transmits.
ret_code_t err_code = ble_radio_notification_init(APP_IRQ_PRIORITY_LOW, NRF_RADIO_NOTIFICATION_DISTANCE_2680US, advertiseUpdate);
servicesToAdvertise[0] = yourServiceUUID;
static ble_advdata_manuf_data_t advertMfgData;
memset(&advertMfgData, 0, sizeof(advertMfgData));
advertMfgData.data.p_data = (uint8_t*)&mfgData;
advertMfgData.data.size = sizeof(mfgData);
memset(&bleAdvertInit, 0, sizeof(bleAdvertInit));
bleAdvertInit.advdata.name_type = BLE_ADVDATA_FULL_NAME;
bleAdvertInit.advdata.include_appearance = false;
bleAdvertInit.advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
bleAdvertInit.advdata.uuids_complete.uuid_cnt = NUM_SERVICES_TO_ADVERTISE;
bleAdvertInit.advdata.uuids_complete.p_uuids = servicesToAdvertise;
bleAdvertInit.advdata.p_manuf_specific_data = &advertMfgData;
bleAdvertInit.config.ble_adv_fast_enabled = true;
bleAdvertInit.config.ble_adv_fast_interval = ADV_INTERVAL_ACTIVE;
bleAdvertInit.config.ble_adv_fast_timeout = BLE_GAP_ADV_TIMEOUT_GENERAL_UNLIMITED;
bleAdvertInit.config.ble_adv_on_disconnect_disabled = true; // true = Let our code handle the restart
bleAdvertInit.evt_handler = advertiseEventHandler;
bleAdvertInit.error_handler = advertiseErrorHandler;
err_code = ble_advertising_init(&advertiseModule, &bleAdvertInit);
APP_ERROR_CHECK(err_code);
ble_advertising_conn_cfg_tag_set(&advertiseModule, APP_BLE_CONN_CFG_TAG);
err_code = sd_ble_gap_tx_power_set(BLE_GAP_TX_POWER_ROLE_ADV, advertiseModule.adv_handle, TX_POWER_LEVEL);
APP_ERROR_CHECK(err_code);
}
static void advertiseUpdate(bool radio_active) {
// This is called after EVERY radio tx, ie during advertising and tx-ing during connection.
if (radio_active) {
// Increment advert counter (optional based on your project, you can change the data in mfgData anywhere in your code and it will go to advert packet because inside advertiseInit we set the advertMfgData.data.p_data = (uint8_t*)&mfgData;, which was sent to ble_advertising_init() via bleAdvertInit struct.
mfgData.advertisingCounter++;
ret_code_t err_code = ble_advdata_encode(&bleAdvertInit.advdata, advertiseModule.enc_advdata, &advertiseModule.adv_data.adv_data.len);
APP_ERROR_CHECK(err_code);
}
}