h2zero / NimBLE-Arduino

A fork of the NimBLE library structured for compilation with Arduino, for use with ESP32, nRF5x.
https://h2zero.github.io/NimBLE-Arduino/
Apache License 2.0
667 stars 138 forks source link

Set Manufacturer Data - Bug #646

Open lilindian16 opened 3 months ago

lilindian16 commented 3 months ago

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));
h2zero commented 2 months ago

Thanks, I will look to change this soon.