Port bluetooth LE support to Qt6

This commit is contained in:
Simon Stürz 2025-08-07 12:22:19 +02:00
parent 55c7562564
commit 4f1e4771fc
6 changed files with 90 additions and 12 deletions

View File

@ -128,11 +128,19 @@ QLowEnergyServiceData BluetoothServer::deviceInformationServiceData()
{ {
QLowEnergyServiceData serviceData; QLowEnergyServiceData serviceData;
serviceData.setType(QLowEnergyServiceData::ServiceTypePrimary); serviceData.setType(QLowEnergyServiceData::ServiceTypePrimary);
#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
serviceData.setUuid(QBluetoothUuid::ServiceClassUuid::DeviceInformation);
#else
serviceData.setUuid(QBluetoothUuid::DeviceInformation); serviceData.setUuid(QBluetoothUuid::DeviceInformation);
#endif
// Model number string 0x2a24 // Model number string 0x2a24
QLowEnergyCharacteristicData modelNumberCharData; QLowEnergyCharacteristicData modelNumberCharData;
#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
modelNumberCharData.setUuid(QBluetoothUuid::CharacteristicType::ModelNumberString);
#else
modelNumberCharData.setUuid(QBluetoothUuid::ModelNumberString); modelNumberCharData.setUuid(QBluetoothUuid::ModelNumberString);
#endif
if (m_modelName.isEmpty()) { if (m_modelName.isEmpty()) {
modelNumberCharData.setValue(QString("N.A.").toUtf8()); modelNumberCharData.setValue(QString("N.A.").toUtf8());
} else { } else {
@ -144,7 +152,11 @@ QLowEnergyServiceData BluetoothServer::deviceInformationServiceData()
// Serial number string 0x2a25 // Serial number string 0x2a25
QLowEnergyCharacteristicData serialNumberCharData; QLowEnergyCharacteristicData serialNumberCharData;
#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
serialNumberCharData.setUuid(QBluetoothUuid::CharacteristicType::SerialNumberString);
#else
serialNumberCharData.setUuid(QBluetoothUuid::SerialNumberString); serialNumberCharData.setUuid(QBluetoothUuid::SerialNumberString);
#endif
if (m_serialNumber.isNull()) { if (m_serialNumber.isNull()) {
// Note: if no serialnumber specified use the system uuid from /etc/machine-id // Note: if no serialnumber specified use the system uuid from /etc/machine-id
qCDebug(dcNetworkManagerBluetoothServer()) << "Serial number not specified. Using system uuid from /etc/machine-id as serialnumber."; qCDebug(dcNetworkManagerBluetoothServer()) << "Serial number not specified. Using system uuid from /etc/machine-id as serialnumber.";
@ -156,28 +168,44 @@ QLowEnergyServiceData BluetoothServer::deviceInformationServiceData()
// Firmware revision string 0x2a26 // Firmware revision string 0x2a26
QLowEnergyCharacteristicData firmwareRevisionCharData; QLowEnergyCharacteristicData firmwareRevisionCharData;
#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
firmwareRevisionCharData.setUuid(QBluetoothUuid::CharacteristicType::FirmwareRevisionString);
#else
firmwareRevisionCharData.setUuid(QBluetoothUuid::FirmwareRevisionString); firmwareRevisionCharData.setUuid(QBluetoothUuid::FirmwareRevisionString);
#endif
firmwareRevisionCharData.setValue(QString(VERSION_STRING).toUtf8()); firmwareRevisionCharData.setValue(QString(VERSION_STRING).toUtf8());
firmwareRevisionCharData.setProperties(QLowEnergyCharacteristic::Read); firmwareRevisionCharData.setProperties(QLowEnergyCharacteristic::Read);
serviceData.addCharacteristic(firmwareRevisionCharData); serviceData.addCharacteristic(firmwareRevisionCharData);
// Hardware revision string 0x2a27 // Hardware revision string 0x2a27
QLowEnergyCharacteristicData hardwareRevisionCharData; QLowEnergyCharacteristicData hardwareRevisionCharData;
#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
hardwareRevisionCharData.setUuid(QBluetoothUuid::CharacteristicType::HardwareRevisionString);
#else
hardwareRevisionCharData.setUuid(QBluetoothUuid::HardwareRevisionString); hardwareRevisionCharData.setUuid(QBluetoothUuid::HardwareRevisionString);
#endif
hardwareRevisionCharData.setValue(m_hardwareVersion.toUtf8()); hardwareRevisionCharData.setValue(m_hardwareVersion.toUtf8());
hardwareRevisionCharData.setProperties(QLowEnergyCharacteristic::Read); hardwareRevisionCharData.setProperties(QLowEnergyCharacteristic::Read);
serviceData.addCharacteristic(hardwareRevisionCharData); serviceData.addCharacteristic(hardwareRevisionCharData);
// Software revision string 0x2a28 // Software revision string 0x2a28
QLowEnergyCharacteristicData softwareRevisionCharData; QLowEnergyCharacteristicData softwareRevisionCharData;
#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
softwareRevisionCharData.setUuid(QBluetoothUuid::CharacteristicType::SoftwareRevisionString);
#else
softwareRevisionCharData.setUuid(QBluetoothUuid::SoftwareRevisionString); softwareRevisionCharData.setUuid(QBluetoothUuid::SoftwareRevisionString);
#endif
softwareRevisionCharData.setValue(m_softwareVersion.toUtf8()); softwareRevisionCharData.setValue(m_softwareVersion.toUtf8());
softwareRevisionCharData.setProperties(QLowEnergyCharacteristic::Read); softwareRevisionCharData.setProperties(QLowEnergyCharacteristic::Read);
serviceData.addCharacteristic(softwareRevisionCharData); serviceData.addCharacteristic(softwareRevisionCharData);
// Manufacturer name string 0x2a29 // Manufacturer name string 0x2a29
QLowEnergyCharacteristicData manufacturerNameCharData; QLowEnergyCharacteristicData manufacturerNameCharData;
#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
manufacturerNameCharData.setUuid(QBluetoothUuid::CharacteristicType::ManufacturerNameString);
#else
manufacturerNameCharData.setUuid(QBluetoothUuid::ManufacturerNameString); manufacturerNameCharData.setUuid(QBluetoothUuid::ManufacturerNameString);
#endif
manufacturerNameCharData.setValue(QString("nymea GmbH").toUtf8()); manufacturerNameCharData.setValue(QString("nymea GmbH").toUtf8());
manufacturerNameCharData.setProperties(QLowEnergyCharacteristic::Read); manufacturerNameCharData.setProperties(QLowEnergyCharacteristic::Read);
serviceData.addCharacteristic(manufacturerNameCharData); serviceData.addCharacteristic(manufacturerNameCharData);
@ -189,11 +217,19 @@ QLowEnergyServiceData BluetoothServer::genericAccessServiceData()
{ {
QLowEnergyServiceData serviceData; QLowEnergyServiceData serviceData;
serviceData.setType(QLowEnergyServiceData::ServiceTypePrimary); serviceData.setType(QLowEnergyServiceData::ServiceTypePrimary);
#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
serviceData.setUuid(QBluetoothUuid::ServiceClassUuid::GenericAccess);
#else
serviceData.setUuid(QBluetoothUuid::GenericAccess); serviceData.setUuid(QBluetoothUuid::GenericAccess);
#endif
// Device name 0x2a00 // Device name 0x2a00
QLowEnergyCharacteristicData nameCharData; QLowEnergyCharacteristicData nameCharData;
#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
nameCharData.setUuid(QBluetoothUuid::CharacteristicType::DeviceName);
#else
nameCharData.setUuid(QBluetoothUuid::DeviceName); nameCharData.setUuid(QBluetoothUuid::DeviceName);
#endif
if (m_advertiseName.isNull()) { if (m_advertiseName.isNull()) {
qCWarning(dcNetworkManagerBluetoothServer()) << "Advertise name not specified. Using system host name as device name."; qCWarning(dcNetworkManagerBluetoothServer()) << "Advertise name not specified. Using system host name as device name.";
m_advertiseName = QSysInfo::machineHostName(); m_advertiseName = QSysInfo::machineHostName();
@ -204,21 +240,33 @@ QLowEnergyServiceData BluetoothServer::genericAccessServiceData()
// Appearance 0x2a01 // Appearance 0x2a01
QLowEnergyCharacteristicData appearanceCharData; QLowEnergyCharacteristicData appearanceCharData;
#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
appearanceCharData.setUuid(QBluetoothUuid::CharacteristicType::Appearance);
#else
appearanceCharData.setUuid(QBluetoothUuid::Appearance); appearanceCharData.setUuid(QBluetoothUuid::Appearance);
#endif
appearanceCharData.setValue(QByteArray(4, 0)); appearanceCharData.setValue(QByteArray(4, 0));
appearanceCharData.setProperties(QLowEnergyCharacteristic::Read); appearanceCharData.setProperties(QLowEnergyCharacteristic::Read);
serviceData.addCharacteristic(appearanceCharData); serviceData.addCharacteristic(appearanceCharData);
// Peripheral Privacy Flag 0x2a02 // Peripheral Privacy Flag 0x2a02
QLowEnergyCharacteristicData privacyFlagCharData; QLowEnergyCharacteristicData privacyFlagCharData;
#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
privacyFlagCharData.setUuid(QBluetoothUuid::CharacteristicType::PeripheralPrivacyFlag);
#else
privacyFlagCharData.setUuid(QBluetoothUuid::PeripheralPrivacyFlag); privacyFlagCharData.setUuid(QBluetoothUuid::PeripheralPrivacyFlag);
#endif
privacyFlagCharData.setValue(QByteArray(2, 0)); privacyFlagCharData.setValue(QByteArray(2, 0));
privacyFlagCharData.setProperties(QLowEnergyCharacteristic::Read | QLowEnergyCharacteristic::Write); privacyFlagCharData.setProperties(QLowEnergyCharacteristic::Read | QLowEnergyCharacteristic::Write);
serviceData.addCharacteristic(privacyFlagCharData); serviceData.addCharacteristic(privacyFlagCharData);
// Reconnection Address 0x2a03 // Reconnection Address 0x2a03
QLowEnergyCharacteristicData reconnectionAddressCharData; QLowEnergyCharacteristicData reconnectionAddressCharData;
#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
reconnectionAddressCharData.setUuid(QBluetoothUuid::CharacteristicType::ReconnectionAddress);
#else
reconnectionAddressCharData.setUuid(QBluetoothUuid::ReconnectionAddress); reconnectionAddressCharData.setUuid(QBluetoothUuid::ReconnectionAddress);
#endif
reconnectionAddressCharData.setValue(QByteArray()); reconnectionAddressCharData.setValue(QByteArray());
reconnectionAddressCharData.setProperties(QLowEnergyCharacteristic::Write); reconnectionAddressCharData.setProperties(QLowEnergyCharacteristic::Write);
serviceData.addCharacteristic(reconnectionAddressCharData); serviceData.addCharacteristic(reconnectionAddressCharData);
@ -230,10 +278,18 @@ QLowEnergyServiceData BluetoothServer::genericAttributeServiceData()
{ {
QLowEnergyServiceData serviceData; QLowEnergyServiceData serviceData;
serviceData.setType(QLowEnergyServiceData::ServiceTypePrimary); serviceData.setType(QLowEnergyServiceData::ServiceTypePrimary);
#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
serviceData.setUuid(QBluetoothUuid::ServiceClassUuid::GenericAttribute);
#else
serviceData.setUuid(QBluetoothUuid::GenericAttribute); serviceData.setUuid(QBluetoothUuid::GenericAttribute);
#endif
QLowEnergyCharacteristicData charData; QLowEnergyCharacteristicData charData;
#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
charData.setUuid(QBluetoothUuid::CharacteristicType::ServiceChanged);
#else
charData.setUuid(QBluetoothUuid::ServiceChanged); charData.setUuid(QBluetoothUuid::ServiceChanged);
#endif
charData.setProperties(QLowEnergyCharacteristic::Indicate); charData.setProperties(QLowEnergyCharacteristic::Indicate);
serviceData.addCharacteristic(charData); serviceData.addCharacteristic(charData);
@ -452,8 +508,13 @@ void BluetoothServer::start()
connect(m_controller, &QLowEnergyController::stateChanged, this, &BluetoothServer::onControllerStateChanged); connect(m_controller, &QLowEnergyController::stateChanged, this, &BluetoothServer::onControllerStateChanged);
connect(m_controller, &QLowEnergyController::connected, this, &BluetoothServer::onConnected); connect(m_controller, &QLowEnergyController::connected, this, &BluetoothServer::onConnected);
connect(m_controller, &QLowEnergyController::disconnected, this, &BluetoothServer::onDisconnected); connect(m_controller, &QLowEnergyController::disconnected, this, &BluetoothServer::onDisconnected);
#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
connect(m_controller, &QLowEnergyController::errorOccurred, this, &BluetoothServer::onError);
#else
connect(m_controller, static_cast<void(QLowEnergyController::*)(QLowEnergyController::Error)> connect(m_controller, static_cast<void(QLowEnergyController::*)(QLowEnergyController::Error)>
(&QLowEnergyController::error), this, &BluetoothServer::onError); (&QLowEnergyController::error), this, &BluetoothServer::onError);
#endif
// Note: https://www.bluetooth.com/specifications/gatt/services // Note: https://www.bluetooth.com/specifications/gatt/services
m_deviceInfoService = m_controller->addService(deviceInformationServiceData(), m_controller); m_deviceInfoService = m_controller->addService(deviceInformationServiceData(), m_controller);

View File

@ -54,8 +54,13 @@ NetworkService::NetworkService(QLowEnergyService *service, NetworkManager *netwo
connect(m_service, &QLowEnergyService::characteristicRead, this, &NetworkService::characteristicRead); connect(m_service, &QLowEnergyService::characteristicRead, this, &NetworkService::characteristicRead);
connect(m_service, &QLowEnergyService::characteristicWritten, this, &NetworkService::characteristicWritten); connect(m_service, &QLowEnergyService::characteristicWritten, this, &NetworkService::characteristicWritten);
connect(m_service, &QLowEnergyService::descriptorWritten, this, &NetworkService::descriptorWritten); connect(m_service, &QLowEnergyService::descriptorWritten, this, &NetworkService::descriptorWritten);
#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
connect(m_service, &QLowEnergyService::errorOccurred, this, &NetworkService::serviceError);
#else
connect(m_service, static_cast<void(QLowEnergyService::*)(QLowEnergyService::ServiceError)> connect(m_service, static_cast<void(QLowEnergyService::*)(QLowEnergyService::ServiceError)>
(&QLowEnergyService::error), this, &NetworkService::serviceError); (&QLowEnergyService::error), this, &NetworkService::serviceError);
#endif
// NetworkManager // NetworkManager
connect(m_networkManager, &NetworkManager::stateChanged, this, &NetworkService::onNetworkManagerStateChanged); connect(m_networkManager, &NetworkManager::stateChanged, this, &NetworkService::onNetworkManagerStateChanged);
@ -74,7 +79,11 @@ QLowEnergyServiceData NetworkService::serviceData(NetworkManager *networkManager
serviceData.setType(QLowEnergyServiceData::ServiceTypePrimary); serviceData.setType(QLowEnergyServiceData::ServiceTypePrimary);
serviceData.setUuid(networkServiceUuid); serviceData.setUuid(networkServiceUuid);
#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
QLowEnergyDescriptorData clientConfigDescriptorData(QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration, QByteArray(2, 0));
#else
QLowEnergyDescriptorData clientConfigDescriptorData(QBluetoothUuid::ClientCharacteristicConfiguration, QByteArray(2, 0)); QLowEnergyDescriptorData clientConfigDescriptorData(QBluetoothUuid::ClientCharacteristicConfiguration, QByteArray(2, 0));
#endif
// Network manager status ef6d661-b8af-49e0-9eca-ab343513641c // Network manager status ef6d661-b8af-49e0-9eca-ab343513641c
QLowEnergyCharacteristicData networkStatusData; QLowEnergyCharacteristicData networkStatusData;
@ -253,7 +262,7 @@ void NetworkService::descriptorWritten(const QLowEnergyDescriptor &descriptor, c
qCDebug(dcNetworkManagerBluetoothServer()) << "NetworkService: Descriptor written" << descriptor.uuid().toString() << value; qCDebug(dcNetworkManagerBluetoothServer()) << "NetworkService: Descriptor written" << descriptor.uuid().toString() << value;
} }
void NetworkService::serviceError(const QLowEnergyService::ServiceError &error) void NetworkService::serviceError(QLowEnergyService::ServiceError error)
{ {
QString errorString; QString errorString;
switch (error) { switch (error) {

View File

@ -82,7 +82,7 @@ private slots:
void characteristicWritten(const QLowEnergyCharacteristic &characteristic, const QByteArray &value); void characteristicWritten(const QLowEnergyCharacteristic &characteristic, const QByteArray &value);
void descriptorRead(const QLowEnergyDescriptor &descriptor, const QByteArray &value); void descriptorRead(const QLowEnergyDescriptor &descriptor, const QByteArray &value);
void descriptorWritten(const QLowEnergyDescriptor &descriptor, const QByteArray &value); void descriptorWritten(const QLowEnergyDescriptor &descriptor, const QByteArray &value);
void serviceError(const QLowEnergyService::ServiceError &error); void serviceError(QLowEnergyService::ServiceError error);
// Commands // Commands
void processCommand(const NetworkServiceCommand &command); void processCommand(const NetworkServiceCommand &command);

View File

@ -56,8 +56,12 @@ WirelessService::WirelessService(QLowEnergyService *service, NetworkManager *net
connect(m_service, &QLowEnergyService::characteristicRead, this, &WirelessService::characteristicRead); connect(m_service, &QLowEnergyService::characteristicRead, this, &WirelessService::characteristicRead);
connect(m_service, &QLowEnergyService::characteristicWritten, this, &WirelessService::characteristicWritten); connect(m_service, &QLowEnergyService::characteristicWritten, this, &WirelessService::characteristicWritten);
connect(m_service, &QLowEnergyService::descriptorWritten, this, &WirelessService::descriptorWritten); connect(m_service, &QLowEnergyService::descriptorWritten, this, &WirelessService::descriptorWritten);
#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
connect(m_service, &QLowEnergyService::errorOccurred, this, &WirelessService::serviceError);
#else
connect(m_service, static_cast<void(QLowEnergyService::*)(QLowEnergyService::ServiceError)> connect(m_service, static_cast<void(QLowEnergyService::*)(QLowEnergyService::ServiceError)>
(&QLowEnergyService::error), this, &WirelessService::serviceError); (&QLowEnergyService::error), this, &WirelessService::serviceError);
#endif
// Get the wireless network device if there is any // Get the wireless network device if there is any
if (!m_networkManager->wirelessAvailable()) { if (!m_networkManager->wirelessAvailable()) {
@ -83,7 +87,11 @@ QLowEnergyServiceData WirelessService::serviceData(NetworkManager *networkManage
serviceData.setType(QLowEnergyServiceData::ServiceTypePrimary); serviceData.setType(QLowEnergyServiceData::ServiceTypePrimary);
serviceData.setUuid(wirelessServiceUuid); serviceData.setUuid(wirelessServiceUuid);
#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
QLowEnergyDescriptorData clientConfigDescriptorData(QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration, QByteArray(2, 0));
#else
QLowEnergyDescriptorData clientConfigDescriptorData(QBluetoothUuid::ClientCharacteristicConfiguration, QByteArray(2, 0)); QLowEnergyDescriptorData clientConfigDescriptorData(QBluetoothUuid::ClientCharacteristicConfiguration, QByteArray(2, 0));
#endif
QLowEnergyCharacteristicData versionCharacteristicData; QLowEnergyCharacteristicData versionCharacteristicData;
versionCharacteristicData.setUuid(wirelessServiceVersionCharacteristicUuid); versionCharacteristicData.setUuid(wirelessServiceVersionCharacteristicUuid);
@ -225,13 +233,13 @@ void WirelessService::streamData(const QVariantMap &responseMap)
} }
QByteArray data = QJsonDocument::fromVariant(responseMap).toJson(QJsonDocument::Compact) + '\n'; QByteArray data = QJsonDocument::fromVariant(responseMap).toJson(QJsonDocument::Compact) + '\n';
qCDebug(dcNetworkManagerBluetoothServer()) << "WirelessService: Start streaming response data:" << data.count() << "bytes"; qCDebug(dcNetworkManagerBluetoothServer()) << "WirelessService: Start streaming response data:" << data.length() << "bytes";
QByteArray remainingData = data; QByteArray remainingData = data;
while (!remainingData.isEmpty()) { while (!remainingData.isEmpty()) {
QByteArray package = remainingData.left(20); QByteArray package = remainingData.left(20);
m_service->writeCharacteristic(characteristic, package); m_service->writeCharacteristic(characteristic, package);
remainingData = remainingData.remove(0, package.count()); remainingData = remainingData.remove(0, package.length());
} }
qCDebug(dcNetworkManagerBluetoothServer()) << "WirelessService: Finished streaming response data"; qCDebug(dcNetworkManagerBluetoothServer()) << "WirelessService: Finished streaming response data";
@ -549,7 +557,7 @@ void WirelessService::descriptorWritten(const QLowEnergyDescriptor &descriptor,
qCDebug(dcNetworkManagerBluetoothServer()) << "WirelessService: Descriptor written" << descriptor.uuid().toString() << value; qCDebug(dcNetworkManagerBluetoothServer()) << "WirelessService: Descriptor written" << descriptor.uuid().toString() << value;
} }
void WirelessService::serviceError(const QLowEnergyService::ServiceError &error) void WirelessService::serviceError(QLowEnergyService::ServiceError error)
{ {
QString errorString; QString errorString;
switch (error) { switch (error) {

View File

@ -106,7 +106,7 @@ private slots:
void characteristicWritten(const QLowEnergyCharacteristic &characteristic, const QByteArray &value); void characteristicWritten(const QLowEnergyCharacteristic &characteristic, const QByteArray &value);
void descriptorRead(const QLowEnergyDescriptor &descriptor, const QByteArray &value); void descriptorRead(const QLowEnergyDescriptor &descriptor, const QByteArray &value);
void descriptorWritten(const QLowEnergyDescriptor &descriptor, const QByteArray &value); void descriptorWritten(const QLowEnergyDescriptor &descriptor, const QByteArray &value);
void serviceError(const QLowEnergyService::ServiceError &error); void serviceError(QLowEnergyService::ServiceError error);
// Commands // Commands
void processCommand(const QVariantMap &request); void processCommand(const QVariantMap &request);

View File

@ -40,7 +40,9 @@ SOURCES += \
wirelessnetworkdevice.cpp \ wirelessnetworkdevice.cpp \
networkmanagerutils.cpp networkmanagerutils.cpp
equals(QT_MAJOR_VERSION, 5):!lessThan(QT_MINOR_VERSION, 7) { lessThan(QT_MAJOR_VERSION, 6):lessThan(QT_MINOR_VERSION, 7) {
message(Bluetooth LE server functionality not supported with Qt $${QT_VERSION}.)
} else {
message(Building with Bluetooth LE server functionality. Qt $${QT_VERSION}.) message(Building with Bluetooth LE server functionality. Qt $${QT_VERSION}.)
QT += bluetooth QT += bluetooth
@ -55,8 +57,6 @@ equals(QT_MAJOR_VERSION, 5):!lessThan(QT_MINOR_VERSION, 7) {
bluetooth/bluetoothserver.cpp \ bluetooth/bluetoothserver.cpp \
bluetooth/networkservice.cpp \ bluetooth/networkservice.cpp \
bluetooth/wirelessservice.cpp \ bluetooth/wirelessservice.cpp \
} else {
message(Bluetooth LE server functionality not supported with Qt $${QT_VERSION}.)
} }
target.path = $$[QT_INSTALL_LIBS] target.path = $$[QT_INSTALL_LIBS]