NimBLE-Arduino
NimBLE-Arduino copied to clipboard
Set Manufacturer Data - Bug
Current implementation to set manufacturer data void NimBLEAdvertising::setManufacturerData(const std::string &data)
Issue: Trying to set the first two bytes of the manufacturer data to Manufacturer ID from Bluetooth SIG list (Nordic Semi ASA - 0x0059) results in no manufacturer data shown in advertisement
Current implementation:
void NimBLEAdvertising::setManufacturerData(const std::string &data)
{
m_mfgData.assign(data.begin(), data.end());
m_advData.mfg_data = &m_mfgData[0];
m_advData.mfg_data_len = m_mfgData.size();
m_advDataSet = false;
} // setManufacturerData
My example where it breaks:
uint16_t manufacturerID = 0x0059; // Nordic Semi ASA
uint8_t dataToAdvertise[4];
dataToAdvertise[0] = (manufacturerID >> 8) & 0xFF;
dataToAdvertise[1] = (manufacturerID & 0xFF);
dataToAdvertise[2] = 0xAB; // Placeholder random data
dataToAdvertise[3] = 0xCD; // Placeholder random data
pAdvertising->setManufacturerData((char *)dataToAdvertise); // Cast to char * to work with std::string
m_mfgData.size() returns zero since the first byte in dataToAdvertise array is a null-character (0)
Proposed Alternative:
void NimBLEAdvertising::setManufacturerData(uint8_t *data, uint8_t length)
{
m_mfgData.assign(data, data + length);
m_advData.mfg_data = &m_mfgData[0];
m_advData.mfg_data_len = length;
m_advDataSet = false;
} // setManufacturerData
We can overload the setManufacturerData function with the uint8_t* type and a length parameter to update the advertising vector
uint16_t manufacturerID = 0x0059; // Nordic Semi ASA
uint8_t dataToAdvertise[4];
dataToAdvertise[0] = (manufacturerID >> 8) & 0xFF;
dataToAdvertise[1] = (manufacturerID & 0xFF);
dataToAdvertise[2] = 0xAB;
dataToAdvertise[3] = 0xCD;
pAdvertising->setManufacturerData(dataToAdvertise, sizeof(dataToAdvertise));
Thanks, I will look to change this soon.