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

news2024/11/25 9:47:27

项目介绍

该项目是一个基于 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.coloradmin.cn/o/2164807.html

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

相关文章

第128集《大佛顶首楞严经》

《大佛顶如来密因修正了义诸菩萨万行首楞严经》。监院法师慈悲&#xff0c;诸位法师&#xff0c;诸位同学&#xff0c;阿弥陀佛&#xff01; 请大家打开讲义296面。 庚一、总示阴相&#xff08;分四&#xff1a;辛一、结前行阴尽相。辛二、正明识阴区宇。辛三、悬示识阴尽相。…

通过frp 免费内网穿透,端口转发

1.准备工作 (1)拥有一台有公网IP的服务器(系统可以是windows/macos/linux),服务器可以使用云厂商购买的服务器 (2)从下面链接下载最新版本的frp安装包,客户端和服务端是同一个tar包 https://github.com/fatedier/frp/releases 服务端机器A-有外网ip的作为服务端 服务端机器B-需…

前端接口415状态码【解决】

前端接口415状态码【解决】 一、概述 415状态码是HTTP协议中的一个标准响应状态码&#xff0c;代表“Unsupported Media Type”&#xff08;不支持的媒体类型&#xff09;。当客户端尝试上传或发送一个服务器无法处理的媒体类型时&#xff0c;服务器会返回这个状态码。这通常意…

二维四边形网格生成算法:paving(五)缝合 Seaming 与 闭合检测 Closure Check

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 参考论文&#xff1a;Paving: A new approach to automated quadrilateral mesh generation 关注公众号回复paving可以获得文章链接 paving&#xff08;一&#xff0…

python如何将字符转换为数字

python中的字符数字之间的转换函数 int(x [,base ]) 将x转换为一个整数 long(x [,base ]) 将x转换为一个长整数 float(x ) 将x转换到一个浮点数 complex(real [,imag ]) 创建一个复数 str(x ) 将对象 x 转换为字…

Pytest测试实战|执行常用命令

Pytest测试实战 本文章主要详细地阐述下Pytest测试框架执行TestCase常用命令。 按分类执行 在Pytest测试框架中按照分类执行的命令为“-k”&#xff0c;它的主要特点是按照TestCase名字的模式来执行&#xff0c;在编写具体的TestCase的时候&#xff0c;都会编写每个TestCase…

el-table表格点击该行任意位置时也勾选上其前面的复选框

需求&#xff1a;当双击表格某一行任意位置时&#xff0c;自动勾选上其前面的复选框 1、在el-table 组件的每一行添加row-dblclick事件&#xff0c;用于双击点击 <el-table:data"tableData"ref"tableRef"selection-change"handleSelectionChange&q…

常用组件详解(五):torch.nn.BatchNorm2d()

文章目录 一、基本原理二、函数说明 在卷积神经网络的卷积层之后通常会添加torch.nn.BatchNorm2d()进行数据的归一化处理&#xff0c;将数据规范到均值为0&#xff0c;方差为一的分布上&#xff0c;使得数据在进行Relu时不会因为数据过大而导致网络性能的不稳定。 一、基本原理…

基础实践:使用JQuery Ajax调用Servlet

前言 本博客介绍最简单的JQuery&#xff08;原生JS的封装库&#xff09;使用Ajax发送请求&#xff0c;并通过对应的servlet响应数据&#xff0c;并在页面显示&#xff0c;并且servlet响应的数据来自MySQL数据库。 实现需求&#xff1a;在前端页面的输入框中输入要注册的用户名&…

2024年_ChatGPT 及类似的人工智能技术带来的影响与改变 怎样利用 ChatGPT 提高学习效率

人工智能技术给我们带来了什么的改变&#xff1a; 工作方式与效率&#xff1a; 信息检索与处理&#xff1a;能快速整合大量信息&#xff0c;提供较为准确的答案和建议&#xff0c;帮助人们更高效地获取所需知识&#xff0c;提升信息检索和处理的速度与质量&#xff0c;比如在做…

Git版本控制的使用教程

使用Git进行项目代码的版本控制&#xff0c;具体操作&#xff1a; 1). 创建Git本地仓库 当Idea中出现&#xff1a; 说明本地仓库创建成功。 2). 创建Git远程仓库 访问Gitee - 基于 Git 的代码托管和研发协作平台&#xff0c;新建仓库 点击 创建 3). 将本地文件推送到Git远程…

Java【根据数据库生成实体文件】

下载插件 安装 MybatisX 配置包 Scratches and Consoles -> Extensions&#xff0c;Reload from Disk 后&#xff0c;会出现 MyBatisX 文件夹&#xff0c;将模板配置文件夹&#xff08;我的模板配置文件夹叫做 a-custom&#xff09;放入该文件夹下的 templates 文件夹内&am…

【欧拉函数变化】[SDOI2012] Longge 的问题

求和 gcd(i,j) 转化为 k*gcd(i/k,j/k) 1 (i,j%k 0)。 本质就是利用互质转化到了欧拉函数的领域上。 [SDOI2012] Longge 的问题 - 洛谷 转自小粉兔 #include<bits/stdc.h> #define int long long using namespace std; unordered_map<int,int>pd; long long…

天润融通发布微藤智能体平台,中国客户联络正式进入“智能体时代”

9月19日&#xff0c;以“云启智跃&#xff0c;产业蝶变”为主题的2024云栖大会在杭州正式开幕。大会持续三天&#xff0c;聚焦AI时代的技术升级与实践应用&#xff0c;设有三大主论坛、400多个分论坛&#xff0c;并开放4万平方米的智能科技展区&#xff0c;展示全球百余款AI应用…

20_BERT微调训练

1.导包 import json #通过路径加载预训练模型 import os import torch from torch import nn import dltools2.加载预训练模型BERT函数 def load_pretrained_model(pretrained_model, num_hiddens, ffn_num_hiddens,num_heads, num_layers, dropout, max_len, devices):dat…

David律所代理Jose Martin幽默水果版权首发维权,尚未TRO

案件基本情况&#xff1a;起诉时间&#xff1a;2024/9/18案件号&#xff1a;2024-cv-08484原告&#xff1a;Jose Martin原告律所&#xff1a;David起诉地&#xff1a;伊利诺伊州北部法院涉案商标/版权&#xff1a;原告品牌简介&#xff1a;西班牙的卓越艺术家Jose Martin以他非…

linux 下80端口被占用

先看报错&#xff1a; [rootlocalhost ~]# nginx nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address alread…

专业版【命令行下载离线安装包及依赖】

UOS统信专业版命令行下载应用商店应用软件的离线安装包及依赖的相关信息。 文章目录 应用场景一、解决方案1.首先需要确认待下载应用的软件包名称。打开应用商店&#xff0c;找到想下载的应用&#xff0c;这里以【企业微信】为例&#xff1a;2.点击应用版本右侧切换按钮&#x…

docker - 迁移和备份

文章目录 1、docker commit1.1、查询 容器 docker ps1.2、docker commit zookeeper zookeeper:3.4.13 2、docker save -o2.1、宿主机 切换到 /opt 目录下2.2、将镜像保存到 宿主机/opt目录下 3、docker load -i 对某一个容器修改完毕以后&#xff0c;我们可以把最新的容器部署到…

三、LLM应用开发准备工作

LLM应用开发准备工作 开发基础开发工具大模型kxswkey的配置与使用工具推荐结语 开发基础 最好具备一定的Python开发基础&#xff0c;不需要特别深 如果不具备&#xff0c;可以先学习一下基础知识&#xff08;概念&#xff09;&#xff0c;比如Python环境管理、包管理与使用、基…