基于Qt5.12.2开发 MQTT客户端调试助手

项目介绍

该项目是一个基于 Qt 框架开发的桌面应用程序,主要用于与 MQTT 服务器进行连接和通信。通过该应用,用户可以连接到 MQTT 服务器,订阅主题、发布消息并处理接收到的消息。项目使用 QMqttClient 类来实现 MQTT 协议的客户端功能,界面通过 QMainWindow 进行搭建,提供了用户友好的操作界面。
在这里插入图片描述

项目功能

  1. MQTT 连接与断开:用户可以通过设置服务器的 IP、端口、用户名、密码等参数进行连接或断开与 MQTT 服务器的连接。
  2. 消息订阅与取消订阅:用户可以订阅一个或多个 MQTT 主题,并通过接口取消订阅。
  3. 消息发布:用户可以向特定的 MQTT 主题发布消息,并查看发布状态。
  4. 消息接收:当订阅的主题收到消息时,会实时显示消息内容。
  5. 日志输出:将运行状态、发布或接收的消息内容以不同颜色显示在界面上,区分信息、警告、错误等类型。
  6. 启动新客户端实例:提供按钮以启动新的客户端实例,方便进行多客户端测试。
    在这里插入图片描述
    在这里插入图片描述

关键代码解析

1. 初始化与连接设置

项目启动时会创建 QMqttClient 对象,并通过信号槽机制连接各种事件。

client = new QMqttClient();  // 创建 MQTT 客户端// 连接信号槽
connect(client, &QMqttClient::connected, this, &MainWindow::onRespondMqttConnected);
connect(client, &QMqttClient::errorChanged, this, &MainWindow::onRespondMqttError);
connect(client, &QMqttClient::stateChanged, this, &MainWindow::onMqttClientStatusChanged);

该部分代码实现了当 MQTT 连接成功、出现错误或状态发生变化时的响应。

2. 样式初始化

项目加载了一个 qss 样式表,用于美化界面。

void MainWindow::initStyle()
{QString qss;QFile file(":/qss/psblack.css");if (file.open(QFile::ReadOnly)) {QTextStream in(&file);qss = in.readAll();qApp->setStyleSheet(qss);file.close();}
}
3. 连接到 MQTT 服务器

在点击“连接”按钮后,程序会根据用户输入的服务器信息尝试与 MQTT 服务器建立连接。

void MainWindow::on_BtnConnect_clicked()
{client->setHostname(ui->EditIP->text());client->setPort(static_cast<quint16>(ui->SpinboxPort->value()));client->setClientId(ui->EditClientID->text());client->setUsername(ui->EditUserName->text());client->setPassword(ui->EditPassWord->text());client->connectToHost();  // 连接到服务器
}
4. 订阅与取消订阅主题

当用户点击“订阅”按钮时,程序会订阅指定的主题,并返回订阅的状态。如果成功订阅,程序会将该信息记录并显示。

void MainWindow::on_BtnSubTopic_clicked()
{auto subscription = client->subscribe(ui->EditTopic->text());if (subscription) {WriteRunMsg(tc("已订阅主题: %1").arg(ui->EditTopic->text()), Info);} else {WriteRunMsg(tc("订阅主题失败"), Error);}
}

取消订阅同样简单,通过调用 unsubscribe 来实现。

void MainWindow::on_BtnUnSubTopic_clicked()
{client->unsubscribe(ui->EditTopic->text());  // 取消订阅WriteRunMsg(tc("已取消订阅主题: %1").arg(ui->EditTopic->text()), Info);
}
5. 发布消息

用户可以输入消息并通过指定的主题发布消息,程序会返回发布结果并显示在日志中。

void MainWindow::on_BtnPushTopic_clicked()
{qint32 packetId = client->publish(ui->EditPushTopic->text(), ui->EditPushMsg->toPlainText().toLocal8Bit().data());if (packetId != -1) {WriteRunMsg(tc("消息已发布到主题: %1").arg(ui->EditPushTopic->text()), Send);} else {WriteRunMsg(tc("消息发布失败"), Error);}
}
6. 接收消息

当 MQTT 客户端收到消息时,程序会通过槽函数处理,并将消息显示在用户界面中。

void MainWindow::onRespondMqttTopicReceived(const QByteArray &ba, const QMqttTopicName &topic)
{QString msg = tc("主题: %1\n内容: %2").arg(topic.name()).arg(QString::fromLocal8Bit(ba));WriteRunMsg(msg, Receive);
}
7. 错误处理

当 MQTT 连接发生错误时,会触发 onRespondMqttError 回调函数,程序会根据不同的错误类型输出详细信息。

