@@ -69,52 +69,64 @@ BLEPeripheral::~BLEPeripheral() {
69
69
}
70
70
71
71
void BLEPeripheral::begin () {
72
- unsigned char advertisementDataType = 0 ;
73
- unsigned char scanDataType = 0 ;
72
+ unsigned char advertisementDataSize = 0 ;
74
73
75
- unsigned char advertisementDataLength = 0 ;
76
- unsigned char scanDataLength = 0 ;
77
-
78
- unsigned char advertisementData[BLE_ADVERTISEMENT_DATA_MAX_VALUE_LENGTH];
79
- unsigned char scanData[BLE_SCAN_DATA_MAX_VALUE_LENGTH];
74
+ BLEEirData advertisementData[3 ];
75
+ BLEEirData scanData = { 0 };
80
76
77
+ unsigned char remainingAdvertisementDataLength = BLE_ADVERTISEMENT_DATA_MAX_VALUE_LENGTH + 2 ;
81
78
if (this ->_serviceSolicitationUuid ){
82
79
BLEUuid serviceSolicitationUuid = BLEUuid (this ->_serviceSolicitationUuid );
83
80
84
- advertisementDataLength = serviceSolicitationUuid.length ();
85
- advertisementDataType = (advertisementDataLength > 2 ) ? 0x15 : 0x14 ;
81
+ unsigned char uuidLength = serviceSolicitationUuid.length ();
82
+ advertisementData[advertisementDataSize].length = uuidLength;
83
+ advertisementData[advertisementDataSize].type = (uuidLength > 2 ) ? 0x15 : 0x14 ;
86
84
87
- memcpy (advertisementData, serviceSolicitationUuid.data (), advertisementDataLength);
88
- } else if (this ->_advertisedServiceUuid ){
85
+ memcpy (advertisementData[advertisementDataSize].data , serviceSolicitationUuid.data (), uuidLength);
86
+ advertisementDataSize += 1 ;
87
+ remainingAdvertisementDataLength -= uuidLength + 2 ;
88
+ }
89
+ if (this ->_advertisedServiceUuid ){
89
90
BLEUuid advertisedServiceUuid = BLEUuid (this ->_advertisedServiceUuid );
90
91
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 ;
92
+ unsigned char uuidLength = advertisedServiceUuid.length ();
93
+ if (uuidLength + 2 <= remainingAdvertisementDataLength) {
94
+ advertisementData[advertisementDataSize].length = uuidLength;
95
+ advertisementData[advertisementDataSize].type = (uuidLength > 2 ) ? 0x06 : 0x02 ;
97
96
98
- if (advertisementDataLength > sizeof (advertisementData)) {
99
- advertisementDataLength = sizeof (advertisementData);
97
+ memcpy (advertisementData[advertisementDataSize].data , advertisedServiceUuid.data (), uuidLength);
98
+ advertisementDataSize += 1 ;
99
+ remainingAdvertisementDataLength -= uuidLength + 2 ;
100
100
}
101
+ }
102
+ if (this ->_manufacturerData && this ->_manufacturerDataLength > 0 ) {
103
+ if (remainingAdvertisementDataLength >= 3 ) {
104
+ unsigned char dataLength = this ->_manufacturerDataLength ;
105
+
106
+ if (dataLength + 2 > remainingAdvertisementDataLength) {
107
+ dataLength = remainingAdvertisementDataLength - 2 ;
108
+ }
101
109
102
- advertisementDataType = 0xff ;
110
+ advertisementData[advertisementDataSize].length = dataLength;
111
+ advertisementData[advertisementDataSize].type = 0xff ;
103
112
104
- memcpy (advertisementData, this ->_manufacturerData , advertisementDataLength);
113
+ memcpy (advertisementData[advertisementDataSize].data , this ->_manufacturerData , dataLength);
114
+ advertisementDataSize += 1 ;
115
+ remainingAdvertisementDataLength -= dataLength + 2 ;
116
+ }
105
117
}
106
118
107
119
if (this ->_localName ){
108
120
unsigned char localNameLength = strlen (this ->_localName );
109
- scanDataLength = localNameLength;
121
+ scanData. length = localNameLength;
110
122
111
- if (scanDataLength > sizeof (scanData) ) {
112
- scanDataLength = sizeof (scanData) ;
123
+ if (scanData. length > BLE_SCAN_DATA_MAX_VALUE_LENGTH ) {
124
+ scanData. length = BLE_SCAN_DATA_MAX_VALUE_LENGTH ;
113
125
}
114
126
115
- scanDataType = (localNameLength > scanDataLength ) ? 0x08 : 0x09 ;
127
+ scanData. type = (localNameLength > scanData. length ) ? 0x08 : 0x09 ;
116
128
117
- memcpy (scanData, this ->_localName , scanDataLength );
129
+ memcpy (scanData. data , this ->_localName , scanData. length );
118
130
}
119
131
120
132
if (this ->_localAttributes == NULL ) {
@@ -144,8 +156,8 @@ void BLEPeripheral::begin() {
144
156
this ->addRemoteAttribute (this ->_remoteServicesChangedCharacteristic );
145
157
}
146
158
147
- this ->_device ->begin (advertisementDataType, advertisementDataLength , advertisementData,
148
- scanDataType, scanDataLength, scanData,
159
+ this ->_device ->begin (advertisementDataSize , advertisementData,
160
+ scanData. length > 0 ? 1 : 0 , & scanData,
149
161
this ->_localAttributes , this ->_numLocalAttributes ,
150
162
this ->_remoteAttributes , this ->_numRemoteAttributes );
151
163
0 commit comments