@@ -69,39 +69,54 @@ BLEPeripheral::~BLEPeripheral() {
69
69
}
70
70
71
71
void BLEPeripheral::begin () {
72
- unsigned char advertisementDataType = 0 ;
73
72
unsigned char scanDataType = 0 ;
74
73
75
- unsigned char advertisementDataLength = 0 ;
74
+ unsigned char advertisementDataSize = 0 ;
76
75
unsigned char scanDataLength = 0 ;
77
76
78
- unsigned char advertisementData[BLE_ADVERTISEMENT_DATA_MAX_VALUE_LENGTH ];
77
+ BLEAdvertisementData advertisementData[3 ];
79
78
unsigned char scanData[BLE_SCAN_DATA_MAX_VALUE_LENGTH];
80
79
80
+ unsigned char remainingAdvertisementDataLength = BLE_ADVERTISEMENT_DATA_MAX_VALUE_LENGTH + 2 ;
81
81
if (this ->_serviceSolicitationUuid ){
82
82
BLEUuid serviceSolicitationUuid = BLEUuid (this ->_serviceSolicitationUuid );
83
83
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 ;
86
87
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 ){
89
93
BLEUuid advertisedServiceUuid = BLEUuid (this ->_advertisedServiceUuid );
90
94
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 ;
97
99
98
- if (advertisementDataLength > sizeof (advertisementData)) {
99
- advertisementDataLength = sizeof (advertisementData);
100
+ memcpy (advertisementData[advertisementDataSize].data , advertisedServiceUuid.data (), uuidLength);
101
+ advertisementDataSize += 1 ;
102
+ remainingAdvertisementDataLength -= uuidLength + 2 ;
100
103
}
104
+ }
105
+ if (this ->_manufacturerData && this ->_manufacturerDataLength > 0 ) {
106
+ if (remainingAdvertisementDataLength >= 3 ) {
107
+ unsigned char dataLength = this ->_manufacturerDataLength ;
101
108
102
- advertisementDataType = 0xff ;
109
+ if (dataLength + 2 > remainingAdvertisementDataLength) {
110
+ dataLength = remainingAdvertisementDataLength - 2 ;
111
+ }
103
112
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
+ }
105
120
}
106
121
107
122
if (this ->_localName ){
@@ -144,7 +159,7 @@ void BLEPeripheral::begin() {
144
159
this ->addRemoteAttribute (this ->_remoteServicesChangedCharacteristic );
145
160
}
146
161
147
- this ->_device ->begin (advertisementDataType, advertisementDataLength , advertisementData,
162
+ this ->_device ->begin (advertisementDataSize , advertisementData,
148
163
scanDataType, scanDataLength, scanData,
149
164
this ->_localAttributes , this ->_numLocalAttributes ,
150
165
this ->_remoteAttributes , this ->_numRemoteAttributes );
0 commit comments