void MainWindow::handleMqttError(const QMqttClient::ClientError &error)
{QString errorMessage;switch (error) {case QMqttClient::InvalidProtocolVersion:errorMessage = tc("无效的协议版本");break;case QMqttClient::IdRejected:errorMessage = tc("客户端ID被服务器拒绝");break;case QMqttClient::ServerUnavailable:errorMessage = tc("服务器不可用");break;case QMqttClient::BadUsernameOrPassword:errorMessage = tc("用户名或密码错误");break;default:errorMessage = tc("未知错误");break;}WriteRunMsg(errorMessage, Error);
}

该项目通过 Qt 框架实现了一个功能全面的 MQTT 客户端。通过友好的用户界面,用户可以方便地与 MQTT 服务器进行通信,处理消息的订阅、发布和接收,并且提供了丰富的错误处理和日志记录功能,极大地提高了用户操作的易用性和透明度。

关键技术点包括:

  1. QMqttClient 的使用,处理 MQTT 连接、订阅、发布和消息接收。
  2. 信号与槽机制,用于响应连接、消息接收、状态变化和错误处理等异步事件。
  3. Qt 样式表 (QSS) 的使用,提升了用户界面的视觉效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/149797.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录Day17 图论-2

103. 水流问题 本题思路很简单 要求我们找到可以满足到达两个边界的单元格的坐标 有一个优化的思路就是 我们从边界的节点向中间遍历 然后用两个数组表示 一个是第一组边界的数组 一个是第二边界的数组 如果两个数组都遍历到了某一个单元格 就说明该单元格时满足题目要求的 #…

初识Java(六)(一维数组)(自己学习整理的资料)

目录 一.复习题 二.数组 三.一维数组 四.数组排序 五.数组的插入和删除 1.插入元素 插入元素案例 2.删除元素 删除元素案例 六.顺序查找 顺序查找案例 七.二分查找 二分查找案例 八.冒泡排序 笔记 一.复习题 &#xff08;一&#xff09;求S1&#xff01;2&#x…

微软宣称其新工具可纠正人工智能幻觉 但专家依然对此表示怀疑

人工智能经常胡言乱语&#xff0c;微软现在说它有办法解决这个问题&#xff0c;但我们有理由对此持怀疑态度。微软今天发布了一项名为"更正"&#xff08;Correction&#xff09;的服务&#xff0c;它可以自动修改人工智能生成的与事实不符的文本。Correction 首先会标…

Golang | Leetcode Golang题解之第435题无重叠区间

题目&#xff1a; 题解&#xff1a; func eraseOverlapIntervals(intervals [][]int) int {n : len(intervals)if n 0 {return 0}sort.Slice(intervals, func(i, j int) bool { return intervals[i][1] < intervals[j][1] })ans, right : 1, intervals[0][1]for _, p : ra…

js实现多行文本控件textarea,根据文本内容自适应窗口全部显示

概述 本人在使用html控件textarea&#xff0c;多行显示的时候&#xff0c;希望根据后台实际的文本&#xff0c;来全部显示文本内容&#xff0c;而不用再去操作滚动条查看全部文本。 本功能实现的难点在于&#xff0c;计算当前文本显示有多少行。 软件环境 编辑器&#xff1a…

使用 UWA Gears 测试小游戏性能

UWA Gears 是UWA最新发布的无SDK性能分析工具。针对移动平台&#xff0c;提供了实时监测和截帧分析功能&#xff0c;帮助您精准定位性能热点&#xff0c;提升应用的整体表现。 随着小游戏的规模和用户量持续增长&#xff0c;玩家对于小游戏的性能要求也越来越高。为了能够给玩…

现代桌面UI框架科普及WPF入门1

现代桌面UI框架科普及WPF入门 文章目录 现代桌面UI框架科普及WPF入门桌面应用程序框架介绍过时的UI框架MFC (Microsoft Foundation Class)缺点 经典的UI框架**WinForms****QT****WPF** 未来的UI框架**MAUI****AvaloniaUI** WPF相对于Winform&#xff0c;QT&#xff0c;MFC的独立…

1.1 elasticsearch分布式集群基本搭建(centos7.x + elaticsearch7.11.1)

【1】分布式分片集群基础概念 【1.1】ES的分布式集群有什么用&#xff1f; 高可用 高可用(High Availability)是分布式系统架构设计中必须考虑的因素之一&#xff0c;它通常是指&#xff0c;通过设计减少系统不能提供服务的时间。如果系统每运行100个时间单位&#xff0c;会有…

