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

QT MQTT库在win上和linux上的使用相关推荐

  1. SVN从win迁移到Linux上

    工作需要把SVN从win迁移到Linux上,花了几天时间看资料搞定,简单记录一下: 公司用的SVN环境为 Windows server 2003 ,VisualSVN 2.1.5版本 1.dump出S ...

  2. opencv可以在linux上运行,linux上 安装并 运行opencv

    我是在树莓派上安装的. 1.先安装依赖项 OpenCV 2.2以后版本需要使用Cmake生成makefile文件,因此需要先安装cmake. sudo apt-get install build-es ...

  3. window上远程访问linux上的neo4j的设置

    1.在neo4j.conf文件中的 将dbms.connectors.default_listen_address=0.0.0.0前面的注释去掉即可 2.直接采用:linux主机的ip + :7474 ...

  4. QT——移植官方MQTT库

    1.软件版本 QT5.12.10 Win11 mingw 2.概述 Qt开发MQTT程序有两种方式,一个是Qt官方提供的基于MQTT的封装,一个是第三方(EMQ)开发的用于Qt调用MQTT的接口,二者 ...

  5. Qt开发MQTT(一) 之Qt官方Qt MQTT

    概述 Qt开发MQTT程序有两种方式,一个是Qt官方提供的基于MQTT的封装,一个是第三方(EMQ)开发的用于Qt调用MQTT的接口,二者使用方法大同小异,并且均提供了源码.那么,这里先来介绍第一种, ...

  6. c#如何在linux上运行程序,在Linux上运行C#

    众所周知,C#是Microsoft推出的.NET语言,只能在.NET平台上运行,例如Win 9x.ME.NT.2000.XP和Win CE之类的操作系统.但是,现在却有了一个叫做Mono的项目,它的目 ...

  7. printf如何消后续0_Hello World背后的故事:如何在Linux上编译C语言程序

    欢迎访问我的网站查看原文: https://lulaoshi.info/blog/2020/05/31/compile-c-hello-world-on-linux.html​lulaoshi.inf ...

  8. tess4j linux so文件,linux上安装tess4j项目

    本文主要介绍了linux上安装tess4j项目,通过具体的解释说明,让我们从中学到linux上安装tess4j项目的精髓所在,让我们对Linux内部原理越来越熟悉,希望大家能够在以后的学习中更加快速的 ...

  9. 在 Ubuntu Linux 上从源代码构建 Qt 6.2.2的简短教程

    Qt 6.2.0 是 Qt 6 系列的第3个版本,功能与 Qt 5 相当,因此有望成为第一个被新 Qt 项目或从 Qt 5 移植的项目广泛采用的版本.在这篇文章中我提供有关在 Ubuntu Linux ...

最新文章

  1. oracle查询保留2位小数
  2. 进程线程001 进程线程结构体和KPCR
  3. python--微信小程序获取手机号码报错
  4. iOS开发(8)UISwitch
  5. linux 浏览器 links,linux下的命令行浏览器links
  6. html ace编辑器,Tiny-editor
  7. Linux路由应用-使用策略路由实现访问控制
  8. Laravel核心解读--Console内核
  9. (50)常见命名方式
  10. 关于js的冒泡--新手踩坑案例
  11. [edu #63][div2 #554][div3 #555]
  12. nginx匹配规则详解
  13. asp连接excel数据库
  14. Python爬取淘宝商品信息
  15. 执教《送给盲婆婆的蝈蝈》有感
  16. Mbit/s MB/s MiB/s单位
  17. 【安卓】电脑执行脚本控制安卓手机
  18. 【C++】C/C++面试之17道经典编程题目分析
  19. 爱普生 RS330 打印机墨水连供装置墨盒吸墨复位方法
  20. 基于canoe开发的Bootloader刷写上位机,符合uds流程

热门文章

  1. 香港科大詹华强发明头发检测吸毒新技术
  2. Python对json数据的提取
  3. 计算机为什么检测不到u盘启动项,bios设置u盘为第一启动项后检测不到怎么办
  4. 模式识别(十四)最小误判概率准则判决
  5. 2019vivo开发者大会在京召开 泰迪熊移动赋能Jovi
  6. python 列表的中括号[]与冒号:的作用
  7. 如何进行在线教育app开发
  8. 100个IT人成为大牛必备的学习经验分享
  9. 中国首个AI考级来了!共分10级,北大出题,工信部认证
  10. spoj7258 SUBLEX Lexicographical Substring Search