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

Updating advertising data (manuf. spec. data) in SDK15

Hello guys! And girls Slight smile

My project is working as expected in SDK14.2.
I'm updating adv data (manuf. spec. data) without any problem with this function

static void advertising_data_update(uint8_t adv_manuf_byte)
{
		ret_code_t err_code;

		ble_advertising_init_t 		init;
		ble_advdata_manuf_data_t 	adv_manuf_data;
		uint8_array_t            	adv_manuf_data_array;
		uint8_t                  	adv_manuf_data_data[1];
		adv_manuf_data_data[0] 		= adv_manuf_byte;

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

		init.advdata.name_type          		 = BLE_ADVDATA_FULL_NAME;
		init.advdata.include_appearance 		 = false;
		init.advdata.flags              		 = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
		init.advdata.uuids_complete.uuid_cnt = sizeof(m_adv_uuids) / sizeof(m_adv_uuids[0]);
		init.advdata.uuids_complete.p_uuids  = m_adv_uuids;

		adv_manuf_data_array.p_data 							 = adv_manuf_data_data;
		adv_manuf_data_array.size 								 = sizeof(adv_manuf_data_data);
		adv_manuf_data.company_identifier 				 = APP_COMPANY_IDENTIFIER;
		adv_manuf_data.data 											 = adv_manuf_data_array;
		init.advdata.p_manuf_specific_data 				 = &adv_manuf_data;

		init.config.ble_adv_whitelist_enabled      = true;
		init.config.ble_adv_directed_enabled       = true;
		init.config.ble_adv_directed_slow_enabled  = false;
		init.config.ble_adv_directed_slow_interval = 0;
		init.config.ble_adv_directed_slow_timeout  = 0;
		init.config.ble_adv_fast_enabled  				 = true;
		init.config.ble_adv_fast_interval 				 = APP_ADV_INTERVAL;
		init.config.ble_adv_fast_timeout  				 = APP_ADV_TIMEOUT_IN_SECONDS;
							
		err_code = ble_advdata_set(&init.advdata, NULL);
		APP_ERROR_CHECK(err_code);	   
}


But in SDK15 the function ble_advdata_set() has been deprecated.
The migration guide is says to use ble_advdata_encode() and sd_ble_gap_adv_set_configure() instead.

So I changed it to something like this

static void advertising_data_update(uint8_t adv_manuf_byte)
{
		ret_code_t err_code;

		ble_advertising_init_t 		init;
		ble_advdata_manuf_data_t 	adv_manuf_data;
		uint8_array_t            	adv_manuf_data_array;
		adv_manuf_data_data[0] 		= adv_manuf_byte;

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

    init.advdata.name_type          		 = BLE_ADVDATA_FULL_NAME;
    init.advdata.include_appearance 		 = false;
    init.advdata.flags              		 = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE;
    init.advdata.uuids_complete.uuid_cnt = sizeof(m_adv_uuids) / sizeof(m_adv_uuids[0]);
    init.advdata.uuids_complete.p_uuids  = m_adv_uuids;
			
		adv_manuf_data_array.p_data 							 = adv_manuf_data_data;
		adv_manuf_data_array.size 								 = sizeof(adv_manuf_data_data);
		adv_manuf_data.company_identifier 				 = APP_COMPANY_IDENTIFIER;
		adv_manuf_data.data 											 = adv_manuf_data_array;
		init.advdata.p_manuf_specific_data 				 = &adv_manuf_data;

    init.config.ble_adv_whitelist_enabled      			= true;
		init.config.ble_adv_directed_high_duty_enabled 	= true;
    init.config.ble_adv_directed_enabled       			= false;
    init.config.ble_adv_fast_enabled  				 			= true;
    init.config.ble_adv_fast_interval 				 			= APP_ADV_INTERVAL;
    init.config.ble_adv_fast_timeout  				 			= APP_ADV_FAST_DURATION;

		//err_code = sd_ble_gap_adv_stop(m_advertising.adv_handle);
		//APP_ERROR_CHECK(err_code);
			
		err_code = ble_advdata_encode(&init.advdata, m_adv_data.adv_data.p_data, &m_adv_data.adv_data.len);	
		APP_ERROR_CHECK(err_code);

		err_code = sd_ble_gap_adv_set_configure(&m_advertising.adv_handle, &m_adv_data, NULL);
		APP_ERROR_CHECK(err_code);
		
		//err_code = sd_ble_gap_adv_start(m_advertising.adv_handle, APP_BLE_CONN_CFG_TAG);
		//APP_ERROR_CHECK(err_code);
}