ubuntu22.04磁盘挂载(多磁盘和单磁盘挂载)

多磁盘挂载到同一个目录 # 如果没有安装逻辑卷管理系统工具sudo apt install lvm2 # 查看磁盘分区sudo fdisk -l # 新建物理卷sudo pvcreate /dev/nvme0n1 /dev/nvme1n1 # 查看现有物理卷信息sudo pvdisplay # 新建物理卷sudo vgcreate dnyjy_vg /dev/nvme0n1 /dev/nvme1n1…

微服务之服务保护

Sentinel引入Java项目中 一&#xff1a;安装Sentinel 官网地址&#xff1a;https://github.com/alibaba/Sentinel/releases 二&#xff1a;安装好后在sentinel-dashboard.jar所在目录运行终端 三&#xff1a;运行命令&#xff0c;端口自己指定 java -Dserver.port8090 -Dcs…

Unity 热更新(HybridCLR+Addressable)-资源更新

七、资源更新 创建一个叫Aot的文件夹&#xff0c;用来存放不会热更新的资源 这个修改为第三个 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b8be5e6465184ad5ad6173c6870bfa06.png 这个是更新 在更新或者打包时遇到端口被占的报错&#xff0c;不用理会&#xf…

frp内网穿透常见问题

Frp编译和部署比较复杂&#xff0c;多端口映射时或者连接数多的情况下会出现不稳定的现象&#xff0c;不适合小白使用&#xff0c;而且仅是上一代的内网穿透技术&#xff0c;生产环境使用建议选择稳定性比较高的产品&#xff0c;如神卓互联、花生壳等&#xff0c;都是采用C语言…

Springboot原理之bean的依赖功能、自动配置

1. Bean管理 Spring 当中提供的注解 Component 以及它的三个衍 生注解&#xff08; Controller 、 Service 、 Repository &#xff09;来声明 IOC 容器中的 bean 对象&#xff0c;同时我们也学 习了如何为应用程序注入运行时所需要依赖的 bean 对象&#xff0c;也就是依赖注…

电池快充协议芯片

1&#xff1a;18650充电快充规则 电池知识 | 东莞市恒帝电子科技有限公司 (heldee.com) 锂电池快速充电知识【钜大锂电】 (juda.cn)18 锂电池和18650锂电池能不能快速充电&#xff0c;四种充电方式讲解 | 东莞市恒帝电子科技有限公司 (heldee.com) 2&#xff1a;国产厂家 …

光子架与电子架 -- 主从子架

主从子架模式可以实现物理上的多个子架在网管上作为一个网元统一管理&#xff0c;这样可以节省IP资源与管理开销&#xff0c;方便维护。 主从子架级联模式 在主从子架模式下&#xff0c;仅主子架可以和网管相连。和网管相连的主子架所在网元为网关网元。主从子架支持树型级联和…

node-rtsp-stream、jsmpeg.min.js实现rtsp视频在web端播放

1. 服务地址&#xff08;私有&#xff09;&#xff1a;https://gitee.com/nnlss/video-node-server 2.node-rtsp-stream 需要安装FFMPEG&#xff1b; 3.给推拉流做了开关&#xff0c;可借助http请求&#xff0c;有更好方式可联系&#xff1b; 4.存在问题&#xff1a; 1&…

浅谈提示工程之In-context learning技术

提示工程之In-context learning技术&#xff1b; 通过一张图片围绕下边几个方面进行简单说明 概念起因本质结构注意事项 日常总结

C++(9.24)

头文件 #ifndef MY_STRING_H #define MY_STRING_H#include <iostream>class My_string { private:char *ptr; // 指向字符数组的指针int size; // 字符串的最大容量int len; // 字符串的当前长度public:My_string();My_string(const char *src);My_string(const My_s…

Error:Decorators are not valid here. 使用Angular中的装饰器

Decorators are not valid here&#xff0c;项目中出现这个提示信息&#xff0c;说明装饰器未知错误、或者在不支持的元素上使用了装饰器。 如下图所示&#xff0c;我在NgModule装饰器后面加了一个导出方法&#xff0c;加完之后控制台提示了如下错误&#xff1a;Error TS1206&a…

【python】横截面数据分析及可视化报告示例

问题描述 题目&#xff1a; 共享的数据文件夹包含 2 个外部文件。第一个文件 "project data.xls "涉及国家层面的数据&#xff08;2000-2019 年&#xff09;&#xff0c;变量大多摘自世界发展指标。变量解释在第二个文件中 创建一个模型&#xff0c;解释为什么一些国…