2017-04-11 82 views
0

我有一個問題,使用一個庫,我從GitHub(https://github.com/emqtt/qmqtt)得到一個mqtt客戶端。Qt&qmqtt客戶端庫不適用於Windows

使用Qt Creator的4.0.3版本的Qt的Qt 5.7.0和使用MinGW 5.3.0在Windows 10編譯

我已經看過了互聯網上一些其他的答案,但他們大多是林關於編譯或鏈接錯誤。
我的問題是,代碼只是沒有做它應該(它沒有什麼)。

我已經在連接到服務器/代理的標題屏幕(上面的鏈接)上的示例出現問題。它什麼都沒做,我什至不收到錯誤消息或任何其他反饋。

我的代碼: 我有一個智能指針,以客戶對象

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

的地址和端口是正確的,我已經與MQTTlens谷歌瀏覽器測試此。

然後我有一個單獨的類來處理我的輸入和輸出(我使用多線程)。該類發送&接收信號,以便它可以控制客戶端/向用戶提供反饋(通過控制檯輸出)。

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-方法之前有狹槽的信號連接看起來如下:

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一起使用。

回答

0

我已經解決了這個問題。就是說,項目中的qmake版本在部署後無法正常工作(在Windows上)。 我使用了Qbs版本,但是這個不能部署。我構建它並將生成的所需文件(.dll等)複製到我的機器上相應的Qt目錄中。