2017-04-11 15 views
0

GitHub(https://github.com/emqtt/qmqtt)から入手したmqtt-clientにライブラリを使用する際に問題があります。Qt&qmqttクライアントライブラリがWindowsで動作しない

イムはQtのバージョンのQt 5.7.0とQtのCreatorを4.0.3を使用し、Windows 10

上のMinGW 5.3.0でコンパイルし、私はすでに、インターネット上のいくつかの他の回答を見てきたが、それらはほとんどがありますコンパイルエラーやリンクエラーについて。
私の問題は、コードがそれが想定していることを実行していないことです(何もしません)。

私はすでに、サーバー/ブローカーに接続するタイトル画面(上のリンク)の例に問題があります。それは単に何もしない、私はエラーメッセージやその他のフィードバックを取得しません。

マイコード: 私はクライアントオブジェクト

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

にアドレスとポートをSmartpointerを持っているが、私はすでにGoogle Chromeの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); 

内のスレッドへのクラスのオブジェクトを移動した後、私はmainMenue-方法スレッド

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(); 

を開始する前に、スロットに信号を接続次のようになります。

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ディレクトリにコピーしました。

関連する問題