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

article/2025/10/29 19:55:13

概述

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

Qt官方虽然在2017年就已经提供了对MQTT的封装,但是并没有正式加入到Qt的标准库里面,所以需要自己下载源码进行编译。

Qt官方介绍文档地址:https://doc.qt.io/QtMQTT/qtmqtt-index.html

下载

Qt官方在github上提供了源代码,地址:https://github.com/qt/qtmqtt
在这里插入图片描述
这是最新的,基于MQTT 5.0协议的版本。先把源码下载下来。

编译

下载源码后得到如下文件,直接打开工程文件准备编译
在这里插入图片描述
我这里的编译环境是:Qt5.12.3+vs2017

注意,编译这个源码需要安装perl,否则会报错:perl 不是内部或外部命令,也不是可运行的程序。

perl下载地址:https://www.perl.org/get.html
官网下载速度比较慢,我上传到网盘了,可以在这里下载:

链接:https://pan.baidu.com/s/1p5YOo-FU-ZLJUtuZSN0Rjg 提取码:i0dm

安装完Perl后会自动写入环境变量, 这时候再次编译(Release模式)QtMqtt源码,编译完成后得到以下文件:
在这里插入图片描述

bin目录下就是我们要的库文件:
在这里插入图片描述

接下来就可以将mqtt部署到自己的Qt项目中了。

部署到Qt项目

编译出来的Qt Mqtt库,要使用它有两种方式,一种是直接在项目中导入外部库和头文件,还有一种是将其以模块的形式部署到Qt的安装目录,其中第二种的好处就是,只需要做一次操作,以后需要再用Mqtt库就可以直接调用了,不需要每次都导入外部库。这里两种方法都介绍一下,首先来看第一种。

导入外部库

新建一个Qt工程
然后将刚刚编译的源码生成目录下的lib文件夹中以下四个文件拷贝:
在这里插入图片描述在这里插入图片描述

在新建工程目录下创建lib文件夹,将拷贝的文件粘贴进去:
在这里插入图片描述
然后在qtmqtt源码目录下(qtmqtt\src\mqtt)的所有.h头文件拷贝,在新建工程目录下创建include文件夹,将拷贝的文件粘贴进去:
在这里插入图片描述

打开新建工程的pro文件,添加:
在这里插入图片描述
再添加库文件引用:

win32:CONFIG(release, debug|release): LIBS += -L$$PWD/lib/ -lQt5Mqtt
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/lib/ -lQt5Mqttd

添加include文件的引用:

INCLUDEPATH += $$PWD/include
DEPENDPATH += $$PWD/include

ok, 这样就可以调用Qt Mqtt的库文件了,直接可以包含头文件来使用了。#include "QtMqtt/QMqttClient"

为了统一演示,先介绍完第二种方法后再来看demo。

部署到Qt安装目录

再来看第二种方法,如何将QtMqtt的库直接部署到Qt安装目录中,这样只需要部署一次,以后在任何工程中引用都不需要再额外导入库了,相比第一种来说更方便些。

首先,将qtmqtt源码目录下(qtmqtt\src\mqtt)的所有.h头文件拷贝,Qt安装目录下的include文件夹中创建一个mqtt目录,将拷贝的文件粘贴进去:
在这里插入图片描述在这里插入图片描述
然后,将源码编译生成目录下的lib中以下6个文件拷贝
在这里插入图片描述
并粘贴到Qt安装目录下的lib文件夹中去:
在这里插入图片描述

接下来将源码编译生成的两个库文件拷贝到Qt安装目录的bin中:
在这里插入图片描述
在这里插入图片描述

最后再拷贝模块配置文件到Qt安装目录中
在这里插入图片描述
在这里插入图片描述

ok,配置完毕,这种方式配置在新建工程中引用只需要引入模块就可以直接使用了

QT += mqtt

包含头文件

#include <QtMqtt/QtMqtt>

所以推荐使用第二种方式进行配置。

接下来看看Demo。

Demo演示

为了方便演示,我们直接使用Qt Mqtt源码中自带的示例来编译运行。
在这里插入图片描述在这里插入图片描述
这个示例Qt官方有详细介绍的,https://doc.qt.io/QtMQTT/qtmqtt-simpleclient-example.html
将该示例打开,有个地方需要改一下,打开Pro文件
在这里插入图片描述
将以上两行注释掉,要不然会有依赖,无法独立运行。

