From 9d60f7f2bad05fcadd9d9d8b01fdcc9a94a712be Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Mon, 30 Dec 2013 20:04:50 +0100 Subject: [PATCH] some more work on the whole structure --- libhive/deviceclass.cpp | 13 ++++- libhive/deviceclass.h | 14 ++--- libhive/deviceplugin.h | 1 + server/devicemanager.cpp | 35 ++++++++++++ server/devicemanager.h | 34 +++++++++++ server/hivecore.cpp | 120 ++------------------------------------- server/hivecore.h | 24 ++------ server/jsonrpcserver.cpp | 64 ++++++++++++++++++++- server/jsonrpcserver.h | 12 +++- server/server.pro | 8 ++- server/tcpserver.cpp | 17 ++++-- server/tcpserver.h | 11 ++-- 12 files changed, 192 insertions(+), 161 deletions(-) create mode 100644 server/devicemanager.cpp create mode 100644 server/devicemanager.h diff --git a/libhive/deviceclass.cpp b/libhive/deviceclass.cpp index 3bdcde2d..a8bd3406 100644 --- a/libhive/deviceclass.cpp +++ b/libhive/deviceclass.cpp @@ -1,7 +1,6 @@ #include "deviceclass.h" -DeviceClass::DeviceClass(const QUuid &id, QObject *parent): - QObject(parent), +DeviceClass::DeviceClass(const QUuid &id): m_id(id) { @@ -16,3 +15,13 @@ QUuid DeviceClass::id() const { return m_id; } + +QString DeviceClass::name() const +{ + return m_name; +} + +void DeviceClass::setName(const QString &name) +{ + m_name = name; +} diff --git a/libhive/deviceclass.h b/libhive/deviceclass.h index 9b832f7d..15e6fdad 100644 --- a/libhive/deviceclass.h +++ b/libhive/deviceclass.h @@ -1,22 +1,22 @@ #ifndef DEVICECLASS_H #define DEVICECLASS_H -#include #include -class DeviceClass: public QObject +class DeviceClass { - Q_OBJECT - Q_PROPERTY(QUuid id READ id CONSTANT) - public: - DeviceClass(const QUuid &id, QObject *parent = 0); + DeviceClass(const QUuid &id); virtual ~DeviceClass(); - virtual QUuid id() const; + QUuid id() const; + + QString name() const; + void setName(const QString &name); private: QUuid m_id; + QString m_name; }; #endif diff --git a/libhive/deviceplugin.h b/libhive/deviceplugin.h index 95d9e696..614f292c 100644 --- a/libhive/deviceplugin.h +++ b/libhive/deviceplugin.h @@ -13,6 +13,7 @@ public: virtual ~DevicePlugin(); virtual QList supportedDevices() const = 0; + }; #endif diff --git a/server/devicemanager.cpp b/server/devicemanager.cpp new file mode 100644 index 00000000..85596cb7 --- /dev/null +++ b/server/devicemanager.cpp @@ -0,0 +1,35 @@ +#include "devicemanager.h" + +#include "radio433.h" + +#include "device.h" +#include "deviceclass.h" +#include "deviceplugin.h" + +#include "deviceplugins/rfswitch/rfswitch.h" + +DeviceManager::DeviceManager(QObject *parent) : + QObject(parent) +{ + + m_radio433 = new Radio433(this); + + + // TODO: load dynamically + RfSwitch *rfSwitch = new RfSwitch(this); + m_supportedDevices.append(rfSwitch->supportedDevices()); + m_devicePlugins.append(rfSwitch); + + +} + +QList DeviceManager::supportedDevices() +{ + return m_supportedDevices; +} + +QList DeviceManager::devices() const +{ + return m_devices; +} + diff --git a/server/devicemanager.h b/server/devicemanager.h new file mode 100644 index 00000000..08267c3e --- /dev/null +++ b/server/devicemanager.h @@ -0,0 +1,34 @@ +#ifndef DEVICEMANAGER_H +#define DEVICEMANAGER_H + +#include "deviceclass.h" + +#include + +class Device; +class DevicePlugin; +class Radio433; + +class DeviceManager : public QObject +{ + Q_OBJECT +public: + explicit DeviceManager(QObject *parent = 0); + + QList supportedDevices(); + + QList devices() const; + +signals: + +public slots: + +private: + QList m_supportedDevices; + QList m_devices; + QList m_devicePlugins; + + Radio433* m_radio433; +}; + +#endif // DEVICEMANAGER_H diff --git a/server/hivecore.cpp b/server/hivecore.cpp index 7fc8b9c6..c9a708bf 100644 --- a/server/hivecore.cpp +++ b/server/hivecore.cpp @@ -1,8 +1,6 @@ #include "hivecore.h" #include "jsonrpcserver.h" - -#include "device.h" -#include "deviceclass.h" +#include "devicemanager.h" #include @@ -16,127 +14,19 @@ HiveCore *HiveCore::instance() return s_instance; } -QList HiveCore::devices() const +DeviceManager *HiveCore::deviceManager() const { - return m_devices; + return m_deviceManager; } HiveCore::HiveCore(QObject *parent) : QObject(parent) { - // create a fake device - m_devices.append(new Device(this)); + m_deviceManager = new DeviceManager(this); + // start the server m_jsonServer = new JsonRPCServer(this); - m_radio433 = new Radio433(this); - - //============================================== - int pulseLenght = 350; - QList signal; - //sync - signal.append(pulseLenght); - signal.append(pulseLenght*31); - - //============================================== - // 0 - signal.append(pulseLenght); - signal.append(pulseLenght*3); - // 1 - signal.append(pulseLenght*3); - signal.append(pulseLenght); - - // 0 - signal.append(pulseLenght); - signal.append(pulseLenght*3); - // 1 - signal.append(pulseLenght*3); - signal.append(pulseLenght); - - // 0 - signal.append(pulseLenght); - signal.append(pulseLenght*3); - // 1 - signal.append(pulseLenght*3); - signal.append(pulseLenght); - - // 0 - signal.append(pulseLenght); - signal.append(pulseLenght*3); - // 1 - signal.append(pulseLenght*3); - signal.append(pulseLenght); - - // 0 - signal.append(pulseLenght); - signal.append(pulseLenght*3); - // 1 - signal.append(pulseLenght*3); - signal.append(pulseLenght); - //============================================== - // 0 - signal.append(pulseLenght); - signal.append(pulseLenght*3); - // 1 - signal.append(pulseLenght*3); - signal.append(pulseLenght); - - // 0 - signal.append(pulseLenght); - signal.append(pulseLenght*3); - // 1 - signal.append(pulseLenght*3); - signal.append(pulseLenght); - - // 0 - signal.append(pulseLenght); - signal.append(pulseLenght*3); - // 1 - signal.append(pulseLenght*3); - signal.append(pulseLenght); - - - // 0 - signal.append(pulseLenght); - signal.append(pulseLenght*3); - // 0 - signal.append(pulseLenght); - signal.append(pulseLenght*3); - - - // 0 - signal.append(pulseLenght); - signal.append(pulseLenght*3); - // 1 - signal.append(pulseLenght*3); - signal.append(pulseLenght); - //============================================== - - // 0 - signal.append(pulseLenght); - signal.append(pulseLenght*3); - // 1 - signal.append(pulseLenght*3); - signal.append(pulseLenght); - - // 0 - signal.append(pulseLenght); - signal.append(pulseLenght*3); - // 0 - signal.append(pulseLenght); - signal.append(pulseLenght*3); - //============================================== - - qDebug() << "sendsignal"; - - m_radio433->sendData(signal); - m_radio433->sendData(signal); - m_radio433->sendData(signal); - m_radio433->sendData(signal); - - - - } diff --git a/server/hivecore.h b/server/hivecore.h index bacb590b..726f7581 100644 --- a/server/hivecore.h +++ b/server/hivecore.h @@ -2,40 +2,24 @@ #define HIVECORE_H #include -#include class JsonRPCServer; -class Device; -class DeviceClass; +class DeviceManager; class HiveCore : public QObject { Q_OBJECT public: static HiveCore* instance(); - - QList devices() const; + + DeviceManager* deviceManager() const; private: explicit HiveCore(QObject *parent = 0); static HiveCore *s_instance; JsonRPCServer *m_jsonServer; - Radio433 *m_radio433; - -// Server *m_server; -// RadioReciver *m_reciver; -// RadioSender *m_sender; -// DeviceManager *m_deviceManager; -// JsonHandler *m_jsonHandler; - -signals: - -public slots: - -private: - QList m_supportedDevices; - QList m_devices; + DeviceManager *m_deviceManager; }; #endif // HIVECORE_H diff --git a/server/jsonrpcserver.cpp b/server/jsonrpcserver.cpp index f2cc0a8d..a905dcfd 100644 --- a/server/jsonrpcserver.cpp +++ b/server/jsonrpcserver.cpp @@ -2,16 +2,22 @@ #include "tcpserver.h" +#include "hivecore.h" +#include "devicemanager.h" +#include "deviceclass.h" + #include +#include JsonRPCServer::JsonRPCServer(QObject *parent): + QObject(parent), m_tcpServer(new TcpServer(this)) { connect(m_tcpServer, &TcpServer::jsonDataAvailable, this, &JsonRPCServer::processData); m_tcpServer->startServer(); } -void JsonRPCServer::processData(const QByteArray &jsonData) +void JsonRPCServer::processData(int clientId, const QByteArray &jsonData) { QJsonParseError error; QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData, &error); @@ -21,8 +27,42 @@ void JsonRPCServer::processData(const QByteArray &jsonData) } qDebug() << "-------------------------\n" << jsonDoc.toJson(); - QVariantMap command = jsonDoc.toVariant().toMap(); - QVariantMap params = jsonDoc.toVariant().toMap().value("params").toMap(); + QVariantMap message = jsonDoc.toVariant().toMap(); + + bool success; + int commandId = message.value("id").toInt(&success); + if (!success) { + qWarning() << "Error parsing command. Missing \"id\":" << jsonData; + return; + } + + QStringList commandList = message.value("method").toString().split('.'); + if (commandList.count() != 2) { + qWarning() << "Error parsing method.\nGot:" << message.value("method").toString() << "\nExpected: \"Namespace.method\""; + return; + } + + QString targetNamspace = commandList.first(); + QString method = commandList.last(); + QVariantMap params = message.value("params").toMap(); + + qDebug() << "got:" << targetNamspace << method << params; + emit commandReceived(targetNamspace, method, params); + + if (targetNamspace == "Devices") { + if (method == "GetSupportedDevices") { + qDebug() << "getSupportedDevices"; + QVariantMap params; + QVariantList supportedDeviceList; + foreach (const DeviceClass &deviceClass, HiveCore::instance()->deviceManager()->supportedDevices()) { + supportedDeviceList.append(packDeviceClass(deviceClass)); + } + params.insert("deviceClasses", supportedDeviceList); + sendResponse(clientId, commandId, params); + } + } else { + qDebug() << "got unknown namespace" << targetNamspace; + } //DeviceJsonPlugin plugin; // {: "name", : "doBla", : "int", { : "name", ... }} @@ -38,4 +78,22 @@ void JsonRPCServer::processData(const QByteArray &jsonData) } +QVariantMap JsonRPCServer::packDeviceClass(const DeviceClass &deviceClass) +{ + QVariantMap variant; + variant.insert("name", deviceClass.name()); + variant.insert("id", deviceClass.id()); + return variant; +} + +void JsonRPCServer::sendResponse(int clientId, int commandId, const QVariantMap ¶ms) +{ + QVariantMap rsp; + rsp.insert("id", commandId); + rsp.insert("params", params); + + QJsonDocument jsonDoc = QJsonDocument::fromVariant(rsp); + m_tcpServer->sendResponse(clientId, jsonDoc.toJson()); +} + diff --git a/server/jsonrpcserver.h b/server/jsonrpcserver.h index 89bb6763..0a01d626 100644 --- a/server/jsonrpcserver.h +++ b/server/jsonrpcserver.h @@ -1,7 +1,11 @@ #ifndef JSONRPCSERVER_H #define JSONRPCSERVER_H +#include "deviceclass.h" + #include +#include +#include class TcpServer; @@ -12,9 +16,15 @@ public: JsonRPCServer(QObject *parent = 0); signals: + void commandReceived(const QString &targetNamespace, const QString &command, const QVariantMap ¶ms); private slots: - void processData(const QByteArray &jsonData); + void processData(int clientId, const QByteArray &jsonData); + +private: + QVariantMap packDeviceClass(const DeviceClass &deviceClass); + + void sendResponse(int clientId, int commandId, const QVariantMap ¶ms); private: TcpServer *m_tcpServer; diff --git a/server/server.pro b/server/server.pro index 88f169b5..76cfc0fd 100644 --- a/server/server.pro +++ b/server/server.pro @@ -15,10 +15,14 @@ SOURCES += main.cpp \ jsonrpcserver.cpp \ radio433.cpp \ tcpserver.cpp \ - gpio.cpp + gpio.cpp \ + deviceplugins/rfswitch/rfswitch.cpp \ + devicemanager.cpp \ HEADERS += hivecore.h \ jsonrpcserver.h \ radio433.h \ tcpserver.h \ - gpio.h + gpio.h \ + deviceplugins/rfswitch/rfswitch.h \ + devicemanager.h \ diff --git a/server/tcpserver.cpp b/server/tcpserver.cpp index 44f37617..4fb4234d 100644 --- a/server/tcpserver.cpp +++ b/server/tcpserver.cpp @@ -17,6 +17,14 @@ TcpServer::TcpServer(QObject *parent) : } +void TcpServer::sendResponse(int clientId, const QByteArray &data) +{ + QTcpSocket *client = m_clientList.value(clientId); + if (client) { + client->write(data); + } +} + void TcpServer::newClientConnected() { // got a new client connected @@ -25,7 +33,7 @@ void TcpServer::newClientConnected() qDebug() << "new client connected:" << newConnection->peerAddress().toString(); // append the new client to the client list - m_clientList.append(newConnection); + m_clientList.insert(m_clientList.count(), newConnection); connect(newConnection, SIGNAL(readyRead()),this,SLOT(readPackage())); connect(newConnection,SIGNAL(disconnected()),this,SLOT(clientDisconnected())); @@ -42,9 +50,8 @@ void TcpServer::readPackage() QByteArray dataLine = client->readLine(); qDebug() << "line in:" << dataLine; message.append(dataLine); - if(dataLine.endsWith("}\r")){ - qDebug() << message; - emit jsonDataAvailable(message); + if(dataLine.endsWith('\n')){ + emit jsonDataAvailable(m_clientList.key(client), message); message.clear(); } } @@ -64,7 +71,7 @@ bool TcpServer::startServer() if(server->listen(address, 1234)) { qDebug() << "server listening on" << address.toString(); connect(server, SIGNAL(newConnection()), SLOT(newClientConnected())); - m_serverList.append(server); + m_serverList.insert(m_serverList.count(), server); } else { qDebug() << "ERROR: can not listening to" << address.toString(); delete server; diff --git a/server/tcpserver.h b/server/tcpserver.h index 70f002e8..04029845 100644 --- a/server/tcpserver.h +++ b/server/tcpserver.h @@ -12,13 +12,14 @@ class TcpServer : public QObject public: explicit TcpServer(QObject *parent = 0); -private: - QList m_serverList; - QList m_clientList; + void sendResponse(int clientId, const QByteArray &data); +private: + QHash m_serverList; + QHash m_clientList; signals: - void jsonDataAvailable(const QByteArray &data); + void jsonDataAvailable(int clientId, const QByteArray &data); private slots: void newClientConnected(); @@ -29,8 +30,6 @@ public slots: bool startServer(); bool stopServer(); void sendToAll(QByteArray data); - - }; #endif // TCPSERVER_H