diff --git a/libnymea-networkmanager/bluetooth/bluetoothserver.cpp b/libnymea-networkmanager/bluetooth/bluetoothserver.cpp index f9c3c3b..c335f91 100644 --- a/libnymea-networkmanager/bluetooth/bluetoothserver.cpp +++ b/libnymea-networkmanager/bluetooth/bluetoothserver.cpp @@ -23,6 +23,9 @@ #include "../networkmanager.h" #include "../networkmanagerutils.h" +#include +#include + BluetoothServer::BluetoothServer(NetworkManager *networkManager) : QObject(networkManager), m_networkManager(networkManager) @@ -41,6 +44,16 @@ BluetoothServer::~BluetoothServer() } +QString BluetoothServer::advertiseName() const +{ + return m_advertiseName; +} + +void BluetoothServer::setAdvertiseName(const QString &advertiseName) +{ + m_advertiseName = advertiseName; +} + QString BluetoothServer::modelName() const { return m_modelName; @@ -51,16 +64,6 @@ void BluetoothServer::setModelName(const QString &modelName) m_modelName = modelName; } -QString BluetoothServer::serverName() const -{ - return m_serverName; -} - -void BluetoothServer::setServerName(const QString &serverName) -{ - m_serverName = serverName; -} - QString BluetoothServer::softwareVersion() const { return m_softwareVersion; @@ -81,6 +84,16 @@ void BluetoothServer::setHardwareVersion(const QString &hardwareVersion) m_hardwareVersion = hardwareVersion; } +QString BluetoothServer::serialNumber() const +{ + return m_serialNumber; +} + +void BluetoothServer::setSerialNumber(const QString &serialNumber) +{ + m_serialNumber = serialNumber; +} + bool BluetoothServer::running() const { return m_running; @@ -109,6 +122,18 @@ QLowEnergyServiceData BluetoothServer::deviceInformationServiceData() modelNumberCharData.setProperties(QLowEnergyCharacteristic::Read); serviceData.addCharacteristic(modelNumberCharData); + // Serial number string 0x2a25 + QLowEnergyCharacteristicData serialNumberCharData; + serialNumberCharData.setUuid(QBluetoothUuid::SerialNumberString); + if (m_serialNumber.isNull()) { + // Note: if no serialnumber specified use the system uuid from /etc/machine-id + qCWarning(dcNetworkManagerBluetoothServer()) << "Serial number not specified. Using system uuid from /etc/machine-id as serialnumber."; + m_serialNumber = readMachineId().toString(); + } + serialNumberCharData.setValue(m_serialNumber.toUtf8()); + serialNumberCharData.setProperties(QLowEnergyCharacteristic::Read); + serviceData.addCharacteristic(serialNumberCharData); + // Firmware revision string 0x2a26 QLowEnergyCharacteristicData firmwareRevisionCharData; firmwareRevisionCharData.setUuid(QBluetoothUuid::FirmwareRevisionString); @@ -149,7 +174,11 @@ QLowEnergyServiceData BluetoothServer::genericAccessServiceData() // Device name 0x2a00 QLowEnergyCharacteristicData nameCharData; nameCharData.setUuid(QBluetoothUuid::DeviceName); - nameCharData.setValue(m_serverName.toUtf8()); + if (m_advertiseName.isNull()) { + qCWarning(dcNetworkManagerBluetoothServer()) << "Advertise name not specified. Using system host name as device name."; + m_advertiseName = QSysInfo::machineHostName(); + } + nameCharData.setValue(m_advertiseName.toUtf8()); nameCharData.setProperties(QLowEnergyCharacteristic::Read); serviceData.addCharacteristic(nameCharData); @@ -210,6 +239,25 @@ void BluetoothServer::setConnected(bool connected) emit connectedChanged(m_connected); } +QUuid BluetoothServer::readMachineId() +{ + QUuid systemUuid; + QFile systemUuidFile("/etc/machine-id"); + if (systemUuidFile.open(QFile::ReadOnly)) { + QString tmpId = QString::fromLatin1(systemUuidFile.readAll()).trimmed(); + tmpId.insert(8, "-"); + tmpId.insert(13, "-"); + tmpId.insert(18, "-"); + tmpId.insert(23, "-"); + systemUuid = QUuid(tmpId); + } else { + qWarning(dcNetworkManagerBluetoothServer()) << "Failed to open /etc/machine-id for reading the system uuid as device information serialnumber."; + } + systemUuidFile.close(); + + return systemUuid; +} + void BluetoothServer::onHostModeStateChanged(const QBluetoothLocalDevice::HostMode mode) { switch (mode) { @@ -389,13 +437,15 @@ void BluetoothServer::start() m_genericAttributeService = m_controller->addService(genericAttributeServiceData(), m_controller); // Create custom services - m_networkService = new NetworkService(m_controller->addService(NetworkService::serviceData(), m_controller), m_networkManager, m_controller); - m_wirelessService = new WirelessService(m_controller->addService(WirelessService::serviceData(), m_controller), m_networkManager, m_controller); + m_networkService = new NetworkService(m_controller->addService(NetworkService::serviceData(m_networkManager), m_controller), + m_networkManager, m_controller); + m_wirelessService = new WirelessService(m_controller->addService(WirelessService::serviceData(m_networkManager), m_controller), + m_networkManager, m_controller); QLowEnergyAdvertisingData advertisingData; advertisingData.setDiscoverability(QLowEnergyAdvertisingData::DiscoverabilityGeneral); advertisingData.setIncludePowerLevel(true); - advertisingData.setLocalName(m_serverName); + advertisingData.setLocalName(m_advertiseName); // FIXME: set guh manufacturer SIG data once available @@ -403,11 +453,10 @@ void BluetoothServer::start() QLowEnergyAdvertisingParameters advertisingParameters; advertisingParameters.setInterval(100,100); - qCDebug(dcNetworkManagerBluetoothServer()) << "Start advertising" << m_serverName << m_localDevice->address().toString(); + qCDebug(dcNetworkManagerBluetoothServer()) << "Start advertising" << m_advertiseName << m_localDevice->address().toString(); m_controller->startAdvertising(advertisingParameters, advertisingData, advertisingData); - // Start the advertising timer - setRunning(true); + // Note: setRunning(true) will be called when the service is really advertising, see onControllerStateChanged() } void BluetoothServer::stop() diff --git a/libnymea-networkmanager/bluetooth/bluetoothserver.h b/libnymea-networkmanager/bluetooth/bluetoothserver.h index ab0984c..e9b5a12 100644 --- a/libnymea-networkmanager/bluetooth/bluetoothserver.h +++ b/libnymea-networkmanager/bluetooth/bluetoothserver.h @@ -51,27 +51,32 @@ public: explicit BluetoothServer(NetworkManager *networkManager); ~BluetoothServer(); + QString advertiseName() const; + void setAdvertiseName(const QString &advertiseName); + // Information for the device info service QString modelName() const; void setModelName(const QString &modelName); - QString serverName() const; - void setServerName(const QString &serverName); - QString softwareVersion() const; void setSoftwareVersion(const QString &softwareVersion); QString hardwareVersion() const; void setHardwareVersion(const QString &hardwareVersion); + QString serialNumber() const; + void setSerialNumber(const QString &serialNumber); + bool running() const; bool connected() const; private: + QString m_advertiseName; + QString m_modelName; - QString m_serverName; QString m_softwareVersion; QString m_hardwareVersion; + QString m_serialNumber; NetworkManager *m_networkManager = nullptr; QBluetoothLocalDevice *m_localDevice = nullptr; @@ -94,6 +99,8 @@ private: void setRunning(bool running); void setConnected(bool connected); + QUuid readMachineId(); + signals: void runningChanged(const bool &running); void connectedChanged(const bool &connected); diff --git a/libnymea-networkmanager/bluetooth/networkservice.cpp b/libnymea-networkmanager/bluetooth/networkservice.cpp index 9427739..cc4c7c8 100644 --- a/libnymea-networkmanager/bluetooth/networkservice.cpp +++ b/libnymea-networkmanager/bluetooth/networkservice.cpp @@ -51,7 +51,7 @@ QLowEnergyService *NetworkService::service() return m_service; } -QLowEnergyServiceData NetworkService::serviceData() +QLowEnergyServiceData NetworkService::serviceData(NetworkManager *networkManager) { QLowEnergyServiceData serviceData; serviceData.setType(QLowEnergyServiceData::ServiceTypePrimary); @@ -65,7 +65,7 @@ QLowEnergyServiceData NetworkService::serviceData() networkStatusData.setValue(QByteArray(1, 0)); networkStatusData.setProperties(QLowEnergyCharacteristic::Read | QLowEnergyCharacteristic::Notify); networkStatusData.addDescriptor(clientConfigDescriptorData); - networkStatusData.setValue(NetworkService::getNetworkManagerStateByteArray(NetworkManager::NetworkManagerStateUnknown)); + networkStatusData.setValue(NetworkService::getNetworkManagerStateByteArray(networkManager->state())); serviceData.addCharacteristic(networkStatusData); // Network manager commander ef6d6612-b8af-49e0-9eca-ab343513641c @@ -88,7 +88,7 @@ QLowEnergyServiceData NetworkService::serviceData() networkingEnabledStatusData.setUuid(networkingEnabledCharacteristicUuid); networkingEnabledStatusData.setValue(QByteArray(1, 0)); networkingEnabledStatusData.setProperties(QLowEnergyCharacteristic::Read | QLowEnergyCharacteristic::Notify); - networkingEnabledStatusData.setValue(QByteArray::number(0)); + networkingEnabledStatusData.setValue(QByteArray::number(static_cast(networkManager->networkingEnabled()))); serviceData.addCharacteristic(networkingEnabledStatusData); // Wireless enabled ef6d6615-b8af-49e0-9eca-ab343513641c @@ -96,7 +96,7 @@ QLowEnergyServiceData NetworkService::serviceData() wirelessEnabledStatusData.setUuid(wirelessEnabledCharacteristicUuid); wirelessEnabledStatusData.setValue(QByteArray(1, 0)); wirelessEnabledStatusData.setProperties(QLowEnergyCharacteristic::Read | QLowEnergyCharacteristic::Notify); - wirelessEnabledStatusData.setValue(QByteArray::number(0)); + wirelessEnabledStatusData.setValue(QByteArray::number(static_cast(networkManager->wirelessEnabled()))); serviceData.addCharacteristic(wirelessEnabledStatusData); return serviceData; diff --git a/libnymea-networkmanager/bluetooth/networkservice.h b/libnymea-networkmanager/bluetooth/networkservice.h index 66c3a86..b06081f 100644 --- a/libnymea-networkmanager/bluetooth/networkservice.h +++ b/libnymea-networkmanager/bluetooth/networkservice.h @@ -56,7 +56,7 @@ public: QLowEnergyService *service(); - static QLowEnergyServiceData serviceData(); + static QLowEnergyServiceData serviceData(NetworkManager *networkManager); static QByteArray getNetworkManagerStateByteArray(const NetworkManager::NetworkManagerState &state); private: diff --git a/libnymea-networkmanager/bluetooth/wirelessservice.cpp b/libnymea-networkmanager/bluetooth/wirelessservice.cpp index 809b742..6b54e80 100644 --- a/libnymea-networkmanager/bluetooth/wirelessservice.cpp +++ b/libnymea-networkmanager/bluetooth/wirelessservice.cpp @@ -59,7 +59,7 @@ QLowEnergyService *WirelessService::service() return m_service; } -QLowEnergyServiceData WirelessService::serviceData() +QLowEnergyServiceData WirelessService::serviceData(NetworkManager *networkManager) { QLowEnergyServiceData serviceData; serviceData.setType(QLowEnergyServiceData::ServiceTypePrimary); @@ -88,7 +88,11 @@ QLowEnergyServiceData WirelessService::serviceData() wirelessStatusCharacteristicData.setProperties(QLowEnergyCharacteristic::Read | QLowEnergyCharacteristic::Notify); wirelessStatusCharacteristicData.addDescriptor(clientConfigDescriptorData); wirelessStatusCharacteristicData.setValueLength(1, 1); - wirelessStatusCharacteristicData.setValue(WirelessService::getWirelessNetworkDeviceState(NetworkDevice::NetworkDeviceStateUnavailable)); + if (networkManager->wirelessNetworkDevices().isEmpty()) { + wirelessStatusCharacteristicData.setValue(WirelessService::getWirelessNetworkDeviceState(NetworkDevice::NetworkDeviceStateUnknown)); + } else { + wirelessStatusCharacteristicData.setValue(WirelessService::getWirelessNetworkDeviceState(networkManager->wirelessNetworkDevices().first()->deviceState())); + } serviceData.addCharacteristic(wirelessStatusCharacteristicData); return serviceData; diff --git a/libnymea-networkmanager/bluetooth/wirelessservice.h b/libnymea-networkmanager/bluetooth/wirelessservice.h index 5e0336b..6cacae3 100644 --- a/libnymea-networkmanager/bluetooth/wirelessservice.h +++ b/libnymea-networkmanager/bluetooth/wirelessservice.h @@ -63,7 +63,7 @@ public: explicit WirelessService(QLowEnergyService *service, NetworkManager *networkManager, QObject *parent = nullptr); QLowEnergyService *service(); - static QLowEnergyServiceData serviceData(); + static QLowEnergyServiceData serviceData(NetworkManager *networkManager); private: QLowEnergyService *m_service = nullptr;