From c293474fd45755d995c9131f931b8b97c6cc3c56 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Tue, 12 Jan 2021 00:04:19 +0100 Subject: [PATCH] Fix the UI --- libnymea-app/libnymea-app-core.h | 3 - libnymea-app/libnymea-app.pri | 4 - libnymea-app/wifisetup/btwifisetup.cpp | 138 ++- libnymea-app/wifisetup/btwifisetup.h | 14 +- .../wifisetup/networkmanagercontroller.cpp | 78 -- .../wifisetup/networkmanagercontroller.h | 68 -- .../wifisetup/wirelesssetupmanager.cpp | 1028 ----------------- libnymea-app/wifisetup/wirelesssetupmanager.h | 275 ----- nymea-app/ui/Nymea.qml | 4 +- nymea-app/ui/RootItem.qml | 12 +- nymea-app/ui/appsettings/CloudLoginPage.qml | 2 +- nymea-app/ui/connection/ConnectPage.qml | 12 +- nymea-app/ui/connection/ManualConnectPage.qml | 2 +- .../wifisetup/BluetoothDiscoveryPage.qml | 65 +- .../ui/connection/wifisetup/BoxInfoPage.qml | 12 +- .../connection/wifisetup/ConnectWiFiPage.qml | 32 +- .../wifisetup/NetworkSettingsPage.qml | 14 +- .../wifisetup/WirelessSetupPage.qml | 41 +- 18 files changed, 232 insertions(+), 1572 deletions(-) delete mode 100644 libnymea-app/wifisetup/networkmanagercontroller.cpp delete mode 100644 libnymea-app/wifisetup/networkmanagercontroller.h delete mode 100644 libnymea-app/wifisetup/wirelesssetupmanager.cpp delete mode 100644 libnymea-app/wifisetup/wirelesssetupmanager.h diff --git a/libnymea-app/libnymea-app-core.h b/libnymea-app/libnymea-app-core.h index 89a9edd9..2d539388 100644 --- a/libnymea-app/libnymea-app-core.h +++ b/libnymea-app/libnymea-app-core.h @@ -74,7 +74,6 @@ #include "configuration/mqttpolicy.h" #include "configuration/mqttpolicies.h" #include "wifisetup/btwifisetup.h" -#include "wifisetup/networkmanagercontroller.h" #include "types/wirelessaccesspoint.h" #include "types/wirelessaccesspoints.h" #include "models/wirelessaccesspointsproxy.h" @@ -272,11 +271,9 @@ void registerQmlTypes() { qmlRegisterType(uri, 1, 0, "TagListProxyModel"); qmlRegisterType(uri, 1, 0, "BtWiFiSetup"); - qmlRegisterType(uri, 1, 0, "NetworkManagerController"); qmlRegisterType(uri, 1, 0, "BluetoothDiscovery"); qmlRegisterUncreatableType(uri, 1, 0, "BluetoothDeviceInfo", "Can't create this in QML. Get it from the DeviceInfos."); qmlRegisterUncreatableType(uri, 1, 0, "BluetoothDeviceInfos", "Can't create this in QML. Get it from the BluetoothDiscovery."); - qmlRegisterUncreatableType(uri, 1, 0, "WirelessSetupManager", "Can't create this in QML. Get it from the NetworkManagerControler."); qmlRegisterUncreatableType(uri, 1, 0, "WirelessAccessPoint", "Can't create this in QML. Get it from the WirelessAccessPoints."); qmlRegisterUncreatableType(uri, 1, 0, "WirelessAccessPoints", "Can't create this in QML. Get it from the Engine instance."); qmlRegisterType(uri, 1, 0, "WirelessAccessPointsProxy"); diff --git a/libnymea-app/libnymea-app.pri b/libnymea-app/libnymea-app.pri index d3a0f5cf..7f82e210 100644 --- a/libnymea-app/libnymea-app.pri +++ b/libnymea-app/libnymea-app.pri @@ -134,8 +134,6 @@ SOURCES += \ $${PWD}/wifisetup/bluetoothdeviceinfo.cpp \ $${PWD}/wifisetup/bluetoothdeviceinfos.cpp \ $${PWD}/wifisetup/bluetoothdiscovery.cpp \ - $${PWD}/wifisetup/wirelesssetupmanager.cpp \ - $${PWD}/wifisetup/networkmanagercontroller.cpp \ $${PWD}/models/logsmodelng.cpp \ $${PWD}/models/interfacesproxy.cpp \ $${PWD}/models/tagsproxymodel.cpp \ @@ -281,8 +279,6 @@ HEADERS += \ $${PWD}/wifisetup/bluetoothdeviceinfo.h \ $${PWD}/wifisetup/bluetoothdeviceinfos.h \ $${PWD}/wifisetup/bluetoothdiscovery.h \ - $${PWD}/wifisetup/wirelesssetupmanager.h \ - $${PWD}/wifisetup/networkmanagercontroller.h \ $${PWD}/libnymea-app-core.h \ $${PWD}/models/logsmodelng.h \ $${PWD}/models/interfacesproxy.h \ diff --git a/libnymea-app/wifisetup/btwifisetup.cpp b/libnymea-app/wifisetup/btwifisetup.cpp index c04837c8..849b8a65 100644 --- a/libnymea-app/wifisetup/btwifisetup.cpp +++ b/libnymea-app/wifisetup/btwifisetup.cpp @@ -9,6 +9,7 @@ static QBluetoothUuid wifiServiceUuid = QBluetoothUuid(QUuid("e0 static QBluetoothUuid wifiCommanderCharacteristicUuid = QBluetoothUuid(QUuid("e081fec1-f757-4449-b9c9-bfa83133f7fc")); static QBluetoothUuid wifiResponseCharacteristicUuid = QBluetoothUuid(QUuid("e081fec2-f757-4449-b9c9-bfa83133f7fc")); static QBluetoothUuid wifiStatusCharacteristicUuid = QBluetoothUuid(QUuid("e081fec3-f757-4449-b9c9-bfa83133f7fc")); +static QBluetoothUuid wifiModeCharacteristicUuid = QBluetoothUuid(QUuid("e081fec4-f757-4449-b9c9-bfa83133f7fc")); static QBluetoothUuid networkServiceUuid = QBluetoothUuid(QUuid("ef6d6610-b8af-49e0-9eca-ab343513641c")); static QBluetoothUuid networkStatusCharacteristicUuid = QBluetoothUuid(QUuid("ef6d6611-b8af-49e0-9eca-ab343513641c")); @@ -32,6 +33,9 @@ void BtWiFiSetup::connectToDevice(const BluetoothDeviceInfo *device) qDebug() << "device" << device; if (m_btController) { delete m_btController; + m_currentConnection = nullptr; + currentConnectionChanged(); + m_accessPoints->clearModel(); m_status = StatusDisconnected; emit statusChanged(m_status); @@ -47,6 +51,11 @@ void BtWiFiSetup::connectToDevice(const BluetoothDeviceInfo *device) qDebug() << "Bluetooth disconnected"; m_status = StatusDisconnected; emit statusChanged(m_status); + m_btController->deleteLater(); + m_btController = nullptr; + m_currentConnection = nullptr; + emit currentConnectionChanged(); + m_accessPoints->clearModel(); }); typedef void (QLowEnergyController::*errorsSignal)(QLowEnergyController::Error); @@ -69,8 +78,6 @@ void BtWiFiSetup::disconnectFromDevice() { if (m_btController) { m_btController->disconnectFromDevice(); - m_btController->deleteLater(); - m_btController = nullptr; } } @@ -86,7 +93,39 @@ void BtWiFiSetup::connectDeviceToWiFi(const QString &ssid, const QString &passwo parameters.insert("e", ssid); parameters.insert("p", password); request.insert("p", parameters); - streamData(request); + streamData(m_wifiService, wifiCommanderCharacteristicUuid, request); +} + +void BtWiFiSetup::disconnectDeviceFromWiFi() +{ + if (m_status != StatusConnectedToWiFi) { + qWarning() << "Cannot disconnect from wifi in state" << m_status; + } + QLowEnergyCharacteristic ssidCharacteristic = m_wifiService->characteristic(wifiCommanderCharacteristicUuid); + QVariantMap request; + request.insert("c", (int)WirelessServiceCommandDisconnect); + streamData(m_wifiService, wifiCommanderCharacteristicUuid, request); +} + +void BtWiFiSetup::scanWiFi() +{ + QLowEnergyCharacteristic characteristic = m_wifiService->characteristic(wifiCommanderCharacteristicUuid); + QVariantMap request; + request.insert("c", (int)WirelessServiceCommandScan); + streamData(m_wifiService, wifiCommanderCharacteristicUuid, request); +} + +void BtWiFiSetup::pressPushButton() +{ + if (!m_systemService) { + qDebug() << "System service not available. Cannot perform push button pairing"; + return; + } + QLowEnergyCharacteristic commanderCharacteristic = m_systemService->characteristic(systemCommanderCharacteristicUuid); + QVariantMap request; + request.insert("c", (int)SystemServiceCommandPushAuthentication); + + streamData(m_systemService, systemCommanderCharacteristicUuid, request); } BtWiFiSetup::Status BtWiFiSetup::status() const @@ -134,11 +173,23 @@ bool BtWiFiSetup::networkingEnabled() const return m_networkingEnabled; } +void BtWiFiSetup::setNetworkingEnabled(bool networkingEnabled) +{ + QLowEnergyCharacteristic characteristic = m_networkService->characteristic(networkCommanderCharacteristicUuid); + m_networkService->writeCharacteristic(characteristic, networkingEnabled ? QByteArray::fromHex("00") : QByteArray::fromHex("01")); +} + bool BtWiFiSetup::wirelessEnabled() const { return m_wirelessEnabled; } +void BtWiFiSetup::setWirelessEnabled(bool wirelessEnabled) const +{ + QLowEnergyCharacteristic characteristic = m_networkService->characteristic(networkCommanderCharacteristicUuid); + m_networkService->writeCharacteristic(characteristic, wirelessEnabled ? QByteArray::fromHex("02") : QByteArray::fromHex("03")); +} + WirelessAccessPoints *BtWiFiSetup::accessPoints() const { return m_accessPoints; @@ -151,6 +202,7 @@ WirelessAccessPoint *BtWiFiSetup::currentConnection() const void BtWiFiSetup::setupServices() { + qDebug() << "Setting up services"; m_deviceInformationService = m_btController->createServiceObject(QBluetoothUuid::DeviceInformation, m_btController); m_networkService = m_btController->createServiceObject(networkServiceUuid, m_btController); m_wifiService = m_btController->createServiceObject(wifiServiceUuid, m_btController); @@ -223,6 +275,7 @@ void BtWiFiSetup::setupServices() m_wifiService->writeDescriptor(m_wifiService->characteristic(wifiResponseCharacteristicUuid).descriptor(QBluetoothUuid::ClientCharacteristicConfiguration), QByteArray::fromHex("0100")); m_wifiService->writeDescriptor(m_wifiService->characteristic(wifiStatusCharacteristicUuid).descriptor(QBluetoothUuid::ClientCharacteristicConfiguration), QByteArray::fromHex("0100")); + qDebug() << "Fetching networks after init"; loadNetworks(); }); connect(m_wifiService, &QLowEnergyService::characteristicChanged, this, &BtWiFiSetup::characteristicChanged); @@ -236,22 +289,15 @@ void BtWiFiSetup::setupServices() return; qDebug() << "System service discovered"; m_systemService->writeDescriptor(m_systemService->characteristic(systemResponseCharacteristicUuid).descriptor(QBluetoothUuid::ClientCharacteristicConfiguration), QByteArray::fromHex("0100")); - }); m_systemService->discoverDetails(); } } -void BtWiFiSetup::streamData(const QVariantMap &request) +void BtWiFiSetup::streamData(QLowEnergyService *service, const QUuid &characteristicUuid, const QVariantMap &request) { - QLowEnergyCharacteristic characteristic = m_wifiService->characteristic(wifiCommanderCharacteristicUuid); - if (!characteristic.isValid()) { - qWarning() << "WifiSetupManager: WirelessService: Wireless commander characteristic not valid"; - return; - } - + QLowEnergyCharacteristic characteristic = service->characteristic(characteristicUuid); QByteArray data = QJsonDocument::fromVariant(request).toJson(QJsonDocument::Compact) + '\n'; - qDebug() << "WifiSetupManager: WirelessService: Start streaming response data:" << data.count() << "bytes"; int sentDataLength = 0; QByteArray remainingData = data; @@ -261,8 +307,6 @@ void BtWiFiSetup::streamData(const QVariantMap &request) m_wifiService->writeCharacteristic(characteristic, package); remainingData = remainingData.remove(0, package.count()); } - - qDebug() << "WifiSetupManager: WirelessService: Finished streaming request data"; } void BtWiFiSetup::processWiFiPacket(const QVariantMap &data) @@ -278,11 +322,19 @@ void BtWiFiSetup::processWiFiPacket(const QVariantMap &data) switch (command) { case WirelessServiceCommandGetNetworks: - m_accessPoints->clearModel(); - foreach (const QVariant &data, data.value("p").toList()) { - WirelessAccessPoint *accessPoint = new WirelessAccessPoint(this); + bool found = false; + for (int i = 0; i < m_accessPoints->rowCount(); i++) { + WirelessAccessPoint *existingAp = m_accessPoints->get(i); + if (existingAp->macAddress() == data.toMap().value("m").toString()) { + found = true; + } + } + if (found) { + continue; + } + WirelessAccessPoint *accessPoint = new WirelessAccessPoint(this); accessPoint->setSsid(data.toMap().value("e").toString()); accessPoint->setMacAddress(data.toMap().value("m").toString()); accessPoint->setSignalStrength(data.toMap().value("s").toInt()); @@ -296,6 +348,29 @@ void BtWiFiSetup::processWiFiPacket(const QVariantMap &data) m_status = StatusConnectingToWiFi; emit statusChanged(m_status); break; + case WirelessServiceCommandGetCurrentConnection: + // Find current network + m_currentConnection = nullptr; + foreach (WirelessAccessPoint *accessPoint, m_accessPoints->wirelessAccessPoints()) { + QVariantMap currentConnection = data.value("p").toMap(); + QString macAddress = currentConnection.value("m").toString(); + if (accessPoint->macAddress() == macAddress) { + // Set the current network + m_currentConnection = accessPoint; + accessPoint->setHostAddress(currentConnection.value("i").toString()); + } + } + qDebug() << "current connection is:" << m_currentConnection; + emit currentConnectionChanged(); + break; + case WirelessServiceCommandScan: + if (responseCode == WirelessServiceResponseSuccess) { + qDebug() << "Fetching networks after wifi scan"; + loadNetworks(); + } + break; + default: + qWarning() << "Unhandled command reply"; } } @@ -303,28 +378,29 @@ void BtWiFiSetup::loadNetworks() { QVariantMap request; request.insert("c", (int)WirelessServiceCommandGetNetworks); - streamData(request); + streamData(m_wifiService, wifiCommanderCharacteristicUuid, request); } void BtWiFiSetup::loadCurrentConnection() { QVariantMap request; request.insert("c", (int)WirelessServiceCommandGetCurrentConnection); - streamData(request); + streamData(m_wifiService, wifiCommanderCharacteristicUuid, request); } -void BtWiFiSetup::characteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &data) +void BtWiFiSetup::characteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &value) { if (characteristic.uuid() == wifiResponseCharacteristicUuid) { - m_inputBuffers[characteristic.uuid()].append(data); + + m_inputBuffers[characteristic.uuid()].append(value); if (!m_inputBuffers[characteristic.uuid()].endsWith("\n")) { return; } QByteArray data = m_inputBuffers.take(characteristic.uuid()); QJsonParseError error; - QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error); + QJsonDocument jsonDoc = QJsonDocument::fromJson(data.trimmed(), &error); if (error.error != QJsonParseError::NoError) { - qWarning() << "Invalid json data received:" << error.errorString() << data << "from characteristic:" << characteristic.uuid(); + qWarning() << "Invalid json data received:" << error.errorString() << data.trimmed() << "from characteristic:" << characteristic.uuid(); m_btController->disconnectFromDevice(); return; } @@ -332,7 +408,7 @@ void BtWiFiSetup::characteristicChanged(const QLowEnergyCharacteristic &characte } else if (characteristic.uuid() == wifiStatusCharacteristicUuid) { - m_wirelessStatus = static_cast(data.toHex().toInt(nullptr, 16)); + m_wirelessStatus = static_cast(value.toHex().toInt(nullptr, 16)); qDebug() << "Wireless status changed" << m_wirelessStatus; emit wirelessStatusChanged(); @@ -342,8 +418,14 @@ void BtWiFiSetup::characteristicChanged(const QLowEnergyCharacteristic &characte loadCurrentConnection(); } + // Note: wirelessEnabled characterristic seems broken server-side. Let's check the wifiStatus for it being enabled or not + if (m_wirelessEnabled != (m_wirelessStatus != WirelessStatusUnavailable)) { + m_wirelessEnabled = m_wirelessStatus != WirelessStatusUnavailable; + emit wirelessEnabledChanged(); + } + } else if (characteristic.uuid() == networkStatusCharacteristicUuid) { - m_networkStatus = static_cast(data.toHex().toInt(nullptr, 16)); + m_networkStatus = static_cast(value.toHex().toInt(nullptr, 16)); qDebug() << "Network status changed:" << m_networkStatus; if (m_networkStatus == NetworkStatusGlobal) { m_status = StatusConnectedToWiFi; @@ -352,6 +434,12 @@ void BtWiFiSetup::characteristicChanged(const QLowEnergyCharacteristic &characte loadCurrentConnection(); } + // Note: networkingEnabled characterristic seems broken server-side. Let's check the networkStatus for it being enabled or not + if (m_wirelessEnabled != (m_networkStatus != NetworkStatusAsleep)) { + m_networkingEnabled = m_networkStatus != NetworkStatusAsleep; + emit wirelessEnabledChanged(); + } + } else { qWarning() << "Unhandled packet from characteristic" << characteristic.uuid(); } diff --git a/libnymea-app/wifisetup/btwifisetup.h b/libnymea-app/wifisetup/btwifisetup.h index c7fa8607..49b8f778 100644 --- a/libnymea-app/wifisetup/btwifisetup.h +++ b/libnymea-app/wifisetup/btwifisetup.h @@ -22,8 +22,8 @@ class BtWiFiSetup : public QObject Q_PROPERTY(NetworkStatus networkStatus READ networkStatus NOTIFY networkStatusChanged) Q_PROPERTY(WirelessStatus wirelessStatus READ wirelessStatus NOTIFY wirelessStatusChanged) - Q_PROPERTY(bool networkingEnabled READ networkingEnabled NOTIFY networkingEnabledChanged) - Q_PROPERTY(bool wirelessEnabled READ wirelessEnabled NOTIFY wirelessEnabledChanged) + Q_PROPERTY(bool networkingEnabled READ networkingEnabled WRITE setNetworkingEnabled NOTIFY networkingEnabledChanged) + Q_PROPERTY(bool wirelessEnabled READ wirelessEnabled WRITE setWirelessEnabled NOTIFY wirelessEnabledChanged) Q_PROPERTY(WirelessAccessPoints *accessPoints READ accessPoints CONSTANT) Q_PROPERTY(WirelessAccessPoint *currentConnection READ currentConnection NOTIFY currentConnectionChanged) @@ -128,6 +128,9 @@ public: Q_INVOKABLE void connectToDevice(const BluetoothDeviceInfo *device); Q_INVOKABLE void disconnectFromDevice(); Q_INVOKABLE void connectDeviceToWiFi(const QString &ssid, const QString &password); + Q_INVOKABLE void disconnectDeviceFromWiFi(); + Q_INVOKABLE void scanWiFi(); + Q_INVOKABLE void pressPushButton(); Status status() const; @@ -140,7 +143,10 @@ public: NetworkStatus networkStatus() const; WirelessStatus wirelessStatus() const; bool networkingEnabled() const; + void setNetworkingEnabled(bool networkingEnabled); + bool wirelessEnabled() const; + void setWirelessEnabled(bool wirelessEnabled) const; WirelessAccessPoints *accessPoints() const; WirelessAccessPoint *currentConnection() const; @@ -165,14 +171,14 @@ signals: private: void setupServices(); - void streamData(const QVariantMap &request); + void streamData(QLowEnergyService *service, const QUuid &characteristicUuid, const QVariantMap &request); void processWiFiPacket(const QVariantMap &data); void loadNetworks(); void loadCurrentConnection(); private slots: - void characteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &data); + void characteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &value); private: Status m_status = StatusDisconnected; diff --git a/libnymea-app/wifisetup/networkmanagercontroller.cpp b/libnymea-app/wifisetup/networkmanagercontroller.cpp deleted file mode 100644 index 9e2943dd..00000000 --- a/libnymea-app/wifisetup/networkmanagercontroller.cpp +++ /dev/null @@ -1,78 +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 General Public License Usage -* Alternatively, this project may be redistributed and/or modified under the -* terms of the GNU General Public License as published by the Free Software -* Foundation, GNU 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 General -* Public License for more details. -* -* You should have received a copy of the GNU 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 -* -* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#include "networkmanagercontroller.h" - -NetworkManagerController::NetworkManagerController(QObject *parent) : QObject(parent) -{ - -} - -BluetoothDeviceInfo *NetworkManagerController::bluetoothDeviceInfo() const -{ - return m_bluetoothDeviceInfo; -} - -void NetworkManagerController::setBluetoothDeviceInfo(BluetoothDeviceInfo *bluetoothDeviceInfo) -{ - if (m_bluetoothDeviceInfo != bluetoothDeviceInfo) { - m_bluetoothDeviceInfo = bluetoothDeviceInfo; - emit bluetoothDeviceInfoChanged(); - } -} - -WirelessSetupManager *NetworkManagerController::manager() -{ - return m_wirelessSetupManager; -} - -void NetworkManagerController::connectDevice() -{ - if (!m_bluetoothDeviceInfo) { - qWarning() << "Can't connect to device. bluetoothDeviceInfo not set."; - return; - } - - if (m_wirelessSetupManager) { - delete m_wirelessSetupManager; - m_wirelessSetupManager = nullptr; - emit managerChanged(); - } - - if (!m_bluetoothDeviceInfo) { - qDebug() << "Could not connect to device. There is no device info for" << m_bluetoothDeviceInfo->name() << m_bluetoothDeviceInfo->address(); - return; - } - - m_wirelessSetupManager = new WirelessSetupManager(m_bluetoothDeviceInfo->bluetoothDeviceInfo(), this); - emit managerChanged(); - - m_wirelessSetupManager->connectDevice(); -} diff --git a/libnymea-app/wifisetup/networkmanagercontroller.h b/libnymea-app/wifisetup/networkmanagercontroller.h deleted file mode 100644 index 3889a2eb..00000000 --- a/libnymea-app/wifisetup/networkmanagercontroller.h +++ /dev/null @@ -1,68 +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 General Public License Usage -* Alternatively, this project may be redistributed and/or modified under the -* terms of the GNU General Public License as published by the Free Software -* Foundation, GNU 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 General -* Public License for more details. -* -* You should have received a copy of the GNU 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 NETWORKMANAGERCONTROLLER_H -#define NETWORKMANAGERCONTROLLER_H - -#include -#include - -#include "bluetoothdeviceinfo.h" -#include "wirelesssetupmanager.h" - -class NetworkManagerController : public QObject -{ - Q_OBJECT - Q_PROPERTY(BluetoothDeviceInfo* bluetoothDeviceInfo READ bluetoothDeviceInfo WRITE setBluetoothDeviceInfo) - Q_PROPERTY(WirelessSetupManager *manager READ manager NOTIFY managerChanged) - -public: - explicit NetworkManagerController(QObject *parent = nullptr); - - BluetoothDeviceInfo* bluetoothDeviceInfo() const; - void setBluetoothDeviceInfo(BluetoothDeviceInfo* bluetoothDeviceInfo); - - WirelessSetupManager *manager(); - - Q_INVOKABLE void connectDevice(); - -private: - BluetoothDeviceInfo* m_bluetoothDeviceInfo = nullptr; - - WirelessSetupManager *m_wirelessSetupManager = nullptr; - -signals: - void managerChanged(); - void nameChanged(); - void bluetoothDeviceInfoChanged(); - -}; - -#endif // NETWORKMANAGERCONTROLLER_H diff --git a/libnymea-app/wifisetup/wirelesssetupmanager.cpp b/libnymea-app/wifisetup/wirelesssetupmanager.cpp deleted file mode 100644 index 514b9d4f..00000000 --- a/libnymea-app/wifisetup/wirelesssetupmanager.cpp +++ /dev/null @@ -1,1028 +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 General Public License Usage -* Alternatively, this project may be redistributed and/or modified under the -* terms of the GNU General Public License as published by the Free Software -* Foundation, GNU 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 General -* Public License for more details. -* -* You should have received a copy of the GNU 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 -* -* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#include "wirelesssetupmanager.h" -#include "types/wirelessaccesspoint.h" -#include "types/wirelessaccesspoints.h" -#include "models/wirelessaccesspointsproxy.h" - -#include - -static QBluetoothUuid wifiServiceUuid = QBluetoothUuid(QUuid("e081fec0-f757-4449-b9c9-bfa83133f7fc")); -static QBluetoothUuid wifiCommanderCharacteristicUuid = QBluetoothUuid(QUuid("e081fec1-f757-4449-b9c9-bfa83133f7fc")); -static QBluetoothUuid wifiResponseCharacteristicUuid = QBluetoothUuid(QUuid("e081fec2-f757-4449-b9c9-bfa83133f7fc")); -static QBluetoothUuid wifiStatusCharacteristicUuid = QBluetoothUuid(QUuid("e081fec3-f757-4449-b9c9-bfa83133f7fc")); - -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 systemServiceUuid = QBluetoothUuid(QUuid("e081fed0-f757-4449-b9c9-bfa83133f7fc")); -static QBluetoothUuid systemCommanderCharacteristicUuid = QBluetoothUuid(QUuid("e081fed1-f757-4449-b9c9-bfa83133f7fc")); -static QBluetoothUuid systemResponseCharacteristicUuid = QBluetoothUuid(QUuid("e081fed2-f757-4449-b9c9-bfa83133f7fc")); - - -WirelessSetupManager::WirelessSetupManager(const QBluetoothDeviceInfo &deviceInfo, QObject *parent) : - BluetoothDevice(deviceInfo, parent), - m_accessPoints(new WirelessAccessPoints(this)) -{ - connect(this, &WirelessSetupManager::connectedChanged, this, &WirelessSetupManager::onConnectedChanged); - connect(this, &WirelessSetupManager::serviceDiscoveryFinished, this, &WirelessSetupManager::onServiceDiscoveryFinished); -} - -QString WirelessSetupManager::modelNumber() const -{ - return m_modelNumber; -} - -QString WirelessSetupManager::manufacturer() const -{ - return m_manufacturer; -} - -QString WirelessSetupManager::softwareRevision() const -{ - return m_softwareRevision; -} - -QString WirelessSetupManager::firmwareRevision() const -{ - return m_firmwareRevision; -} - -QString WirelessSetupManager::hardwareRevision() const -{ - return m_hardwareRevision; -} - -bool WirelessSetupManager::initialized() const -{ - return m_initialized; -} - -bool WirelessSetupManager::working() const -{ - return m_working; -} - -WirelessSetupManager::NetworkStatus WirelessSetupManager::networkStatus() const -{ - return m_networkStatus; -} - -WirelessSetupManager::WirelessStatus WirelessSetupManager::wirelessStatus() const -{ - return m_wirelessStatus; -} - -bool WirelessSetupManager::networkingEnabled() const -{ - return m_networkingEnabled; -} - -bool WirelessSetupManager::wirelessEnabled() const -{ - return m_wirelessEnabled; -} - -WirelessAccessPoints *WirelessSetupManager::accessPoints() const -{ - return m_accessPoints; -} - -WirelessAccessPoint *WirelessSetupManager::currentConnection() const -{ - return m_currentConnection; -} - -void WirelessSetupManager::reloadData() -{ - loadNetworks(); -} - -void WirelessSetupManager::loadNetworks() -{ - qDebug() << "WifiSetupManager: Start loading wifi networks"; - - if (!m_wifiService) { - qWarning() << "WifiSetupManager: Could not send command. Service not valid"; - return; - } - - QLowEnergyCharacteristic characteristic = m_wifiService->characteristic(wifiCommanderCharacteristicUuid); - if (!characteristic.isValid()) { - qWarning() << "WifiSetupManager: Could not send command. Characteristic is not valid"; - return; - } - - m_readingResponse = true; - m_inputDataStream.clear(); - - setStatusText("Loading wifi network list..."); - m_working = true; - emit workingChanged(); - - QVariantMap request; - request.insert("c", (int)WirelessServiceCommandGetNetworks); - streamData(request); -} - -void WirelessSetupManager::loadCurrentConnection() -{ - qDebug() << "WifiSetupManager: Start loading current connection data"; - - if (!m_wifiService) { - qWarning() << "WifiSetupManager: Could not send command. Service not valid"; - return; - } - - QLowEnergyCharacteristic characteristic = m_wifiService->characteristic(wifiCommanderCharacteristicUuid); - if (!characteristic.isValid()) { - qWarning() << "WifiSetupManager: Could not send command. Characteristic is not valid"; - return; - } - - m_readingResponse = false; - m_inputDataStream.clear(); - - setStatusText("Loading current connection data"); - m_working = true; - emit workingChanged(); - - QVariantMap request; - request.insert("c", (int)WirelessServiceCommandGetCurrentConnection); - streamData(request); -} - -void WirelessSetupManager::performWifiScan() -{ - qDebug() << "WifiSetupManager: Start loading wifi networks"; - - if (!m_wifiService) { - qWarning() << "WifiSetupManager: Could not send command. Service not valid"; - return; - } - - QLowEnergyCharacteristic characteristic = m_wifiService->characteristic(wifiCommanderCharacteristicUuid); - if (!characteristic.isValid()) { - qWarning() << "WifiSetupManager: Could not send command. Characteristic is not valid"; - return; - } - - setStatusText("Perform refresh..."); - m_working = true; - emit workingChanged(); - - QVariantMap request; - request.insert("c", (int)WirelessServiceCommandScan); - streamData(request); -} - -void WirelessSetupManager::enableNetworking(bool enable) -{ - qDebug() << "WifiSetupManager: Send networking" << enable; - - if (!m_netwokService) { - qWarning() << "WifiSetupManager: Could not set networking. Service not valid"; - return; - } - - QLowEnergyCharacteristic characteristic = m_netwokService->characteristic(networkCommanderCharacteristicUuid); - if (!characteristic.isValid()) { - qWarning() << "WifiSetupManager: Could not set networking. Characteristic is not valid"; - return; - } - - m_netwokService->writeCharacteristic(characteristic, enable ? QByteArray::fromHex("00") : QByteArray::fromHex("01")); -} - -void WirelessSetupManager::enableWireless(bool enable) -{ - qDebug() << "WifiSetupManager: Send wireless networking" << enable; - - if (!m_netwokService) { - qWarning() << "WifiSetupManager: Could not enable/disable wireless. Service not valid"; - return; - } - - QLowEnergyCharacteristic characteristic = m_netwokService->characteristic(networkCommanderCharacteristicUuid); - if (!characteristic.isValid()) { - qWarning() << "WifiSetupManager: Could not enable/disable wireless. Characteristic is not valid"; - return; - } - - m_netwokService->writeCharacteristic(characteristic, enable ? QByteArray::fromHex("02") : QByteArray::fromHex("03")); -} - -void WirelessSetupManager::connectWirelessNetwork(const QString &ssid, const QString &password) -{ - qDebug() << "WifiSetupManager: Connect wireless network" << ssid << password; - - m_ssid = ssid; - m_password = password; - - if (!m_wifiService) { - qWarning() << "WifiSetupManager: Could not set wireless network. Service not valid"; - return; - } - - QLowEnergyCharacteristic ssidCharacteristic = m_wifiService->characteristic(wifiCommanderCharacteristicUuid); - if (!ssidCharacteristic.isValid()) { - qWarning() << "WifiSetupManager: Could not connect. Characteristic is not valid"; - return; - } - - QVariantMap request; - request.insert("c", (int)WirelessServiceCommandConnect); - QVariantMap parameters; - parameters.insert("e", ssid); - parameters.insert("p", password); - request.insert("p", parameters); - - streamData(request); -} - -void WirelessSetupManager::disconnectWirelessNetwork() -{ - qDebug() << "WifiSetupManager: Disconnect wireless network"; - - if (!m_wifiService) { - qWarning() << "WifiSetupManager: Could not disconnect wireless network. Service not valid"; - return; - } - - QLowEnergyCharacteristic ssidCharacteristic = m_wifiService->characteristic(wifiCommanderCharacteristicUuid); - if (!ssidCharacteristic.isValid()) { - qWarning() << "WifiSetupManager: Could not disconnect wireless ssid. Characteristic is not valid"; - return; - } - - QVariantMap request; - request.insert("c", (int)WirelessServiceCommandDisconnect); - streamData(request); -} - -void WirelessSetupManager::pressPushButton() -{ - qDebug() << "WifiSetupManager: Press push button"; - - if (!m_systemService) { - qWarning() << "WifiSetupManager: Could not press push button. Service not valid"; - return; - } - - QLowEnergyCharacteristic commanderCharacteristic = m_systemService->characteristic(systemCommanderCharacteristicUuid); - if (!commanderCharacteristic.isValid()) { - qWarning() << "WifiSetupManager: Could not press push button. Characteristic is not valid"; - return; - } - - QVariantMap request; - request.insert("c", (int)SystemServiceCommandPushAuthentication); - - QByteArray data = QJsonDocument::fromVariant(request).toJson(QJsonDocument::Compact) + '\n'; - qDebug() << "WifiSetupManager: SystemService: 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_systemService->writeCharacteristic(commanderCharacteristic, package); - remainingData = remainingData.remove(0, package.count()); - } - - qDebug() << "WifiSetupManager: SystemService: Finished streaming request data"; -} - -void WirelessSetupManager::checkInitialized() -{ - bool initialized = false; - - if (m_systemService) { - initialized = m_deviceInformationService->state() == QLowEnergyService::ServiceDiscovered - && m_netwokService->state() == QLowEnergyService::ServiceDiscovered - && m_wifiService->state() == QLowEnergyService::ServiceDiscovered - && m_systemService->state() == QLowEnergyService::ServiceDiscovered; - } else { - initialized = m_deviceInformationService->state() == QLowEnergyService::ServiceDiscovered - && m_netwokService->state() == QLowEnergyService::ServiceDiscovered - && m_wifiService->state() == QLowEnergyService::ServiceDiscovered; - } - - if (initialized && m_wirelessEnabled && m_networkingEnabled) { - loadNetworks(); - } -} - -void WirelessSetupManager::setModelNumber(const QString &modelNumber) -{ - m_modelNumber = modelNumber; - emit modelNumberChanged(); -} - -void WirelessSetupManager::setManufacturer(const QString &manufacturer) -{ - m_manufacturer = manufacturer; - emit manufacturerChanged(); -} - -void WirelessSetupManager::setSoftwareRevision(const QString &softwareRevision) -{ - m_softwareRevision = softwareRevision; - emit softwareRevisionChanged(); -} - -void WirelessSetupManager::setFirmwareRevision(const QString &firmwareRevision) -{ - m_firmwareRevision = firmwareRevision; - emit firmwareRevisionChanged(); -} - -void WirelessSetupManager::setHardwareRevision(const QString &hardwareRevision) -{ - m_hardwareRevision = hardwareRevision; - emit hardwareRevisionChanged(); -} - -void WirelessSetupManager::setNetworkStatus(int networkStatus) -{ - if (m_networkStatus == networkStatus) - return; - - m_networkStatus = static_cast(networkStatus); - qDebug() << "-->" << m_networkStatus; - emit networkStatusChanged(); -} - -void WirelessSetupManager::setWirelessStatus(int wirelessStatus) -{ - if (m_wirelessStatus == wirelessStatus) - return; - - m_wirelessStatus = static_cast(wirelessStatus); - qDebug() << "-->" << m_wirelessStatus; - emit wirelessStatusChanged(); -} - -void WirelessSetupManager::setNetworkingEnabled(bool networkingEnabled) -{ - if (m_networkingEnabled == networkingEnabled) - return; - - qDebug() << "WifiSetupManager: Networking enabled changed" << networkingEnabled; - m_networkingEnabled = networkingEnabled; - emit networkingEnabledChanged(); - - if (!m_networkingEnabled) - m_accessPoints->clearModel(); - -} - -void WirelessSetupManager::setWirelessEnabled(bool wirelessEnabled) -{ - if (m_wirelessEnabled == wirelessEnabled) - return; - - qDebug() << "WifiSetupManager: Wireless enabled changed" << wirelessEnabled; - m_wirelessEnabled = wirelessEnabled; - emit wirelessEnabledChanged(); - - if (!m_wirelessEnabled) - m_accessPoints->clearModel(); - -} - -void WirelessSetupManager::streamData(const QVariantMap &request) -{ - QLowEnergyCharacteristic characteristic = m_wifiService->characteristic(wifiCommanderCharacteristicUuid); - if (!characteristic.isValid()) { - qWarning() << "WifiSetupManager: WirelessService: Wireless commander characteristic not valid"; - return; - } - - QByteArray data = QJsonDocument::fromVariant(request).toJson(QJsonDocument::Compact) + '\n'; - qDebug() << "WifiSetupManager: 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_wifiService->writeCharacteristic(characteristic, package); - remainingData = remainingData.remove(0, package.count()); - } - - qDebug() << "WifiSetupManager: WirelessService: Finished streaming request data"; -} - -void WirelessSetupManager::processNetworkResponse(const QVariantMap &response) -{ - if (!response.contains("c") || !response.contains("r")) { - qWarning() << "WifiSetupManager: Got invalid response map."; - return; - } - - NetworkServiceCommand command = (NetworkServiceCommand)response.value("c").toInt(); - NetworkServiceResponse responseCode = (NetworkServiceResponse)response.value("r").toInt(); - - if (responseCode != NetworkServiceResponseSuccess) { - qWarning() << "WifiSetupManager: Got error for command" << command << responseCode; - - - switch (responseCode) { - case NetworkServiceResponseIvalidValue: - emit errorOccurred(tr("Invalid value.")); - break; - case NetworkServiceResponseNetworkManagerNotAvailable: - emit errorOccurred(tr("There is no networkmanager available on the device.")); - break; - case NetworkServiceResponseWirelessNotAvailable: - emit errorOccurred(tr("There is no wireless device available on the device.")); - break; - default: - emit errorOccurred(tr("Unknown error occured.")); - break; - } - - return; - } - - qDebug() << "WifiSetupManager: Network command response" << command << responseCode; -} - -void WirelessSetupManager::processWifiResponse(const QVariantMap &response) -{ - m_working = false; - emit workingChanged(); - - if (!response.contains("c") || !response.contains("r")) { - qWarning() << "WifiSetupManager: Got invalid response map."; - return; - } - - WirelessServiceCommand command = (WirelessServiceCommand)response.value("c").toInt(); - WirelessServiceResponse responseCode = (WirelessServiceResponse)response.value("r").toInt(); - - if (responseCode != WirelessServiceResponseSuccess) { - qWarning() << "WifiSetupManager: Got error for command" << command << responseCode; - - switch (responseCode) { - case WirelessServiceResponseIvalidCommand: - emit errorOccurred(tr("Invalid command.")); - break; - case WirelessServiceResponseIvalidParameters: - emit errorOccurred(tr("Invalid parameters.")); - break; - case WirelessServiceResponseNetworkManagerNotAvailable: - emit errorOccurred(tr("There is no networkmanager available on the device.")); - break; - case WirelessServiceResponseWirelessNotAvailable: - emit errorOccurred(tr("There is no wireless device available on the device.")); - break; - case WirelessServiceResponseWirelessNotEnabled: - emit errorOccurred(tr("The wireless networking is disabled on the device.")); - break; - case WirelessServiceResponseNetworkingNotEnabled: - emit errorOccurred(tr("The networking is disabled on the device.")); - break; - default: - emit errorOccurred(tr("Unknown error occured.")); - break; - } - - return; - } - - switch (command) { - case WirelessServiceCommandGetNetworks: { - if (!response.contains("p")) { - qWarning() << "WifiSetupManager: Missing parameters in response."; - return; - } - - m_accessPointsVariantList = response.value("p").toList(); - m_accessPoints->clearModel(); - - foreach (const QVariant &accessPointVariant, m_accessPointsVariantList) { - QVariantMap accessPointVariantMap = accessPointVariant.toMap(); - WirelessAccessPoint *accessPoint = new WirelessAccessPoint(this); - accessPoint->setSsid(accessPointVariantMap.value("e").toString()); - accessPoint->setMacAddress(accessPointVariantMap.value("m").toString()); - accessPoint->setSignalStrength(accessPointVariantMap.value("s").toInt()); - accessPoint->setProtected(accessPointVariantMap.value("p").toBool()); - accessPoint->setHostAddress(""); - - m_accessPoints->addWirelessAccessPoint(accessPoint); - } - - loadCurrentConnection(); - - break; - } - case WirelessServiceCommandConnect: - - break; - case WirelessServiceCommandConnectHidden: - - break; - case WirelessServiceCommandDisconnect: - - break; - case WirelessServiceCommandGetCurrentConnection: { - - qDebug() << "Current network connection" << response; - QVariantMap currentConnection = response.value("p").toMap();; - - // Find current network - m_currentConnection = nullptr; - QString macAddress = currentConnection.value("m").toString(); - foreach (WirelessAccessPoint *accessPoint, m_accessPoints->wirelessAccessPoints()) { - if (accessPoint->macAddress() == macAddress) { - // Set the current network - m_currentConnection = accessPoint; - accessPoint->setHostAddress(currentConnection.value("i").toString()); - } - } - qDebug() << "current connection is:" << m_currentConnection; - emit currentConnectionChanged(); - - m_initialized = true; - emit initializedChanged(); - - break; - } - default: - break; - } -} - -void WirelessSetupManager::processSystemResponse(const QVariantMap &response) -{ - m_working = false; - emit workingChanged(); - - if (!response.contains("c") || !response.contains("r")) { - qWarning() << "WifiSetupManager: Got invalid response map."; - return; - } - - SystemServiceCommand command = (SystemServiceCommand)response.value("c").toInt(); - SystemServiceResponse responseCode = (SystemServiceResponse)response.value("r").toInt(); - - if (responseCode != SystemServiceResponseSuccess) { - qWarning() << "WifiSetupManager: Got error for command" << command << responseCode; - return; - } - - qDebug() << "WifiSetupManager: System command response" << command << responseCode; -} - -void WirelessSetupManager::onConnectedChanged() -{ - if (!connected()) { - // Clean up - qDebug() << "WifiSetupManager: Clean up services"; - if (m_deviceInformationService) { - m_deviceInformationService->deleteLater(); - } - if (m_netwokService) { - m_netwokService->deleteLater(); - } - if (m_wifiService) { - m_wifiService->deleteLater(); - } - if (m_systemService) { - m_systemService->deleteLater(); - } - - m_deviceInformationService = nullptr; - m_netwokService = nullptr; - m_wifiService = nullptr; - m_systemService = nullptr; - - m_accessPoints->clearModel(); - - m_initialized = false; - emit initializedChanged(); - m_working = false; - emit workingChanged(); - - setManufacturer(""); - setModelNumber(""); - setSoftwareRevision(""); - setFirmwareRevision(""); - setHardwareRevision(""); - } -} - -void WirelessSetupManager::onServiceDiscoveryFinished() -{ - foreach (const QBluetoothUuid &serviceUuid, controller()->services()) { - qDebug() << "WifiSetupManager: -->" << serviceUuid.toString(); - } - - if (!controller()->services().contains(QBluetoothUuid::DeviceInformation)) { - qWarning() << "WifiSetupManager: Could not find device information service"; - controller()->disconnectFromDevice(); - return; - } - - if (!controller()->services().contains(networkServiceUuid)) { - qWarning() << "WifiSetupManager: Could not find network service"; - controller()->disconnectFromDevice(); - return; - } - - if (!controller()->services().contains(wifiServiceUuid)) { - qWarning() << "WifiSetupManager: Could not find wifi service"; - controller()->disconnectFromDevice(); - return; - } - - // Device Informantion service - if (!m_deviceInformationService) { - m_deviceInformationService = controller()->createServiceObject(QBluetoothUuid::DeviceInformation, this); - if (!m_deviceInformationService) { - qWarning() << "WifiSetupManager: Could not create temperature service."; - controller()->disconnectFromDevice(); - return; - } - - connect(m_deviceInformationService, &QLowEnergyService::stateChanged, this, &WirelessSetupManager::onDeviceInformationStateChanged); - connect(m_deviceInformationService, &QLowEnergyService::characteristicChanged, this, &WirelessSetupManager::onDeviceInformationCharacteristicChanged); - connect(m_deviceInformationService, &QLowEnergyService::characteristicRead, this, &WirelessSetupManager::onDeviceInformationCharacteristicChanged); - - if (m_deviceInformationService->state() == QLowEnergyService::DiscoveryRequired) { - qDebug() << "WifiSetupManager: start discovering device information service..."; - m_deviceInformationService->discoverDetails(); - } - - } -} - -void WirelessSetupManager::onDeviceInformationStateChanged(const QLowEnergyService::ServiceState &state) -{ - - if (state != QLowEnergyService::ServiceDiscovered) - return; - - qDebug() << "WifiSetupManager: Device information service discovered."; - - foreach (const QLowEnergyCharacteristic &characteristic, m_deviceInformationService->characteristics()) { - qDebug() << " -->" << characteristic.name() << characteristic.uuid().toString() << characteristic.value(); - foreach (const QLowEnergyDescriptor &descriptor, characteristic.descriptors()) { - qDebug() << " -->" << descriptor.name() << descriptor.uuid().toString() << descriptor.value(); - } - } - - setManufacturer(QString::fromUtf8(m_deviceInformationService->characteristic(QBluetoothUuid::ManufacturerNameString).value())); - setModelNumber(QString::fromUtf8(m_deviceInformationService->characteristic(QBluetoothUuid::ModelNumberString).value())); - setSoftwareRevision(QString::fromUtf8(m_deviceInformationService->characteristic(QBluetoothUuid::SoftwareRevisionString).value())); - setFirmwareRevision(QString::fromUtf8(m_deviceInformationService->characteristic(QBluetoothUuid::FirmwareRevisionString).value())); - setHardwareRevision(QString::fromUtf8(m_deviceInformationService->characteristic(QBluetoothUuid::HardwareRevisionString).value())); - - // Network service - if (!m_netwokService) { - m_netwokService = controller()->createServiceObject(networkServiceUuid, this); - if (!m_netwokService) { - qWarning() << "WifiSetupManager: Could not create network service."; - controller()->disconnectFromDevice(); - return; - } - - connect(m_netwokService, &QLowEnergyService::stateChanged, this, &WirelessSetupManager::onNetworkServiceStateChanged); - connect(m_netwokService, &QLowEnergyService::characteristicChanged, this, &WirelessSetupManager::onNetworkServiceCharacteristicChanged); - connect(m_netwokService, &QLowEnergyService::characteristicRead, this, &WirelessSetupManager::onNetworkServiceReadFinished); - - if (m_netwokService->state() == QLowEnergyService::DiscoveryRequired) { - qDebug() << "WifiSetupManager: start discovering network service..."; - m_netwokService->discoverDetails(); - } - } - checkInitialized(); -} - -void WirelessSetupManager::onDeviceInformationCharacteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &value) -{ - Q_UNUSED(characteristic) - Q_UNUSED(value) -} - -void WirelessSetupManager::onDeviceInformationReadFinished(const QLowEnergyCharacteristic &characteristic, const QByteArray &value) -{ - Q_UNUSED(characteristic) - Q_UNUSED(value) -} - -void WirelessSetupManager::onNetworkServiceStateChanged(const QLowEnergyService::ServiceState &state) -{ - if (state != QLowEnergyService::ServiceDiscovered) - return; - - qDebug() << "WifiSetupManager: Network service discovered."; - - foreach (const QLowEnergyCharacteristic &characteristic, m_netwokService->characteristics()) { - qDebug() << " -->" << characteristic.name() << characteristic.uuid().toString() << characteristic.value(); - foreach (const QLowEnergyDescriptor &descriptor, characteristic.descriptors()) { - qDebug() << " -->" << descriptor.name() << descriptor.uuid().toString() << descriptor.value(); - } - } - - QLowEnergyCharacteristic networkCharacteristic = m_netwokService->characteristic(networkStatusCharacteristicUuid); - if (!networkCharacteristic.isValid()) { - qWarning() << "Invalud networking status characteristic"; - return; - } - - QLowEnergyCharacteristic networkingEnabledCharacteristic = m_netwokService->characteristic(networkingEnabledCharacteristicUuid); - if (!networkingEnabledCharacteristic.isValid()) { - qWarning() << "Invalud networking enabled characteristic"; - return; - } - - QLowEnergyCharacteristic wirelessEnabledCharacteristic = m_netwokService->characteristic(wirelessEnabledCharacteristicUuid); - if (!wirelessEnabledCharacteristic.isValid()) { - qWarning() << "Invalud wireless enabled characteristic"; - return; - } - - - // Enable notifications - qDebug() << "Enable notifications of network service"; - m_netwokService->writeDescriptor(networkCharacteristic.descriptor(QBluetoothUuid::ClientCharacteristicConfiguration), QByteArray::fromHex("0100")); - m_netwokService->writeDescriptor(networkingEnabledCharacteristic.descriptor(QBluetoothUuid::ClientCharacteristicConfiguration), QByteArray::fromHex("0100")); - m_netwokService->writeDescriptor(wirelessEnabledCharacteristic.descriptor(QBluetoothUuid::ClientCharacteristicConfiguration), QByteArray::fromHex("0100")); - - setStatusText("Connected and ready"); - m_working = false; - emit workingChanged(); - - // Done with discovery - setNetworkStatus(networkCharacteristic.value().toHex().toUInt(0, 16)); - setNetworkingEnabled((bool)networkingEnabledCharacteristic.value().toHex().toUInt(0, 16)); - setWirelessEnabled((bool)wirelessEnabledCharacteristic.value().toHex().toUInt(0, 16)); - - // Wifi service - if (!m_wifiService) { - m_wifiService = controller()->createServiceObject(wifiServiceUuid, this); - if (!m_wifiService) { - qWarning() << "WifiSetupManager: Could not create wifi service."; - controller()->disconnectFromDevice(); - return; - } - - connect(m_wifiService, &QLowEnergyService::stateChanged, this, &WirelessSetupManager::onWifiServiceStateChanged); - connect(m_wifiService, &QLowEnergyService::characteristicChanged, this, &WirelessSetupManager::onWifiServiceCharacteristicChanged); - connect(m_wifiService, &QLowEnergyService::characteristicRead, this, &WirelessSetupManager::onWifiServiceReadFinished); - - if (m_wifiService->state() == QLowEnergyService::DiscoveryRequired) { - qDebug() << "WifiSetupManager: start discovering wifi service..."; - m_wifiService->discoverDetails(); - } - - } - - checkInitialized(); -} - -void WirelessSetupManager::onNetworkServiceCharacteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &value) -{ - if (characteristic.uuid() == networkStatusCharacteristicUuid) { - qDebug() << "Network status changed:" << value; - setNetworkStatus(value.toHex().toInt(nullptr, 16)); - if (m_networkStatus == NetworkStatusGlobal) { - loadCurrentConnection(); - } - return; - } else if (characteristic.uuid() == networkResponseCharacteristicUuid) { - // Check if currently reading - if (m_readingResponse) { - m_inputDataStream.append(value); - } else { - m_inputDataStream.clear(); - m_readingResponse = 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) { - qWarning() << "Got invalid json object" << m_inputDataStream; - m_inputDataStream.clear(); - m_readingResponse = false; - return; - } - - qDebug() << "Got command stream" << qUtf8Printable(jsonDocument.toJson()); - - processNetworkResponse(jsonDocument.toVariant().toMap()); - - m_inputDataStream.clear(); - m_readingResponse = false; - return; - } - } else if (characteristic.uuid() == networkingEnabledCharacteristicUuid) { - qDebug() << "Networking enabled changed" << (bool)value.toHex().toUInt(0, 16); - setNetworkingEnabled((bool)value.toHex().toUInt(0, 16)); - return; - } else if (characteristic.uuid() == wirelessEnabledCharacteristicUuid) { - qDebug() << "Wireless enabled changed" << (bool)value.toHex().toUInt(0, 16); - setWirelessEnabled((bool)value.toHex().toUInt(0, 16)); - return; - } - - qWarning() << "Bluetooth: Unhandled service characteristic changed" << characteristic.uuid() << value; -} - -void WirelessSetupManager::onNetworkServiceReadFinished(const QLowEnergyCharacteristic &characteristic, const QByteArray &value) -{ - Q_UNUSED(characteristic) - Q_UNUSED(value) -} - -void WirelessSetupManager::onWifiServiceStateChanged(const QLowEnergyService::ServiceState &state) -{ - if (state != QLowEnergyService::ServiceDiscovered) - return; - - qDebug() << "WifiSetupManager: Wifi service discovered."; - - foreach (const QLowEnergyCharacteristic &characteristic, m_wifiService->characteristics()) { - qDebug() << " -->" << characteristic.name() << characteristic.uuid().toString() << characteristic.value(); - foreach (const QLowEnergyDescriptor &descriptor, characteristic.descriptors()) { - qDebug() << " -->" << descriptor.name() << descriptor.uuid().toString() << descriptor.value(); - } - } - - // Enable notifications - m_wifiService->writeDescriptor(m_wifiService->characteristic(wifiResponseCharacteristicUuid).descriptor(QBluetoothUuid::ClientCharacteristicConfiguration), QByteArray::fromHex("0100")); - m_wifiService->writeDescriptor(m_wifiService->characteristic(wifiStatusCharacteristicUuid).descriptor(QBluetoothUuid::ClientCharacteristicConfiguration), QByteArray::fromHex("0100")); - - setWirelessStatus(m_wifiService->characteristic(wifiStatusCharacteristicUuid).value().toHex().toUInt(0, 16)); - - // System service - if (!m_systemService) { - m_systemService = controller()->createServiceObject(systemServiceUuid, this); - if (!m_systemService) { - qWarning() << "WifiSetupManager: Could not create system service. Looks like this networkmanager has not implemented that."; - //controller()->disconnectFromDevice(); - } else { - connect(m_systemService, &QLowEnergyService::stateChanged, this, &WirelessSetupManager::onSystemServiceStateChanged); - connect(m_systemService, &QLowEnergyService::characteristicChanged, this, &WirelessSetupManager::onSystemServiceCharacteristicChanged); - connect(m_systemService, &QLowEnergyService::characteristicRead, this, &WirelessSetupManager::onSystemServiceReadFinished); - - if (m_systemService->state() == QLowEnergyService::DiscoveryRequired) { - qDebug() << "WifiSetupManager: start discovering system service..."; - m_systemService->discoverDetails(); - } - } - } - - checkInitialized(); -} - -void WirelessSetupManager::onWifiServiceCharacteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &value) -{ - Q_UNUSED(characteristic) - - if (characteristic.uuid() == wifiResponseCharacteristicUuid) { - // Check if currently reading - if (m_readingResponse) { - m_inputDataStream.append(value); - } else { - m_inputDataStream.clear(); - m_readingResponse = 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) { - qWarning() << "Got invalid json object" << m_inputDataStream; - m_inputDataStream.clear(); - m_readingResponse = false; - return; - } - - qDebug() << "Got command stream" << qUtf8Printable(jsonDocument.toJson()); - - processWifiResponse(jsonDocument.toVariant().toMap()); - - m_inputDataStream.clear(); - m_readingResponse = false; - } - return; - } - - if (characteristic.uuid() == wifiStatusCharacteristicUuid) { - qDebug() << "Wireless status changed:" << value.toHex().toUInt(nullptr, 16) << "Old status:" << m_wirelessStatus; - setWirelessStatus(value.toHex().toInt(nullptr, 16)); - if (m_wirelessStatus == WirelessStatusActivated) { - loadCurrentConnection(); - } - return; - } - - qWarning() << "Bluetooth: Unhandled service characteristic changed" << characteristic.uuid() << value; - -} - -void WirelessSetupManager::onWifiServiceReadFinished(const QLowEnergyCharacteristic &characteristic, const QByteArray &value) -{ - Q_UNUSED(characteristic) - Q_UNUSED(value) -} - -void WirelessSetupManager::onSystemServiceStateChanged(const QLowEnergyService::ServiceState &state) -{ - if (state != QLowEnergyService::ServiceDiscovered) - return; - - qDebug() << "WifiSetupManager: System service discovered."; - - foreach (const QLowEnergyCharacteristic &characteristic, m_systemService->characteristics()) { - qDebug() << " -->" << characteristic.name() << characteristic.uuid().toString() << characteristic.value(); - foreach (const QLowEnergyDescriptor &descriptor, characteristic.descriptors()) { - qDebug() << " -->" << descriptor.name() << descriptor.uuid().toString() << descriptor.value(); - } - } - - // Enable notifications - m_systemService->writeDescriptor(m_systemService->characteristic(systemResponseCharacteristicUuid).descriptor(QBluetoothUuid::ClientCharacteristicConfiguration), QByteArray::fromHex("0100")); - - checkInitialized(); -} - -void WirelessSetupManager::onSystemServiceCharacteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &value) -{ - Q_UNUSED(characteristic) - - // Check if currently reading - if (m_readingResponse) { - m_inputDataStream.append(value); - } else { - m_inputDataStream.clear(); - m_readingResponse = 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) { - qWarning() << "Got invalid json object" << m_inputDataStream; - m_inputDataStream.clear(); - m_readingResponse = false; - return; - } - - qDebug() << "Got command stream" << qUtf8Printable(jsonDocument.toJson()); - - processSystemResponse(jsonDocument.toVariant().toMap()); - - m_inputDataStream.clear(); - m_readingResponse = false; - } -} - -void WirelessSetupManager::onSystemServiceReadFinished(const QLowEnergyCharacteristic &characteristic, const QByteArray &value) -{ - Q_UNUSED(characteristic) - Q_UNUSED(value) -} diff --git a/libnymea-app/wifisetup/wirelesssetupmanager.h b/libnymea-app/wifisetup/wirelesssetupmanager.h deleted file mode 100644 index a56ccfd7..00000000 --- a/libnymea-app/wifisetup/wirelesssetupmanager.h +++ /dev/null @@ -1,275 +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 General Public License Usage -* Alternatively, this project may be redistributed and/or modified under the -* terms of the GNU General Public License as published by the Free Software -* Foundation, GNU 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 General -* Public License for more details. -* -* You should have received a copy of the GNU 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 WIRELESSSETUPMANAGER_H -#define WIRELESSSETUPMANAGER_H - -#include -#include - -#include "bluetoothdevice.h" - -class WirelessAccessPoint; -class WirelessAccessPoints; -class WirelessAccessPointsProxy; - -class WirelessSetupManager : public BluetoothDevice -{ - Q_OBJECT - Q_PROPERTY(bool working READ working NOTIFY workingChanged) - Q_PROPERTY(bool initialized READ initialized NOTIFY initializedChanged) - - Q_PROPERTY(WirelessAccessPoints *accessPoints READ accessPoints CONSTANT) - Q_PROPERTY(WirelessAccessPoint *currentConnection READ currentConnection NOTIFY currentConnectionChanged) - - Q_PROPERTY(QString modelNumber READ modelNumber NOTIFY modelNumberChanged) - Q_PROPERTY(QString manufacturer READ manufacturer NOTIFY manufacturerChanged) - Q_PROPERTY(QString softwareRevision READ softwareRevision NOTIFY softwareRevisionChanged) - Q_PROPERTY(QString firmwareRevision READ firmwareRevision NOTIFY firmwareRevisionChanged) - Q_PROPERTY(QString hardwareRevision READ hardwareRevision NOTIFY hardwareRevisionChanged) - - Q_PROPERTY(NetworkStatus networkStatus READ networkStatus NOTIFY networkStatusChanged) - Q_PROPERTY(WirelessStatus wirelessStatus READ wirelessStatus NOTIFY wirelessStatusChanged) - Q_PROPERTY(bool networkingEnabled READ networkingEnabled NOTIFY networkingEnabledChanged) - Q_PROPERTY(bool wirelessEnabled READ wirelessEnabled NOTIFY wirelessEnabledChanged) - -public: - - enum WirelessServiceCommand { - WirelessServiceCommandInvalid = -1, - WirelessServiceCommandGetNetworks = 0x00, - WirelessServiceCommandConnect = 0x01, - WirelessServiceCommandConnectHidden = 0x02, - WirelessServiceCommandDisconnect = 0x03, - WirelessServiceCommandScan = 0x04, - WirelessServiceCommandGetCurrentConnection = 0x05 - }; - Q_ENUM(WirelessServiceCommand) - - enum WirelessServiceResponse { - WirelessServiceResponseSuccess = 0x00, - WirelessServiceResponseIvalidCommand = 0x01, - WirelessServiceResponseIvalidParameters = 0x02, - WirelessServiceResponseNetworkManagerNotAvailable = 0x03, - WirelessServiceResponseWirelessNotAvailable = 0x04, - WirelessServiceResponseWirelessNotEnabled = 0x05, - WirelessServiceResponseNetworkingNotEnabled = 0x06, - WirelessServiceResponseUnknownError = 0x07 - }; - Q_ENUM(WirelessServiceResponse) - - 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) - - enum SystemServiceCommand { - SystemServiceCommandInvalid = -1, - SystemServiceCommandPushAuthentication = 0x00 - }; - Q_ENUM(SystemServiceCommand) - - enum SystemServiceResponse { - SystemServiceResponseSuccess = 0x00, - SystemServiceResponseUnknownError = 0x01, - SystemServiceResponseInvalidCommand = 0x02, - SystemServiceResponseInvalidValue = 0x03, - SystemServiceResponsePushServiceUnavailable = 0x04, - }; - Q_ENUM(SystemServiceResponse) - - enum NetworkStatus { - NetworkStatusUnknown = 0x00, - NetworkStatusAsleep = 0x01, - NetworkStatusDisconnected = 0x02, - NetworkStatusDisconnecting = 0x03, - NetworkStatusConnecting = 0x04, - NetworkStatusLocal = 0x05, - NetworkStatusConnectedSite = 0x06, - NetworkStatusGlobal = 0x07 - }; - Q_ENUM(NetworkStatus) - - enum WirelessStatus { - WirelessStatusUnknown = 0x00, - WirelessStatusUnmanaged = 0x01, - WirelessStatusUnavailable = 0x02, - WirelessStatusDisconnected = 0x03, - WirelessStatusPrepare = 0x04, - WirelessStatusConfig = 0x05, - WirelessStatusNeedAuth = 0x06, - WirelessStatusIpConfig = 0x07, - WirelessStatusIpCheck = 0x08, - WirelessStatusSecondaries = 0x09, - WirelessStatusActivated = 0x0A, - WirelessStatusDeactivating = 0x0B, - WirelessStatusFailed = 0x0C - }; - Q_ENUM(WirelessStatus) - - explicit WirelessSetupManager(const QBluetoothDeviceInfo &deviceInfo, QObject *parent = nullptr); - - QString modelNumber() const; - QString manufacturer() const; - QString softwareRevision() const; - QString firmwareRevision() const; - QString hardwareRevision() const; - - bool initialized() const; - bool working() const; - - NetworkStatus networkStatus() const; - WirelessSetupManager::WirelessStatus wirelessStatus() const; - - bool networkingEnabled() const; - bool wirelessEnabled() const; - - WirelessAccessPoints *accessPoints() const; - WirelessAccessPoint *currentConnection() const; - - void reloadData(); - - // Wireless commands - Q_INVOKABLE void loadNetworks(); - Q_INVOKABLE void loadCurrentConnection(); - Q_INVOKABLE void performWifiScan(); - Q_INVOKABLE void enableNetworking(bool enable); - Q_INVOKABLE void enableWireless(bool enable); - Q_INVOKABLE void connectWirelessNetwork(const QString &ssid, const QString &password = QString()); - Q_INVOKABLE void disconnectWirelessNetwork(); - Q_INVOKABLE void pressPushButton(); - -signals: - void modelNumberChanged(); - void manufacturerChanged(); - void softwareRevisionChanged(); - void firmwareRevisionChanged(); - void hardwareRevisionChanged(); - - void initializedChanged(); - void workingChanged(); - - void networkStatusChanged(); - void wirelessStatusChanged(); - void networkingEnabledChanged(); - void wirelessEnabledChanged(); - - void currentConnectionChanged(); - - void errorOccurred(const QString &errorMessage); - -private slots: - void onConnectedChanged(); - void onServiceDiscoveryFinished(); - - void onDeviceInformationStateChanged(const QLowEnergyService::ServiceState &state); - void onDeviceInformationCharacteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &value); - void onDeviceInformationReadFinished(const QLowEnergyCharacteristic &characteristic, const QByteArray &value); - - void onNetworkServiceStateChanged(const QLowEnergyService::ServiceState &state); - void onNetworkServiceCharacteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &value); - void onNetworkServiceReadFinished(const QLowEnergyCharacteristic &characteristic, const QByteArray &value); - - void onWifiServiceStateChanged(const QLowEnergyService::ServiceState &state); - void onWifiServiceCharacteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &value); - void onWifiServiceReadFinished(const QLowEnergyCharacteristic &characteristic, const QByteArray &value); - - void onSystemServiceStateChanged(const QLowEnergyService::ServiceState &state); - void onSystemServiceCharacteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &value); - void onSystemServiceReadFinished(const QLowEnergyCharacteristic &characteristic, const QByteArray &value); - -private: - QLowEnergyService *m_deviceInformationService = nullptr; - QLowEnergyService *m_netwokService = nullptr; - QLowEnergyService *m_wifiService = nullptr; - QLowEnergyService *m_systemService = nullptr; - - WirelessAccessPoints *m_accessPoints = nullptr; - WirelessAccessPoint *m_currentConnection = nullptr; - - QString m_modelNumber; - QString m_manufacturer; - QString m_softwareRevision; - QString m_firmwareRevision; - QString m_hardwareRevision; - - bool m_networkingEnabled = false; - bool m_wirelessEnabled = false; - - bool m_working = false; - bool m_initialized = false; - - NetworkStatus m_networkStatus = NetworkStatusUnknown; - WirelessStatus m_wirelessStatus = WirelessStatusUnknown; - - bool m_readingResponse = false; - QByteArray m_inputDataStream; - - QString m_ssid; - QString m_password; - - QVariantList m_accessPointsVariantList; - - void checkInitialized(); - - // Private set methods for read only properties - void setModelNumber(const QString &modelNumber); - void setManufacturer(const QString &manufacturer); - void setSoftwareRevision(const QString &softwareRevision); - void setFirmwareRevision(const QString &firmwareRevision); - void setHardwareRevision(const QString &hardwareRevision); - - void setNetworkStatus(int networkStatus); - void setWirelessStatus(int wirelessStatus); - void setNetworkingEnabled(bool networkingEnabled); - void setWirelessEnabled(bool wirelessEnabled); - - // Data methods - void streamData(const QVariantMap &request); - void processNetworkResponse(const QVariantMap &response); - void processWifiResponse(const QVariantMap &response); - void processSystemResponse(const QVariantMap &response); - -}; - -#endif // WIRELESSSETUPMANAGER_H diff --git a/nymea-app/ui/Nymea.qml b/nymea-app/ui/Nymea.qml index 41494ca3..3cb99172 100644 --- a/nymea-app/ui/Nymea.qml +++ b/nymea-app/ui/Nymea.qml @@ -130,13 +130,11 @@ ApplicationWindow { anchors.bottomMargin: keyboardRect.height } - NymeaDiscovery { - id: discovery + property NymeaDiscovery nymeaDiscovery: NymeaDiscovery { objectName: "discovery" awsClient: AWSClient // discovering: pageStack.currentItem.objectName === "discoveryPage" } - property alias _discovery: discovery property var supportedInterfaces: [ "light", diff --git a/nymea-app/ui/RootItem.qml b/nymea-app/ui/RootItem.qml index 0b39375e..572b0900 100644 --- a/nymea-app/ui/RootItem.qml +++ b/nymea-app/ui/RootItem.qml @@ -84,7 +84,7 @@ Item { d.pushSettingsPage("connection/wifisetup/BluetoothDiscoveryPage.qml"); } function startDemoMode() { - var host = discovery.nymeaHosts.createWanHost("Demo server", "nymea://nymea.nymea.io:2222") + var host = nymeaDiscovery.nymeaHosts.createWanHost("Demo server", "nymea://nymea.nymea.io:2222") root.currentEngine.jsonRpcClient.connectToHost(host) } @@ -164,7 +164,7 @@ Item { } Binding { - target: _discovery + target: nymeaDiscovery property: "discovering" value: engine.jsonRpcClient.currentHost === null } @@ -180,11 +180,11 @@ Item { Component.onCompleted: { setupPushNotifications(); if (autoConnectHost.length > 0) { - var host = discovery.nymeaHosts.createLanHost("Manual connection", autoConnectHost); + var host = nymeaDiscovery.nymeaHosts.createLanHost("Manual connection", autoConnectHost); engine.jsonRpcClient.connectToHost(host) } else if (tabSettings.lastConnectedHost.length > 0) { print("Last connected host was", tabSettings.lastConnectedHost) - var cachedHost = discovery.nymeaHosts.find(tabSettings.lastConnectedHost); + var cachedHost = nymeaDiscovery.nymeaHosts.find(tabSettings.lastConnectedHost); if (cachedHost) { engine.jsonRpcClient.connectToHost(cachedHost) return; @@ -343,14 +343,14 @@ Item { var popup = certDialogComponent.createObject(root); popup.accepted.connect(function(){ engine.jsonRpcClient.acceptCertificate(serverUuid, pem); - engine.jsonRpcClient.connectToHost(discovery.nymeaHosts.find(serverUuid)); + engine.jsonRpcClient.connectToHost(nymeaDiscovery.nymeaHosts.find(serverUuid)); }) popup.open(); } onConnectedChanged: { print("json client connected changed", engine.jsonRpcClient.connected) if (engine.jsonRpcClient.connected) { - discovery.cacheHost(engine.jsonRpcClient.currentHost) + nymeaDiscovery.cacheHost(engine.jsonRpcClient.currentHost) tabSettings.lastConnectedHost = engine.jsonRpcClient.serverUuid } init(); diff --git a/nymea-app/ui/appsettings/CloudLoginPage.qml b/nymea-app/ui/appsettings/CloudLoginPage.qml index 916d736b..912bd19a 100644 --- a/nymea-app/ui/appsettings/CloudLoginPage.qml +++ b/nymea-app/ui/appsettings/CloudLoginPage.qml @@ -126,7 +126,7 @@ SettingsPageBase { onClicked: { print("clicked, connected:", engine.jsonRpcClient.connected, model.id) if (!engine.jsonRpcClient.connected) { - var host = discovery.nymeaHosts.find(model.id) + var host = nymeaDiscovery.nymeaHosts.find(model.id) engine.jsonRpcClient.connectToHost(host); } } diff --git a/nymea-app/ui/connection/ConnectPage.qml b/nymea-app/ui/connection/ConnectPage.qml index 70dd5ae0..63ce0d59 100644 --- a/nymea-app/ui/connection/ConnectPage.qml +++ b/nymea-app/ui/connection/ConnectPage.qml @@ -70,7 +70,7 @@ Page { NymeaHostsFilterModel { id: hostsProxy - discovery: _discovery + discovery: nymeaDiscovery showUnreachableBearers: false jsonRpcClient: engine.jsonRpcClient showUnreachableHosts: false @@ -220,16 +220,16 @@ Page { Layout.leftMargin: app.margins Layout.rightMargin: app.margins wrapMode: Text.WordWrap - visible: discovery.nymeaHosts.count === 0 + visible: nymeaDiscovery.nymeaHosts.count === 0 text: qsTr("Do you have a %1:core but it's not connected to your network yet? Use the wireless setup to connect it!").arg(app.systemName) } Button { Layout.fillWidth: true Layout.leftMargin: app.margins Layout.rightMargin: app.margins - visible: discovery.nymeaHosts.count === 0 + visible: nymeaDiscovery.nymeaHosts.count === 0 text: qsTr("Start wireless setup") - onClicked: pageStack.push(Qt.resolvedUrl("wifisetup/BluetoothDiscoveryPage.qml"), {nymeaDiscovery: discovery}) + onClicked: pageStack.push(Qt.resolvedUrl("wifisetup/BluetoothDiscoveryPage.qml")) } Button { Layout.fillWidth: true @@ -245,10 +245,10 @@ Page { Layout.leftMargin: app.margins Layout.rightMargin: app.margins Layout.bottomMargin: app.margins - visible: discovery.nymeaHosts.count === 0 + visible: nymeaDiscovery.nymeaHosts.count === 0 text: qsTr("Demo mode (online)") onClicked: { - var host = discovery.nymeaHosts.createWanHost("Demo server", "nymea://nymea.nymea.io:2222") + var host = nymeaDiscovery.nymeaHosts.createWanHost("Demo server", "nymea://nymea.nymea.io:2222") engine.jsonRpcClient.connectToHost(host) } } diff --git a/nymea-app/ui/connection/ManualConnectPage.qml b/nymea-app/ui/connection/ManualConnectPage.qml index bf6c73e9..6ae36884 100644 --- a/nymea-app/ui/connection/ManualConnectPage.qml +++ b/nymea-app/ui/connection/ManualConnectPage.qml @@ -124,7 +124,7 @@ Page { } print("Try to connect ", rpcUrl) - var host = discovery.nymeaHosts.createLanHost("Manual connection", rpcUrl); + var host = nymeaDiscovery.nymeaHosts.createLanHost("Manual connection", rpcUrl); engine.jsonRpcClient.connectToHost(host) } } diff --git a/nymea-app/ui/connection/wifisetup/BluetoothDiscoveryPage.qml b/nymea-app/ui/connection/wifisetup/BluetoothDiscoveryPage.qml index 4d1f3a3a..c8ef605d 100644 --- a/nymea-app/ui/connection/wifisetup/BluetoothDiscoveryPage.qml +++ b/nymea-app/ui/connection/wifisetup/BluetoothDiscoveryPage.qml @@ -41,57 +41,70 @@ Page { onBackPressed: pageStack.pop() } - property var nymeaDiscovery: null - BluetoothDiscovery { id: bluetoothDiscovery discoveryEnabled: pageStack.currentItem === root } - NetworkManagerController { - id: networkManager + BtWiFiSetup { + id: wifiSetup + + onStatusChanged: { + print("status changed", status) + switch (status) { + case BtWiFiSetup.StatusDisconnected: + pageStack.pop(root) + break; + case BtWiFiSetup.StatusConnectingToBluetooth: + break; + case BtWiFiSetup.StatusConnectedToBluetooth: + if (!wifiSetup.networkingEnabled) { + wifiSetup.networkingEnabled = true; + } + if (!wifiSetup.wirelessEnabled) { + wifiSetup.wirelessEnabled = true; + } + setupDevice() + break; + case BtWiFiSetup.StatusConnectingToWiFi: + break; + case BtWiFiSetup.StatusConnectedToWiFi: + print("Connected to wifi!") + } + } + onBluetoothConnectionError: { + print("Error") + pageStack.pop(root) + } + onWirelessEnabledChanged: { + if (wirelessEnabled) { + scanWiFi(); + } + } } function connectDevice(btDeviceInfo) { - networkManager.bluetoothDeviceInfo = btDeviceInfo - networkManager.connectDevice(); + wifiSetup.connectToDevice(btDeviceInfo) print("**** connecting") pageStack.push(connectingPageComponent, {deviceName: btDeviceInfo.name}) } function setupDevice() { pageStack.pop(root, StackView.Immediate) - if (networkManager.manager.currentConnection) { - print("***** pushing WirelessSetupPage with networkManager:", networkManager) - var page = pageStack.push(Qt.resolvedUrl("WirelessSetupPage.qml"), { networkManagerController: networkManager, nymeaDiscovery: root.nymeaDiscovery } ) + if (wifiSetup.currentConnection) { + var page = pageStack.push(Qt.resolvedUrl("WirelessSetupPage.qml"), { wifiSetup: wifiSetup } ) page.done.connect(function() { pageStack.pop(root, StackView.Immediate); pageStack.pop(); }) } else { - var page = pageStack.push(Qt.resolvedUrl("ConnectWiFiPage.qml"), { networkManagerController: networkManager } ) + var page = pageStack.push(Qt.resolvedUrl("ConnectWiFiPage.qml"), { wifiSetup: wifiSetup } ) page.connected.connect(function() { setupDevice(); }) } } - Connections { - target: networkManager.manager - onInitializedChanged: { - if (networkManager.manager.initialized) { - setupDevice() - } else { - pageStack.pop(root) - } - } - - onConnectedChanged: { - if (!networkManager.manager.connected) { - pageStack.pop(root) - } - } - } ColumnLayout { anchors.fill: parent diff --git a/nymea-app/ui/connection/wifisetup/BoxInfoPage.qml b/nymea-app/ui/connection/wifisetup/BoxInfoPage.qml index 824aa7ca..4113db27 100644 --- a/nymea-app/ui/connection/wifisetup/BoxInfoPage.qml +++ b/nymea-app/ui/connection/wifisetup/BoxInfoPage.qml @@ -41,7 +41,7 @@ Page { onBackPressed: pageStack.pop() } - property var networkManagerController: null + property BtWiFiSetup wifiSetup: null ColumnLayout { anchors { left: parent.left; top: parent.top; right: parent.right } @@ -50,31 +50,31 @@ Page { Layout.fillWidth: true progressive: false text: qsTr("System UUID") - subText: networkManagerController.manager.modelNumber + subText: wifiSetup.modelNumber } NymeaSwipeDelegate { Layout.fillWidth: true progressive: false text: qsTr("Manufacturer") - subText: networkManagerController.manager.manufacturer + subText: wifiSetup.manufacturer } NymeaSwipeDelegate { Layout.fillWidth: true progressive: false text: qsTr("Software revision") - subText: networkManagerController.manager.softwareRevision + subText: wifiSetup.softwareRevision } NymeaSwipeDelegate { Layout.fillWidth: true progressive: false text: qsTr("Firmware revision") - subText: networkManagerController.manager.firmwareRevision + subText: wifiSetup.firmwareRevision } NymeaSwipeDelegate { Layout.fillWidth: true progressive: false text: qsTr("Hardware revision") - subText: networkManagerController.manager.hardwareRevision + subText: wifiSetup.hardwareRevision } } } diff --git a/nymea-app/ui/connection/wifisetup/ConnectWiFiPage.qml b/nymea-app/ui/connection/wifisetup/ConnectWiFiPage.qml index 2c1025fa..b1939d49 100644 --- a/nymea-app/ui/connection/wifisetup/ConnectWiFiPage.qml +++ b/nymea-app/ui/connection/wifisetup/ConnectWiFiPage.qml @@ -37,7 +37,7 @@ import Nymea 1.0 Page { id: root - property var networkManagerController: null + property BtWiFiSetup wifiSetup: null signal connected(); @@ -50,13 +50,13 @@ Page { HeaderButton { imageSource: "../images/info.svg" onClicked: { - pageStack.push(Qt.resolvedUrl("BoxInfoPage.qml"), {networkManagerController: root.networkManagerController}) + pageStack.push(Qt.resolvedUrl("BoxInfoPage.qml"), {wifiSetup: root.wifiSetup}) } } HeaderButton { imageSource: "../images/settings.svg" onClicked: { - pageStack.push(Qt.resolvedUrl("NetworkSettingsPage.qml"), {networkManagerController: root.networkManagerController}) + pageStack.push(Qt.resolvedUrl("NetworkSettingsPage.qml"), {wifiSetup: root.wifiSetup}) } } } @@ -69,14 +69,26 @@ Page { Layout.fillHeight: true model: WirelessAccessPointsProxy { - accessPoints: networkManagerController.manager.accessPoints + accessPoints: wifiSetup.accessPoints } clip: true + Timer { + interval: 5000 + repeat: true + onTriggered: wifiSetup.scanWiFi() + running: wifiSetup.accessPoints.count === 0 + } + + BusyIndicator { + anchors.centerIn: parent + visible: wifiSetup.accessPoints.count === 0 + running: visible + } + delegate: NymeaSwipeDelegate { width: parent.width text: model.ssid !== "" ? model.ssid : qsTr("Hidden Network") - enabled: !networkManagerController.manager.working subText: model.hostAddress iconColor: model.selectedNetwork ? Style.accentColor : "#808080" @@ -136,16 +148,16 @@ Page { property string macAddress Connections { - target: root.networkManagerController.manager + target: root.wifiSetup onCurrentConnectionChanged: { - if (root.networkManagerController.manager.currentConnection && root.networkManagerController.manager.currentConnection.ssid === authenticationPage.ssid) { + if (root.wifiSetup.currentConnection && root.wifiSetup.currentConnection.ssid === authenticationPage.ssid) { print("**** connected!") root.connected(); } } onWirelessStatusChanged: { - print("Wireless status changed:", networkManagerController.manager.networkStatus) - if (networkManagerController.manager.wirelessStatus === WirelessSetupManager.WirelessStatusFailed) { + print("Wireless status changed:", wifiSetup.networkStatus) + if (wifiSetup.wirelessStatus === BtWiFiSetup.WirelessStatusFailed) { wrongPasswordText.visible = true pageStack.pop(authenticationPage) } @@ -199,7 +211,7 @@ Page { text: qsTr("OK") enabled: passwordTextField.displayText.length >= 8 onClicked: { - root.networkManagerController.manager.connectWirelessNetwork(authenticationPage.ssid, passwordTextField.text) + root.wifiSetup.connectDeviceToWiFi(authenticationPage.ssid, passwordTextField.text) pageStack.push(connectingWifiWaitPageComponent, {ssid: authenticationPage.ssid }) } } diff --git a/nymea-app/ui/connection/wifisetup/NetworkSettingsPage.qml b/nymea-app/ui/connection/wifisetup/NetworkSettingsPage.qml index 27eef97a..fca42e47 100644 --- a/nymea-app/ui/connection/wifisetup/NetworkSettingsPage.qml +++ b/nymea-app/ui/connection/wifisetup/NetworkSettingsPage.qml @@ -41,7 +41,7 @@ Page { onBackPressed: pageStack.pop() } - property var networkManagerController: null + property BtWiFiSetup wifiSetup: null ColumnLayout { anchors { left: parent.left; top: parent.top; right: parent.right } @@ -49,17 +49,17 @@ Page { SwitchDelegate { Layout.fillWidth: true text: qsTr("Networking") - checked: networkManagerController.manager.networkingEnabled - onClicked: networkManagerController.manager.enableNetworking(checked) + checked: wifiSetup.networkingEnabled + onClicked: wifiSetup.networkingEnabled = checked } SwitchDelegate { Layout.fillWidth: true - enabled: networkManagerController.manager.networkingEnabled + enabled: wifiSetup.networkingEnabled text: qsTr("Wireless network") - checked: networkManagerController.manager.wirelessEnabled + checked: wifiSetup.wirelessEnabled onClicked: { - networkManagerController.manager.enableWireless(checked) + wifiSetup.wirelessEnabled = checked } } @@ -68,7 +68,7 @@ Page { Layout.leftMargin: app.margins Layout.rightMargin: app.margins text: qsTr("Trigger a wireless scan on the device.") - onClicked: networkManagerController.manager.performWifiScan() + onClicked: wifiSetup.scanWiFi() } } } diff --git a/nymea-app/ui/connection/wifisetup/WirelessSetupPage.qml b/nymea-app/ui/connection/wifisetup/WirelessSetupPage.qml index 00b0943d..abb1ce5a 100644 --- a/nymea-app/ui/connection/wifisetup/WirelessSetupPage.qml +++ b/nymea-app/ui/connection/wifisetup/WirelessSetupPage.qml @@ -37,8 +37,7 @@ import Nymea 1.0 Page { id: root - property var networkManagerController: null - property var nymeaDiscovery: null + property BtWiFiSetup wifiSetup: null signal done() @@ -51,25 +50,24 @@ Page { HeaderButton { imageSource: "../images/info.svg" onClicked: { - pageStack.push(Qt.resolvedUrl("BoxInfoPage.qml"), {networkManagerController: root.networkManagerController}) + pageStack.push(Qt.resolvedUrl("BoxInfoPage.qml"), {wifiSetup: root.wifiSetup}) } } HeaderButton { imageSource: "../images/settings.svg" onClicked: { - pageStack.push(Qt.resolvedUrl("NetworkSettingsPage.qml"), {networkManagerController: root.networkManagerController}) + pageStack.push(Qt.resolvedUrl("NetworkSettingsPage.qml"), {wifiSetup: root.wifiSetup}) } } } Component.onCompleted: { - print("created with networkmanagercontroller:", root.networkManagerController) updateConnectButton(); } Connections { - target: root.networkManagerController.manager - onErrorOccurred: { + target: root.wifiSetup + onWifiSetupError: { print("Error occurred", errorMessage) var errorDialog = Qt.createComponent(Qt.resolvedUrl("../components/ErrorDialog.qml")); var popup = errorDialog.createObject(app, {text: errorMessage}) @@ -82,25 +80,25 @@ Page { } Connections { - target: root.nymeadiscovery.nymeaHosts + target: nymeaDiscovery.nymeaHosts onCountChanged: updateConnectButton(); } function updateConnectButton() { - if (!root.networkManagerController.manager.currentConnection) { + if (!root.wifiSetup.currentConnection) { connectButton.url = ""; return; } // FIXME: We should rather look for the UUID here, but nymea-networkmanager doesn't support getting us the nymea uuid (yet) - for (var i = 0; i < root.nymeadiscovery.nymeaHosts.count; i++) { - for (var j = 0; j < root.nymeadiscovery.nymeaHosts.get(i).connections.count; j++) { - if (root.nymeadiscovery.nymeaHosts.get(i).connections.get(j).url.toString().indexOf(root.networkManagerController.manager.currentConnection.hostAddress) >= 0) { - connectButton.url = root.nymeadiscovery.nymeaHosts.get(i).connections.get(j).url + for (var i = 0; i < nymeaDiscovery.nymeaHosts.count; i++) { + for (var j = 0; j < nymeaDiscovery.nymeaHosts.get(i).connections.count; j++) { + if (nymeaDiscovery.nymeaHosts.get(i).connections.get(j).url.toString().indexOf(root.wifiSetup.currentConnection.hostAddress) >= 0) { + connectButton.host = nymeaDiscovery.nymeaHosts.get(i) return; } } - root.nymeadiscovery.nymeaHosts.get(i).connections.countChanged.connect(function() { + nymeaDiscovery.nymeaHosts.get(i).connections.countChanged.connect(function() { updateConnectButton(); }) } @@ -121,15 +119,15 @@ Page { Layout.fillWidth: true Layout.leftMargin: app.margins; Layout.rightMargin: app.margins wrapMode: Text.WordWrap - text: root.networkManagerController.manager.currentConnection - ? qsTr("Your %1:core is connected to %2").arg(app.systemName).arg(root.networkManagerController.manager.currentConnection.ssid) + text: root.wifiSetup.currentConnection + ? qsTr("Your %1:core is connected to %2").arg(app.systemName).arg(root.wifiSetup.currentConnection.ssid) : "" } Label { Layout.fillWidth: true Layout.leftMargin: app.margins; Layout.rightMargin: app.margins - text: qsTr("IP address: %1").arg(root.networkManagerController.manager.currentConnection.hostAddress) + text: qsTr("IP address: %1").arg(root.wifiSetup.currentConnection.hostAddress) elide: Text.ElideRight } @@ -147,13 +145,14 @@ Page { Button { id: connectButton - visible: url != "" + visible: host !== null Layout.fillWidth: true Layout.leftMargin: app.margins; Layout.rightMargin: app.margins text: qsTr("Connect to %1:core").arg(app.systemName) - property string url + property NymeaHost host: null onClicked: { - engine.jsonRpcClient.connectToHost(url) + print("connecting to", host) + engine.jsonRpcClient.connectToHost(host) } } @@ -162,7 +161,7 @@ Page { Layout.leftMargin: app.margins; Layout.rightMargin: app.margins text: qsTr("Change network") onClicked: { - var page = pageStack.push(Qt.resolvedUrl("ConnectWiFiPage.qml"), {networkManagerController: root.networkManagerController}) + var page = pageStack.push(Qt.resolvedUrl("ConnectWiFiPage.qml"), {wifiSetup: root.wifiSetup}) page.connected.connect(function() { pageStack.pop(root) })