关键代码:

#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QtCore/QDateTime>
#include <QtMqtt/QMqttClient>
#include <QtWidgets/QMessageBox>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);m_client = new QMqttClient(this);m_client->setHostname(ui->lineEditHost->text());m_client->setPort(ui->spinBoxPort->value());connect(m_client, &QMqttClient::stateChanged, this, &MainWindow::updateLogStateChange);connect(m_client, &QMqttClient::disconnected, this, &MainWindow::brokerDisconnected);connect(m_client, &QMqttClient::messageReceived, this, [this](const QByteArray &message, const QMqttTopicName &topic) {const QString content = QDateTime::currentDateTime().toString()+ QLatin1String(" Received Topic: ")+ topic.name()+ QLatin1String(" Message: ")+ message+ QLatin1Char('\n');ui->editLog->insertPlainText(content);});connect(m_client, &QMqttClient::pingResponseReceived, this, [this]() {const QString content = QDateTime::currentDateTime().toString()+ QLatin1String(" PingResponse")+ QLatin1Char('\n');ui->editLog->insertPlainText(content);});connect(ui->lineEditHost, &QLineEdit::textChanged, m_client, &QMqttClient::setHostname);connect(ui->spinBoxPort, QOverload<int>::of(&QSpinBox::valueChanged), this, &MainWindow::setClientPort);updateLogStateChange();
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_buttonConnect_clicked()
{if (m_client->state() == QMqttClient::Disconnected) {ui->lineEditHost->setEnabled(false);ui->spinBoxPort->setEnabled(false);ui->buttonConnect->setText(tr("Disconnect"));m_client->connectToHost();} else {ui->lineEditHost->setEnabled(true);ui->spinBoxPort->setEnabled(true);ui->buttonConnect->setText(tr("Connect"));m_client->disconnectFromHost();}
}void MainWindow::on_buttonQuit_clicked()
{QApplication::quit();
}void MainWindow::updateLogStateChange()
{const QString content = QDateTime::currentDateTime().toString()+ QLatin1String(": State Change")+ QString::number(m_client->state())+ QLatin1Char('\n');ui->editLog->insertPlainText(content);
}void MainWindow::brokerDisconnected()
{ui->lineEditHost->setEnabled(true);ui->spinBoxPort->setEnabled(true);ui->buttonConnect->setText(tr("Connect"));
}void MainWindow::setClientPort(int p)
{m_client->setPort(p);
}void MainWindow::on_buttonPublish_clicked()
{if (m_client->publish(ui->lineEditTopic->text(), ui->lineEditMessage->text().toUtf8()) == -1)QMessageBox::critical(this, QLatin1String("Error"), QLatin1String("Could not publish message"));
}void MainWindow::on_buttonSubscribe_clicked()
{auto subscription = m_client->subscribe(ui->lineEditTopic->text());if (!subscription) {QMessageBox::critical(this, QLatin1String("Error"), QLatin1String("Could not subscribe. Is there a valid connection?"));return;}
}

我们直接编译运行该示例:
broker.hivemq.com
在这里插入图片描述
在官方文档中介绍,可以直接连接以下两个服务器地址:
在这里插入图片描述

经测试,第一个地址连接不上,所以我们直接输入第二个地址进行测试:broker.hivemq.com
在这里插入图片描述
输入地址,点击连接后就可以连接服务器,并且State变成了2就表示已经连上了。
然后点击订阅按钮,表示要订阅这个主题,在点击发布,就可以收到信息了:
在这里插入图片描述
可以在多台电脑上进行测试,只要订阅了同一个主题,那么一端发送消息,其他端就可以接收到相应的信息。

Qt官方提供了非常详细的文档介绍,大家可以去参考接口的使用,最主要使用的类是QMqttClient

至此,Qt官方提供的MQTT封装模块使用介绍已经全部完了,下一篇将介绍一个第三方基于MQTT封装的使用方式。

演示Demo在这里


http://chatgpt.dhexx.cn/article/kdp9MUYM.shtml

