void BLEPeripheral::_advDataInit(void) { uint8_t *adv_tmp = _adv_data; memset(_adv_data, 0, sizeof(_adv_data)); /* Add flags */ *adv_tmp++ = 2; *adv_tmp++ = BLE_ADV_TYPE_FLAGS; *adv_tmp++ = BLE_SVC_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE; _adv_data_len = 3; if (_advertise_service_uuid) { BLEUuid bleUuid = BLEUuid(_advertise_service_uuid); struct bt_uuid uuid = bleUuid.uuid(); if (BT_UUID16 == uuid.type) { uint8_t *adv_tmp = &_adv_data[_adv_data_len]; *adv_tmp++ = (1 + sizeof(uint16_t)); /* Segment data length */ *adv_tmp++ = BLE_ADV_TYPE_COMP_16_UUID; /* Needed for Eddystone */ UINT16_TO_LESTREAM(adv_tmp, uuid.uuid16); _adv_data_len += (2 + sizeof(uint16_t)); } else if (BT_UUID128 == uuid.type) { uint8_t *adv_tmp = &_adv_data[_adv_data_len]; *adv_tmp++ = (1 + MAX_UUID_SIZE); /* Segment data length */ *adv_tmp++ = BLE_ADV_TYPE_INC_128_UUID; memcpy(adv_tmp, uuid.uuid128, MAX_UUID_SIZE); _adv_data_len += (2 + MAX_UUID_SIZE); } } if (_local_name) { /* Add device name (truncated if too long) */ uint8_t calculated_len; adv_tmp = &_adv_data[_adv_data_len]; if (_adv_data_len + strlen(_local_name) + 2 <= BLE_MAX_ADV_SIZE) { *adv_tmp++ = strlen(_local_name) + 1; *adv_tmp++ = BLE_ADV_TYPE_COMP_LOCAL_NAME; calculated_len = strlen(_local_name); } else { *adv_tmp++ = BLE_MAX_ADV_SIZE - _adv_data_len - 1; *adv_tmp++ = BLE_ADV_TYPE_SHORT_LOCAL_NAME; calculated_len = BLE_MAX_ADV_SIZE - _adv_data_len - 2; } memcpy(adv_tmp, _local_name, calculated_len); _adv_data_len += calculated_len + 2; } if (_service_data) { /* Add Service Data (if it will fit) */ BLEUuid bleUuid = BLEUuid(_service_data_uuid); struct bt_uuid uuid = bleUuid.uuid(); /* A 128-bit Service Data UUID won't fit in an Advertising packet */ if (BT_UUID16 != uuid.type) { return; /* We support service data only for 16-bit service UUID */ } uint8_t block_len = 1 + sizeof(uint16_t) + _service_data_length; if (_adv_data_len + 1 + block_len > BLE_MAX_ADV_SIZE) { return; // Service data block is too large. } adv_tmp = &_adv_data[_adv_data_len]; *adv_tmp++ = block_len; _adv_data_len++; *adv_tmp++ = BLE_ADV_TYPE_SERVICE_DATA_16_UUID; UINT16_TO_LESTREAM(adv_tmp, uuid.uuid16); memcpy(adv_tmp, _service_data, _service_data_length); _adv_data_len += block_len; } }