Qt& qmqtt客户端库不适用于Windows

时间:2017-04-11 14:41:17

标签: qt c++11 windows-10 mqtt

我在从GitHub( https://github.com/emqtt/qmqtt )获得的mqtt客户端使用库时遇到问题。

我使用Qt Creator 4.0.3和Qt Version Qt 5.7.0并在Windows 10上使用MinGW 5.3.0进行编译。

我已经在互联网上查找了其他一些答案,但它们主要是关于编译或链接错误 我的问题是代码没有做到它应该做的事情(它什么都没做)。

我已经在标题屏幕(上面的链接)上连接到服务器/代理的示例出现问题。它什么都不做,我甚至不会得到错误信息或任何其他反馈。

我的代码: 我有一个Smartpointer到客户端对象

QScopedPointer<QMQTT::Client> client(new QMQTT::Client(QHostAddress("192.168.8.50"), 1883));

地址和端口是正确的,我已经使用MQTTlens为Google Chrome测试了这个。

然后我有一个单独的类来处理我的输入和输出(我使用多线程)。本课程发送&amp;接收信号,以便它可以控制客户端/向用户提供反馈(通过控制台输出)。

class MainIO : public QObject
{
Q_OBJECT
public:
    explicit MainIO(QString clientId = "", QObject *parent = 0);

    void mainMenue();
private:
    QVector<QString> m_mainMenueStrings;

    QString m_clientId;

signals:
    void connectToHost();
    void disconnectFromHost();

    void subscribe(const QString &topic, const quint8 qos);
    void unsubscribe(const QString &topic);
    void publish(const QMQTT::Message &message);

public slots:
    void onClientConnected();
    void onClientDisconnected();
    void onClientPublished();
    void onClientError(const QMQTT::ClientError error);

    void onClientReceived(const QMQTT::Message &message);

    void add();
    void subtract();
};

我将类的对象移动到主要

中的线程
QThread mainIOThread;
IoTClient::MainIO control(clientId);
control.moveToThread(&mainIOThread);

然后我在启动线程之前用槽连接信号

QObject::connect(&mainIOThread, &QThread::started
               , &control,      &IoTClient::MainIO::mainMenue);
/* Control -> Client */
QObject::connect(&control,        &IoTClient::MainIO::connectToHost
               , client.data(),   &QMQTT::Client::connectToHost);
QObject::connect(&control,        &IoTClient::MainIO::subscribe
               , client.data(),   &QMQTT::Client::subscribe);
QObject::connect(&control,        &IoTClient::MainIO::unsubscribe
               , client.data(),   &QMQTT::Client::unsubscribe);
QObject::connect(&control,        &IoTClient::MainIO::publish
               , client.data(),   &QMQTT::Client::publish);
/* Client -> Control */
QObject::connect(client.data(),   &QMQTT::Client::connected
               , &control,        &IoTClient::MainIO::onClientConnected);
QObject::connect(client.data(),   &QMQTT::Client::disconnected
               , &control,        &IoTClient::MainIO::onClientDisconnected);
QObject::connect(client.data(),   &QMQTT::Client::error
               , &control,        &IoTClient::MainIO::onClientError);
QObject::connect(client.data(),   &QMQTT::Client::published
               , &control,        &IoTClient::MainIO::onClientPublished);
QObject::connect(client.data(),   &QMQTT::Client::received
               , &control,        &IoTClient::MainIO::onClientReceived);
mainIOThread.start();

mainMenue-Method如下所示:

void MainIO::mainMenue()
{
    std::system("cls");
    qDebug().noquote().nospace() << (tr("clients/") + m_clientId + 
    tr("/state"));
    /* Print Menue */
    qDebug().noquote().nospace() << "QMQTT-Client";
    for (int i = 0; i < m_mainMenueStrings.size(); i++)
    {
         qDebug().noquote().nospace() << "\t(" << i+1 << ") " << 
         m_mainMenueStrings[i];
    }
    qDebug().noquote().nospace() << "Ihre Auswahl: ";

    /* select choice */
    int option = -1;
    while ((option >= m_mainMenueStrings.size()) || (option < 0)) {
        std::cin >> option;
    }
    option--;

    switch(option) {
    case 0: emit this->connectToHost();
            break;
    case 1: add();
            break;
    case 2: subtract();
            break;
    case 3: emit this->disconnectFromHost();
            break;
    default:
        qDebug().noquote().nospace() << "Fehlerhafte Eingabe";
    }
}

控制台输出看起来有点像: (1)连接 (2)补充 ... 你的输入:_

发送一些输入后(1表示连接)没有任何反应。我没有收到任何错误(我已将错误信号从客户端连接到错误槽)或其他信号。

我已经在源代码中测试了这个连接并且无法得出结论,因为(对我来说)客户端无法连接到代理是没有意义的。

代码仅在Windows中失败,它与Linux一起使用。

1 个答案:

答案 0 :(得分:0)

我已经解决了这个问题。是的,部署后(在Windows上)项目中的qmake版本无法正常工作。 我使用的是Qbs版本,但是这个版本无法部署。我构建了它并将所需的生成文件(.dll等)复制到我机器上相应的Qt目录中。