QTcpSocket эмулирует netcat 'разговор' - PullRequest
1 голос
/ 21 января 2020

В моем терминале linux у меня есть следующий «разговор», который я хочу запустить из qt с помощью QTcpSocket:

S   user@domain:~ $ netcat 1.1.1.2 9230
R   HELO SOME MORE INFORMATION ABOUT THE DEVICE I CONNECTED TO
S   DEVC 1.1.1.1 somePassword
R   DEVC OK
S   @AlarmCode=2,12

Где S - отправленные данные, а R - полученные данные.

Я сделал следующий код, мой заголовочный файл:

#ifndef TCPCLIENT_H
#define TCPCLIENT_H
#include <QTcpSocket>
#include <QObject>

class TCPClient : public QObject
{
    Q_OBJECT
private:

    QTcpSocket *tcpSocket = nullptr;
    void handleHeloMessage(QString message);
    void handleConnectToDeviceMessage(QString message);
    void handleMessage(QString message);

    bool handledHeloMessage = false;
    bool handledConnectToDeviceMessage = false;
    void sendDeviceToConnectTo();
private slots:
    void onConnected();
    void handleReadyRead();
public:
    TCPClient();
};

#endif // TCPCLIENT_H

Мой cpp:

#include "tcpclient.h"
#include <QDataStream>
#include <QDebug>

const QString COMMAND_RESET_ALARM = "@AlarmCode=1,-";
const QString COMMAND_CONNECT_TO_DEVICE = "DEVC 1.1.1.1 somePassword";
const QString IP_DATA_SOURCE = "1.1.1.2";
const int PORT_DATA_SOURCE = 9230;
#include <QDebug>


TCPClient::TCPClient()
{
    tcpSocket = new QTcpSocket(this);
    connect(tcpSocket, SIGNAL(connected()), this, SLOT(onConnected()));
    connect(tcpSocket, SIGNAL(readyRead()), SLOT(handleReadyRead()));
    tcpSocket->connectToHost(IP_DATA_SOURCE, PORT_DATA_SOURCE);
}

void TCPClient::handleHeloMessage(QString message)
{
    if(message.left(4) == "HELO")
    {
        handledHeloMessage = true;
        qDebug() << "Handled HELO \n" << message;
        sendDeviceToConnectTo();
    }
    else{
        qDebug() << "We did not receive halo but \n" << message;
    }
}

void TCPClient::handleConnectToDeviceMessage(QString message)
{
    qDebug() << "RECEIVED DEVICE\n" << message;
}

void TCPClient::handleMessage(QString message)
{
    qDebug() << "We received data. "<< message;
}

void TCPClient::sendDeviceToConnectTo()
{
    QByteArray br = COMMAND_CONNECT_TO_DEVICE.toUtf8();
    tcpSocket->write(br);
    qDebug() << "Sending: " << br;
}

void TCPClient::onConnected()
{
    qDebug() << "we are now connected.";
}

void TCPClient::handleReadyRead()
{
    QByteArray dataReceived = tcpSocket->readAll();
    QString dataReceivedString = QString::fromStdString(dataReceived.toStdString());
    if(!handledHeloMessage)
    {
        handleHeloMessage(dataReceivedString);
    }
    else if(!handledConnectToDeviceMessage)
    {
        handleConnectToDeviceMessage(dataReceivedString);
    }
    else{
        handleMessage(dataReceivedString);
    }
}

Когда я запускаю свою программу, я получаю:

we are now connected.
Handled HELO 
 "HELO SOME MORE INFORMATION ABOUT THE DEVICE I CONNECTED TO"
Sending:  "DEVC 1.1.1.1 somePassword"

Я ожидал получить DEV C OK, но вышеприведенная часть - это все, что я получаю. Почему я не получаю DEVC OK как пример с терминала?

1 Ответ

0 голосов
/ 21 января 2020

Я обнаружил проблему, сообщение не было написано, пока не была введена новая строка. добавление \n к сообщению сделало работу.

...