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で動作します。