当前位置:主页 > 查看内容

QT MQTT库在win上和linux上的使用

发布时间:2021-05-21 00:00| 位朋友查看

简介:QT的两种MQTT库 目前QT使用MQTT库的方法有两种 一种为使用官方库qmqtt: https://github.com/qt/qtmqtt 另一种是为使用EMQX提供的QT库 https://github.com/emqx/qmqtt 版本差异 两个版本存在一定差异 官方库qtmqtt功能比较强支持MQTT5.0协议SSL有比较完整例程……

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文件。

  1. 其中编译官方库需要除了此博客中的注意点以外,还需要注库的源文件路径中不能出现中文,否则无法进行编译。
  2. 编译可能会出错 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

  3. 编译可能会出错 qmqttconnection.cpp:169: error: ‘errorOccurred’ is not a member of ‘QAbstractSocket’

    connect(socket, &QAbstractSocket::errorOccurred, this, &QMqttConnection::transportError);

    qmqttconnection.cpp 中 168行有这么一句:
    connect(socket, &QAbstractSocket::errorOccurred, this, &QMqttConnection::transportError);
    
    就是这句出了问题。查帮助文档或者源代码都可以发现 QAbstractSocket 没有 errorOccurred 这个 信号。有的那个信号叫:
    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
;原文链接:https://blog.csdn.net/zhuchen88988/article/details/115449464
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文


随机推荐