我在从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一起使用。
答案 0 :(得分:0)
我已经解决了这个问题。是的,部署后(在Windows上)项目中的qmake版本无法正常工作。 我使用的是Qbs版本,但是这个版本无法部署。我构建了它并将所需的生成文件(.dll等)复制到我机器上相应的Qt目录中。