最近一个项目中要用到 MQTT Client 的一些功能。Qt 的发行版还没有包含相关的模块。但是在下面这个 Qt 的官网上已经能找到相关的模块了:
https://codereview.qt-project.org/#/admin/projects/qt/qtmqtt
github 上也能搜到不少相关的代码:
https://github.com/qt/qtmqtt
https://github.com/toni1991/QtMqtt
https://github.com/KurtPattyn/QtMqtt
在这篇博客里,我们使用 https://github.com/qt/qtmqtt 上的代码。这个模块应该算是 Qt 的官方发布的。
首先下载源代码,解压后进入 qtmqtt-dev\ 目录,在这个目录下建个 build 目录,进入 build 目录执行:
qmake ..\qtmqtt.pro
nmake
nmake install
直接编译会报很多错误,我们一个一个来解决。
qmqttauthenticationproperties.h:33: error: C1083: 无法打开包括文件: “QtMqtt/qmqttglobal.h”: No such file or directory
打开 qmqttauthenticationproperties.h 文件,发现有这么两句:
#include
#include
在 Qt 的 include 目录下新建一个 QtMqtt 文件夹(注意 x86 和 x64 所在的目录不一样),把 头文件都复制一份到这个目录。
再编译就不报这个错误了。
下一个错误是:qmqttconnection.cpp:169: error: C2039: “errorOccurred”: 不是“QAbstractSocket”的成员
qmqttconnection.cpp 中 168行有这么一句:
connect(socket, &QAbstractSocket::errorOccurred, this, &QMqttConnection::transportError);
就是这句出了问题。查帮助文档或者源代码都可以发现 QAbstractSocket 没有 errorOccurred 这个 信号。有的那个信号叫:
void error(QAbstractSocket::SocketError socketError)
所以要改写成:
connect(socket, static_cast (&QAbstractSocket::error),
this, static_cast(&QMqttConnection::transportError) );
再次编译。还有错误:
qmqtttopicname.cpp:148: error: C2039: “KeepEmptyParts”: 不是“Qt”的成员
qmqtttopicname.cpp 148 行代码是这样的:
return d->name.split(QLatin1Char('/'), Qt::KeepEmptyParts);
改写成:
return d->name.split(QLatin1Char('/'), QString::KeepEmptyParts);
再次编译,还有最后一个错误:
qmqtttopicname.cpp:189: error: call to 'qHash' is ambiguous
qmqtttopicname.cpp 189行是:
return qHash(name.d->name, seed);
改为:
return qHash(static_cast(name.d->name), static_cast(seed));
类似的还有:
return qHash(filter.d->filter, seed);
改为:
return qHash(static_cast(filter.d->filter), static_cast(seed));
至此,编译就没什么问题了。