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

基于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.kler.cn/news/318516.html

相关文章:

  • Go基础学习04-变量重声明;类型转换;类型断言;Unicode代码点;类型别名;潜在类型
  • MobileNetV2: Inverted Residuals and Linear Bottlenecks
  • vue2和vue3页面加自定义水印(组件化)
  • 【计算机网络 - 基础问题】每日 3 题(二十)
  • SpringBoot的应用
  • 现代桌面UI框架科普及WPF入门1
  • Mac电脑上最简单安装Python的方式
  • Java:文件操作
  • [spring]用MyBatis XML操作数据库 其他查询操作 数据库连接池 mysql企业开发规范
  • WPF入门教学十四 命令与ICommand接口
  • OpenAI GPT o1技术报告阅读(5)-安全性对齐以及思维链等的综合评估与思考
  • Servlet入门:服务端小程序的初试(自己学习整理的资料)
  • R包:gplots经典热图
  • CentOS中使用Docker运行mysql并挂载本地目录
  • 滚雪球学SpringCloud[9.3讲]:微服务监控与运维详解
  • redis 快速入门
  • Serilog文档翻译系列(五) - 编写日志事件
  • [利用python进行数据分析01] “来⾃Bitly的USA.gov数据” 分析出各个地区的 windows和非windows用户
  • vue2 实现简易版的模糊查询功能
  • 大数据新视界 --大数据大厂之大数据实战指南:Apache Flume 数据采集的配置与优化秘籍
  • RabbitMQ 高级特性——发送方确认
  • 实现信创Linux桌面录制成MP4(源码,银河麒麟、统信UOS)
  • debain 登录后提示符显示ip
  • jekyll相关的技术点
  • 网络PPP协议802.11协议以太网协议IPV4协议在思科模拟器的实现
  • 深度学习(5):逻辑斯蒂回归Logistic
  • 深度学习(2):梯度下降
  • Windows系统使用PHPStudy搭建Cloudreve私有云盘公网环境远程访问
  • OTTO奥托机器人开发总结
  • 2024java高频面试-数据库相关