当前位置: 首页 > news >正文

QT6搭建和使用MQTT

QT6搭建和使用MQTT

  • 1.搭建MQTT环境
    • 1.下载源码
    • 2.CMake 编译 Qt MQTT 模块
    • 3.添加QT MQTT模块
    • 4.验证测试
  • 2.MQTT的使用

1.搭建MQTT环境

1.下载源码

1.在GitHub下载对应qt版本的源码
git clone git://code.qt.io/qt/qtmqtt.git -b 6.5.3

这里以6.5.3版本的为例。
这里使用的是VScode的终端,使用cmd也可以。
在这里插入图片描述
在这里插入图片描述

2.CMake 编译 Qt MQTT 模块

1.使用QT软件打开CMakeLists.txt。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
编译成功文件夹里会生成一个build的文件夹,里面包含Desktop_Qt_6_5_3_MinGW_64_bit-Release这个文件。
在这里插入图片描述

3.添加QT MQTT模块

这里将编译好的文件放到Qt的安装目录中。
1.移动bin文件里的Qt6Mqtt.dll。注意两者的路径

2.移动include里的QtMqtt文件夹。注意两者的路径
在这里插入图片描述
3.移动lib文件夹
注意路径。
Qt6Mqtt文件夹
在这里插入图片描述
Qt6Mqtt.pc文件
在这里插入图片描述
libQt6Mqtt.a Qt6Mqtt.prl文件。
在这里插入图片描述
4.移动mkspecs文件
在这里插入图片描述
5.modules文件夹
在这里插入图片描述
6.复制替换头文件的内容
在这里插入图片描述
7.至此mqtt环境已经全部配置完成了。下面我们可以进行验证一下

4.验证测试

进入到例示程序里面选中该文件。
在这里插入图片描述
在这里插入图片描述
点击运行,如果之前配置没有出错的话,这里可以出现运行界面。
在这里插入图片描述
连接EMQ 免费提供的公共 MQTT Broker,基于 EMQX Platform 构建。服务器访问详情如下:
代理:broker.emqx.io
TCP 端口:1883
SSL/TLS 端口:8883
WebSocket 端口:8083
SSL/TLS 端口:8883
安全 WebSocket 端口:8084
在这里插入图片描述

2.MQTT的使用

1.添加相关头文件

#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QtCore/QDateTime>
#include <QtMqtt/QMqttClient>
#include <QtWidgets/QMessageBox>

2.窗口

MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);  //MQTT客户端设置m_client = new QMqttClient(this);
//从界面上获取MQTT服务器的主机名和端口号m_client->setHostname(ui->lineEditHost->text());  m_client->setPort(static_cast<quint16>(ui->spinBoxPort->value()));//信号槽连接
//状态变化处理 调用updateLogStateChange更新当前的状态connect(m_client, &QMqttClient::stateChanged, this, &MainWindow::updateLogStateChange);
//断开连接处理  当断开时调用brokerDisconnected     connect(m_client, &QMqttClient::disconnected, this, &MainWindow::brokerDisconnected);//消息接收处理 当接收到MQTT消息时,记录时间戳,主题和消息内容到日志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);});
//Ping相应处理    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);//端口号变化时,通过setClientPort函数更新客户端设置connect(ui->spinBoxPort, QOverload<int>::of(&QSpinBox::valueChanged), this, &MainWindow::setClientPort);//初始化日志状态   updateLogStateChange();
}

3.进行连接

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(); //断开连接}
}

4.初始化日志状态

void MainWindow::updateLogStateChange()
{const QString content = QDateTime::currentDateTime().toString()+ QLatin1String(": State Change")+ QString::number(m_client->state())+ QLatin1Char('\n');ui->editLog->insertPlainText(content);
}

5.断开连接

void MainWindow::brokerDisconnected()
{ui->lineEditHost->setEnabled(true);ui->spinBoxPort->setEnabled(true);ui->buttonConnect->setText(tr("Connect"));
}

6.端口设置函数

void MainWindow::setClientPort(int p)
{m_client->setPort(static_cast<quint16>(p));
}

7.消息发布函数
从界面获取主题和消息内容
调用 MQTT 客户端发布消息
错误处理:发布失败时显示错误对话框

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"));
}

8.主题订阅函数
从界面获取订阅主题
调用 MQTT 客户端订阅主题
错误处理:订阅失败时显示错误对话框

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;}
}

相关文章:

  • 【LangChain】
  • 【Redis】第3节|深入理解Redis线程模型
  • Python中的__init__和__new__方法解析
  • 纵览网丨病毒学领域的 AI 变局:机遇、隐忧与监管之路
  • AI如何让你的智能设备电池更“聪明”?——Python实现智能电池管理
  • jdk 国内下载镜像站
  • 互联网商业模式全景解读:B2B、B2C、C2C及更多
  • Android高级开发第一篇 - JNI(初级入门篇)
  • 第一个桌面应用程序的创建
  • st倍增(st表)
  • [Rust_1] 环境配置 | vs golang | 程序运行 | 包管理
  • 配网导线自取电式视频监测装置
  • MySQL 索引详解:从基础到原理
  • 前端使用qrcode来生成二维码的时候中间添加logo图标
  • Python入门教程:从零基础到精通的完整指南
  • 重温经典算法——选择排序
  • 互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景
  • [Dify] Chatflow 与 工作流的差异解析:多轮对话与流程编排的真正区别
  • linux 安装python
  • Android第十一次面试多线程篇
  • 教育机构的网站怎么做/百度搜索资源平台
  • 广州app开发公司排名十强/网站关键词优化公司
  • 地铁建设网站/站长统计推荐
  • 做翻译的网站/百度账户安全中心
  • 做网站的公司什么动力/成都百度百科
  • 网站 mip/怎么自己做一个小程序