diff --git a/debian/control b/debian/control index 5f2dc95..2746c9a 100644 --- a/debian/control +++ b/debian/control @@ -8,7 +8,6 @@ Build-Depends: debhelper (>= 9.0.0), qt5-qmake, qtbase5-dev, qtbase5-dev-tools, - libqt5bluetooth5, qtconnectivity5-dev Standards-Version: 3.9.7 @@ -17,8 +16,7 @@ Section: libs Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, - libqt5network5, - libqt5bluetooth5 + libqt5network5 Description: Qt 5 based library for the network-manager DBus API. Qt 5 based library for the network-manager DBus API. diff --git a/libnymea-networkmanager/bluetooth/bluetoothserver.cpp b/libnymea-networkmanager/bluetooth/bluetoothserver.cpp deleted file mode 100644 index a20649c..0000000 --- a/libnymea-networkmanager/bluetooth/bluetoothserver.cpp +++ /dev/null @@ -1,498 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* -* Copyright 2013 - 2020, nymea GmbH -* Contact: contact@nymea.io -* -* This file is part of nymea. -* This project including source code and documentation is protected by -* copyright law, and remains the property of nymea GmbH. All rights, including -* reproduction, publication, editing and translation, are reserved. The use of -* this project is subject to the terms of a license agreement to be concluded -* with nymea GmbH in accordance with the terms of use of nymea GmbH, available -* under https://nymea.io/license -* -* GNU Lesser General Public License Usage -* Alternatively, this project may be redistributed and/or modified under the -* terms of the GNU Lesser General Public License as published by the Free -* Software Foundation; version 3. This project is distributed in the hope that -* it will be useful, but WITHOUT ANY WARRANTY; without even the implied -* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License -* along with this project. If not, see . -* -* For any further details and any questions please contact us under -* contact@nymea.io or see our FAQ/Licensing Information on -* https://nymea.io/license/faq -* -* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/*! - \class BluetoothServer - \brief Represents a bluetooth LE server for network-manager remote configuration. - \inmodule nymea-networkmanager - \ingroup networkmanager-bluetooth - -*/ - -#include "bluetoothserver.h" -#include "../networkmanager.h" -#include "../networkmanagerutils.h" - -#include -#include - -BluetoothServer::BluetoothServer(NetworkManager *networkManager) : - QObject(networkManager), - m_networkManager(networkManager) -{ - -} - -BluetoothServer::~BluetoothServer() -{ - qCDebug(dcNetworkManagerBluetoothServer()) << "Destroy bluetooth server."; - if (m_controller) - m_controller->stopAdvertising(); - - if (m_localDevice) - m_localDevice->setHostMode(QBluetoothLocalDevice::HostConnectable); - -} - -QString BluetoothServer::advertiseName() const -{ - return m_advertiseName; -} - -void BluetoothServer::setAdvertiseName(const QString &advertiseName) -{ - m_advertiseName = advertiseName; -} - -QString BluetoothServer::modelName() const -{ - return m_modelName; -} - -void BluetoothServer::setModelName(const QString &modelName) -{ - m_modelName = modelName; -} - -QString BluetoothServer::softwareVersion() const -{ - return m_softwareVersion; -} - -void BluetoothServer::setSoftwareVersion(const QString &softwareVersion) -{ - m_softwareVersion = softwareVersion; -} - -QString BluetoothServer::hardwareVersion() const -{ - return m_hardwareVersion; -} - -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; -} - -bool BluetoothServer::connected() const -{ - return m_connected; -} - -QLowEnergyServiceData BluetoothServer::deviceInformationServiceData() -{ - QLowEnergyServiceData serviceData; - serviceData.setType(QLowEnergyServiceData::ServiceTypePrimary); - serviceData.setUuid(QBluetoothUuid::DeviceInformation); - - // Model number string 0x2a24 - QLowEnergyCharacteristicData modelNumberCharData; - modelNumberCharData.setUuid(QBluetoothUuid::ModelNumberString); - if (m_modelName.isEmpty()) { - modelNumberCharData.setValue(QString("N.A.").toUtf8()); - } else { - modelNumberCharData.setValue(m_modelName.toUtf8()); - } - - 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 - qCDebug(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); - firmwareRevisionCharData.setValue(QString(VERSION_STRING).toUtf8()); - firmwareRevisionCharData.setProperties(QLowEnergyCharacteristic::Read); - serviceData.addCharacteristic(firmwareRevisionCharData); - - // Hardware revision string 0x2a27 - QLowEnergyCharacteristicData hardwareRevisionCharData; - hardwareRevisionCharData.setUuid(QBluetoothUuid::HardwareRevisionString); - hardwareRevisionCharData.setValue(m_hardwareVersion.toUtf8()); - hardwareRevisionCharData.setProperties(QLowEnergyCharacteristic::Read); - serviceData.addCharacteristic(hardwareRevisionCharData); - - // Software revision string 0x2a28 - QLowEnergyCharacteristicData softwareRevisionCharData; - softwareRevisionCharData.setUuid(QBluetoothUuid::SoftwareRevisionString); - softwareRevisionCharData.setValue(m_softwareVersion.toUtf8()); - softwareRevisionCharData.setProperties(QLowEnergyCharacteristic::Read); - serviceData.addCharacteristic(softwareRevisionCharData); - - // Manufacturer name string 0x2a29 - QLowEnergyCharacteristicData manufacturerNameCharData; - manufacturerNameCharData.setUuid(QBluetoothUuid::ManufacturerNameString); - manufacturerNameCharData.setValue(QString("guh GmbH").toUtf8()); - manufacturerNameCharData.setProperties(QLowEnergyCharacteristic::Read); - serviceData.addCharacteristic(manufacturerNameCharData); - - return serviceData; -} - -QLowEnergyServiceData BluetoothServer::genericAccessServiceData() -{ - QLowEnergyServiceData serviceData; - serviceData.setType(QLowEnergyServiceData::ServiceTypePrimary); - serviceData.setUuid(QBluetoothUuid::GenericAccess); - - // Device name 0x2a00 - QLowEnergyCharacteristicData nameCharData; - nameCharData.setUuid(QBluetoothUuid::DeviceName); - 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); - - // Appearance 0x2a01 - QLowEnergyCharacteristicData appearanceCharData; - appearanceCharData.setUuid(QBluetoothUuid::Appearance); - appearanceCharData.setValue(QByteArray(4, 0)); - appearanceCharData.setProperties(QLowEnergyCharacteristic::Read); - serviceData.addCharacteristic(appearanceCharData); - - // Peripheral Privacy Flag 0x2a02 - QLowEnergyCharacteristicData privacyFlagCharData; - privacyFlagCharData.setUuid(QBluetoothUuid::PeripheralPrivacyFlag); - privacyFlagCharData.setValue(QByteArray(2, 0)); - privacyFlagCharData.setProperties(QLowEnergyCharacteristic::Read | QLowEnergyCharacteristic::Write); - serviceData.addCharacteristic(privacyFlagCharData); - - // Reconnection Address 0x2a03 - QLowEnergyCharacteristicData reconnectionAddressCharData; - reconnectionAddressCharData.setUuid(QBluetoothUuid::ReconnectionAddress); - reconnectionAddressCharData.setValue(QByteArray()); - reconnectionAddressCharData.setProperties(QLowEnergyCharacteristic::Write); - serviceData.addCharacteristic(reconnectionAddressCharData); - - return serviceData; -} - -QLowEnergyServiceData BluetoothServer::genericAttributeServiceData() -{ - QLowEnergyServiceData serviceData; - serviceData.setType(QLowEnergyServiceData::ServiceTypePrimary); - serviceData.setUuid(QBluetoothUuid::GenericAttribute); - - QLowEnergyCharacteristicData charData; - charData.setUuid(QBluetoothUuid::ServiceChanged); - charData.setProperties(QLowEnergyCharacteristic::Indicate); - - serviceData.addCharacteristic(charData); - - return serviceData; -} - -void BluetoothServer::setRunning(bool running) -{ - if (m_running == running) - return; - - m_running = running; - emit runningChanged(m_running); -} - -void BluetoothServer::setConnected(bool connected) -{ - if (m_connected == connected) - return; - - m_connected = 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 { - qCWarning(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) { - case QBluetoothLocalDevice::HostConnectable: - qCDebug(dcNetworkManagerBluetoothServer()) << "Bluetooth host in connectable mode."; - break; - case QBluetoothLocalDevice::HostDiscoverable: - qCDebug(dcNetworkManagerBluetoothServer()) << "Bluetooth host in discoverable mode."; - break; - case QBluetoothLocalDevice::HostPoweredOff: - qCDebug(dcNetworkManagerBluetoothServer()) << "Bluetooth host in power off mode."; - break; - case QBluetoothLocalDevice::HostDiscoverableLimitedInquiry: - qCDebug(dcNetworkManagerBluetoothServer()) << "Bluetooth host in discoverable limited inquiry mode."; - break; - } -} - -void BluetoothServer::onDeviceConnected(const QBluetoothAddress &address) -{ - qCDebug(dcNetworkManagerBluetoothServer()) << "Device connected" << address.toString(); -} - -void BluetoothServer::onDeviceDisconnected(const QBluetoothAddress &address) -{ - qCDebug(dcNetworkManagerBluetoothServer()) << "Device disconnected" << address.toString(); -} - -void BluetoothServer::onError(QLowEnergyController::Error error) -{ - qCWarning(dcNetworkManagerBluetoothServer()) << "Bluetooth error occured:" << error << m_controller->errorString(); -} - -void BluetoothServer::onConnected() -{ - qCDebug(dcNetworkManagerBluetoothServer()) << "Client connected" << m_controller->remoteName() << m_controller->remoteAddress(); - setConnected(true); -} - -void BluetoothServer::onDisconnected() -{ - qCDebug(dcNetworkManagerBluetoothServer()) << "Client disconnected"; - setConnected(false); - stop(); -} - -void BluetoothServer::onControllerStateChanged(QLowEnergyController::ControllerState state) -{ - switch (state) { - case QLowEnergyController::UnconnectedState: - qCDebug(dcNetworkManagerBluetoothServer()) << "Controller state disonnected."; - setConnected(false); - break; - case QLowEnergyController::ConnectingState: - qCDebug(dcNetworkManagerBluetoothServer()) << "Controller state connecting..."; - setConnected(false); - break; - case QLowEnergyController::ConnectedState: - qCDebug(dcNetworkManagerBluetoothServer()) << "Controller state connected." << m_controller->remoteName() << m_controller->remoteAddress(); - setConnected(true); - break; - case QLowEnergyController::DiscoveringState: - qCDebug(dcNetworkManagerBluetoothServer()) << "Controller state discovering..."; - break; - case QLowEnergyController::DiscoveredState: - qCDebug(dcNetworkManagerBluetoothServer()) << "Controller state discovered."; - break; - case QLowEnergyController::ClosingState: - qCDebug(dcNetworkManagerBluetoothServer()) << "Controller state closing..."; - break; - case QLowEnergyController::AdvertisingState: - qCDebug(dcNetworkManagerBluetoothServer()) << "Controller state advertising..."; - setRunning(true); - break; - } -} - -void BluetoothServer::characteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &value) -{ - qCDebug(dcNetworkManagerBluetoothServer()) << "Service characteristic changed" << characteristic.uuid() << value; -} - -void BluetoothServer::characteristicRead(const QLowEnergyCharacteristic &characteristic, const QByteArray &value) -{ - qCDebug(dcNetworkManagerBluetoothServer()) << "Service characteristic read" << characteristic.uuid() << value; -} - -void BluetoothServer::characteristicWritten(const QLowEnergyCharacteristic &characteristic, const QByteArray &value) -{ - qCDebug(dcNetworkManagerBluetoothServer()) << "Service characteristic written" << characteristic.uuid() << value; -} - -void BluetoothServer::descriptorRead(const QLowEnergyDescriptor &descriptor, const QByteArray &value) -{ - qCDebug(dcNetworkManagerBluetoothServer()) << "Descriptor read" << descriptor.uuid() << value; -} - -void BluetoothServer::descriptorWritten(const QLowEnergyDescriptor &descriptor, const QByteArray &value) -{ - qCDebug(dcNetworkManagerBluetoothServer()) << "Descriptor written" << descriptor.uuid() << value; -} - -void BluetoothServer::serviceError(QLowEnergyService::ServiceError error) -{ - QString errorString; - switch (error) { - case QLowEnergyService::NoError: - errorString = "No error"; - break; - case QLowEnergyService::OperationError: - errorString = "Operation error"; - break; - case QLowEnergyService::CharacteristicReadError: - errorString = "Characteristic read error"; - break; - case QLowEnergyService::CharacteristicWriteError: - errorString = "Characteristic write error"; - break; - case QLowEnergyService::DescriptorReadError: - errorString = "Descriptor read error"; - break; - case QLowEnergyService::DescriptorWriteError: - errorString = "Descriptor write error"; - break; - case QLowEnergyService::UnknownError: - errorString = "Unknown error"; - break; - } - - qCWarning(dcNetworkManagerBluetoothServer()) << "Service error:" << errorString; -} - -void BluetoothServer::start() -{ - if (running()) { - qCDebug(dcNetworkManagerBluetoothServer()) << "Start Bluetooth server called but the server is already running. Doing nothing."; - return; - } - - if (connected()) { - qCDebug(dcNetworkManagerBluetoothServer()) << "Start Bluetooth server called but the server is running and a client is connected. Doing nothing."; - return; - } - - qCDebug(dcNetworkManagerBluetoothServer()) << "-------------------------------------"; - qCDebug(dcNetworkManagerBluetoothServer()) << "Starting bluetooth server..."; - qCDebug(dcNetworkManagerBluetoothServer()) << "-------------------------------------"; - - // Local bluetooth device - m_localDevice = new QBluetoothLocalDevice(this); - if (!m_localDevice->isValid()) { - qCWarning(dcNetworkManagerBluetoothServer()) << "Local bluetooth device is not valid."; - delete m_localDevice; - m_localDevice = nullptr; - return; - } - - connect(m_localDevice, &QBluetoothLocalDevice::hostModeStateChanged, this, &BluetoothServer::onHostModeStateChanged); - connect(m_localDevice, &QBluetoothLocalDevice::deviceConnected, this, &BluetoothServer::onDeviceConnected); - connect(m_localDevice, &QBluetoothLocalDevice::deviceDisconnected, this, &BluetoothServer::onDeviceDisconnected); - - qCDebug(dcNetworkManagerBluetoothServer()) << "Local device" << m_localDevice->name() << m_localDevice->address().toString(); - m_localDevice->setHostMode(QBluetoothLocalDevice::HostDiscoverable); - m_localDevice->powerOn(); - - // Bluetooth low energy periperal controller - m_controller = QLowEnergyController::createPeripheral(this); - connect(m_controller, &QLowEnergyController::stateChanged, this, &BluetoothServer::onControllerStateChanged); - connect(m_controller, &QLowEnergyController::connected, this, &BluetoothServer::onConnected); - connect(m_controller, &QLowEnergyController::disconnected, this, &BluetoothServer::onDisconnected); - connect(m_controller, SIGNAL(error(QLowEnergyController::Error)), this, SLOT(onError(QLowEnergyController::Error))); - - // Note: https://www.bluetooth.com/specifications/gatt/services - m_deviceInfoService = m_controller->addService(deviceInformationServiceData(), m_controller); - m_genericAccessService = m_controller->addService(genericAccessServiceData(), m_controller); - m_genericAttributeService = m_controller->addService(genericAttributeServiceData(), m_controller); - - // Create custom services - 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_advertiseName); - // FIXME: set guh manufacturer SIG data once available - - // Note: start advertising in 100 ms interval, this makes the device better discoverable on certain phones - QLowEnergyAdvertisingParameters advertisingParameters; - advertisingParameters.setInterval(100, 100); - - qCDebug(dcNetworkManagerBluetoothServer()) << "Start advertising" << m_advertiseName << m_localDevice->address().toString(); - m_controller->startAdvertising(advertisingParameters, advertisingData, advertisingData); - // Note: setRunning(true) will be called when the service is really advertising, see onControllerStateChanged() -} - -void BluetoothServer::stop() -{ - qCDebug(dcNetworkManagerBluetoothServer()) << "-------------------------------------"; - qCDebug(dcNetworkManagerBluetoothServer()) << "Stopping bluetooth server."; - qCDebug(dcNetworkManagerBluetoothServer()) << "-------------------------------------"; - - if (m_localDevice) { - qCDebug(dcNetworkManagerBluetoothServer()) << "Set host mode to connectable."; - m_localDevice->setHostMode(QBluetoothLocalDevice::HostConnectable); - delete m_localDevice; - m_localDevice = nullptr; - } - - if (m_controller) { - qCDebug(dcNetworkManagerBluetoothServer()) << "Stop advertising."; - m_controller->stopAdvertising(); - delete m_controller; - m_controller = nullptr; - } - - setConnected(false); - setRunning(false); -} diff --git a/libnymea-networkmanager/bluetooth/bluetoothserver.h b/libnymea-networkmanager/bluetooth/bluetoothserver.h deleted file mode 100644 index 986738f..0000000 --- a/libnymea-networkmanager/bluetooth/bluetoothserver.h +++ /dev/null @@ -1,142 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* -* Copyright 2013 - 2020, nymea GmbH -* Contact: contact@nymea.io -* -* This file is part of nymea. -* This project including source code and documentation is protected by -* copyright law, and remains the property of nymea GmbH. All rights, including -* reproduction, publication, editing and translation, are reserved. The use of -* this project is subject to the terms of a license agreement to be concluded -* with nymea GmbH in accordance with the terms of use of nymea GmbH, available -* under https://nymea.io/license -* -* GNU Lesser General Public License Usage -* Alternatively, this project may be redistributed and/or modified under the -* terms of the GNU Lesser General Public License as published by the Free -* Software Foundation; version 3. This project is distributed in the hope that -* it will be useful, but WITHOUT ANY WARRANTY; without even the implied -* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License -* along with this project. If not, see . -* -* For any further details and any questions please contact us under -* contact@nymea.io or see our FAQ/Licensing Information on -* https://nymea.io/license/faq -* -* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#ifndef BLUETOOTHSERVER_H -#define BLUETOOTHSERVER_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "networkservice.h" -#include "wirelessservice.h" - -class NetworkManager; - -class BluetoothServer : public QObject -{ - Q_OBJECT -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 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_softwareVersion; - QString m_hardwareVersion; - QString m_serialNumber; - - NetworkManager *m_networkManager = nullptr; - QBluetoothLocalDevice *m_localDevice = nullptr; - QLowEnergyController *m_controller = nullptr; - - QLowEnergyService *m_deviceInfoService = nullptr; - QLowEnergyService *m_genericAccessService = nullptr; - QLowEnergyService *m_genericAttributeService = nullptr; - - NetworkService *m_networkService = nullptr; - WirelessService *m_wirelessService = nullptr; - - bool m_running = false; - bool m_connected = false; - - QLowEnergyServiceData deviceInformationServiceData(); - QLowEnergyServiceData genericAccessServiceData(); - QLowEnergyServiceData genericAttributeServiceData(); - - void setRunning(bool running); - void setConnected(bool connected); - - QUuid readMachineId(); - -signals: - void runningChanged(const bool &running); - void connectedChanged(const bool &connected); - -private slots: - // Local bluetooth device - void onHostModeStateChanged(QBluetoothLocalDevice::HostMode mode); - void onDeviceConnected(const QBluetoothAddress &address); - void onDeviceDisconnected(const QBluetoothAddress &address); - void onError(QLowEnergyController::Error error); - - // Bluetooth controller - void onConnected(); - void onDisconnected(); - void onControllerStateChanged(QLowEnergyController::ControllerState state); - - // Services - void characteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &value); - void characteristicRead(const QLowEnergyCharacteristic &characteristic, const QByteArray &value); - void characteristicWritten(const QLowEnergyCharacteristic &characteristic, const QByteArray &value); - void descriptorRead(const QLowEnergyDescriptor &descriptor, const QByteArray &value); - void descriptorWritten(const QLowEnergyDescriptor &descriptor, const QByteArray &value); - void serviceError(QLowEnergyService::ServiceError error); - -public slots: - void start(); - void stop(); - -}; - -#endif // BLUETOOTHSERVER_H diff --git a/libnymea-networkmanager/bluetooth/bluetoothuuids.h b/libnymea-networkmanager/bluetooth/bluetoothuuids.h deleted file mode 100644 index fc9065b..0000000 --- a/libnymea-networkmanager/bluetooth/bluetoothuuids.h +++ /dev/null @@ -1,49 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* -* Copyright 2013 - 2020, nymea GmbH -* Contact: contact@nymea.io -* -* This file is part of nymea. -* This project including source code and documentation is protected by -* copyright law, and remains the property of nymea GmbH. All rights, including -* reproduction, publication, editing and translation, are reserved. The use of -* this project is subject to the terms of a license agreement to be concluded -* with nymea GmbH in accordance with the terms of use of nymea GmbH, available -* under https://nymea.io/license -* -* GNU Lesser General Public License Usage -* Alternatively, this project may be redistributed and/or modified under the -* terms of the GNU Lesser General Public License as published by the Free -* Software Foundation; version 3. This project is distributed in the hope that -* it will be useful, but WITHOUT ANY WARRANTY; without even the implied -* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License -* along with this project. If not, see . -* -* For any further details and any questions please contact us under -* contact@nymea.io or see our FAQ/Licensing Information on -* https://nymea.io/license/faq -* -* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#ifndef BLUETOOTHUUIDS_H -#define BLUETOOTHUUIDS_H - -#include - -static QBluetoothUuid networkServiceUuid = QBluetoothUuid(QUuid("ef6d6610-b8af-49e0-9eca-ab343513641c")); -static QBluetoothUuid networkStatusCharacteristicUuid = QBluetoothUuid(QUuid("ef6d6611-b8af-49e0-9eca-ab343513641c")); -static QBluetoothUuid networkCommanderCharacteristicUuid = QBluetoothUuid(QUuid("ef6d6612-b8af-49e0-9eca-ab343513641c")); -static QBluetoothUuid networkResponseCharacteristicUuid = QBluetoothUuid(QUuid("ef6d6613-b8af-49e0-9eca-ab343513641c")); -static QBluetoothUuid networkingEnabledCharacteristicUuid = QBluetoothUuid(QUuid("ef6d6614-b8af-49e0-9eca-ab343513641c")); -static QBluetoothUuid wirelessEnabledCharacteristicUuid = QBluetoothUuid(QUuid("ef6d6615-b8af-49e0-9eca-ab343513641c")); - -static QBluetoothUuid wirelessServiceUuid = QBluetoothUuid(QUuid("e081fec0-f757-4449-b9c9-bfa83133f7fc")); -static QBluetoothUuid wirelessCommanderCharacteristicUuid = QBluetoothUuid(QUuid("e081fec1-f757-4449-b9c9-bfa83133f7fc")); -static QBluetoothUuid wirelessResponseCharacteristicUuid = QBluetoothUuid(QUuid("e081fec2-f757-4449-b9c9-bfa83133f7fc")); -static QBluetoothUuid wirelessStateCharacteristicUuid = QBluetoothUuid(QUuid("e081fec3-f757-4449-b9c9-bfa83133f7fc")); -static QBluetoothUuid wirelessModeCharacteristicUuid = QBluetoothUuid(QUuid("e081fec4-f757-4449-b9c9-bfa83133f7fc")); - -#endif // BLUETOOTHUUIDS_H diff --git a/libnymea-networkmanager/bluetooth/networkservice.cpp b/libnymea-networkmanager/bluetooth/networkservice.cpp deleted file mode 100644 index 545fc95..0000000 --- a/libnymea-networkmanager/bluetooth/networkservice.cpp +++ /dev/null @@ -1,363 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* -* Copyright 2013 - 2020, nymea GmbH -* Contact: contact@nymea.io -* -* This file is part of nymea. -* This project including source code and documentation is protected by -* copyright law, and remains the property of nymea GmbH. All rights, including -* reproduction, publication, editing and translation, are reserved. The use of -* this project is subject to the terms of a license agreement to be concluded -* with nymea GmbH in accordance with the terms of use of nymea GmbH, available -* under https://nymea.io/license -* -* GNU Lesser General Public License Usage -* Alternatively, this project may be redistributed and/or modified under the -* terms of the GNU Lesser General Public License as published by the Free -* Software Foundation; version 3. This project is distributed in the hope that -* it will be useful, but WITHOUT ANY WARRANTY; without even the implied -* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License -* along with this project. If not, see . -* -* For any further details and any questions please contact us under -* contact@nymea.io or see our FAQ/Licensing Information on -* https://nymea.io/license/faq -* -* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/*! - \class NetworkService - \brief Represents a bluetooth LE service interfacing the network-manager. - \inmodule nymea-networkmanager - \ingroup networkmanager-bluetooth - -*/ - -#include "networkservice.h" -#include "bluetoothuuids.h" - -#include -#include - -NetworkService::NetworkService(QLowEnergyService *service, NetworkManager *networkManager, QObject *parent) : - QObject(parent), - m_service(service), - m_networkManager(networkManager) -{ - qCDebug(dcNetworkManagerBluetoothServer()) << "Create NetworkService."; - - // Service - connect(m_service, SIGNAL(characteristicChanged(QLowEnergyCharacteristic, QByteArray)), this, SLOT(characteristicChanged(QLowEnergyCharacteristic, QByteArray))); - connect(m_service, SIGNAL(characteristicRead(QLowEnergyCharacteristic, QByteArray)), this, SLOT(characteristicChanged(QLowEnergyCharacteristic, QByteArray))); - connect(m_service, SIGNAL(characteristicWritten(QLowEnergyCharacteristic, QByteArray)), this, SLOT(characteristicWritten(QLowEnergyCharacteristic, QByteArray))); - connect(m_service, SIGNAL(descriptorWritten(QLowEnergyDescriptor, QByteArray)), this, SLOT(descriptorWritten(QLowEnergyDescriptor, QByteArray))); - connect(m_service, SIGNAL(error(QLowEnergyService::ServiceError)), this, SLOT(serviceError(QLowEnergyService::ServiceError))); - - // NetworkManager - connect(m_networkManager, &NetworkManager::stateChanged, this, &NetworkService::onNetworkManagerStateChanged); - connect(m_networkManager, &NetworkManager::networkingEnabledChanged, this, &NetworkService::onNetworkingEnabledChanged); - connect(m_networkManager, &NetworkManager::wirelessEnabledChanged, this, &NetworkService::onWirelessEnabledChanged); -} - -QLowEnergyService *NetworkService::service() -{ - return m_service; -} - -QLowEnergyServiceData NetworkService::serviceData(NetworkManager *networkManager) -{ - QLowEnergyServiceData serviceData; - serviceData.setType(QLowEnergyServiceData::ServiceTypePrimary); - serviceData.setUuid(networkServiceUuid); - - QLowEnergyDescriptorData clientConfigDescriptorData(QBluetoothUuid::ClientCharacteristicConfiguration, QByteArray(2, 0)); - - // Network manager status ef6d661-b8af-49e0-9eca-ab343513641c - QLowEnergyCharacteristicData networkStatusData; - networkStatusData.setUuid(networkStatusCharacteristicUuid); - networkStatusData.setValue(QByteArray(1, 0)); - networkStatusData.setProperties(QLowEnergyCharacteristic::Read | QLowEnergyCharacteristic::Notify); - networkStatusData.addDescriptor(clientConfigDescriptorData); - networkStatusData.setValue(NetworkService::getNetworkManagerStateByteArray(networkManager->state())); - serviceData.addCharacteristic(networkStatusData); - - // Network manager commander ef6d6612-b8af-49e0-9eca-ab343513641c - QLowEnergyCharacteristicData networkCommanderCharacteristicData; - networkCommanderCharacteristicData.setUuid(networkCommanderCharacteristicUuid); - networkCommanderCharacteristicData.setProperties(QLowEnergyCharacteristic::Write); - networkCommanderCharacteristicData.setValueLength(1, 1); - serviceData.addCharacteristic(networkCommanderCharacteristicData); - - // Response characteristic ef6d6613-b8af-49e0-9eca-ab343513641c - QLowEnergyCharacteristicData networkResponseCharacteristicData; - networkResponseCharacteristicData.setUuid(networkResponseCharacteristicUuid); - networkResponseCharacteristicData.setProperties(QLowEnergyCharacteristic::Notify); - networkResponseCharacteristicData.addDescriptor(clientConfigDescriptorData); - networkResponseCharacteristicData.setValueLength(1, 1); - serviceData.addCharacteristic(networkResponseCharacteristicData); - - // Networking enabled ef6d6614-b8af-49e0-9eca-ab343513641c - QLowEnergyCharacteristicData networkingEnabledStatusData; - networkingEnabledStatusData.setUuid(networkingEnabledCharacteristicUuid); - networkingEnabledStatusData.setValue(QByteArray(1, 0)); - networkingEnabledStatusData.setProperties(QLowEnergyCharacteristic::Read | QLowEnergyCharacteristic::Notify); - networkingEnabledStatusData.setValue(QByteArray::number(static_cast(networkManager->networkingEnabled()))); - serviceData.addCharacteristic(networkingEnabledStatusData); - - // Wireless enabled ef6d6615-b8af-49e0-9eca-ab343513641c - QLowEnergyCharacteristicData wirelessEnabledStatusData; - wirelessEnabledStatusData.setUuid(wirelessEnabledCharacteristicUuid); - wirelessEnabledStatusData.setValue(QByteArray(1, 0)); - wirelessEnabledStatusData.setProperties(QLowEnergyCharacteristic::Read | QLowEnergyCharacteristic::Notify); - wirelessEnabledStatusData.setValue(QByteArray::number(static_cast(networkManager->wirelessEnabled()))); - serviceData.addCharacteristic(wirelessEnabledStatusData); - - return serviceData; -} - -QByteArray NetworkService::getNetworkManagerStateByteArray(const NetworkManager::NetworkManagerState &state) -{ - QByteArray networkManagerState; - switch (state) { - case NetworkManager::NetworkManagerStateUnknown: - networkManagerState = QByteArray::fromHex("00"); - break; - case NetworkManager::NetworkManagerStateAsleep: - networkManagerState = QByteArray::fromHex("01"); - break; - case NetworkManager::NetworkManagerStateDisconnected: - networkManagerState = QByteArray::fromHex("02"); - break; - case NetworkManager::NetworkManagerStateDisconnecting: - networkManagerState = QByteArray::fromHex("03"); - break; - case NetworkManager::NetworkManagerStateConnecting: - networkManagerState = QByteArray::fromHex("04"); - break; - case NetworkManager::NetworkManagerStateConnectedLocal: - networkManagerState = QByteArray::fromHex("05"); - break; - case NetworkManager::NetworkManagerStateConnectedSite: - networkManagerState = QByteArray::fromHex("06"); - break; - case NetworkManager::NetworkManagerStateConnectedGlobal: - networkManagerState = QByteArray::fromHex("07"); - break; - } - - return networkManagerState; -} - -void NetworkService::sendResponse(const NetworkService::NetworkServiceResponse &response) -{ - if (!m_service) { - qCWarning(dcNetworkManagerBluetoothServer()) << "NetworkService: Could not send response. Service not valid"; - return; - } - - QLowEnergyCharacteristic characteristic = m_service->characteristic(networkResponseCharacteristicUuid); - if (!characteristic.isValid()) { - qCWarning(dcNetworkManagerBluetoothServer()) << "NetworkService: Could not send response. Characteristic not valid"; - return; - } - - switch (response) { - case NetworkServiceResponseSuccess: - m_service->writeCharacteristic(characteristic, QByteArray::fromHex("00")); - break; - case NetworkServiceResponseIvalidValue: - m_service->writeCharacteristic(characteristic, QByteArray::fromHex("01")); - break; - case NetworkServiceResponseNetworkManagerNotAvailable: - m_service->writeCharacteristic(characteristic, QByteArray::fromHex("02")); - break; - case NetworkServiceResponseWirelessNotAvailable: - m_service->writeCharacteristic(characteristic, QByteArray::fromHex("03")); - break; - default: - // Unknown error - m_service->writeCharacteristic(characteristic, QByteArray::fromHex("04")); - break; - } -} - -NetworkService::NetworkServiceCommand NetworkService::verifyCommand(const QByteArray &commandData) -{ - if (commandData.length() != 1) - return NetworkServiceCommandInvalid; - - uint commandInteger = commandData.toHex().toUInt(nullptr, 16); - switch (commandInteger) { - case NetworkServiceCommandEnableNetworking: - return NetworkServiceCommandEnableNetworking; - case NetworkServiceCommandDisableNetworking: - return NetworkServiceCommandDisableNetworking; - case NetworkServiceCommandEnableWireless: - return NetworkServiceCommandEnableWireless; - case NetworkServiceCommandDisableWireless: - return NetworkServiceCommandDisableWireless; - default: - break; - } - - return NetworkServiceCommandInvalid; -} - -void NetworkService::characteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &value) -{ - if (characteristic.uuid() == networkCommanderCharacteristicUuid) { - - NetworkServiceCommand command = verifyCommand(value); - if (command == NetworkServiceCommandInvalid) { - qCWarning(dcNetworkManagerBluetoothServer()) << "NetworkService: received invalid command" << command; - sendResponse(NetworkServiceResponseIvalidValue); - return; - } - - if (!m_networkManager->available()) { - qCWarning(dcNetworkManagerBluetoothServer()) << "NetworkService: Networkmanager not available"; - sendResponse(NetworkServiceResponseNetworkManagerNotAvailable); - return; - } - - processCommand(command); - - sendResponse(NetworkServiceResponseSuccess); - return; - } - - qCDebug(dcNetworkManagerBluetoothServer()) << "NetworkService: Characteristic changed" << characteristic.uuid().toString() << value; -} - -void NetworkService::characteristicRead(const QLowEnergyCharacteristic &characteristic, const QByteArray &value) -{ - qCDebug(dcNetworkManagerBluetoothServer()) << "NetworkService: Characteristic read" << characteristic.uuid().toString() << value; -} - -void NetworkService::characteristicWritten(const QLowEnergyCharacteristic &characteristic, const QByteArray &value) -{ - qCDebug(dcNetworkManagerBluetoothServer()) << "NetworkService: Characteristic written" << characteristic.uuid().toString() << value; -} - -void NetworkService::descriptorRead(const QLowEnergyDescriptor &descriptor, const QByteArray &value) -{ - qCDebug(dcNetworkManagerBluetoothServer()) << "NetworkService: Descriptor read" << descriptor.uuid().toString() << value; -} - -void NetworkService::descriptorWritten(const QLowEnergyDescriptor &descriptor, const QByteArray &value) -{ - qCDebug(dcNetworkManagerBluetoothServer()) << "NetworkService: Descriptor written" << descriptor.uuid().toString() << value; -} - -void NetworkService::serviceError(const QLowEnergyService::ServiceError &error) -{ - QString errorString; - switch (error) { - case QLowEnergyService::NoError: - errorString = "No error"; - break; - case QLowEnergyService::OperationError: - errorString = "Operation error"; - break; - case QLowEnergyService::CharacteristicReadError: - errorString = "Characteristic read error"; - break; - case QLowEnergyService::CharacteristicWriteError: - errorString = "Characteristic write error"; - break; - case QLowEnergyService::DescriptorReadError: - errorString = "Descriptor read error"; - break; - case QLowEnergyService::DescriptorWriteError: - errorString = "Descriptor write error"; - break; - case QLowEnergyService::UnknownError: - errorString = "Unknown error"; - break; - } - - qCWarning(dcNetworkManagerBluetoothServer()) << "NetworkService: Error:" << errorString; -} - -void NetworkService::processCommand(const NetworkServiceCommand &command) -{ - switch (command) { - case NetworkServiceCommandEnableNetworking: - qCDebug(dcNetworkManagerBluetoothServer()) << "NetworkService: received \"Enable networking\" command"; - m_networkManager->enableNetworking(true); - break; - case NetworkServiceCommandDisableNetworking: - qCDebug(dcNetworkManagerBluetoothServer()) << "NetworkService: received \"Disable networking\" command"; - m_networkManager->enableNetworking(false); - break; - case NetworkServiceCommandEnableWireless: - qCDebug(dcNetworkManagerBluetoothServer()) << "NetworkService: received \"Enable wireless networking\" command"; - m_networkManager->enableWireless(true); - break; - case NetworkServiceCommandDisableWireless: - qCDebug(dcNetworkManagerBluetoothServer()) << "NetworkService: received \"Disable wireless networking\" command"; - m_networkManager->enableWireless(false); - break; - default: - qCWarning(dcNetworkManagerBluetoothServer()) << "NetworkService: Unhandled command" << command; - sendResponse(NetworkServiceResponseIvalidValue); - break; - } -} - -bool NetworkService::onNetworkManagerStateChanged() -{ - if (!m_service) { - qCWarning(dcNetworkManagerBluetoothServer()) << "NetworkService: Could not updatet network manager status. Service not valid"; - return false; - } - - QLowEnergyCharacteristic characteristic = m_service->characteristic(networkStatusCharacteristicUuid); - if (!characteristic.isValid()) { - qCWarning(dcNetworkManagerBluetoothServer()) << "NetworkService: Could not update network manager status. Characteristic not valid"; - return false; - } - - qCDebug(dcNetworkManagerBluetoothServer()) << "NetworkService: Notify state changed" << NetworkService::getNetworkManagerStateByteArray(m_networkManager->state()); - m_service->writeCharacteristic(characteristic, NetworkService::getNetworkManagerStateByteArray(m_networkManager->state())); - return true; -} - -bool NetworkService::onNetworkingEnabledChanged() -{ - if (!m_service) { - qCWarning(dcNetworkManagerBluetoothServer()) << "NetworkService: Could not set networking enabled. Service not valid"; - return false; - } - - QLowEnergyCharacteristic characteristic = m_service->characteristic(networkingEnabledCharacteristicUuid); - if (!characteristic.isValid()) { - qCWarning(dcNetworkManagerBluetoothServer()) << "NetworkService: Could not set networking enabled. Characteristic not valid"; - return false; - } - - qCDebug(dcNetworkManagerBluetoothServer()) << "NetworkService: Notify networking enabled changed:" << (m_networkManager->networkingEnabled() ? "enabled" : "disabled"); - m_service->writeCharacteristic(characteristic, m_networkManager->networkingEnabled() ? QByteArray::fromHex("01") : QByteArray::fromHex("00")); - return true; -} - -bool NetworkService::onWirelessEnabledChanged() -{ - if (!m_service) { - qCWarning(dcNetworkManagerBluetoothServer()) << "NetworkService: Could not set wireless enabled. Service not valid"; - return false; - } - - QLowEnergyCharacteristic characteristic = m_service->characteristic(wirelessEnabledCharacteristicUuid); - if (!characteristic.isValid()) { - qCWarning(dcNetworkManagerBluetoothServer()) << "NetworkService: Could not set wireless enabled. Characteristic not valid"; - return false; - } - - qCDebug(dcNetworkManagerBluetoothServer()) << "NetworkService: Notify wireless networking enabled changed:" << (m_networkManager->wirelessEnabled() ? "enabled" : "disabled"); - m_service->writeCharacteristic(characteristic, m_networkManager->wirelessEnabled() ? QByteArray::fromHex("01") : QByteArray::fromHex("00")); - return true; -} diff --git a/libnymea-networkmanager/bluetooth/networkservice.h b/libnymea-networkmanager/bluetooth/networkservice.h deleted file mode 100644 index c8c6e8b..0000000 --- a/libnymea-networkmanager/bluetooth/networkservice.h +++ /dev/null @@ -1,97 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* -* Copyright 2013 - 2020, nymea GmbH -* Contact: contact@nymea.io -* -* This file is part of nymea. -* This project including source code and documentation is protected by -* copyright law, and remains the property of nymea GmbH. All rights, including -* reproduction, publication, editing and translation, are reserved. The use of -* this project is subject to the terms of a license agreement to be concluded -* with nymea GmbH in accordance with the terms of use of nymea GmbH, available -* under https://nymea.io/license -* -* GNU Lesser General Public License Usage -* Alternatively, this project may be redistributed and/or modified under the -* terms of the GNU Lesser General Public License as published by the Free -* Software Foundation; version 3. This project is distributed in the hope that -* it will be useful, but WITHOUT ANY WARRANTY; without even the implied -* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License -* along with this project. If not, see . -* -* For any further details and any questions please contact us under -* contact@nymea.io or see our FAQ/Licensing Information on -* https://nymea.io/license/faq -* -* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#ifndef NETWORKSERVICE_H -#define NETWORKSERVICE_H - -#include -#include -#include - -#include "../networkmanager.h" - -class NetworkService : public QObject -{ - Q_OBJECT - -public: - enum NetworkServiceCommand { - NetworkServiceCommandInvalid = -1, - NetworkServiceCommandEnableNetworking = 0x00, - NetworkServiceCommandDisableNetworking = 0x01, - NetworkServiceCommandEnableWireless = 0x02, - NetworkServiceCommandDisableWireless = 0x03 - }; - Q_ENUM(NetworkServiceCommand) - - enum NetworkServiceResponse { - NetworkServiceResponseSuccess = 0x00, - NetworkServiceResponseIvalidValue = 0x01, - NetworkServiceResponseNetworkManagerNotAvailable = 0x02, - NetworkServiceResponseWirelessNotAvailable = 0x03, - NetworkServiceResponseUnknownError = 0x04, - }; - Q_ENUM(NetworkServiceResponse) - - explicit NetworkService(QLowEnergyService *service, NetworkManager *networkManager, QObject *parent = nullptr); - - QLowEnergyService *service(); - - static QLowEnergyServiceData serviceData(NetworkManager *networkManager); - static QByteArray getNetworkManagerStateByteArray(const NetworkManager::NetworkManagerState &state); - -private: - QLowEnergyService *m_service = nullptr; - NetworkManager *m_networkManager = nullptr; - - void sendResponse(const NetworkServiceResponse &response); - - NetworkServiceCommand verifyCommand(const QByteArray &commandData); - -private slots: - // Service - void characteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &value); - void characteristicRead(const QLowEnergyCharacteristic &characteristic, const QByteArray &value); - void characteristicWritten(const QLowEnergyCharacteristic &characteristic, const QByteArray &value); - void descriptorRead(const QLowEnergyDescriptor &descriptor, const QByteArray &value); - void descriptorWritten(const QLowEnergyDescriptor &descriptor, const QByteArray &value); - void serviceError(const QLowEnergyService::ServiceError &error); - - // Commands - void processCommand(const NetworkServiceCommand &command); - -public slots: - bool onNetworkManagerStateChanged(); - bool onNetworkingEnabledChanged(); - bool onWirelessEnabledChanged(); - -}; - -#endif // NETWORKSERVICE_H diff --git a/libnymea-networkmanager/bluetooth/wirelessservice.cpp b/libnymea-networkmanager/bluetooth/wirelessservice.cpp deleted file mode 100644 index b435fe6..0000000 --- a/libnymea-networkmanager/bluetooth/wirelessservice.cpp +++ /dev/null @@ -1,650 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* -* Copyright 2013 - 2020, nymea GmbH -* Contact: contact@nymea.io -* -* This file is part of nymea. -* This project including source code and documentation is protected by -* copyright law, and remains the property of nymea GmbH. All rights, including -* reproduction, publication, editing and translation, are reserved. The use of -* this project is subject to the terms of a license agreement to be concluded -* with nymea GmbH in accordance with the terms of use of nymea GmbH, available -* under https://nymea.io/license -* -* GNU Lesser General Public License Usage -* Alternatively, this project may be redistributed and/or modified under the -* terms of the GNU Lesser General Public License as published by the Free -* Software Foundation; version 3. This project is distributed in the hope that -* it will be useful, but WITHOUT ANY WARRANTY; without even the implied -* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License -* along with this project. If not, see . -* -* For any further details and any questions please contact us under -* contact@nymea.io or see our FAQ/Licensing Information on -* https://nymea.io/license/faq -* -* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/*! - \class WirelessService - \brief Represents a bluetooth LE service interfacing the wireless configuration of the network-manager. - \inmodule nymea-networkmanager - \ingroup networkmanager-bluetooth - -*/ - -#include "wirelessservice.h" -#include "bluetoothuuids.h" - -#include -#include -#include -#include - -WirelessService::WirelessService(QLowEnergyService *service, NetworkManager *networkManager, QObject *parent) : - QObject(parent), - m_service(service), - m_networkManager(networkManager) -{ - qCDebug(dcNetworkManagerBluetoothServer()) << "Create WirelessService."; - - // Service - connect(m_service, SIGNAL(characteristicChanged(QLowEnergyCharacteristic, QByteArray)), this, SLOT(characteristicChanged(QLowEnergyCharacteristic, QByteArray))); - connect(m_service, SIGNAL(characteristicRead(QLowEnergyCharacteristic, QByteArray)), this, SLOT(characteristicChanged(QLowEnergyCharacteristic, QByteArray))); - connect(m_service, SIGNAL(characteristicWritten(QLowEnergyCharacteristic, QByteArray)), this, SLOT(characteristicWritten(QLowEnergyCharacteristic, QByteArray))); - connect(m_service, SIGNAL(descriptorWritten(QLowEnergyDescriptor, QByteArray)), this, SLOT(descriptorWritten(QLowEnergyDescriptor, QByteArray))); - connect(m_service, SIGNAL(error(QLowEnergyService::ServiceError)), this, SLOT(serviceError(QLowEnergyService::ServiceError))); - - // Get the wireless network device if there is any - if (!m_networkManager->wirelessAvailable()) { - qCWarning(dcNetworkManagerBluetoothServer()) << "WirelessService: There is no wireless network device available"; - return; - } - - qCDebug(dcNetworkManagerBluetoothServer()) << "WirelessService: Using" << m_networkManager->wirelessNetworkDevices().first(); - m_device = m_networkManager->wirelessNetworkDevices().first(); - connect(m_device, &WirelessNetworkDevice::bitRateChanged, this, &WirelessService::onWirelessDeviceBitRateChanged); - connect(m_device, &WirelessNetworkDevice::stateChanged, this, &WirelessService::onWirelessDeviceStateChanged); - connect(m_device, &WirelessNetworkDevice::wirelessModeChanged, this, &WirelessService::onWirelessModeChanged); -} - -QLowEnergyService *WirelessService::service() -{ - return m_service; -} - -QLowEnergyServiceData WirelessService::serviceData(NetworkManager *networkManager) -{ - QLowEnergyServiceData serviceData; - serviceData.setType(QLowEnergyServiceData::ServiceTypePrimary); - serviceData.setUuid(wirelessServiceUuid); - - QLowEnergyDescriptorData clientConfigDescriptorData(QBluetoothUuid::ClientCharacteristicConfiguration, QByteArray(2, 0)); - - // Wifi commander characterisitc e081fec1-f757-4449-b9c9-bfa83133f7fc - QLowEnergyCharacteristicData wirelessCommanderCharacteristicData; - wirelessCommanderCharacteristicData.setUuid(wirelessCommanderCharacteristicUuid); - wirelessCommanderCharacteristicData.setProperties(QLowEnergyCharacteristic::Write); - wirelessCommanderCharacteristicData.setValueLength(0, 20); - serviceData.addCharacteristic(wirelessCommanderCharacteristicData); - - // Response characterisitc e081fec2-f757-4449-b9c9-bfa83133f7fc - QLowEnergyCharacteristicData wirelessResponseCharacteristicData; - wirelessResponseCharacteristicData.setUuid(wirelessResponseCharacteristicUuid); - wirelessResponseCharacteristicData.setProperties(QLowEnergyCharacteristic::Notify); - wirelessResponseCharacteristicData.addDescriptor(clientConfigDescriptorData); - wirelessResponseCharacteristicData.setValueLength(0, 20); - serviceData.addCharacteristic(wirelessResponseCharacteristicData); - - // Wireless connection status characterisitc e081fec3-f757-4449-b9c9-bfa83133f7fc - QLowEnergyCharacteristicData wirelessStatusCharacteristicData; - wirelessStatusCharacteristicData.setUuid(wirelessStateCharacteristicUuid); - wirelessStatusCharacteristicData.setProperties(QLowEnergyCharacteristic::Read | QLowEnergyCharacteristic::Notify); - wirelessStatusCharacteristicData.addDescriptor(clientConfigDescriptorData); - wirelessStatusCharacteristicData.setValueLength(1, 1); - if (networkManager->wirelessNetworkDevices().isEmpty()) { - wirelessStatusCharacteristicData.setValue(WirelessService::getWirelessNetworkDeviceState(NetworkDevice::NetworkDeviceStateUnknown)); - } else { - wirelessStatusCharacteristicData.setValue(WirelessService::getWirelessNetworkDeviceState(networkManager->wirelessNetworkDevices().first()->deviceState())); - } - serviceData.addCharacteristic(wirelessStatusCharacteristicData); - - // Wireless mode characterisitc e081fec4-f757-4449-b9c9-bfa83133f7fc - QLowEnergyCharacteristicData wirelessModeCharacteristicData; - wirelessModeCharacteristicData.setUuid(wirelessModeCharacteristicUuid); - wirelessModeCharacteristicData.setProperties(QLowEnergyCharacteristic::Read | QLowEnergyCharacteristic::Notify); - wirelessModeCharacteristicData.addDescriptor(clientConfigDescriptorData); - wirelessModeCharacteristicData.setValueLength(1, 1); - if (networkManager->wirelessNetworkDevices().isEmpty()) { - wirelessModeCharacteristicData.setValue(WirelessService::getWirelessMode(WirelessNetworkDevice::WirelessModeUnknown)); - } else { - wirelessModeCharacteristicData.setValue(WirelessService::getWirelessMode(networkManager->wirelessNetworkDevices().first()->wirelessMode())); - } - serviceData.addCharacteristic(wirelessModeCharacteristicData); - - return serviceData; -} - - -WirelessService::WirelessServiceResponse WirelessService::checkWirelessErrors() -{ - // Check possible errors - if (!m_networkManager->available()) { - qCWarning(dcNetworkManagerBluetoothServer()) << "WirelessService: The networkmanager is not available."; - return WirelessServiceResponseNetworkManagerNotAvailable; - } - - if (!m_device) { - qCWarning(dcNetworkManagerBluetoothServer()) << "WirelessService: There is no wireless device available."; - return WirelessServiceResponseWirelessNotAvailable; - } - - if (!m_networkManager->networkingEnabled()) { - qCWarning(dcNetworkManagerBluetoothServer()) << "WirelessService: Networking not enabled"; - return WirelessServiceResponseNetworkingNotEnabled; - } - - if (!m_networkManager->wirelessEnabled()) { - qCWarning(dcNetworkManagerBluetoothServer()) << "WirelessService: Wireless not enabled"; - return WirelessServiceResponseWirelessNotEnabled; - } - - return WirelessServiceResponseSuccess; -} - -QByteArray WirelessService::getWirelessNetworkDeviceState(const NetworkDevice::NetworkDeviceState &state) -{ - switch (state) { - case NetworkDevice::NetworkDeviceStateUnknown: - return QByteArray::fromHex("00"); - case NetworkDevice::NetworkDeviceStateUnmanaged: - return QByteArray::fromHex("01"); - case NetworkDevice::NetworkDeviceStateUnavailable: - return QByteArray::fromHex("02"); - case NetworkDevice::NetworkDeviceStateDisconnected: - return QByteArray::fromHex("03"); - case NetworkDevice::NetworkDeviceStatePrepare: - return QByteArray::fromHex("04"); - case NetworkDevice::NetworkDeviceStateConfig: - return QByteArray::fromHex("05"); - case NetworkDevice::NetworkDeviceStateNeedAuth: - return QByteArray::fromHex("06"); - case NetworkDevice::NetworkDeviceStateIpConfig: - return QByteArray::fromHex("07"); - case NetworkDevice::NetworkDeviceStateIpCheck: - return QByteArray::fromHex("08"); - case NetworkDevice::NetworkDeviceStateSecondaries: - return QByteArray::fromHex("09"); - case NetworkDevice::NetworkDeviceStateActivated: - return QByteArray::fromHex("0a"); - case NetworkDevice::NetworkDeviceStateDeactivating: - return QByteArray::fromHex("0b"); - case NetworkDevice::NetworkDeviceStateFailed: - return QByteArray::fromHex("0c"); - } - - // Unknown - return QByteArray::fromHex("00"); -} - -QByteArray WirelessService::getWirelessMode(WirelessNetworkDevice::WirelessMode mode) -{ - switch (mode) { - case WirelessNetworkDevice::WirelessModeUnknown: - return QByteArray::fromHex("00"); - case WirelessNetworkDevice::WirelessModeAdhoc: - return QByteArray::fromHex("01"); - case WirelessNetworkDevice::WirelessModeInfrastructure: - return QByteArray::fromHex("02"); - case WirelessNetworkDevice::WirelessModeAccessPoint: - return QByteArray::fromHex("03"); - } - - // Unknown - return QByteArray::fromHex("00"); -} - - -void WirelessService::streamData(const QVariantMap &responseMap) -{ - QLowEnergyCharacteristic characteristic = m_service->characteristic(wirelessResponseCharacteristicUuid); - if (!characteristic.isValid()) { - qCWarning(dcNetworkManagerBluetoothServer()) << "WirelessService: Wireless response characteristic not valid"; - return; - } - - QByteArray data = QJsonDocument::fromVariant(responseMap).toJson(QJsonDocument::Compact) + '\n'; - qCDebug(dcNetworkManagerBluetoothServer()) << "WirelessService: Start streaming response data:" << data.count() << "bytes"; - - int sentDataLength = 0; - QByteArray remainingData = data; - while (!remainingData.isEmpty()) { - QByteArray package = remainingData.left(20); - sentDataLength += package.count(); - m_service->writeCharacteristic(characteristic, package); - remainingData = remainingData.remove(0, package.count()); - } - - qCDebug(dcNetworkManagerBluetoothServer()) << "WirelessService: Finished streaming response data"; -} - -QVariantMap WirelessService::createResponse(const WirelessService::WirelessServiceCommand &command, const WirelessService::WirelessServiceResponse &responseCode) -{ - QVariantMap response; - response.insert("c", static_cast(command)); - response.insert("r", static_cast(responseCode)); - return response; -} - -void WirelessService::commandGetNetworks(const QVariantMap &request) -{ - Q_UNUSED(request) - - if (!m_service) { - qCWarning(dcNetworkManagerBluetoothServer()) << "WirelessService: Could not stream wireless network list. Service not valid"; - return; - } - - QLowEnergyCharacteristic characteristic = m_service->characteristic(wirelessResponseCharacteristicUuid); - if (!characteristic.isValid()) { - qCWarning(dcNetworkManagerBluetoothServer()) << "WirelessService: Wireless response characteristic not valid"; - return; - } - - QVariantList accessPointVariantList; - foreach (WirelessAccessPoint *accessPoint, m_device->accessPoints()) { - QVariantMap accessPointVariantMap; - accessPointVariantMap.insert("e", accessPoint->ssid()); - accessPointVariantMap.insert("m", accessPoint->macAddress()); - accessPointVariantMap.insert("s", accessPoint->signalStrength()); - accessPointVariantMap.insert("p", static_cast(accessPoint->isProtected())); - accessPointVariantList.append(accessPointVariantMap); - } - - QVariantMap response = createResponse(WirelessServiceCommandGetNetworks); - response.insert("p", accessPointVariantList); - - streamData(response); -} - -void WirelessService::commandConnect(const QVariantMap &request) -{ - if (!m_service) { - qCWarning(dcNetworkManagerBluetoothServer()) << "WirelessService: Could not stream wireless network list. Service not valid"; - return; - } - - QLowEnergyCharacteristic characteristic = m_service->characteristic(wirelessResponseCharacteristicUuid); - if (!characteristic.isValid()) { - qCWarning(dcNetworkManagerBluetoothServer()) << "WirelessService: Wireless response characteristic not valid"; - return; - } - - if (!request.contains("p")) { - qCWarning(dcNetworkManagerBluetoothServer()) << "WirelessService: Connect command: Missing parameters."; - streamData(createResponse(WirelessServiceCommandConnect, WirelessServiceResponseIvalidParameters)); - return; - } - - QVariantMap parameters = request.value("p").toMap(); - if (!parameters.contains("e") || !parameters.contains("p")) { - qCWarning(dcNetworkManagerBluetoothServer()) << "WirelessService: Connect command: Invalid parameters."; - streamData(createResponse(WirelessServiceCommandConnect, WirelessServiceResponseIvalidParameters)); - return; - } - - NetworkManager::NetworkManagerError networkError = m_networkManager->connectWifi(m_device->interface(), parameters.value("e").toString(), parameters.value("p").toString()); - WirelessService::WirelessServiceResponse responseCode = WirelessService::WirelessServiceResponseSuccess; - switch (networkError) { - case NetworkManager::NetworkManagerErrorNoError: - break; - case NetworkManager::NetworkManagerErrorWirelessNetworkingDisabled: - responseCode = WirelessService::WirelessServiceResponseWirelessNotEnabled; - break; - case NetworkManager::NetworkManagerErrorWirelessConnectionFailed: - responseCode = WirelessService::WirelessServiceResponseUnknownError; - break; - default: - responseCode = WirelessService::WirelessServiceResponseUnknownError; - break; - } - streamData(createResponse(WirelessServiceCommandConnect, responseCode)); -} - -void WirelessService::commandConnectHidden(const QVariantMap &request) -{ - Q_UNUSED(request) - - // TODO: - qCWarning(dcNetworkManagerBluetoothServer()) << "Connect to hidden network is not implemented yet."; -} - -void WirelessService::commandDisconnect(const QVariantMap &request) -{ - Q_UNUSED(request) - - if (!m_service) { - qCWarning(dcNetworkManagerBluetoothServer()) << "WirelessService: Could not stream wireless network list. Service not valid"; - return; - } - - QLowEnergyCharacteristic characteristic = m_service->characteristic(wirelessResponseCharacteristicUuid); - if (!characteristic.isValid()) { - qCWarning(dcNetworkManagerBluetoothServer()) << "WirelessService: Wireless response characteristic not valid"; - return; - } - - m_device->disconnectDevice(); - streamData(createResponse(WirelessServiceCommandDisconnect)); -} - -void WirelessService::commandScan(const QVariantMap &request) -{ - Q_UNUSED(request) - - if (!m_service) { - qCWarning(dcNetworkManagerBluetoothServer()) << "WirelessService: Could not stream wireless network list. Service not valid"; - return; - } - - QLowEnergyCharacteristic characteristic = m_service->characteristic(wirelessResponseCharacteristicUuid); - if (!characteristic.isValid()) { - qCWarning(dcNetworkManagerBluetoothServer()) << "WirelessService: Wireless response characteristic not valid"; - return; - } - - m_device->scanWirelessNetworks(); - streamData(createResponse(WirelessServiceCommandScan)); -} - -void WirelessService::commandGetCurrentConnection(const QVariantMap &request) -{ - Q_UNUSED(request) - - if (!m_service) { - qCWarning(dcNetworkManagerBluetoothServer()) << "WirelessService: Could not stream wireless network list. Service not valid"; - return; - } - - QLowEnergyCharacteristic characteristic = m_service->characteristic(wirelessResponseCharacteristicUuid); - if (!characteristic.isValid()) { - qCWarning(dcNetworkManagerBluetoothServer()) << "WirelessService: Wireless response characteristic not valid"; - return; - } - - QVariantMap connectionDataMap; - QNetworkInterface wifiInterface = QNetworkInterface::interfaceFromName(m_device->interface()); - if (!m_device->activeAccessPoint() || !wifiInterface.isValid() || wifiInterface.addressEntries().isEmpty()) { - qCDebug(dcNetworkManagerBluetoothServer()) << "There is currently no access active accesspoint"; - connectionDataMap.insert("e", ""); - connectionDataMap.insert("m", ""); - connectionDataMap.insert("s", 0); - connectionDataMap.insert("p", 0); - connectionDataMap.insert("i", ""); - } else { - QHostAddress address; - // Note: for now, we'll just use the first IPv4 address. However, in a future version - // this should somehow pack all addresses, IPv4 and IPv6 ones. - foreach (const QNetworkAddressEntry &entry, wifiInterface.addressEntries()) { - if (entry.ip().protocol() == QAbstractSocket::IPv4Protocol) { - address = entry.ip(); - break; - } - } - qCDebug(dcNetworkManagerBluetoothServer()) << "Current connection:" << m_device->activeAccessPoint() << address.toString(); - connectionDataMap.insert("e", m_device->activeAccessPoint()->ssid()); - connectionDataMap.insert("m", m_device->activeAccessPoint()->macAddress()); - connectionDataMap.insert("s", m_device->activeAccessPoint()->signalStrength()); - connectionDataMap.insert("p", static_cast(m_device->activeAccessPoint()->isProtected())); - connectionDataMap.insert("i", address.toString()); - } - - QVariantMap response = createResponse(WirelessServiceCommandGetCurrentConnection); - response.insert("p", connectionDataMap); - streamData(response); -} - -void WirelessService::commandStartAccessPoint(const QVariantMap &request) -{ - if (!m_service) { - qCWarning(dcNetworkManagerBluetoothServer()) << "WirelessService: Could not start access point. Service is not valid."; - return; - } - - QLowEnergyCharacteristic characteristic = m_service->characteristic(wirelessResponseCharacteristicUuid); - if (!characteristic.isValid()) { - qCWarning(dcNetworkManagerBluetoothServer()) << "WirelessService: Wireless response characteristic not valid"; - return; - } - - if (!request.contains("p")) { - qCWarning(dcNetworkManagerBluetoothServer()) << "WirelessService: Start access point command: Missing parameters."; - streamData(createResponse(WirelessServiceCommandStartAccessPoint, WirelessServiceResponseIvalidParameters)); - return; - } - - QVariantMap parameters = request.value("p").toMap(); - if (!parameters.contains("e")) { - qCWarning(dcNetworkManagerBluetoothServer()) << "WirelessService: Missing ESSID (e) parameter."; - streamData(createResponse(WirelessServiceCommandStartAccessPoint, WirelessServiceResponseIvalidParameters)); - return; - } - - QString essid = parameters.value("e").toString(); - if (essid.length() > 32) { - qCWarning(dcNetworkManagerBluetoothServer()) << "WirelessService: Invalid ESSID (e) parameter."; - streamData(createResponse(WirelessServiceCommandStartAccessPoint, WirelessServiceResponseIvalidParameters)); - return; - } - - if (!parameters.contains("p")) { - qCWarning(dcNetworkManagerBluetoothServer()) << "WirelessService: Missing passkey (p) parameter."; - streamData(createResponse(WirelessServiceCommandStartAccessPoint, WirelessServiceResponseIvalidParameters)); - return; - } - - QString passkey = parameters.value("p").toString(); - if (passkey.length() < 8 || passkey.length() > 64) { - qCWarning(dcNetworkManagerBluetoothServer()) << "WirelessService: Invalid passkey (p) parameter."; - streamData(createResponse(WirelessServiceCommandStartAccessPoint, WirelessServiceResponseIvalidParameters)); - return; - } - - NetworkManager::NetworkManagerError status = m_networkManager->startAccessPoint(m_device->interface(), essid, passkey); - if (status != NetworkManager::NetworkManagerErrorNoError) { - qCWarning(dcNetworkManagerBluetoothServer()) << "Failed to start the access point:" << status; - // FIXME: Add more error codes so that we can actually report this failure to the client - streamData(createResponse(WirelessServiceCommandStartAccessPoint, WirelessServiceResponseUnknownError)); - return; - } - - streamData(createResponse(WirelessServiceCommandStartAccessPoint, WirelessServiceResponseSuccess)); -} - -void WirelessService::characteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &value) -{ - // Command - if (characteristic.uuid() == wirelessCommanderCharacteristicUuid) { - // Check if currently reading - if (m_readingInputData) { - m_inputDataStream.append(value); - } else { - m_inputDataStream.clear(); - m_readingInputData = true; - m_inputDataStream.append(value); - } - - // If command finished - if (value.endsWith('\n')) { - QJsonParseError error; - QJsonDocument jsonDocument = QJsonDocument::fromJson(m_inputDataStream, &error); - if (error.error != QJsonParseError::NoError) { - qCWarning(dcNetworkManagerBluetoothServer()) << "Got invalid json object" << m_inputDataStream; - m_inputDataStream.clear(); - m_readingInputData = false; - return; - } - - qCDebug(dcNetworkManagerBluetoothServer()) << "Got command stream" << jsonDocument.toJson(); - - processCommand(jsonDocument.toVariant().toMap()); - - m_inputDataStream.clear(); - m_readingInputData = false; - } - - // Limit possible data stream to prevent overflow - if (m_inputDataStream.length() >= 20 * 1024) { - m_inputDataStream.clear(); - m_readingInputData = false; - return; - } - } -} - -void WirelessService::characteristicRead(const QLowEnergyCharacteristic &characteristic, const QByteArray &value) -{ - qCDebug(dcNetworkManagerBluetoothServer()) << "WirelessService: Characteristic read" << characteristic.uuid().toString() << value; -} - -void WirelessService::characteristicWritten(const QLowEnergyCharacteristic &characteristic, const QByteArray &value) -{ - qCDebug(dcNetworkManagerBluetoothServer()) << "WirelessService: Characteristic written" << characteristic.uuid().toString() << value; -} - -void WirelessService::descriptorRead(const QLowEnergyDescriptor &descriptor, const QByteArray &value) -{ - qCDebug(dcNetworkManagerBluetoothServer()) << "WirelessService: Descriptor read" << descriptor.uuid().toString() << value; -} - -void WirelessService::descriptorWritten(const QLowEnergyDescriptor &descriptor, const QByteArray &value) -{ - qCDebug(dcNetworkManagerBluetoothServer()) << "WirelessService: Descriptor written" << descriptor.uuid().toString() << value; -} - -void WirelessService::serviceError(const QLowEnergyService::ServiceError &error) -{ - QString errorString; - switch (error) { - case QLowEnergyService::NoError: - errorString = "No error"; - break; - case QLowEnergyService::OperationError: - errorString = "Operation error"; - break; - case QLowEnergyService::CharacteristicReadError: - errorString = "Characteristic read error"; - break; - case QLowEnergyService::CharacteristicWriteError: - errorString = "Characteristic write error"; - break; - case QLowEnergyService::DescriptorReadError: - errorString = "Descriptor read error"; - break; - case QLowEnergyService::DescriptorWriteError: - errorString = "Descriptor write error"; - break; - case QLowEnergyService::UnknownError: - errorString = "Unknown error"; - break; - } - - qCWarning(dcNetworkManagerBluetoothServer()) << "WirelessService: Error:" << errorString; -} - -void WirelessService::processCommand(const QVariantMap &request) -{ - if (!request.contains("c")) { - qCWarning(dcNetworkManagerBluetoothServer()) << "Invalid request. Command value missing."; - streamData(createResponse(WirelessServiceCommandConnect, WirelessServiceResponseIvalidCommand)); - return; - } - - bool commandIntOk; - int command = request.value("c").toInt(&commandIntOk); - if (!commandIntOk) { - qCWarning(dcNetworkManagerBluetoothServer()) << "Invalid request. Could not convert method to interger."; - streamData(createResponse(WirelessServiceCommandConnect, WirelessServiceResponseIvalidCommand)); - return; - } - - // Check wireless errors - WirelessServiceResponse responseCode = checkWirelessErrors(); - if (responseCode != WirelessServiceResponseSuccess) { - streamData(createResponse(static_cast(command), responseCode)); - return; - } - - // Process method - qCDebug(dcNetworkManagerBluetoothServer()) << "Received command" << static_cast(command); - switch (command) { - case WirelessServiceCommandGetNetworks: - commandGetNetworks(request); - break; - case WirelessServiceCommandConnect: - commandConnect(request); - break; - case WirelessServiceCommandConnectHidden: - commandConnectHidden(request); - break; - case WirelessServiceCommandDisconnect: - commandDisconnect(request); - break; - case WirelessServiceCommandScan: - commandScan(request); - break; - case WirelessServiceCommandGetCurrentConnection: - commandGetCurrentConnection(request); - break; - case WirelessServiceCommandStartAccessPoint: - commandStartAccessPoint(request); - break; - default: - qCWarning(dcNetworkManagerBluetoothServer()) << "Invalid request. Unknown command" << command; - streamData(createResponse(WirelessServiceCommandConnect, WirelessServiceResponseIvalidCommand)); - break; - } -} - -void WirelessService::onWirelessDeviceBitRateChanged(const int &bitRate) -{ - Q_UNUSED(bitRate) -} - -void WirelessService::onWirelessDeviceStateChanged(const NetworkDevice::NetworkDeviceState &state) -{ - qCDebug(dcNetworkManagerBluetoothServer()) << "WirelessService: Wireless network device state changed" << state; - - if (!m_service) { - qCWarning(dcNetworkManagerBluetoothServer()) << "WirelessService: Could not update wireless network device state. Service not valid"; - return; - } - - QLowEnergyCharacteristic characteristic = m_service->characteristic(wirelessStateCharacteristicUuid); - if (!characteristic.isValid()) { - qCWarning(dcNetworkManagerBluetoothServer()) << "WirelessService: Could not update wireless network device state. Characteristic not valid"; - return; - } - - m_service->writeCharacteristic(characteristic, WirelessService::getWirelessNetworkDeviceState(state)); -} - -void WirelessService::onWirelessModeChanged(WirelessNetworkDevice::WirelessMode mode) -{ - if (!m_service) { - qCWarning(dcNetworkManagerBluetoothServer()) << "WirelessService: Could not update wireless device mode. Service not valid"; - return; - } - - QLowEnergyCharacteristic characteristic = m_service->characteristic(wirelessModeCharacteristicUuid); - if (!characteristic.isValid()) { - qCWarning(dcNetworkManagerBluetoothServer()) << "WirelessService: Could not update wireless device mode. Characteristic not valid"; - return; - } - - qCDebug(dcNetworkManagerBluetoothServer()) << "WirelessService: Notify wireless mode changed" << WirelessService::getWirelessMode(mode); - m_service->writeCharacteristic(characteristic, WirelessService::getWirelessMode(mode)); -} diff --git a/libnymea-networkmanager/bluetooth/wirelessservice.h b/libnymea-networkmanager/bluetooth/wirelessservice.h deleted file mode 100644 index f879034..0000000 --- a/libnymea-networkmanager/bluetooth/wirelessservice.h +++ /dev/null @@ -1,123 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* -* Copyright 2013 - 2020, nymea GmbH -* Contact: contact@nymea.io -* -* This file is part of nymea. -* This project including source code and documentation is protected by -* copyright law, and remains the property of nymea GmbH. All rights, including -* reproduction, publication, editing and translation, are reserved. The use of -* this project is subject to the terms of a license agreement to be concluded -* with nymea GmbH in accordance with the terms of use of nymea GmbH, available -* under https://nymea.io/license -* -* GNU Lesser General Public License Usage -* Alternatively, this project may be redistributed and/or modified under the -* terms of the GNU Lesser General Public License as published by the Free -* Software Foundation; version 3. This project is distributed in the hope that -* it will be useful, but WITHOUT ANY WARRANTY; without even the implied -* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License -* along with this project. If not, see . -* -* For any further details and any questions please contact us under -* contact@nymea.io or see our FAQ/Licensing Information on -* https://nymea.io/license/faq -* -* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#ifndef WIRELESSSERVICE_H -#define WIRELESSSERVICE_H - -#include -#include -#include -#include - -#include "../networkmanager.h" -#include "../wirelessaccesspoint.h" -#include "../wirelessnetworkdevice.h" - -class WirelessService : public QObject -{ - Q_OBJECT - -public: - enum WirelessServiceCommand { - WirelessServiceCommandInvalid = -1, - WirelessServiceCommandGetNetworks = 0x00, - WirelessServiceCommandConnect = 0x01, - WirelessServiceCommandConnectHidden = 0x02, - WirelessServiceCommandDisconnect = 0x03, - WirelessServiceCommandScan = 0x04, - WirelessServiceCommandGetCurrentConnection = 0x05, - WirelessServiceCommandStartAccessPoint = 0x06 - }; - Q_ENUM(WirelessServiceCommand) - - enum WirelessServiceResponse { - WirelessServiceResponseSuccess = 0x00, - WirelessServiceResponseIvalidCommand = 0x01, - WirelessServiceResponseIvalidParameters = 0x02, - WirelessServiceResponseNetworkManagerNotAvailable = 0x03, - WirelessServiceResponseWirelessNotAvailable = 0x04, - WirelessServiceResponseWirelessNotEnabled = 0x05, - WirelessServiceResponseNetworkingNotEnabled = 0x06, - WirelessServiceResponseUnknownError = 0x07 - }; - Q_ENUM(WirelessServiceResponse) - - explicit WirelessService(QLowEnergyService *service, NetworkManager *networkManager, QObject *parent = nullptr); - QLowEnergyService *service(); - - static QLowEnergyServiceData serviceData(NetworkManager *networkManager); - -private: - QLowEnergyService *m_service = nullptr; - NetworkManager *m_networkManager = nullptr; - WirelessNetworkDevice *m_device = nullptr; - - bool m_readingInputData = false; - QByteArray m_inputDataStream; - - WirelessServiceResponse checkWirelessErrors(); - - // Note: static to be available in serviceData - static QByteArray getWirelessNetworkDeviceState(const NetworkDevice::NetworkDeviceState &state); - static QByteArray getWirelessMode(WirelessNetworkDevice::WirelessMode mode); - - void streamData(const QVariantMap &responseMap); - - QVariantMap createResponse(const WirelessServiceCommand &command, const WirelessServiceResponse &responseCode = WirelessServiceResponseSuccess); - - // Methods - void commandGetNetworks(const QVariantMap &request); - void commandConnect(const QVariantMap &request); - void commandConnectHidden(const QVariantMap &request); - void commandDisconnect(const QVariantMap &request); - void commandScan(const QVariantMap &request); - void commandGetCurrentConnection(const QVariantMap &request); - void commandStartAccessPoint(const QVariantMap &request); - -private slots: - // Service - void characteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &value); - void characteristicRead(const QLowEnergyCharacteristic &characteristic, const QByteArray &value); - void characteristicWritten(const QLowEnergyCharacteristic &characteristic, const QByteArray &value); - void descriptorRead(const QLowEnergyDescriptor &descriptor, const QByteArray &value); - void descriptorWritten(const QLowEnergyDescriptor &descriptor, const QByteArray &value); - void serviceError(const QLowEnergyService::ServiceError &error); - - // Commands - void processCommand(const QVariantMap &request); - - // Wireless network device - void onWirelessDeviceBitRateChanged(const int &bitRate); - void onWirelessDeviceStateChanged(const NetworkDevice::NetworkDeviceState &state); - void onWirelessModeChanged(WirelessNetworkDevice::WirelessMode mode); - -}; - -#endif // WIRELESSSERVICE_H diff --git a/libnymea-networkmanager/libnymea-networkmanager.pro b/libnymea-networkmanager/libnymea-networkmanager.pro index 3463fe6..11a5992 100644 --- a/libnymea-networkmanager/libnymea-networkmanager.pro +++ b/libnymea-networkmanager/libnymea-networkmanager.pro @@ -28,24 +28,6 @@ SOURCES += \ wirelessnetworkdevice.cpp \ networkmanagerutils.cpp -equals(QT_MAJOR_VERSION, 5):!lessThan(QT_MINOR_VERSION, 7) { - message(Building with Bluetooth LE server functionality. Qt $${QT_VERSION}.) - - QT += bluetooth - - HEADERS += \ - bluetooth/bluetoothserver.h \ - bluetooth/bluetoothuuids.h \ - bluetooth/networkservice.h \ - bluetooth/wirelessservice.h \ - - SOURCES += \ - bluetooth/bluetoothserver.cpp \ - bluetooth/networkservice.cpp \ - bluetooth/wirelessservice.cpp \ -} else { - message(Bluetooth LE server functionality not supported with Qt $${QT_VERSION}.) -} target.path = $$[QT_INSTALL_LIBS] INSTALLS += target