@@ -46,6 +46,7 @@ blePeripheralGattsEventHandler(ble_client_gatts_event_t event, struct ble_gatts_
4646BlePeripheral::BlePeripheral (void ) :
4747 _state(BLE_PERIPH_STATE_NOT_READY),
4848 _advertise_service_uuid(NULL ),
49+ _local_name(NULL ),
4950 _appearance(0 ),
5051 _central(this ),
5152 _attributes(NULL ),
@@ -54,7 +55,7 @@ BlePeripheral::BlePeripheral(void) :
5455{
5556 memset (_event_handlers, 0x00 , sizeof (_event_handlers));
5657
57- ble_client_get_factory_config (&_local_bda, _local_name );
58+ ble_client_get_factory_config (&_local_bda, _device_name );
5859}
5960
6061BlePeripheral::~BlePeripheral (void )
@@ -73,6 +74,15 @@ BleStatus BlePeripheral::begin()
7374 return status;
7475 }
7576
77+ /* Populate advertising data
78+ */
79+ _advDataInit ();
80+
81+ status = ble_client_gap_wr_adv_data (_adv_data, _adv_data_len);
82+ if (BLE_STATUS_SUCCESS != status) {
83+ return status;
84+ }
85+
7686 uint16_t lastServiceHandle = 0 ;
7787
7888 for (int i = 0 ; i < _num_attributes; i++) {
@@ -132,14 +142,22 @@ BlePeripheral::setAdvertisedServiceUuid(const char* advertisedServiceUuid)
132142}
133143
134144BleStatus
135- BlePeripheral::setLocalName (const char localName[] )
145+ BlePeripheral::setLocalName (const char * localName)
136146{
137- memset (_local_name, 0 , sizeof (_local_name));
138- if (localName && localName[0 ]) {
139- int len = strlen (localName);
147+ _local_name = localName;
148+
149+ return BLE_STATUS_SUCCESS;
150+ }
151+
152+ BleStatus
153+ BlePeripheral::setDeviceName (const char deviceName[])
154+ {
155+ memset (_device_name, 0 , sizeof (_device_name));
156+ if (_device_name && _device_name[0 ]) {
157+ int len = strlen (deviceName);
140158 if (len > BLE_MAX_DEVICE_NAME)
141159 len = BLE_MAX_DEVICE_NAME;
142- memcpy (_local_name, localName , len);
160+ memcpy (_device_name, deviceName , len);
143161 }
144162
145163 return BLE_STATUS_SUCCESS;
@@ -235,16 +253,11 @@ BlePeripheral::_init()
235253 return status;
236254 }
237255
238- status = ble_client_gap_set_enable_config (_local_name , &_local_bda, _appearance, txPower);
256+ status = ble_client_gap_set_enable_config (_device_name , &_local_bda, _appearance, txPower);
239257 if (BLE_STATUS_SUCCESS != status) {
240258 return status;
241259 }
242260
243- /* Populate initial advertising data
244- * This may be extended later with Service UUIDs
245- */
246- _advDataInit ();
247-
248261 _state = BLE_PERIPH_STATE_READY;
249262 return BLE_STATUS_SUCCESS;
250263}
@@ -254,7 +267,6 @@ BlePeripheral::_advDataInit(void)
254267{
255268 uint8_t *adv_tmp = _adv_data;
256269
257- _adv_data_set = false ;
258270 memset (_adv_data, 0 , sizeof (_adv_data));
259271
260272 /* Add flags */
@@ -282,20 +294,24 @@ BlePeripheral::_advDataInit(void)
282294 }
283295 }
284296
285- /* Add device name (truncated if too long) */
286- uint8_t calculated_len;
287- adv_tmp = &_adv_data[_adv_data_len];
288- if (_adv_data_len + strlen (_local_name) + 2 <= BLE_MAX_ADV_SIZE) {
289- *adv_tmp++ = strlen (_local_name) + 1 ;
290- *adv_tmp++ = BLE_ADV_TYPE_COMP_LOCAL_NAME;
291- calculated_len = strlen (_local_name);
292- } else {
293- *adv_tmp++ = BLE_MAX_ADV_SIZE - _adv_data_len - 1 ;
294- *adv_tmp++ = BLE_ADV_TYPE_SHORT_LOCAL_NAME;
295- calculated_len = BLE_MAX_ADV_SIZE - _adv_data_len - 2 ;
297+ if (_local_name) {
298+ /* Add device name (truncated if too long) */
299+ uint8_t calculated_len;
300+
301+ adv_tmp = &_adv_data[_adv_data_len];
302+ if (_adv_data_len + strlen (_local_name) + 2 <= BLE_MAX_ADV_SIZE) {
303+ *adv_tmp++ = strlen (_local_name) + 1 ;
304+ *adv_tmp++ = BLE_ADV_TYPE_COMP_LOCAL_NAME;
305+ calculated_len = strlen (_local_name);
306+ } else {
307+ *adv_tmp++ = BLE_MAX_ADV_SIZE - _adv_data_len - 1 ;
308+ *adv_tmp++ = BLE_ADV_TYPE_SHORT_LOCAL_NAME;
309+ calculated_len = BLE_MAX_ADV_SIZE - _adv_data_len - 2 ;
310+ }
311+
312+ memcpy (adv_tmp, _local_name, calculated_len);
313+ _adv_data_len += calculated_len + 2 ;
296314 }
297- memcpy (adv_tmp, _local_name, calculated_len);
298- _adv_data_len += calculated_len + 2 ;
299315}
300316
301317BleStatus
@@ -306,14 +322,6 @@ BlePeripheral::_startAdvertising()
306322 if (_state != BLE_PERIPH_STATE_READY)
307323 return BLE_STATUS_WRONG_STATE;
308324
309- /* Advertising data can only be set once in this way */
310- if (!_adv_data_set) {
311- status = ble_client_gap_wr_adv_data (_adv_data, _adv_data_len);
312- if (BLE_STATUS_SUCCESS != status)
313- return status;
314- _adv_data_set = true ;
315- }
316-
317325 status = ble_client_gap_start_advertise (0 ); // 0 = no timeout
318326 if (BLE_STATUS_SUCCESS != status)
319327 return status;
0 commit comments