QT的两种MQTT库
目前QT使用MQTT库的方法有两种:
- 一种为使用官方库qmqtt:
https://github.com/qt/qtmqtt
- 另一种是为使用EMQX提供的QT库:
https://github.com/emqx/qmqtt
版本差异
两个版本存在一定差异
- 官方库qtmqtt功能比较强,支持MQTT5.0协议,SSL,有比较完整例程提供参考。但是官方库版本众多,在github中有32个分支版本,如果QT版本不对应可能会导致一些编译错误,使得编译无法通过。
- emqtt库功能较弱,开发文档介绍太简单,在emqtt的github中的Readme文件中简单介绍了connect,和一些信号和槽。连接服务器只支持IP,使用域名需要自己使用QHostInfo转化为IP。但是相比官方库,其编译简单,对多个QT版本兼容性较好,方便在不同版本QT使用。此库同时也支持SSL,但是MQTT5.0还没有试过是否支持。
Windows下QT使用MQTT库
在Windows平台编译使用官方MQTT的例子已经有博客介绍了,可以参考以下两个博客:
- 官方库qtmqtt编译使用:
https://blog.csdn.net/luoyayun361/article/details/104671603
编译前需要注意的问题:3、4中的错误很可能为编译了不对应QT版本的Qmqtt库,可在官方github分支中查找自己QT对应的版本。在这里我使用的是QT5.8.0版本编译官方库,所以我使用了最接近QT5.8.0的版本qtmqtt-5.12版本。
按照对应版本的QTMQTT库进行编译一般不会出现错误,实测完成1、2中的错误修改后编译完成,成功提取lib文件。
- 其中编译官方库需要除了此博客中的注意点以外,还需要注库的源文件路径中不能出现中文,否则无法进行编译。
- 编译可能会出错 QtMqtt/qmqttglobal.h: No such file or directory。
解决方法为:在QT的安装目下include文件夹下创建QtMqtt文件夹,例如 Qt\5.8\mingw53_32\include\QtMqtt将源文件src/mqtt下所有.h头文件添加到我们创建的QtMqtt文件夹。
问题的主要原因是:编译器是按照在Qt安装目录下搜索的,但我们文件是我们自己随意放的目录下的 src\mqtt 路径下。
原文:https://blog.csdn.net/qq_39280795/article/details/105455436
- 编译可能会出错 qmqttconnection.cpp:169: error: ‘errorOccurred’ is not a member of ‘QAbstractSocket’
connect(socket, &QAbstractSocket::errorOccurred, this, &QMqttConnection::transportError);
qmqttconnection.cpp 中 168行有这么一句:
就是这句出了问题。查帮助文档或者源代码都可以发现 QAbstractSocket 没有 errorOccurred 这个 信号。有的那个信号叫:connect(socket, &QAbstractSocket::errorOccurred, this, &QMqttConnection::transportError);
所以要改写成:void error(QAbstractSocket::SocketError socketError)
connect(socket, static_cast<void(QAbstractSocket::*)(QAbstractSocket::SocketError)> (&QAbstractSocket::error), this, static_cast<void(QMqttConnection::*)(QAbstractSocket::SocketError)>(&QMqttConnection::transportError) );
原文:https://blog.csdn.net/liyuanbhu/article/details/106597506
4.错误qmqttconnection.cpp:1455: error: ‘class QList’ has no member named ‘resize’
此错误为QT6的QMQTT类中成员,使用了QT5编译,当然无法找到。使用老版本QT需要在github仓库中选择对应版本的分支。
5.编译运行官方例子simpleclient.pro中出现的问题:error: QMqttClient: No such file or directory此错误可以将
#include <QMqttClient>
改为
#include <qmqttclient.h>
此外还会出现error: QtMqtt/QMqttClient: No such file or directory
此错误可以将
#include <QtMqtt/QMqttClient>
改为
#include <qmqttglobal.h>
- emqx_mqtt:
https://luoyayun361.blog.csdn.net/article/details/104699062
Windows上QT5.8按照此教程没有出现错误。
Linux下QT使用MQTT库
- Linux下官方QTMQTT库程序从win上可以移植过来,但是注意QT版本不能相差太大,并且lib下dll的文件需要换成.so文件。这就意味着需要将QTMqtt代码使用Linux上QT的gcc++重新编译一遍,并且将lib下的dll,.a文件换成linux编译出的lib。
1.编译qtmqtt,勾选release,注意kit套件版本,要和winQT版本对应上,一般ubuntu系统会自带QT,注意安装使用配套Win上写的程序的QT版本。
2.编译会出现和Win上同样的错误QtMqtt/qmqttglobal.h: No such file or directory。
此时可按照win上qtmqtt教程一样在qt的安装目录/opt/Qt5.8.0/5.8/gcc_64/include目录下新建QtMqtt文件夹,将源码文件qtmqtt-5.12/src/mqtt中的.h头文件复制到其中。
3.再次编译成功,会在源码文件夹中找到lib文件夹下的lib文件,替换windows下编好程序的lib库(.a,.dll文件)。
4.相比在win上的程序还需在程序的.pro文件中多加入一段else:unix:!macx: LIBS += -L$$PWD/lib/ -lQt5Mqtt
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/lib/ -lQt5Mqtt
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/lib/ -lQt5Mqttd
else:unix:!macx: LIBS += -L$$PWD/lib/ -lQt5Mqtt
INCLUDEPATH += $$PWD/include
DEPENDPATH += $$PWD/include
5.编译win上移植过来的程序运行成功
- Linux下emqx的移植,同理与qtmqtt一样,需要在linux平台下重新编译源码。
可以看博客:https://blog.csdn.net/wct3344142/article/details/107022706