Merge pull request #7 from guh/add-tcp-commander

Added TCP Commander
This commit is contained in:
Simon Stürz 2017-10-03 18:39:22 +02:00 committed by GitHub
commit dda459e8ce
15 changed files with 784 additions and 2251 deletions

6
debian/changelog vendored
View File

@ -1,3 +1,9 @@
guh-plugins (0.1.0+201710031827) UNRELEASED; urgency=medium
*
-- <timon@guh-plugins-guh-builder-xenial-amd64-amd64.lxd> Tue, 03 Oct 2017 16:27:01 +0000
guh-plugins (0.1.0) xenial; urgency=medium
* Add metapackages

18
debian/control vendored
View File

@ -438,7 +438,7 @@ Architecture: any
Depends: ${shlibs:Depends},
${misc:Depends},
guh-plugins-translations,
Description: guh.io plugin for udpcommander
Description: guh.io plugin for UDP commander
The guh daemon is a plugin based IoT (Internet of Things) server. The
server works like a translator for devices, things and services and
allows them to interact.
@ -523,6 +523,21 @@ Description: guh.io plugin for ws2812
This package will install the guh.io plugin for ws2812
Package: guh-plugin-tcpcommander
Architecture: any
Depends: ${shlibs:Depends},
${misc:Depends},
guh-plugins-translations,
Description: guh.io plugin for TCP commander
The guh daemon is a plugin based IoT (Internet of Things) server. The
server works like a translator for devices, things and services and
allows them to interact.
With the powerful rule engine you are able to connect any device available
in the system and create individual scenes and behaviors for your environment.
.
This package will install the guh.io plugin for TCP commander
Package: guh-plugins-translations
Section: misc
Architecture: all
@ -575,6 +590,7 @@ Architecture: all
Depends: guh-plugin-lircd,
guh-plugin-commandlauncher,
guh-plugin-udpcommander,
guh-plugin-tcpcommander,
guh-plugin-genericelements,
guh-plugin-avahimonitor,
guh-plugin-gpio,

1
debian/copyright vendored
View File

