From 007dfedc205468593849aeb47717b8266af92908 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20St=C3=BCrz?= Date: Thu, 14 Apr 2022 07:52:10 +0200 Subject: [PATCH] Fix broadcast sending and make command confirm optional for backwards compatibility --- .../integrationplugintcpcommander.cpp | 13 +++++++++- .../integrationplugintcpcommander.json | 9 +++++++ tcpcommander/tcpserver.cpp | 26 +++++++++++++++---- tcpcommander/tcpserver.h | 12 ++++++--- 4 files changed, 50 insertions(+), 10 deletions(-) diff --git a/tcpcommander/integrationplugintcpcommander.cpp b/tcpcommander/integrationplugintcpcommander.cpp index 7ddc4979..1827ff49 100644 --- a/tcpcommander/integrationplugintcpcommander.cpp +++ b/tcpcommander/integrationplugintcpcommander.cpp @@ -85,19 +85,30 @@ void IntegrationPluginTcpCommander::setupThing(ThingSetupInfo *info) // In case of reconfigure, make sure to re-setup the server delete tcpServer; } + tcpServer = new TcpServer(port, this); + tcpServer->setConfirmCommands(thing->setting(tcpServerSettingsConfirmCommandParamTypeId).toBool()); if (tcpServer->isValid()) { m_tcpServers.insert(thing, tcpServer); + connect(thing, &Thing::settingChanged, tcpServer, [=](const ParamTypeId ¶mTypeId, const QVariant &value){ + if (paramTypeId == tcpServerSettingsConfirmCommandParamTypeId) { + tcpServer->setConfirmCommands(value.toBool()); + } + }); + connect(tcpServer, &TcpServer::connectionCountChanged, this, &IntegrationPluginTcpCommander::onTcpServerConnectionCountChanged); connect(tcpServer, &TcpServer::commandReceived, this, &IntegrationPluginTcpCommander::onTcpServerCommandReceived); info->finish(Thing::ThingErrorNoError); + + // Set the initial connected state since the server is running thing->setStateValue("connected", true); return; } else { tcpServer->deleteLater(); qDebug(dcTCPCommander()) << "Could not open TCP Server"; - return info->finish(Thing::ThingErrorSetupFailed, QT_TR_NOOP("Error opening TCP port.")); + info->finish(Thing::ThingErrorSetupFailed, QT_TR_NOOP("Error opening TCP port.")); + return; } } } diff --git a/tcpcommander/integrationplugintcpcommander.json b/tcpcommander/integrationplugintcpcommander.json index bfaa766b..29244a33 100644 --- a/tcpcommander/integrationplugintcpcommander.json +++ b/tcpcommander/integrationplugintcpcommander.json @@ -89,6 +89,15 @@ "defaultValue": "22" } ], + "settingsTypes": [ + { + "id": "27b8a43a-186e-46e6-b2e5-b6fa1dfaaaa9", + "name": "confirmCommand", + "displayName": "Autoconfirm commands", + "type": "bool", + "defaultValue": false + } + ], "stateTypes": [ { "id": "a2eb1619-261c-45ee-9587-6b5994633ad0", diff --git a/tcpcommander/tcpserver.cpp b/tcpcommander/tcpserver.cpp index 42272237..f735f9be 100644 --- a/tcpcommander/tcpserver.cpp +++ b/tcpcommander/tcpserver.cpp @@ -61,11 +61,21 @@ TcpServer::~TcpServer() { } -bool TcpServer::isValid() +bool TcpServer::isValid() const { return m_tcpServer->isListening(); } +bool TcpServer::confirmCommands() const +{ + return m_confirmCommands; +} + +void TcpServer::setConfirmCommands(bool confirmCommands) +{ + m_confirmCommands = confirmCommands; +} + QHostAddress TcpServer::serverAddress() { return m_tcpServer->serverAddress(); @@ -76,7 +86,7 @@ int TcpServer::serverPort() return m_tcpServer->serverPort(); } -int TcpServer::connectionCount() +int TcpServer::connectionCount() const { return m_clients.count(); } @@ -85,16 +95,19 @@ bool TcpServer::sendCommand(const QString &clientIp, const QByteArray &data) { bool success = false; QHostAddress address(clientIp); + bool broadcast = false; + if (address == QHostAddress(QHostAddress::AnyIPv4) || address == QHostAddress(QHostAddress::Broadcast)) + broadcast = true; foreach (QTcpSocket *client, m_clients) { - if (address == QHostAddress(QHostAddress::AnyIPv4) || client->peerAddress() == address) { + if (broadcast || client->peerAddress() == address) { qint64 len = client->write(data); if (len == data.length()) { success = true; } } } - qCWarning(dcTCPCommander()) << "No client matching the destination IP" << address.toString(); + return success; } @@ -125,7 +138,10 @@ void TcpServer::readData() QTcpSocket *socket = static_cast(sender()); QByteArray data = socket->readAll(); qDebug(dcTCPCommander()) << "TCP Server data received: " << data; - socket->write("OK\n"); + if (m_confirmCommands) { + socket->write("OK\n"); + } + emit commandReceived(socket->peerAddress().toString(), data); } diff --git a/tcpcommander/tcpserver.h b/tcpcommander/tcpserver.h index e99cf1f6..bf384e79 100644 --- a/tcpcommander/tcpserver.h +++ b/tcpcommander/tcpserver.h @@ -43,12 +43,16 @@ public: explicit TcpServer(const quint16 &port, QObject *parent = nullptr); ~TcpServer(); - bool isValid(); - QHostAddress serverAddress(); + QHostAddress serverAddress(); int serverPort(); - int connectionCount(); + bool isValid() const; + + bool confirmCommands() const; + void setConfirmCommands(bool confirmCommands); + + int connectionCount() const; bool sendCommand(const QString &clientIp, const QByteArray &data); @@ -65,7 +69,7 @@ private slots: private: QTcpServer *m_tcpServer = nullptr; - + bool m_confirmCommands = false; QList m_clients; };