From db146a38d0022044f2aecc31b6570b33d489de1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20St=C3=BCrz?= Date: Thu, 29 Oct 2020 11:45:28 +0100 Subject: [PATCH] Remove settings and leave that to the stack using application --- .../backends/deconz/zigbeenetworkdeconz.cpp | 9 +- .../backends/deconz/zigbeenetworkdeconz.h | 3 +- .../backends/nxp/zigbeenetworknxp.cpp | 9 +- .../backends/nxp/zigbeenetworknxp.h | 4 +- libnymea-zigbee/zigbeenetwork.cpp | 105 +++++++++++------- libnymea-zigbee/zigbeenetwork.h | 20 +++- libnymea-zigbee/zigbeenetworkdatabase.cpp | 20 +++- libnymea-zigbee/zigbeenetworkdatabase.h | 4 + libnymea-zigbee/zigbeenetworkmanager.cpp | 6 +- libnymea-zigbee/zigbeenetworkmanager.h | 4 +- 10 files changed, 125 insertions(+), 59 deletions(-) diff --git a/libnymea-zigbee/backends/deconz/zigbeenetworkdeconz.cpp b/libnymea-zigbee/backends/deconz/zigbeenetworkdeconz.cpp index ae1c642..18d7475 100644 --- a/libnymea-zigbee/backends/deconz/zigbeenetworkdeconz.cpp +++ b/libnymea-zigbee/backends/deconz/zigbeenetworkdeconz.cpp @@ -32,8 +32,8 @@ #include -ZigbeeNetworkDeconz::ZigbeeNetworkDeconz(QObject *parent) : - ZigbeeNetwork(parent) +ZigbeeNetworkDeconz::ZigbeeNetworkDeconz(const QUuid &networkUuid, QObject *parent) : + ZigbeeNetwork(networkUuid, parent) { m_controller = new ZigbeeBridgeControllerDeconz(this); connect(m_controller, &ZigbeeBridgeControllerDeconz::availableChanged, this, &ZigbeeNetworkDeconz::onControllerAvailableChanged); @@ -59,6 +59,11 @@ ZigbeeBridgeController *ZigbeeNetworkDeconz::bridgeController() const return qobject_cast(m_controller); } +Zigbee::ZigbeeBackendType ZigbeeNetworkDeconz::backendType() const +{ + return Zigbee::ZigbeeBackendTypeDeconz; +} + ZigbeeNetworkReply *ZigbeeNetworkDeconz::sendRequest(const ZigbeeNetworkRequest &request) { ZigbeeNetworkReply *reply = createNetworkReply(request); diff --git a/libnymea-zigbee/backends/deconz/zigbeenetworkdeconz.h b/libnymea-zigbee/backends/deconz/zigbeenetworkdeconz.h index abd2b53..3e6d0e3 100644 --- a/libnymea-zigbee/backends/deconz/zigbeenetworkdeconz.h +++ b/libnymea-zigbee/backends/deconz/zigbeenetworkdeconz.h @@ -49,9 +49,10 @@ public: }; Q_ENUM(CreateNetworkState) - explicit ZigbeeNetworkDeconz(QObject *parent = nullptr); + explicit ZigbeeNetworkDeconz(const QUuid &networkUuid, QObject *parent = nullptr); ZigbeeBridgeController *bridgeController() const override; + Zigbee::ZigbeeBackendType backendType() const override; // Sending an APSDE-DATA.request, will be finished on APSDE-DATA.confirm ZigbeeNetworkReply *sendRequest(const ZigbeeNetworkRequest &request) override; diff --git a/libnymea-zigbee/backends/nxp/zigbeenetworknxp.cpp b/libnymea-zigbee/backends/nxp/zigbeenetworknxp.cpp index d02f15c..e8acec5 100644 --- a/libnymea-zigbee/backends/nxp/zigbeenetworknxp.cpp +++ b/libnymea-zigbee/backends/nxp/zigbeenetworknxp.cpp @@ -31,8 +31,8 @@ #include -ZigbeeNetworkNxp::ZigbeeNetworkNxp(QObject *parent) : - ZigbeeNetwork(parent) +ZigbeeNetworkNxp::ZigbeeNetworkNxp(const QUuid &networkUuid, QObject *parent) : + ZigbeeNetwork(networkUuid, parent) { m_controller = new ZigbeeBridgeControllerNxp(this); connect(m_controller, &ZigbeeBridgeControllerNxp::availableChanged, this, &ZigbeeNetworkNxp::onControllerAvailableChanged); @@ -71,6 +71,11 @@ ZigbeeBridgeController *ZigbeeNetworkNxp::bridgeController() const return qobject_cast(m_controller); } +Zigbee::ZigbeeBackendType ZigbeeNetworkNxp::backendType() const +{ + return Zigbee::ZigbeeBackendTypeNxp; +} + ZigbeeNetworkReply *ZigbeeNetworkNxp::sendRequest(const ZigbeeNetworkRequest &request) { ZigbeeNetworkReply *reply = createNetworkReply(request); diff --git a/libnymea-zigbee/backends/nxp/zigbeenetworknxp.h b/libnymea-zigbee/backends/nxp/zigbeenetworknxp.h index 205eb0d..8989b20 100644 --- a/libnymea-zigbee/backends/nxp/zigbeenetworknxp.h +++ b/libnymea-zigbee/backends/nxp/zigbeenetworknxp.h @@ -40,10 +40,10 @@ class ZigbeeNetworkNxp : public ZigbeeNetwork { Q_OBJECT public: - explicit ZigbeeNetworkNxp(QObject *parent = nullptr); + explicit ZigbeeNetworkNxp(const QUuid &networkUuid, QObject *parent = nullptr); ZigbeeBridgeController *bridgeController() const override; - + Zigbee::ZigbeeBackendType backendType() const override; ZigbeeNetworkReply *sendRequest(const ZigbeeNetworkRequest &request) override; ZigbeeNetworkReply *setPermitJoin(quint16 shortAddress = Zigbee::BroadcastAddressAllRouters, quint8 duration = 0xfe); diff --git a/libnymea-zigbee/zigbeenetwork.cpp b/libnymea-zigbee/zigbeenetwork.cpp index 2cba55b..3dc76d4 100644 --- a/libnymea-zigbee/zigbeenetwork.cpp +++ b/libnymea-zigbee/zigbeenetwork.cpp @@ -34,12 +34,18 @@ #include #include -ZigbeeNetwork::ZigbeeNetwork(QObject *parent) : - QObject(parent) +ZigbeeNetwork::ZigbeeNetwork(const QUuid &networkUuid, QObject *parent) : + QObject(parent), + m_networkUuid(networkUuid) { } +QUuid ZigbeeNetwork::networkUuid() const +{ + return m_networkUuid; +} + ZigbeeNetwork::State ZigbeeNetwork::state() const { return m_state; @@ -50,18 +56,17 @@ ZigbeeNetwork::Error ZigbeeNetwork::error() const return m_error; } -QString ZigbeeNetwork::settingsFilenName() const +QDir ZigbeeNetwork::settingsDirectory() const { - return m_settingsFileName; + return m_settingsDirectory; } -void ZigbeeNetwork::setSettingsFileName(const QString &settingsFileName) +void ZigbeeNetwork::setSettingsDirectory(const QDir &settingsDirectory) { - qCDebug(dcZigbeeNetwork()) << "Using settings file" << settingsFileName; - m_settingsFileName = settingsFileName; - emit settingsFileNameChanged(m_settingsFileName); + qCDebug(dcZigbeeNetwork()) << "Using settings directory" << settingsDirectory.absolutePath(); + m_settingsDirectory = settingsDirectory; + emit settingsDirectoryChanged(m_settingsDirectory); - m_settingsDirectory = QDir(QFileInfo(m_settingsFileName).absolutePath()); bridgeController()->setSettingsDirectory(m_settingsDirectory); } @@ -93,6 +98,20 @@ void ZigbeeNetwork::setSerialBaudrate(qint32 baudrate) emit serialBaudrateChanged(m_serialBaudrate); } +ZigbeeAddress ZigbeeNetwork::macAddress() const +{ + return m_macAddress; +} + +void ZigbeeNetwork::setMacAddress(const ZigbeeAddress &zigbeeAddress) +{ + if (m_macAddress == zigbeeAddress) + return; + + m_macAddress = zigbeeAddress; + emit macAddressChanged(m_macAddress); +} + quint16 ZigbeeNetwork::panId() { return m_panId; @@ -315,39 +334,39 @@ ZigbeeNode *ZigbeeNetwork::createNode(quint16 shortAddress, const ZigbeeAddress void ZigbeeNetwork::saveNetwork() { - qCDebug(dcZigbeeNetwork()) << "Save current network configuration to" << m_settingsFileName; - QSettings settings(m_settingsFileName, QSettings::IniFormat, this); - settings.beginGroup("ZigbeeNetwork"); - settings.setValue("panId", panId()); - settings.setValue("channel", channel()); - settings.setValue("networkKey", securityConfiguration().networkKey().toString()); - settings.setValue("trustCenterLinkKey", securityConfiguration().globalTrustCenterLinkKey().toString()); - settings.endGroup(); +// qCDebug(dcZigbeeNetwork()) << "Save current network configuration to" << m_settingsFileName; +// QSettings settings(m_settingsFileName, QSettings::IniFormat, this); +// settings.beginGroup("ZigbeeNetwork"); +// settings.setValue("panId", panId()); +// settings.setValue("channel", channel()); +// settings.setValue("networkKey", securityConfiguration().networkKey().toString()); +// settings.setValue("trustCenterLinkKey", securityConfiguration().globalTrustCenterLinkKey().toString()); +// settings.endGroup(); } void ZigbeeNetwork::loadNetwork() { - qCDebug(dcZigbeeNetwork()) << "Load current network configuration from" << m_settingsFileName; - + qCDebug(dcZigbeeNetwork()) << "Loading network from settings directory" << m_settingsDirectory.absolutePath(); if (!m_database) { - QDir storagePath = QFileInfo(m_settingsFileName).absoluteDir(); - m_database = new ZigbeeNetworkDatabase(this, storagePath.absolutePath() + QDir::separator() + "zigbee-network.db", this); + QString networkDatabaseFileName = m_settingsDirectory.absolutePath() + QDir::separator() + QString("zigbee-network-%1.db").arg(m_networkUuid.toString()); + qCDebug(dcZigbeeNetwork()) << "Using ZigBee network database" << QFileInfo(networkDatabaseFileName).fileName(); + m_database = new ZigbeeNetworkDatabase(this, networkDatabaseFileName, this); } - QSettings settings(m_settingsFileName, QSettings::IniFormat, this); - settings.beginGroup("ZigbeeNetwork"); - quint16 panId = static_cast(settings.value("panId", 0).toUInt()); - setPanId(panId); - setChannel(settings.value("channel", 0).toUInt()); - ZigbeeNetworkKey netKey(settings.value("networkKey", QString()).toString()); - if (netKey.isValid()) - m_securityConfiguration.setNetworkKey(netKey); +// QSettings settings(m_settingsFileName, QSettings::IniFormat, this); +// settings.beginGroup("ZigbeeNetwork"); +// quint16 panId = static_cast(settings.value("panId", 0).toUInt()); +// setPanId(panId); +// setChannel(settings.value("channel", 0).toUInt()); +// ZigbeeNetworkKey netKey(settings.value("networkKey", QString()).toString()); +// if (netKey.isValid()) +// m_securityConfiguration.setNetworkKey(netKey); - ZigbeeNetworkKey tcKey(settings.value("trustCenterLinkKey", QString("5A6967426565416C6C69616E63653039")).toString()); - if (!tcKey.isValid()) - m_securityConfiguration.setGlobalTrustCenterlinkKey(tcKey); +// ZigbeeNetworkKey tcKey(settings.value("trustCenterLinkKey", QString("5A6967426565416C6C69616E63653039")).toString()); +// if (!tcKey.isValid()) +// m_securityConfiguration.setGlobalTrustCenterlinkKey(tcKey); - settings.endGroup(); // Network +// settings.endGroup(); // Network QList nodes = m_database->loadNodes(); foreach (ZigbeeNode *node, nodes) { @@ -358,25 +377,32 @@ void ZigbeeNetwork::loadNetwork() void ZigbeeNetwork::clearSettings() { + // Note: this clears the database qCDebug(dcZigbeeNetwork()) << "Remove zigbee nodes from network"; foreach (ZigbeeNode *node, m_nodes) { removeNode(node); } + qCDebug(dcZigbeeNetwork()) << "Clear all uninitialized nodes"; foreach (ZigbeeNode *node, m_uninitializedNodes) { + qCDebug(dcZigbeeNetwork()) << "Remove uninitialized" << node; m_uninitializedNodes.removeAll(node); node->deleteLater(); } - qCDebug(dcZigbeeNetwork()) << "Clear network settings" << m_settingsFileName; - QSettings settings(m_settingsFileName, QSettings::IniFormat, this); - settings.clear(); + qCDebug(dcZigbeeNetwork()) << "Delete network database"; + if (m_database) { + if (!m_database->wipeDatabase()) { + qCWarning(dcZigbeeNetwork()) << "Failed to wipe the network database" << m_database->databaseName(); + } + } // Reset network configurations qCDebug(dcZigbeeNetwork()) << "Clear network properties"; - m_extendedPanId = 0; - m_channel = 0; - m_securityConfiguration.clear(); + setExtendedPanId(0); + setChannel(0); + setSecurityConfiguration(ZigbeeSecurityConfiguration()); + setState(StateUninitialized); m_nodeType = ZigbeeDeviceProfile::NodeTypeCoordinator; } @@ -512,6 +538,7 @@ void ZigbeeNetwork::finishNetworkReply(ZigbeeNetworkReply *reply, ZigbeeNetworkR qCWarning(dcZigbeeNetwork()) << "Failed to send request to device" << reply->request() << reply->error(); break; } + // Stop the timer reply->m_timer->stop(); diff --git a/libnymea-zigbee/zigbeenetwork.h b/libnymea-zigbee/zigbeenetwork.h index 51de183..ca71ef2 100644 --- a/libnymea-zigbee/zigbeenetwork.h +++ b/libnymea-zigbee/zigbeenetwork.h @@ -29,9 +29,9 @@ #define ZIGBEENETWORK_H #include +#include #include #include - #include #include "zigbeenode.h" @@ -64,16 +64,19 @@ public: }; Q_ENUM(Error) - explicit ZigbeeNetwork(QObject *parent = nullptr); + explicit ZigbeeNetwork(const QUuid &networkUuid, QObject *parent = nullptr); + + QUuid networkUuid() const; State state() const; Error error() const; - QString settingsFilenName() const; - void setSettingsFileName(const QString &settingsFileName); + QDir settingsDirectory() const; + void setSettingsDirectory(const QDir &settingsDirectory); virtual ZigbeeBridgeController *bridgeController() const = 0; + virtual Zigbee::ZigbeeBackendType backendType() const = 0; // Serial port configuration QString serialPortName() const; @@ -82,6 +85,9 @@ public: qint32 serialBaudrate() const; void setSerialBaudrate(qint32 baudrate); + ZigbeeAddress macAddress() const; + void setMacAddress(const ZigbeeAddress &zigbeeAddress); + // Network configurations quint16 panId(); void setPanId(quint16 panId); @@ -119,11 +125,13 @@ public: void removeZigbeeNode(const ZigbeeAddress &address); private: + QUuid m_networkUuid; State m_state = StateUninitialized; // Serial port configuration QString m_serialPortName = "/dev/ttyUSB0"; qint32 m_serialBaudrate = 115200; + ZigbeeAddress m_macAddress; // Continuouse ASP sequence number for network requests quint8 m_sequenceNumber = 0; @@ -136,7 +144,6 @@ private: ZigbeeDeviceProfile::NodeType m_nodeType = ZigbeeDeviceProfile::NodeTypeCoordinator; // Network storage - QString m_settingsFileName = "/etc/nymea/nymea-zigbee.conf"; QDir m_settingsDirectory = QDir("/etc/nymea/"); QList m_nodes; QList m_uninitializedNodes; @@ -181,9 +188,10 @@ protected: void startWaitingReply(ZigbeeNetworkReply *reply); signals: - void settingsFileNameChanged(const QString &settingsFileName); + void settingsDirectoryChanged(const QDir &settingsDirectory); void serialPortNameChanged(const QString &serialPortName); void serialBaudrateChanged(qint32 serialBaudrate); + void macAddressChanged(const ZigbeeAddress &macAddress); void panIdChanged(quint16 panId); void extendedPanIdChanged(quint64 extendedPanId); diff --git a/libnymea-zigbee/zigbeenetworkdatabase.cpp b/libnymea-zigbee/zigbeenetworkdatabase.cpp index db77f27..a852ff7 100644 --- a/libnymea-zigbee/zigbeenetworkdatabase.cpp +++ b/libnymea-zigbee/zigbeenetworkdatabase.cpp @@ -36,10 +36,11 @@ ZigbeeNetworkDatabase::ZigbeeNetworkDatabase(ZigbeeNetwork *network, const QString &databaseName, QObject *parent) : QObject(parent), - m_network(network) + m_network(network), + m_databaseName(databaseName) { m_db = QSqlDatabase::addDatabase(QStringLiteral("QSQLITE"), "zigbee"); - m_db.setDatabaseName(databaseName); + m_db.setDatabaseName(m_databaseName); qCDebug(dcZigbeeNetworkDatabase()) << "Opening zigbee network database" << m_db.databaseName(); if (!m_db.isValid()) { @@ -63,6 +64,11 @@ ZigbeeNetworkDatabase::~ZigbeeNetworkDatabase() } } +QString ZigbeeNetworkDatabase::databaseName() const +{ + return m_databaseName; +} + QList ZigbeeNetworkDatabase::loadNodes() { qCDebug(dcZigbeeNetworkDatabase()) << "Loading nodes from database" << m_db.databaseName(); @@ -177,6 +183,16 @@ bool ZigbeeNetworkDatabase::wipeDatabase() qCWarning(dcZigbeeNetworkDatabase()) << "Could not delete all node database entries." << m_db.lastError().databaseText() << m_db.lastError().driverText(); return false; } + m_db.close(); + + // Delete database file + QFile databaseFile(m_databaseName); + if (databaseFile.exists()) { + if (!databaseFile.remove()) { + qCWarning(dcZigbeeNetworkDatabase()) << "Could not delete database file" << m_databaseName; + return false; + } + } return true; } diff --git a/libnymea-zigbee/zigbeenetworkdatabase.h b/libnymea-zigbee/zigbeenetworkdatabase.h index bab99d4..3f1d35b 100644 --- a/libnymea-zigbee/zigbeenetworkdatabase.h +++ b/libnymea-zigbee/zigbeenetworkdatabase.h @@ -46,11 +46,15 @@ public: explicit ZigbeeNetworkDatabase(ZigbeeNetwork *network, const QString &databaseName, QObject *parent = nullptr); ~ZigbeeNetworkDatabase(); + QString databaseName() const; + QList loadNodes(); + bool wipeDatabase(); private: ZigbeeNetwork *m_network = nullptr; + QString m_databaseName; QSqlDatabase m_db; bool initDatabase(); diff --git a/libnymea-zigbee/zigbeenetworkmanager.cpp b/libnymea-zigbee/zigbeenetworkmanager.cpp index 700af52..b76be8f 100644 --- a/libnymea-zigbee/zigbeenetworkmanager.cpp +++ b/libnymea-zigbee/zigbeenetworkmanager.cpp @@ -38,16 +38,16 @@ QStringList ZigbeeNetworkManager::availableZigbeeBackendTypes() return {"deCONZ", "NXP"}; } -ZigbeeNetwork *ZigbeeNetworkManager::createZigbeeNetwork(Zigbee::ZigbeeBackendType backend, QObject *parent) +ZigbeeNetwork *ZigbeeNetworkManager::createZigbeeNetwork(const QUuid &networkUuid, Zigbee::ZigbeeBackendType backend, QObject *parent) { // Note: required for generating random PAN ID srand(static_cast(QDateTime::currentMSecsSinceEpoch() / 1000)); switch (backend) { case Zigbee::ZigbeeBackendTypeNxp: - return qobject_cast(new ZigbeeNetworkNxp(parent)); + return qobject_cast(new ZigbeeNetworkNxp(networkUuid, parent)); case Zigbee::ZigbeeBackendTypeDeconz: - return qobject_cast(new ZigbeeNetworkDeconz(parent)); + return qobject_cast(new ZigbeeNetworkDeconz(networkUuid, parent)); } return nullptr; diff --git a/libnymea-zigbee/zigbeenetworkmanager.h b/libnymea-zigbee/zigbeenetworkmanager.h index 9b4a5cc..7b3c449 100644 --- a/libnymea-zigbee/zigbeenetworkmanager.h +++ b/libnymea-zigbee/zigbeenetworkmanager.h @@ -30,8 +30,8 @@ #include -#include "zigbeeuartadapter.h" #include "zigbeenetwork.h" +#include "zigbeeuartadapter.h" class ZigbeeNetworkManager { @@ -39,7 +39,7 @@ class ZigbeeNetworkManager public: static QStringList availableZigbeeBackendTypes(); - static ZigbeeNetwork *createZigbeeNetwork(Zigbee::ZigbeeBackendType backend, QObject *parent = nullptr); + static ZigbeeNetwork *createZigbeeNetwork(const QUuid &networkUuid, Zigbee::ZigbeeBackendType backend, QObject *parent = nullptr); }; Q_DECLARE_METATYPE(ZigbeeNetworkManager)