【发布时间】:2017-09-07 00:44:07
【问题描述】:
我在使用从 GitHub (https://github.com/emqtt/qmqtt) 获得的 mqtt 客户端库时遇到问题。
我正在使用带有 Qt 版本 Qt 5.7.0 的 Qt Creator 4.0.3,并在 Windows 10 上使用 MinGW 5.3.0 进行编译。
我已经在 Internet 上查找了其他一些答案,但它们大多是关于编译或链接错误的。
我的问题是代码没有做它应该做的事情(它什么也没做)。
我已经对连接到服务器/代理的标题屏幕(上面的链接)上的示例有问题。它什么都不做,我什至没有收到错误消息或任何其他反馈。
我的代码: 我有一个指向客户端对象的智能指针
QScopedPointer<QMQTT::Client> client(new QMQTT::Client(QHostAddress("192.168.8.50"), 1883));
地址和端口是正确的,我已经用 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);
然后我在启动线程之前将信号与插槽连接
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。
【问题讨论】:
标签: qt c++11 windows-10 mqtt