@ -31,6 +31,7 @@ Copyright: 2017, Michael Zanetti <michael.zanetti@guh.io>
Files: denon/*
orderbutton/*
ws2812/*
tcpcommander/*
License: LGPL-2.1
Copyright: 2016, Bernhard Trinnes <bernhard.trinnes@guh.io>

View File

@ -0,0 +1 @@
usr/lib/@DEB_HOST_MULTIARCH@/guh/plugins/libguh_deviceplugintcpcommander.so

1
debian/guh-plugins-translations.dirs vendored Normal file
View File

@ -0,0 +1 @@
usr/share/guh/translations

File diff suppressed because it is too large Load Diff

View File

@ -19,6 +19,7 @@ PLUGIN_DIRS = \
unitec \
leynew \
udpcommander \
tcpcommander \
kodi \
elgato \
awattar \

View File

@ -0,0 +1,178 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* *
* Copyright (C) 2017 Bernhard Trinnes <bernhard.trinnes@guh.io> *
* *
* This file is part of guh. *
* *
* Guh is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, version 2 of the License. *
* *
* Guh 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 guh. If not, see <http://www.gnu.org/licenses/>. *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include "deviceplugintcpcommander.h"
#include "plugininfo.h"
DevicePluginTcpCommander::DevicePluginTcpCommander()
{
}
DeviceManager::HardwareResources DevicePluginTcpCommander::requiredHardware() const
{
return DeviceManager::HardwareResourceNone;
}
DeviceManager::DeviceSetupStatus DevicePluginTcpCommander::setupDevice(Device *device)
{
if (device->deviceClassId() == tcpOutputDeviceClassId) {
QTcpSocket *tcpSocket = new QTcpSocket(this);
m_tcpSockets.insert(tcpSocket, device);
connect(tcpSocket, &QTcpSocket::connected, this, &DevicePluginTcpCommander::onTcpSocketConnected);
connect(tcpSocket, &QTcpSocket::disconnected, this, &DevicePluginTcpCommander::onTcpSocketDisconnected);
connect(tcpSocket, &QTcpSocket::bytesWritten, this, &DevicePluginTcpCommander::onTcpSocketBytesWritten);
return DeviceManager::DeviceSetupStatusAsync;
}
if (device->deviceClassId() == tcpInputDeviceClassId) {
int port = device->paramValue(portParamTypeId).toInt();
TcpServer *tcpServer = new TcpServer(port, this);
if (tcpServer->isValid()) {
m_tcpServer.insert(tcpServer, device);
connect(tcpServer, &TcpServer::connected, this, &DevicePluginTcpCommander::onTcpServerConnected);
connect(tcpServer, &TcpServer::disconnected, this, &DevicePluginTcpCommander::onTcpServerDisconnected);
return DeviceManager::DeviceSetupStatusSuccess;
} else {
tcpServer->deleteLater();
qDebug(dcTCPCommander()) << "Could not open TCP Server";
}
}
return DeviceManager::DeviceSetupStatusFailure;
}
DeviceManager::DeviceError DevicePluginTcpCommander::executeAction(Device *device, const Action &action)
{
if (device->deviceClassId() == tcpOutputDeviceClassId) {
if (action.actionTypeId() == outputDataActionTypeId) {
int port = device->paramValue(portParamTypeId).toInt();
QHostAddress address= QHostAddress(device->paramValue(ipv4addressParamTypeId).toString());
QTcpSocket *tcpSocket = m_tcpSockets.key(device);
tcpSocket->connectToHost(address, port);
return DeviceManager::DeviceErrorNoError;
}
return DeviceManager::DeviceErrorActionTypeNotFound;
}
return DeviceManager::DeviceErrorDeviceClassNotFound;
}
void DevicePluginTcpCommander::deviceRemoved(Device *device)
{
if(device->deviceClassId() == tcpOutputDeviceClassId){
QTcpSocket *tcpSocket = m_tcpSockets.key(device);
m_tcpSockets.remove(tcpSocket);
tcpSocket->deleteLater();
}else if(device->deviceClassId() == tcpInputDeviceClassId){
TcpServer *tcpServer = m_tcpServer.key(device);
m_tcpServer.remove(tcpServer);
tcpServer->deleteLater();
}
}
void DevicePluginTcpCommander::onTcpSocketConnected()
{
QTcpSocket *tcpSocket = static_cast<QTcpSocket *>(sender());
Device *device = m_tcpSockets.value(tcpSocket);
if (!device->setupComplete()) {
qDebug(dcTCPCommander()) << device->name() << "Setup finished" ;
emit deviceSetupFinished(device, DeviceManager::DeviceSetupStatusSuccess);
} else {
QByteArray data = device->paramValue(outputDataAreaParamTypeId).toByteArray();
tcpSocket->write(data);
}
device->setStateValue(connectedStateTypeId, true);
}
void DevicePluginTcpCommander::onTcpSocketDisconnected()
{
QTcpSocket *tcpSocket = static_cast<QTcpSocket *>(sender());
Device *device = m_tcpSockets.value(tcpSocket);
device->setStateValue(connectedStateTypeId, false);
}
void DevicePluginTcpCommander::onTcpSocketBytesWritten()
{
QTcpSocket *tcpSocket = static_cast<QTcpSocket *>(sender());
tcpSocket->close();
}
void DevicePluginTcpCommander::onTcpServerConnected()
{
TcpServer *tcpServer = static_cast<TcpServer *>(sender());
Device *device = m_tcpServer.value(tcpServer);
qDebug(dcTCPCommander()) << device->name() << "Tcp Server Client connected" ;
device->setStateValue(connectedStateTypeId, true);
connect(tcpServer, &TcpServer::textMessageReceived, this, &DevicePluginTcpCommander::onTcpServerTextMessageReceived);
//send signal device Setup was successfull
}
void DevicePluginTcpCommander::onTcpServerDisconnected()
{
TcpServer *tcpServer = static_cast<TcpServer *>(sender());
Device *device = m_tcpServer.value(tcpServer);
qDebug(dcTCPCommander()) << device->name() << "Tcp Server Client disconnected" ;
device->setStateValue(connectedStateTypeId, false);
}
void DevicePluginTcpCommander::onTcpServerTextMessageReceived(QByteArray data)
{
TcpServer *tcpServer = static_cast<TcpServer *>(sender());
Device *device = m_tcpServer.value(tcpServer);
qDebug(dcTCPCommander()) << device->name() << "Message received" << data;
device->setStateValue(dataReceivedStateTypeId, data);
if (device->paramValue(comparisionParamTypeId).toString() == "Is exactly") {
qDebug(dcTCPCommander()) << "is exacly";
if (data == device->paramValue(inputDataParamTypeId)) {
qDebug(dcTCPCommander()) << "comparison successful";
emitEvent(Event(commandReceivedEventTypeId, device->id()));
}
} else if (device->paramValue(comparisionParamTypeId).toString() == "Contains") {
if (data.contains(device->paramValue(inputDataParamTypeId).toByteArray())) {
emitEvent(Event(commandReceivedEventTypeId, device->id()));
}
} else if (device->paramValue(comparisionParamTypeId) == "Contains not") {
if (!data.contains(device->paramValue(inputDataParamTypeId).toByteArray()))
emitEvent(Event(commandReceivedEventTypeId, device->id()));
} else if (device->paramValue(comparisionParamTypeId) == "Starts with") {
if (data.startsWith(device->paramValue(inputDataParamTypeId).toByteArray()))
emitEvent(Event(commandReceivedEventTypeId, device->id()));
} else if (device->paramValue(comparisionParamTypeId) == "Ends with") {
if (data.endsWith(device->paramValue(inputDataParamTypeId).toByteArray()))
emitEvent(Event(commandReceivedEventTypeId, device->id()));
}
}

View File

@ -0,0 +1,60 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* *
* Copyright (C) 2017 Bernhard Trinnes <bernhard.trinnes@guh.io> *
* *
* This file is part of guh. *
* *
* Guh is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, version 2 of the License. *
* *
* Guh 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 guh. If not, see <http://www.gnu.org/licenses/>. *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#ifndef DEVICEPLUGINDEVTCPCOMMANDER_H
#define DEVICEPLUGINDEVTCPCOMMANDER_H
#include "plugin/deviceplugin.h"
#include "devicemanager.h"
#include "tcpserver.h"
class DevicePluginTcpCommander : public DevicePlugin
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "guru.guh.DevicePlugin" FILE "deviceplugintcpcommander.json")
Q_INTERFACES(DevicePlugin)
public:
explicit DevicePluginTcpCommander();
DeviceManager::HardwareResources requiredHardware() const override;
DeviceManager::DeviceSetupStatus setupDevice(Device *device) override;
void deviceRemoved(Device *device) override;
DeviceManager::DeviceError executeAction(Device *device, const Action &action) override;
private:
QHash<QTcpSocket *, Device *> m_tcpSockets;
QHash<TcpServer *, Device *> m_tcpServer;
private slots:
void onTcpSocketConnected();
void onTcpSocketDisconnected();
void onTcpSocketBytesWritten();
void onTcpServerConnected();
void onTcpServerDisconnected();
void onTcpServerTextMessageReceived(QByteArray message);
};
#endif // DEVICEPLUGINTCPCOMMANDER_H

View File

@ -0,0 +1,148 @@
{
"name": "tcp commander",
"idName": "TCPCommander",
"id": "741b7b0a-0c9c-4c93-be99-0d0bcf5a4643",
"vendors": [
{
"name": "TCP Commander",
"idName": "tcpCommander",
"id": "9181278e-7812-4a3e-a9ce-f00f3f8b8afd",
"deviceClasses": [
{
"id": "c67d059f-694f-47cb-8e1d-9e3e6d014c1a",
"idName": "tcpOutput",
"name": "TCP Output",
"deviceIcon": "Network",
"createMethods": ["user"],
"basicTags": [
"Service"
],
"criticalStateTypeId": "725b541a-9e0c-4634-81eb-e415c0b8f025",
"primaryStateTypeId": "725b541a-9e0c-4634-81eb-e415c0b8f025",
"paramTypes": [
{
"id": "2a3fcb23-931b-4ba1-b134-c49b656c76f7",
"idName": "ipv4address",
"name": "IPv4 Address",
"type": "QString",
"inputType": "IPv4Address",
"defaultValue": "127.0.0.1",
"index" : 0
},
{
"id": "bee8b151-815a-4159-9d8a-42b76e99b42c",
"idName": "port",
"name": "Port",
"type": "int",
"defaultValue": "22",
"index" : 1
}
],
"stateTypes":[
{
"id": "725b541a-9e0c-4634-81eb-e415c0b8f025",
"idName": "connected",
"name": "connected",
"type": "bool",
"defaultValue": false,
"eventTypeName": "connection status changed",
"index" : 0
}
],
"actionTypes": [
{
"id": "6bc52462-b192-46a4-a6df-92cc5a479c89",
"idName": "outputData",
"name": "Send Data",
"index": 0,
"paramTypes": [
{
"id": "6604c852-6b24-4707-b8e5-1ddd8032efcc",
"idName": "outputDataArea",
"name": "Data",
"type": "QString",
"index": 0,
"inputType": "TextArea"
}
]
}
]
},
{
"id": "bc40e84a-69c4-4fd2-beb0-bd65f19aa8ff",
"idName": "tcpInput",
"name": "TCP Input",
"deviceIcon": "Network",
"createMethods": ["user"],
"basicTags": [
"Service"
],
"primaryStateTypeId": "725b541a-9e0c-4634-81eb-e415c0b8f025",
"paramTypes": [
{
"id": "bee8b151-815a-4159-9d8a-42b76e99b42c",
"idName": "port",
"name": "Port",
"type": "int",
"defaultValue": "22",
"index" : 0
},
{
"id": "d99f55c7-0e14-45ee-b0f0-33f2d1d2e674",
"idName": "comparision",
"name": "Data Comparison",
"type": "QString",
"allowedValues": [
"Is exactly",
"Contains",
"Contains not",
"Starts with",
"Ends with"
],
"defaultValue": "Exactly",
"index" : 1
},
{
"id": "23051bdf-3f50-41fa-abde-bc4fe0bcc4fc",
"idName": "inputData",
"name": "Command",
"type": "QString",
"inputType": "TextArea",
"defaultValue": "",
"index" : 2
}
],
"stateTypes": [
{
"id": "725b541a-9e0c-4634-81eb-e415c0b8f025",
"idName": "connected",
"name": "connected",
"type": "bool",
"defaultValue": false,
"eventTypeName": "connection status changed",
"index" : 0
},
{
"id": "b98fdacc-59d7-41c4-b790-1fdca50dfb22",
"idName": "dataReceived",
"name": "Data Received",
"type": "QString",
"inputType": "TextArea",
"defaultValue": "",
"eventTypeName": "Data received",
"index" : 1
}
],
"eventTypes": [
{
"id": "6d7c6df6-cb61-4d9e-b0d7-37c43911ca4b",
"idName": "commandReceived",
"name": "Command Received",
"index": 0
}
]
}
]
}
]
}

View File

@ -0,0 +1,16 @@
TRANSLATIONS = translations/en_US.ts \
translations/de_DE.ts
# Note: include after the TRANSLATIONS definition
include(../plugins.pri)
TARGET = $$qtLibraryTarget(guh_deviceplugintcpcommander)
SOURCES += \
deviceplugintcpcommander.cpp \
tcpserver.cpp \
HEADERS += \
deviceplugintcpcommander.h \
tcpserver.h \

101
tcpcommander/tcpserver.cpp Normal file
View File

@ -0,0 +1,101 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* *
* Copyright (C) 2017 Bernhard Trinnes <bernhard.trinnes@guh.io> *
* *
* This file is part of guh. *
* *
* Guh is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, version 2 of the License. *
* *
* Guh 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 guh. If not, see <http://www.gnu.org/licenses/>. *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include "tcpserver.h"
#include "extern-plugininfo.h"
#include <QNetworkInterface>
TcpServer::TcpServer(const QHostAddress address, const int &port, QObject *parent) :
QObject(parent)
{
m_tcpServer = new QTcpServer(this);
connect(m_tcpServer, &QTcpServer::newConnection, this, &TcpServer::newConnection);
qDebug(dcTCPCommander()) << "TCP Server on Port: " << port << "Address: " << address.toString();
if (!m_tcpServer->listen(address, port)) {
qDebug(dcTCPCommander()) << "Unable to start the server: " << m_tcpServer->errorString();
return;
}
}
TcpServer::TcpServer(const int &port, QObject *parent) :
QObject(parent)
{
m_tcpServer = new QTcpServer(this);
connect(m_tcpServer, &QTcpServer::newConnection, this, &TcpServer::newConnection);
qDebug(dcTCPCommander()) << "TCP Server on Port: " << port;
if (!m_tcpServer->listen(QHostAddress::Any, port)) {
qDebug(dcTCPCommander()) << "Unable to start the server: " << m_tcpServer->errorString();
return;
}
}
TcpServer::~TcpServer()
{
}
bool TcpServer::isValid()
{
return m_tcpServer->isListening();
}
QHostAddress TcpServer::serverAddress()
{
return m_tcpServer->serverAddress();
}
int TcpServer::serverPort()
{
return m_tcpServer->serverPort();
}
void TcpServer::newConnection()
{
qDebug(dcTCPCommander()) << "TCP Server new Connection request";
m_socket = m_tcpServer->nextPendingConnection();
m_socket->write("Hello client");
m_socket->flush();
emit connected();
connect(m_socket, &QTcpSocket::disconnected, this, &TcpServer::onDisconnected);
connect(m_socket, &QTcpSocket::readyRead, this, &TcpServer::readData);
// Note: error signal will be interpreted as function, not as signal in C++11
//connect(m_socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onError(QAbstractSocket::SocketError)));
}
void TcpServer::onDisconnected()
{
qDebug(dcTCPCommander()) << "TCP Server connection aborted";
disconnect(m_socket, &QTcpSocket::disconnected, this, &TcpServer::onDisconnected);
disconnect(m_socket, &QTcpSocket::readyRead, this, &TcpServer::readData);
m_socket->deleteLater();
emit disconnected();
}
void TcpServer::readData()
{
QByteArray data = m_socket->readAll();
qDebug(dcTCPCommander()) << "TCP Server data received: " << data;
emit textMessageReceived(data);
}

60
tcpcommander/tcpserver.h Normal file
View File

@ -0,0 +1,60 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* *
* Copyright (C) 2017 Bernhard Trinnes <bernhard.trinnes@guh.io> *
* *
* This file is part of guh. *
* *
* Guh is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, version 2 of the License. *
* *
* Guh 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 guh. If not, see <http://www.gnu.org/licenses/>. *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#ifndef TCPSERVER_H
#define TCPSERVER_H
#include <QObject>
#include <QTcpSocket>
#include <QTcpServer>
class TcpServer : public QObject
{
Q_OBJECT
public:
explicit TcpServer(const QHostAddress address, const int &port, QObject *parent);
explicit TcpServer(const int &port, QObject *parent = 0);
~TcpServer();
bool isValid();
QHostAddress serverAddress();
int serverPort();
void setPort(int port);
void setServerAddress(const QHostAddress &address);
private:
QTcpServer *m_tcpServer;
QTcpSocket *m_socket;
signals:
void newPendingConnection();
void textMessageReceived(QByteArray message);
void connected();
void disconnected();
public slots:
void newConnection();
void onDisconnected();
void readData();
};
#endif // TCPSERVER_H

View File

@ -0,0 +1,97 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="de_DE">
<context>
<name>TCPCommander</name>
<message>
<location filename="../../../build-guh-plugins-Desktop-Debug/tcpcommander/plugininfo.h" line="41"/>
<source>tcp commander</source>
<extracomment>The name of the plugin tcp commander (741b7b0a-0c9c-4c93-be99-0d0bcf5a4643)</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-guh-plugins-Desktop-Debug/tcpcommander/plugininfo.h" line="44"/>
<source>TCP Commander</source>
<extracomment>The name of the vendor (9181278e-7812-4a3e-a9ce-f00f3f8b8afd)</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-guh-plugins-Desktop-Debug/tcpcommander/plugininfo.h" line="47"/>
<source>TCP Output</source>
<extracomment>The name of the DeviceClass (c67d059f-694f-47cb-8e1d-9e3e6d014c1a)</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-guh-plugins-Desktop-Debug/tcpcommander/plugininfo.h" line="50"/>
<source>IPv4 Address</source>
<extracomment>The name of the paramType (2a3fcb23-931b-4ba1-b134-c49b656c76f7) of TCP Output</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-guh-plugins-Desktop-Debug/tcpcommander/plugininfo.h" line="53"/>
<source>Port</source>
<extracomment>The name of the paramType (bee8b151-815a-4159-9d8a-42b76e99b42c) of TCP Output</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-guh-plugins-Desktop-Debug/tcpcommander/plugininfo.h" line="56"/>
<source>connection status changed</source>
<extracomment>The name of the autocreated EventType (725b541a-9e0c-4634-81eb-e415c0b8f025)</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-guh-plugins-Desktop-Debug/tcpcommander/plugininfo.h" line="59"/>
<source>connected</source>
<extracomment>The name of the ParamType of StateType (725b541a-9e0c-4634-81eb-e415c0b8f025) of DeviceClass TCP Output</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-guh-plugins-Desktop-Debug/tcpcommander/plugininfo.h" line="62"/>
<source>Send Data</source>
<extracomment>The name of the ActionType 6bc52462-b192-46a4-a6df-92cc5a479c89 of deviceClass TCP Output</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-guh-plugins-Desktop-Debug/tcpcommander/plugininfo.h" line="65"/>
<source>Data</source>
<extracomment>The name of the paramType (6604c852-6b24-4707-b8e5-1ddd8032efcc) of TCP Output</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-guh-plugins-Desktop-Debug/tcpcommander/plugininfo.h" line="68"/>
<source>TCP Input</source>
<extracomment>The name of the DeviceClass (bc40e84a-69c4-4fd2-beb0-bd65f19aa8ff)</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-guh-plugins-Desktop-Debug/tcpcommander/plugininfo.h" line="71"/>
<source>Data Comparison</source>
<extracomment>The name of the paramType (d99f55c7-0e14-45ee-b0f0-33f2d1d2e674) of TCP Input</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-guh-plugins-Desktop-Debug/tcpcommander/plugininfo.h" line="74"/>
<source>Command</source>
<extracomment>The name of the paramType (23051bdf-3f50-41fa-abde-bc4fe0bcc4fc) of TCP Input</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-guh-plugins-Desktop-Debug/tcpcommander/plugininfo.h" line="77"/>
<source>Data received</source>
<extracomment>The name of the autocreated EventType (b98fdacc-59d7-41c4-b790-1fdca50dfb22)</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-guh-plugins-Desktop-Debug/tcpcommander/plugininfo.h" line="80"/>
<source>Data Received</source>
<extracomment>The name of the ParamType of StateType (b98fdacc-59d7-41c4-b790-1fdca50dfb22) of DeviceClass TCP Input</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-guh-plugins-Desktop-Debug/tcpcommander/plugininfo.h" line="83"/>
<source>Command Received</source>
<extracomment>The name of the EventType 6d7c6df6-cb61-4d9e-b0d7-37c43911ca4b of deviceClass TCP Input</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@ -0,0 +1,97 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1">
<context>
<name>TCPCommander</name>
<message>
<location filename="../../../build-guh-plugins-Desktop-Debug/tcpcommander/plugininfo.h" line="41"/>
<source>tcp commander</source>
<extracomment>The name of the plugin tcp commander (741b7b0a-0c9c-4c93-be99-0d0bcf5a4643)</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-guh-plugins-Desktop-Debug/tcpcommander/plugininfo.h" line="44"/>
<source>TCP Commander</source>
<extracomment>The name of the vendor (9181278e-7812-4a3e-a9ce-f00f3f8b8afd)</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-guh-plugins-Desktop-Debug/tcpcommander/plugininfo.h" line="47"/>
<source>TCP Output</source>
<extracomment>The name of the DeviceClass (c67d059f-694f-47cb-8e1d-9e3e6d014c1a)</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-guh-plugins-Desktop-Debug/tcpcommander/plugininfo.h" line="50"/>
<source>IPv4 Address</source>
<extracomment>The name of the paramType (2a3fcb23-931b-4ba1-b134-c49b656c76f7) of TCP Output</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-guh-plugins-Desktop-Debug/tcpcommander/plugininfo.h" line="53"/>
<source>Port</source>
<extracomment>The name of the paramType (bee8b151-815a-4159-9d8a-42b76e99b42c) of TCP Output</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-guh-plugins-Desktop-Debug/tcpcommander/plugininfo.h" line="56"/>
<source>connection status changed</source>
<extracomment>The name of the autocreated EventType (725b541a-9e0c-4634-81eb-e415c0b8f025)</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-guh-plugins-Desktop-Debug/tcpcommander/plugininfo.h" line="59"/>
<source>connected</source>
<extracomment>The name of the ParamType of StateType (725b541a-9e0c-4634-81eb-e415c0b8f025) of DeviceClass TCP Output</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-guh-plugins-Desktop-Debug/tcpcommander/plugininfo.h" line="62"/>
<source>Send Data</source>
<extracomment>The name of the ActionType 6bc52462-b192-46a4-a6df-92cc5a479c89 of deviceClass TCP Output</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-guh-plugins-Desktop-Debug/tcpcommander/plugininfo.h" line="65"/>
<source>Data</source>
<extracomment>The name of the paramType (6604c852-6b24-4707-b8e5-1ddd8032efcc) of TCP Output</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-guh-plugins-Desktop-Debug/tcpcommander/plugininfo.h" line="68"/>
<source>TCP Input</source>
<extracomment>The name of the DeviceClass (bc40e84a-69c4-4fd2-beb0-bd65f19aa8ff)</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-guh-plugins-Desktop-Debug/tcpcommander/plugininfo.h" line="71"/>
<source>Data Comparison</source>
<extracomment>The name of the paramType (d99f55c7-0e14-45ee-b0f0-33f2d1d2e674) of TCP Input</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-guh-plugins-Desktop-Debug/tcpcommander/plugininfo.h" line="74"/>
<source>Command</source>
<extracomment>The name of the paramType (23051bdf-3f50-41fa-abde-bc4fe0bcc4fc) of TCP Input</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-guh-plugins-Desktop-Debug/tcpcommander/plugininfo.h" line="77"/>
<source>Data received</source>
<extracomment>The name of the autocreated EventType (b98fdacc-59d7-41c4-b790-1fdca50dfb22)</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-guh-plugins-Desktop-Debug/tcpcommander/plugininfo.h" line="80"/>
<source>Data Received</source>
<extracomment>The name of the ParamType of StateType (b98fdacc-59d7-41c4-b790-1fdca50dfb22) of DeviceClass TCP Input</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-guh-plugins-Desktop-Debug/tcpcommander/plugininfo.h" line="83"/>
<source>Command Received</source>
<extracomment>The name of the EventType 6d7c6df6-cb61-4d9e-b0d7-37c43911ca4b of deviceClass TCP Input</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
</TS>