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

Assigning manufacturing data to advertisement truncates the device name??

Hello, we are creating a device on an nRF52832.  I started our project based on the examples/ble_peripheral/ble_app_uart project, which worked fine.  However, I needed to modify the advertisement data, so I tried to merge in some code from the ble_app_beacon project, and an odd behavior has arisen.

Basically, when I assign manufacturing data, our device name gets truncated by four characters.  In our code (again, just a modified ble_app_uart), we set the device name with a call to sd_ble_gap_device_name_set.  The intended name is "SmileDevice0.00.017"  (See first snippet below.)

What I think I learned from the "beacon" example is how to set up a ble_advdata_manuf_data_t  object and assign it to init.advdata.p_manuf_specific_data before calling ble_advdata_encode, and it will assign that data to that field.  This code is below, it works well -- I can see the intended manufacturer data in my sniffer.

EXCEPT, I noticed that our device name became truncated to "SmileDevice0.00" when I connected the manufacturing data.  This is a direct cause and effect, if I don't assign manufacturer data, then the device name is the correct length.  If I assign it, it's truncated.  As stated in the code:

// if I comment out the following line of code, then device name advertises as 'SmileDevice0.00.017' and there is no manufacturing data
// if I leave this line of code in, there is advertising data but the device name advertises as 'SmileDevice0.00'
// what is it about the manufacturing data that is *truncating* the device name?
init.advdata.p_manuf_specific_data = &manuf_specific_data;

So... what is it I don't understand about how to set this up, that is causing manufacturing data to corrupt the length of my device name?  

Thanks.

//////////////////////////////////////////////////
// in the gap_params_init section
// m_DeviceName = "SmileDevice0.00.017"
// m_DeviceNameLength = 19
//////////////////////////////////////////////////

err_code = sd_ble_gap_device_name_set(&sec_mode, (const uint8_t *) m_DeviceName, m_DeviceNameLength);
if (err_code != NRF_SUCCESS) { RETURN_FAULT(2, err_code) }

...

//////////////////////////////////////////////////
// in the advertising init section
// uint8_t m_MfrData[] = {9,10,11,12,13,14,15}
// uint8_t m_MfrDataLength= 7
//////////////////////////////////////////////////

ble_advertising_init_t init;

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;

// set the manufacturing data

ble_advdata_manuf_data_t manuf_specific_data;
manuf_specific_data.company_identifier = 0x0;
manuf_specific_data.data.p_data = (uint8_t *) (m_MfrData);
manuf_specific_data.data.size   = m_MfrDataLength;
// if I comment out the following line of code, then device name advertises as 'SmileDevice0.00.017' and there is no manufacturing data
// if I leave this line of code in, there is advertising data but the device name advertises as 'SmileDevice0.00'
// what is it about the manufacturing data that is *truncating* the device name?
init.advdata.p_manuf_specific_data = &manuf_specific_data;

init.srdata.uuids_complete.uuid_cnt = sizeof(m_adv_uuids) / sizeof(m_adv_uuids[0]);
init.srdata.uuids_complete.p_uuids  = m_adv_uuids;

init.config.ble_adv_fast_enabled  = true;
init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;
init.config.ble_adv_fast_timeout  = APP_ADV_DURATION;

init.evt_handler = on_adv_evt;

m_advertising.adv_mode_current   = BLE_ADV_MODE_IDLE;
m_advertising.adv_modes_config   = init.config;
m_advertising.conn_cfg_tag       = BLE_CONN_CFG_TAG_DEFAULT;
m_advertising.evt_handler        = init.evt_handler;
m_advertising.error_handler      = init.error_handler;
m_advertising.current_slave_link_conn_handle = BLE_CONN_HANDLE_INVALID;
m_advertising.p_adv_data         = &(m_advertising.adv_data);

memset(&(m_advertising.peer_address), 0, sizeof(m_advertising.peer_address));

// Copy advertising data.
if (!m_advertising.initialized)
{
    m_advertising.adv_handle = BLE_GAP_ADV_SET_HANDLE_NOT_SET;
}
m_advertising.adv_data.adv_data.p_data = m_advertising.enc_advdata[0];
m_advertising.adv_data.adv_data.len = adv_set_data_size_max_get(&(m_advertising));

err_code = ble_advdata_encode(&(init.advdata), m_advertising.enc_advdata[0], &(m_advertising.adv_data.adv_data.len));
if (err_code != NRF_SUCCESS) { RETURN_FAULT(2, err_code) }

m_advertising.adv_data.scan_rsp_data.p_data = m_advertising.enc_scan_rsp_data[0];
m_advertising.adv_data.scan_rsp_data.len = adv_set_data_size_max_get(&(m_advertising));

err_code = ble_advdata_encode(&(init.srdata),
  m_advertising.adv_data.scan_rsp_data.p_data,
 &(m_advertising.adv_data.scan_rsp_data.len));

if (err_code != NRF_SUCCESS) { RETURN_FAULT(2, err_code) }

// Configure a initial advertising configuration. The advertising data and and advertising
// parameters will be changed later when we call @ref ble_advertising_start, but must be set
// to legal values here to define an advertising handle.

m_advertising.adv_params.primary_phy     = BLE_GAP_PHY_1MBPS;
m_advertising.adv_params.duration        = m_advertising.adv_modes_config.ble_adv_fast_timeout;
m_advertising.adv_params.properties.type = BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED;
m_advertising.adv_params.p_peer_addr     = NULL;
m_advertising.adv_params.filter_policy   = BLE_GAP_ADV_FP_ANY;
m_advertising.adv_params.interval        = m_advertising.adv_modes_config.ble_adv_fast_interval;

err_code = sd_ble_gap_adv_set_configure(&(m_advertising.adv_handle), NULL, &(m_advertising.adv_params));
if (err_code != NRF_SUCCESS) { RETURN_FAULT(2, err_code) }

m_advertising.initialized = true;

ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);

  • Hello,

    I suspect that you have exceeded the 31 byte advertisement length limit, which is why your name is being cut short.
    Be advised that each new data field comes with two bytes overhead - one to indicate length, and one to indicate type.
    Alternatively, you could also use the SHORTENED name option, to maximally allocate 6 bytes to device name.
    Could you verify that the contents of your advertisements does not exceed 31 bytes in total, when the device name is cut short?

    Additionally, are you familiar with using the nRF Sniffer tool? It is a powerful tool to wield when developing BLE applications, and would allow you to see the contents of the advertisements your device is transmitting, as they appear to other devices.

    Best regards,
    Karl


Related