Skip to content

Commit 6e2b2b9

Browse files
author
Jaakko Kangasharju
committed
Allow advertisement to contain multiple types of data
1 parent 5c20a1b commit 6e2b2b9

File tree

6 files changed

+62
-43
lines changed

6 files changed

+62
-43
lines changed

src/BLEDevice.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,13 @@
1111
#include "BLERemoteCharacteristic.h"
1212
#include "BLERemoteService.h"
1313

14+
struct BLEAdvertisementData
15+
{
16+
unsigned char length;
17+
unsigned char type;
18+
unsigned char data[BLE_ADVERTISEMENT_DATA_MAX_VALUE_LENGTH];
19+
};
20+
1421
class BLEDevice;
1522

1623
class BLEDeviceEventListener
@@ -49,9 +56,8 @@ class BLEDevice
4956
void setConnectable(bool connectable);
5057
void setBondStore(BLEBondStore& bondStore);
5158

52-
virtual void begin(unsigned char /*advertisementDataType*/,
53-
unsigned char /*advertisementDataLength*/,
54-
const unsigned char* /*advertisementData*/,
59+
virtual void begin(unsigned char /*advertisementDataSize*/,
60+
BLEAdvertisementData * /*advertisementData*/,
5561
unsigned char /*scanDataType*/,
5662
unsigned char /*scanDataLength*/,
5763
const unsigned char* /*scanData*/,

src/BLEPeripheral.cpp

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -69,39 +69,54 @@ BLEPeripheral::~BLEPeripheral() {
6969
}
7070

7171
void BLEPeripheral::begin() {
72-
unsigned char advertisementDataType = 0;
7372
unsigned char scanDataType = 0;
7473

75-
unsigned char advertisementDataLength = 0;
74+
unsigned char advertisementDataSize = 0;
7675
unsigned char scanDataLength = 0;
7776

78-
unsigned char advertisementData[BLE_ADVERTISEMENT_DATA_MAX_VALUE_LENGTH];
77+
BLEAdvertisementData advertisementData[3];
7978
unsigned char scanData[BLE_SCAN_DATA_MAX_VALUE_LENGTH];
8079

80+
unsigned char remainingAdvertisementDataLength = BLE_ADVERTISEMENT_DATA_MAX_VALUE_LENGTH + 2;
8181
if (this->_serviceSolicitationUuid){
8282
BLEUuid serviceSolicitationUuid = BLEUuid(this->_serviceSolicitationUuid);
8383

84-
advertisementDataLength = serviceSolicitationUuid.length();
85-
advertisementDataType = (advertisementDataLength > 2) ? 0x15 : 0x14;
84+
unsigned char uuidLength = serviceSolicitationUuid.length();
85+
advertisementData[advertisementDataSize].length = uuidLength;
86+
advertisementData[advertisementDataSize].type = (uuidLength > 2) ? 0x15 : 0x14;
8687

87-
memcpy(advertisementData, serviceSolicitationUuid.data(), advertisementDataLength);
88-
} else if (this->_advertisedServiceUuid){
88+
memcpy(advertisementData[advertisementDataSize].data, serviceSolicitationUuid.data(), uuidLength);
89+
advertisementDataSize += 1;
90+
remainingAdvertisementDataLength -= uuidLength + 2;
91+
}
92+
if (this->_advertisedServiceUuid){
8993
BLEUuid advertisedServiceUuid = BLEUuid(this->_advertisedServiceUuid);
9094

91-
advertisementDataLength = advertisedServiceUuid.length();
92-
advertisementDataType = (advertisementDataLength > 2) ? 0x06 : 0x02;
93-
94-
memcpy(advertisementData, advertisedServiceUuid.data(), advertisementDataLength);
95-
} else if (this->_manufacturerData && this->_manufacturerDataLength > 0) {
96-
advertisementDataLength = this->_manufacturerDataLength;
95+
unsigned char uuidLength = advertisedServiceUuid.length();
96+
if (uuidLength + 2 <= remainingAdvertisementDataLength) {
97+
advertisementData[advertisementDataSize].length = uuidLength;
98+
advertisementData[advertisementDataSize].type = (uuidLength > 2) ? 0x06 : 0x02;
9799

98-
if (advertisementDataLength > sizeof(advertisementData)) {
99-
advertisementDataLength = sizeof(advertisementData);
100+
memcpy(advertisementData[advertisementDataSize].data, advertisedServiceUuid.data(), uuidLength);
101+
advertisementDataSize += 1;
102+
remainingAdvertisementDataLength -= uuidLength + 2;
100103
}
104+
}
105+
if (this->_manufacturerData && this->_manufacturerDataLength > 0) {
106+
if (remainingAdvertisementDataLength >= 3) {
107+
unsigned char dataLength = this->_manufacturerDataLength;
101108

102-
advertisementDataType = 0xff;
109+
if (dataLength + 2 > remainingAdvertisementDataLength) {
110+
dataLength = remainingAdvertisementDataLength - 2;
111+
}
103112

104-
memcpy(advertisementData, this->_manufacturerData, advertisementDataLength);
113+
advertisementData[advertisementDataSize].length = dataLength;
114+
advertisementData[advertisementDataSize].type = 0xff;
115+
116+
memcpy(advertisementData[advertisementDataSize].data, this->_manufacturerData, dataLength);
117+
advertisementDataSize += 1;
118+
remainingAdvertisementDataLength -= dataLength + 2;
119+
}
105120
}
106121

107122
if (this->_localName){
@@ -144,7 +159,7 @@ void BLEPeripheral::begin() {
144159
this->addRemoteAttribute(this->_remoteServicesChangedCharacteristic);
145160
}
146161

147-
this->_device->begin(advertisementDataType, advertisementDataLength, advertisementData,
162+
this->_device->begin(advertisementDataSize, advertisementData,
148163
scanDataType, scanDataLength, scanData,
149164
this->_localAttributes, this->_numLocalAttributes,
150165
this->_remoteAttributes, this->_numRemoteAttributes);

src/nRF51822.cpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,8 @@ nRF51822::~nRF51822() {
7676
this->end();
7777
}
7878

79-
void nRF51822::begin(unsigned char advertisementDataType,
80-
unsigned char advertisementDataLength,
81-
const unsigned char* advertisementData,
79+
void nRF51822::begin(unsigned char advertisementDataSize,
80+
BLEAdvertisementData *advertisementData,
8281
unsigned char scanDataType,
8382
unsigned char scanDataLength,
8483
const unsigned char* scanData,
@@ -196,14 +195,16 @@ void nRF51822::begin(unsigned char advertisementDataType,
196195

197196
this->_advDataLen += 3;
198197

199-
if (advertisementDataType && advertisementDataLength && advertisementData) {
200-
this->_advData[this->_advDataLen + 0] = advertisementDataLength + 1;
201-
this->_advData[this->_advDataLen + 1] = advertisementDataType;
202-
this->_advDataLen += 2;
198+
if (advertisementDataSize && advertisementData) {
199+
for (int i = 0; i < advertisementDataSize; i++) {
200+
this->_advData[this->_advDataLen + 0] = advertisementData[i].length + 1;
201+
this->_advData[this->_advDataLen + 1] = advertisementData[i].type;
202+
this->_advDataLen += 2;
203203

204-
memcpy(&this->_advData[this->_advDataLen], advertisementData, advertisementDataLength);
204+
memcpy(&this->_advData[this->_advDataLen], advertisementData[i].data, advertisementData[i].length);
205205

206-
this->_advDataLen += advertisementDataLength;
206+
this->_advDataLen += advertisementData[i].length;
207+
}
207208
}
208209

209210
if (scanDataType && scanDataLength && scanData) {

src/nRF51822.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,8 @@ class nRF51822 : public BLEDevice
5252

5353
virtual ~nRF51822();
5454

55-
virtual void begin(unsigned char advertisementDataType,
56-
unsigned char advertisementDataLength,
57-
const unsigned char* advertisementData,
55+
virtual void begin(unsigned char advertisementDataSize,
56+
BLEAdvertisementData *advertisementData,
5857
unsigned char scanDataType,
5958
unsigned char scanDataLength,
6059
const unsigned char* scanData,

src/nRF8001.cpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -143,9 +143,8 @@ nRF8001::~nRF8001() {
143143
this->end();
144144
}
145145

146-
void nRF8001::begin(unsigned char advertisementDataType,
147-
unsigned char advertisementDataLength,
148-
const unsigned char* advertisementData,
146+
void nRF8001::begin(unsigned char advertisementDataSize,
147+
BLEAdvertisementData *advertisementData,
149148
unsigned char scanDataType,
150149
unsigned char scanDataLength,
151150
const unsigned char* scanData,
@@ -261,7 +260,7 @@ void nRF8001::begin(unsigned char advertisementDataType,
261260

262261
setupMsg.status_byte = 0;
263262

264-
bool hasAdvertisementData = advertisementDataType && advertisementDataLength && advertisementData;
263+
bool hasAdvertisementData = advertisementDataSize && advertisementData;
265264
bool hasScanData = scanDataType && scanDataLength && scanData;
266265

267266
for (int i = 0; i < NB_BASE_SETUP_MESSAGES; i++) {
@@ -305,9 +304,9 @@ void nRF8001::begin(unsigned char advertisementDataType,
305304
setupMsgData->data[0] |= 0x01;
306305
}
307306
} else if (i == 5 && hasAdvertisementData) {
308-
setupMsgData->data[0] = advertisementDataType;
309-
setupMsgData->data[1] = advertisementDataLength;
310-
memcpy(&setupMsgData->data[2], advertisementData, advertisementDataLength);
307+
setupMsgData->data[0] = advertisementData[0].type;
308+
setupMsgData->data[1] = advertisementData[0].length;
309+
memcpy(&setupMsgData->data[2], advertisementData[0].data, advertisementData[0].length);
311310
} else if (i == 6 && hasScanData) {
312311
setupMsgData->data[0] = scanDataType;
313312
setupMsgData->data[1] = scanDataLength;

src/nRF8001.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,8 @@ class nRF8001 : protected BLEDevice
4646

4747
virtual ~nRF8001();
4848

49-
virtual void begin(unsigned char advertisementDataType,
50-
unsigned char advertisementDataLength,
51-
const unsigned char* advertisementData,
49+
virtual void begin(unsigned char advertisementDataSize,
50+
BLEAdvertisementData *advertisementData,
5251
unsigned char scanDataType,
5352
unsigned char scanDataLength,
5453
const unsigned char* scanData,

0 commit comments

Comments
 (0)