相关文章

Qt开发之Rust篇(一)

本文运行环境&#xff1a; 操作系统&#xff1a;Windows 11 专业版Visual Studio版本&#xff1a;Visual Studio 2022 PreviewQt版本&#xff1a;Qt 5.14.2 1、安装C编译器 除了 Rust 自己的构建工具之外&#xff0c;您还需要设置 C 编译器、Qt 和 CMake。 在 Windows 上&am…

【Qt】ubuntu下Qt开发环境的搭建

下载对应版本的Qt开发环境 Qt官网下载地址&#xff1a;https://download.qt.io 国内镜像下载地址&#xff1a;https://mirrors.cloud.tencent.com/qt/ 。建议用镜像下载速度快。集成安装包在 official_releases/qt 目录下&#xff0c;新地址&#xff1a;https://download.q…

QT开发环境简介、安装以及搭建VS2019环境

文章目录 1、QT简介2、 QT的安装1、下载QT安装包2、安装QT1、安装qt creator2、设置qt账号3、选择安装路径4、选择组件5、同意许可协议&#xff0c;下一步6、菜单快捷方式7、点击安装&#xff0c;等待安装完成8、安装完成 3、qt creator创建工程1、打开软件2、新建项目3、选择Q…

Qt开发框架介绍

Qt: 基于C++跨平台的软件开发框架 Languages: C++, Python, Qt QML, Javascript Qt支持的平台有:Windows, Linux, macOS Qt Quick技术: 描述性UI设计语言(QML)作为前端, C++作为后端. 适用于基于触摸操作的界面的开发, 轻松实现优美、现代的界面. 默认使用GPU进行图形渲染.…

用QT开发安卓应用

QT官网参考链接 https://doc.qt.io/qt-5/android.html 这里的指示是QT5的&#xff0c;和QT6有点不同。 安装QT 下载地址QT6&#xff1a;http://download.qt.io/archive/qt/6.0/6.0.0/single/ 安装后&#xff0c;会多出一个Qt文件夹&#xff0c;里边包含了Qt Creator.app和…

【QT基础入门】1、QT开发环境搭建

文章目录 一、学习所需要的软件 二、安装 VS2012 三、win10 下安装 QT 一、学习所需要的软件 Visual Studio 2012Qt SDK 4.7.4Qt Creator 2.4.1 Visutal Studio 2012 用于学习 Windows 上 GUI 程序设计的原理体会使用 C/C 编写 GUI 窗口应用程序展现 Qt 对于 Windows 窗口开…

UOS搭建QT开发环境

需要注意的是&#xff0c;UOS与其他ubantu系统不同&#xff0c;UOS本身是基于QT开发的&#xff0c;所以当安装的QT版本高于UOS开发者使用的版本时&#xff0c;在使用过程中会出现各种问题。 以下以 UOS家庭版&#xff08;系统环境搭建参考本人上一篇博客 搭建国产化统信UOS操作…

VS2019 Qt开发环境搭建与配置

目录 更新说明 学习Qt、安装Qt环境的困扰 问题1&#xff1a;该选什么操作系统&#xff0c;该用MinGW还是msvc ? 问题2&#xff1a;如果用visual studio该安装哪个qt版本&#xff1f; 问题3&#xff1a;Qt开发商业软件需要付费授权吗&#xff1f; Visual studio Qt 安装步骤…

安装QT开发环境

UOS操作系统 1. 开启开发者权限。 开启开发者权限后可以使用root权限。 2. 先获取可更新的软件执行 sudo apt-get update 3. 安装所有可更新的软件 sudo apt-get dist-upgrade 4. 安装所有依赖的环境包 一下命令为了方便可以写入脚本中执行脚本运行更加方便。一下除了安…

Qt开发Android环境配置

目录 0.前提 1.安装JDK 2.Android SDK下载 3. 安装模拟器 4.Qt中进行配置 5.新建android项目 6.结束 0.前提 安装Qt时勾选Android相关套件&#xff0c;确保Qt的安装组件已被安装。 1.安装JDK Java Downloads | Oracle 安装java8即可&#xff0c;需要登陆&#xff0c;没…

08_树莓派安装Qt开发环境

