@@ -69,52 +69,64 @@ BLEPeripheral::~BLEPeripheral() {
6969}
7070
7171void BLEPeripheral::begin () {
72- unsigned char advertisementDataType = 0 ;
73- unsigned char scanDataType = 0 ;
72+ unsigned char advertisementDataSize = 0 ;
7473
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 };
8076
77+ unsigned char remainingAdvertisementDataLength = BLE_ADVERTISEMENT_DATA_MAX_VALUE_LENGTH + 2 ;
8178 if (this ->_serviceSolicitationUuid ){
8279 BLEUuid serviceSolicitationUuid = BLEUuid (this ->_serviceSolicitationUuid );
8380
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 ;
8684
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 ){
8990 BLEUuid advertisedServiceUuid = BLEUuid (this ->_advertisedServiceUuid );
9091
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 ;
9796
98- if (advertisementDataLength > sizeof (advertisementData)) {
99- advertisementDataLength = sizeof (advertisementData);
97+ memcpy (advertisementData[advertisementDataSize].data , advertisedServiceUuid.data (), uuidLength);
98+ advertisementDataSize += 1 ;
99+ remainingAdvertisementDataLength -= uuidLength + 2 ;
100100 }
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+ }
101109
102- advertisementDataType = 0xff ;
110+ advertisementData[advertisementDataSize].length = dataLength;
111+ advertisementData[advertisementDataSize].type = 0xff ;
103112
104- memcpy (advertisementData, this ->_manufacturerData , advertisementDataLength);
113+ memcpy (advertisementData[advertisementDataSize].data , this ->_manufacturerData , dataLength);
114+ advertisementDataSize += 1 ;
115+ remainingAdvertisementDataLength -= dataLength + 2 ;
116+ }
105117 }
106118
107119 if (this ->_localName ){
108120 unsigned char localNameLength = strlen (this ->_localName );
109- scanDataLength = localNameLength;
121+ scanData. length = localNameLength;
110122
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 ;
113125 }
114126
115- scanDataType = (localNameLength > scanDataLength ) ? 0x08 : 0x09 ;
127+ scanData. type = (localNameLength > scanData. length ) ? 0x08 : 0x09 ;
116128
117- memcpy (scanData, this ->_localName , scanDataLength );
129+ memcpy (scanData. data , this ->_localName , scanData. length );
118130 }
119131
120132 if (this ->_localAttributes == NULL ) {
@@ -144,8 +156,8 @@ void BLEPeripheral::begin() {
144156 this ->addRemoteAttribute (this ->_remoteServicesChangedCharacteristic );
145157 }
146158
147- this ->_device ->begin (advertisementDataType, advertisementDataLength , advertisementData,
148- scanDataType, scanDataLength, scanData,
159+ this ->_device ->begin (advertisementDataSize , advertisementData,
160+ scanData. length > 0 ? 1 : 0 , & scanData,
149161 this ->_localAttributes , this ->_numLocalAttributes ,
150162 this ->_remoteAttributes , this ->_numRemoteAttributes );
151163
0 commit comments