我有一個問題,使用一個庫,我從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一起使用。