目的&#xff1a; 通过本章节&#xff0c;在树莓派上安装Qt开发环境。 目录 1、Qt简介 2、安装Qt开发环境 2.1、安装指令 2.2、示例demo 2.2.1、打开Qt Creator工具 2.2.2、新建工程 2.2.3、添加hello标签 2.2.4、编译运行工程代码 2.2.5、运行结果 1、Qt简介 Qt 是一个…

Qt 开发环境搭建

一、Qt下载与安装 1、qt下载网站https://download.qt.io/ 其中各个目录含义如下&#xff1a; 目录说明snapshots/预览版&#xff0c;最新开发测试的Qt库和开发工具online/在线安装源official_releases/正式发布版&#xff0c;是与开发版相对应的稳定版Qt库和开发工具&#x…

VS中使用Qt开发项目

文章目录 请添加图片描述 前言一、Qt和VS版本的选择和安装&#xff08;一&#xff09;Qt版本的选择和安装&#xff08;二&#xff09;VS版本的选择及安装 二、VS与Qt的连接&#xff08;一&#xff09;安装插件&#xff08;二&#xff09;Qt路径配置&#xff08;三&#xff09;测…

Qt 开发使用VSCode

配置环境变量 从Qt安装目录中找到对应的工具路径配置环境变量 配置cmake工具环境变量 D:\Qt\Tools\CMake_64\bin (cmake.exe 跨平台的编译配置工具,可以用简单的语句来描述所有平台的编译过程) 配置gcc编译器环境变量 D:\Qt\Tools\mingw810_64\bin (鼎鼎大名的gcc/g&#xff…

【QT开发笔记-基础篇】| 第一章 QT入门 | 1.2 搭建Qt开发环境

本节对应的视频讲解&#xff1a;B_站_链_接 https://www.bilibili.com/video/BV1Pr4y1x7fh Qt 开发主要有两种开发环境 Qt Creator 它是 Qt 官方提供的开发环境&#xff0c;并且 creator 本身是跨平台的&#xff0c;它可以被安装在 windows、linux、mac 上。 Visual Studio …

【Qt5】入门Qt开发教程,一篇文章就够了(Creator、混合开发、多窗体、资源文件、打包发布、exe图标)

时间是人类生活的空间&#xff0c;我们在时域上展开生活&#xff0c;构建自己的世界 零|说明 本文面向初学者介绍Qt5开发&#xff0c;不求全面 但求过程完整 每个步骤只说明【一种】操作方式 代码和操作并重 在给出代码的同时介绍开发环境的使用 力图使读者能较容易地【复现】…

QT——开发入门简介

【系列专栏】&#xff1a;博主结合工作实践输出的&#xff0c;解决实际问题的专栏&#xff0c;朋友们看过来&#xff01; 《QT开发实战》 《嵌入式通用开发实战》 《嵌入式Linux开发实战》 1、你了解Qt吗&#xff1f; Qt是一种基于C的跨平台图形用户界面应用程序开发框架。如何…

Qt开发简介-1

Qt是什么&#xff1f; Qt&#xff08;官方发音 [kju:t]&#xff0c;音同 cute&#xff09;是一个跨平台的C开发库&#xff0c;主要用来开发图形用户界面&#xff08;Graphical User Interface&#xff0c;GUI&#xff09;程序&#xff0c;当然也可以开发不带界面的命令行&…

详解Qt的几种开发方式

1.qt值得学习吗&#xff1f;2.那么哪种Qt开发方式较好或者容易入门呢&#xff1f;3.使用VSQt的正确打开方式4.使用Qt Creator的打开方式5.结论 1.qt值得学习吗&#xff1f; 嵌入式要学的东西真的很多&#xff0c;我们可能会说不写界面的话就不用学qt了&#xff1f;我不赞同。…

QT界面开发--基础学习篇一(上)

一、Qt简单介绍&#xff1a; 1、QT的简单理解&#xff1a; Qt简单的说就是一种可以跨平台的编程语言工具&#xff0c;可以直接类比C语言和C. 且一般QT的代码逻辑也是以C语言和C&#xff08;也可以适用于像JS的语言&#xff09;&#xff0c;可以直观理解于VScode、vs2019. 不…