Skip to content

Commit 79a9e2e

Browse files
committed
Extend advertising data allowing insertion of flags and raw data
1 parent 88bf0ca commit 79a9e2e

File tree

3 files changed

+71
-7
lines changed

3 files changed

+71
-7
lines changed

src/BLEAdvertisingData.cpp

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,17 @@
2121

2222
BLEAdvertisingData::BLEAdvertisingData() :
2323
_dataLength(0),
24+
_rawDataLength(0),
2425
_advertisedServiceUuid(NULL),
2526
_manufacturerData(NULL),
2627
_manufacturerDataLength(0),
2728
_manufacturerCompanyId(0),
2829
_hasManufacturerCompanyId(false),
2930
_localName(NULL),
3031
_serviceData(NULL),
31-
_serviceDataLength(0)
32+
_serviceDataLength(0),
33+
_flags(0),
34+
_hasFlags(false)
3235
{
3336
}
3437

@@ -68,11 +71,28 @@ void BLEAdvertisingData::setLocalName(const char *localName)
6871
_localName = localName;
6972
}
7073

74+
void BLEAdvertisingData::setRawData(const uint8_t* data, uint8_t length)
75+
{
76+
_rawData = data;
77+
_rawDataLength = length;
78+
}
79+
80+
void BLEAdvertisingData::setFlags(uint8_t flags)
81+
{
82+
_hasFlags = true;
83+
_flags = flags;
84+
}
85+
7186
bool BLEAdvertisingData::updateData()
7287
{
88+
// Success indicates whether all the fields have been inserted
7389
bool success = true;
7490
// Reset data
7591
_dataLength = 0;
92+
// Try to add flags into the current advertising packet
93+
if (_hasFlags) {
94+
success &= addFlags(_flags);
95+
}
7696
// Try to add Advertised service uuid into the current advertising packet
7797
if (_advertisedServiceUuid) {
7898
success &= addAdvertisedServiceUuid(_advertisedServiceUuid);
@@ -93,6 +113,10 @@ bool BLEAdvertisingData::updateData()
93113
if (_localName) {
94114
success &= addLocalName(_localName);
95115
}
116+
// Try to add Raw data
117+
if (_rawDataLength) {
118+
success &= addRawData(_rawData, _rawDataLength);
119+
}
96120
return success;
97121
}
98122

@@ -123,9 +147,9 @@ bool BLEAdvertisingData::addAdvertisedServiceUuid(const char* advertisedServiceU
123147
int uuidLen = uuid.length();
124148
BLEAdField advField;
125149
if (uuidLen > 2) {
126-
advField = BLEFieldAdvertisedService128;
150+
advField = BLEFieldIncompleteAdvertisedService128;
127151
} else {
128-
advField = BLEFieldAdvertisedService16;
152+
advField = BLEFieldIncompleteAdvertisedService16;
129153
}
130154
return addField(advField, uuid.data(), uuidLen);
131155
}
@@ -153,6 +177,23 @@ bool BLEAdvertisingData::addAdvertisedServiceData(uint16_t uuid, const uint8_t d
153177
return addField(BLEFieldServiceData, tempData, tempDataLength);
154178
}
155179

180+
bool BLEAdvertisingData::addRawData(const uint8_t* data, uint8_t length)
181+
{
182+
// Bypass addField to add the integral raw data
183+
if (length > (MAX_AD_DATA_LENGTH - _dataLength)) {
184+
// Not enough space
185+
return false;
186+
}
187+
memcpy(&_data[_dataLength], data, length);
188+
_dataLength += length;
189+
return true;
190+
}
191+
192+
bool BLEAdvertisingData::addFlags(uint8_t flags)
193+
{
194+
return addField(BLEFieldFlags, &flags, 1);
195+
}
196+
156197
bool BLEAdvertisingData::addField(BLEAdField field, const char* data)
157198
{
158199
uint8_t dataLength = strlen(data);

src/BLEAdvertisingData.h

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,20 @@
2525

2626
#define MAX_AD_DATA_LENGTH (31)
2727

28+
enum BLEFlags {
29+
BLEFlagsLimitedDiscoverable = 0x01,
30+
BLEFlagsGeneralDiscoverable = 0x02,
31+
BLEFlagsBREDRNotSupported = 0x04
32+
};
33+
2834
enum BLEAdField {
35+
BLEFieldFlags = 0x01,
36+
BLEFieldIncompleteAdvertisedService16 = 0x02,
37+
BLEFieldCompleteAdvertisedService16 = 0x03,
38+
BLEFieldIncompleteAdvertisedService128 = 0x06,
39+
BLEFieldCompleteAdvertisedService128 = 0x07,
2940
BLEFieldShortLocalName = 0x08,
3041
BLEFieldCompleteLocalName = 0x09,
31-
BLEFieldAdvertisedService16 = 0x02,
32-
BLEFieldAdvertisedService128 = 0x06,
3342
BLEFieldServiceData = 0x16,
3443
BLEFieldManufacturerData = 0xFF,
3544

@@ -46,7 +55,11 @@ class BLEAdvertisingData {
4655
void setManufacturerData(const uint16_t companyId, const uint8_t manufacturerData[], int manufacturerDataLength);
4756
void setLocalName(const char *localName);
4857
void setAdvertisedServiceData(uint16_t uuid, const uint8_t data[], int length);
58+
void setRawData(const uint8_t* data, uint8_t length);
59+
void setFlags(uint8_t flags);
4960

61+
protected:
62+
friend class BLELocalDevice;
5063
bool updateData();
5164
uint8_t* data();
5265
int dataLength() const;
@@ -57,19 +70,28 @@ class BLEAdvertisingData {
5770
bool addManufacturerData(const uint16_t companyId, const uint8_t manufacturerData[], int manufacturerDataLength);
5871
bool addLocalName(const char *localName);
5972
bool addAdvertisedServiceData(uint16_t uuid, const uint8_t data[], int length);
73+
bool addRawData(const uint8_t* data, uint8_t length);
74+
bool addFlags(uint8_t flags);
6075

6176
bool addField(BLEAdField field, const char* data);
6277
bool addField(BLEAdField field, const uint8_t* data, uint8_t length);
6378

6479
uint8_t _data[MAX_AD_DATA_LENGTH];
6580
int _dataLength;
6681

67-
const char* _advertisedServiceUuid;
82+
const uint8_t* _rawData;
83+
uint8_t _rawDataLength;
84+
85+
uint8_t _flags;
86+
bool _hasFlags;
87+
const char* _localName;
88+
6889
const uint8_t* _manufacturerData;
6990
int _manufacturerDataLength;
7091
uint16_t _manufacturerCompanyId;
7192
bool _hasManufacturerCompanyId;
72-
const char* _localName;
93+
94+
const char* _advertisedServiceUuid;
7395
uint16_t _serviceDataUuid;
7496
const uint8_t* _serviceData;
7597
int _serviceDataLength;

src/local/BLELocalDevice.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333

3434
BLELocalDevice::BLELocalDevice()
3535
{
36+
_advertisingData.setFlags(BLEFlagsGeneralDiscoverable | BLEFlagsBREDRNotSupported);
3637
}
3738

3839
BLELocalDevice::~BLELocalDevice()

0 commit comments

Comments
 (0)