And of course... it's not working. :)
I'm getting a very strange error at sd_ble_gap_adv_set_configure() --> app: ERROR 12801 [Unknown error code]

Any idea why?
What I'm doing wrong?
What I have to change to get this working like in the SDK14.2?

Parents
  • I had same issue with SDK 15. Read thru several forums including this one with no real answer. I too was using the Advertising Module with 

    BLE_ADVERTISING_DEF(advertiseModule);
    I found the answer to my problem by digging into what SDK's ble_advertising_init was using when it calls ble_advdata_encode. It uses the encoded buffer inside advertiseModule. I was mistakenly creating my own buffer and passing it to ble_advdata_encode.
    Once I used the following functions, everything worked fine. Even without restarting advertising.
    static void advertiseInit(void) {
        // Only call once at start of program.
        servicesToAdvertise[0] = someServiceUUID;
    
        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(&init, 0, sizeof(init));
        init.advdata.name_type = BLE_ADVDATA_FULL_NAME;
        init.advdata.include_appearance = false;
        init.advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
        init.advdata.uuids_complete.uuid_cnt = NUM_SERVICES_TO_ADVERTISE;
        init.advdata.uuids_complete.p_uuids = servicesToAdvertise;
        init.advdata.p_manuf_specific_data = &advertMfgData;
    
        init.config.ble_adv_fast_enabled = true;
        init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;
        init.config.ble_adv_fast_timeout = BLE_GAP_ADV_TIMEOUT_GENERAL_UNLIMITED;
        init.config.ble_adv_on_disconnect_disabled = true; // true = Let our code handle the restart
    
        init.evt_handler = advertiseEventHandler;
        init.error_handler = advertiseErrorHandler;
    
        ret_code_t err_code = ble_advertising_init(&advertiseModule, &init);
        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);
    }
    
    void advertisingUpdateMfgData(void) {
      mfgData.inventoryCount = userData.count;
      ret_code_t err_code = ble_advdata_encode(&init.advdata, advertiseModule.enc_advdata, &advertiseModule.adv_data.adv_data.len);
      APP_ERROR_CHECK(err_code);
    }
    Notes:
      1) that advertiseModule.enc_advdata is not my buffer. It was created by SDK when using BLE_ADVERTISING_DEF(advertiseModule) and  ble_advertising_init.
Reply
  • I had same issue with SDK 15. Read thru several forums including this one with no real answer. I too was using the Advertising Module with 

    BLE_ADVERTISING_DEF(advertiseModule);
    I found the answer to my problem by digging into what SDK's ble_advertising_init was using when it calls ble_advdata_encode. It uses the encoded buffer inside advertiseModule. I was mistakenly creating my own buffer and passing it to ble_advdata_encode.
    Once I used the following functions, everything worked fine. Even without restarting advertising.
    static void advertiseInit(void) {
        // Only call once at start of program.
        servicesToAdvertise[0] = someServiceUUID;
    
        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(&init, 0, sizeof(init));
        init.advdata.name_type = BLE_ADVDATA_FULL_NAME;
        init.advdata.include_appearance = false;
        init.advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
        init.advdata.uuids_complete.uuid_cnt = NUM_SERVICES_TO_ADVERTISE;
        init.advdata.uuids_complete.p_uuids = servicesToAdvertise;
        init.advdata.p_manuf_specific_data = &advertMfgData;
    
        init.config.ble_adv_fast_enabled = true;
        init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;
        init.config.ble_adv_fast_timeout = BLE_GAP_ADV_TIMEOUT_GENERAL_UNLIMITED;
        init.config.ble_adv_on_disconnect_disabled = true; // true = Let our code handle the restart
    
        init.evt_handler = advertiseEventHandler;
        init.error_handler = advertiseErrorHandler;
    
        ret_code_t err_code = ble_advertising_init(&advertiseModule, &init);
        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);
    }
    
    void advertisingUpdateMfgData(void) {
      mfgData.inventoryCount = userData.count;
      ret_code_t err_code = ble_advdata_encode(&init.advdata, advertiseModule.enc_advdata, &advertiseModule.adv_data.adv_data.len);
      APP_ERROR_CHECK(err_code);
    }
    Notes:
      1) that advertiseModule.enc_advdata is not my buffer. It was created by SDK when using BLE_ADVERTISING_DEF(advertiseModule) and  ble_advertising_init.
Children
Related