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

Qt 官方提供了 **QtMqtt** 模块(`QMqttClient` 类),这是目前最推荐、最稳定的 MQTT 客户端实现

Qt MQTT 连接代码详解(Qt 5.9.9 ~ Qt 6.11 通用,适用于 Embedded-Integrated-Project)

Qt 官方提供了QtMqtt模块(QMqttClient类),这是目前最推荐、最稳定的 MQTT 客户端实现。项目Embedded-Integrated-Project的 Qt 上位机正是使用此模块实现与云服务器的 MQTT 通信(JSON 协议 + 设备 ChipID 主题)。

1. 项目配置(.pro 文件)

在你的Qt/Qt.pro(或主项目 .pro)中添加:

QT += core gui widgets network mqtt # 必须包含 mqtt 模块 # 推荐工业级优化 DEFINES += QT_NO_CAST_FROM_ASCII # 强制显式编码,配合 QByteArrayView CONFIG += c++17 # Qt 5.9.9 建议启用 # 如果是 Qt 6 项目(推荐升级) # QT += mqtt

注意:Qt 5.9.9 默认不包含 MQTT 模块,需要在 Qt 安装器中勾选 “Qt MQTT” 组件,或手动编译qtmqtt源码。

2. 完整封装类示例(推荐工业上位机写法)

创建一个MyMqttClient类,封装连接、重连、发布、订阅、协议解析等功能,适合直接复制到 Embedded-Integrated-Project 中使用。

头文件mymqttclient.h

#ifndefMYMQTTCLIENT_H#defineMYMQTTCLIENT_H#include<QMqttClient>#include<QMqttSubscription>#include<QJsonDocument>#include<QJsonObject>#include<QTimer>#include<QDebug>classMyMqttClient:publicQObject{Q_OBJECTpublic:explicitMyMqttClient(QObject*parent=nullptr);// 初始化参数(项目中常用)voidinit(constQString&host,quint16 port=1883,constQString&clientId=QString(),constQString&username=QString(),constQString&password=QString());voidconnectToBroker();// 连接voiddisconnectFromBroker();// 断开voidpublish(constQString&topic,constQJsonObject&json,intqos=0,boolretain=false);// 订阅示例(项目中设备 ChipID 主题)voidsubscribeDevice(constQString&chipId);signals:voidconnected();// 连接成功voiddisconnected();// 断开连接voidmessageReceived(constQString&topic,constQJsonObject&json);// JSON 消息privateslots:voidonConnected();voidonDisconnected();voidonMessageReceived(constQByteArray&message,constQMqttTopicName&topic);voidonStateChanged(QMqttClient::ClientState state);voidonErrorOccurred(QMqttClient::ClientError error);voidattemptReconnect();// 自动重连private:QMqttClient*m_client=nullptr;QTimer*m_reconnectTimer=nullptr;QString m_host;quint16 m_port=1883;QString m_clientId;QString m_username;QString m_password;intm_reconnectInterval=5000;// 重连间隔(ms)};#endif// MYMQTTCLIENT_H

源文件mymqttclient.cpp

#include"mymqttclient.h"MyMqttClient::MyMqttClient(QObject*parent):QObject(parent){m_client=newQMqttClient(this);m_reconnectTimer=newQTimer(this);m_reconnectTimer->setSingleShot(true);// 信号槽连接(Qt 5/6 通用写法)connect(m_client,&QMqttClient::connected,this,&MyMqttClient::onConnected);connect(m_client,&QMqttClient::disconnected,this,&MyMqttClient::onDisconnected);connect(m_client,&QMqttClient::messageReceived,this,&MyMqttClient::onMessageReceived);connect(m_client,&QMqttClient::stateChanged,this,&MyMqttClient::onStateChanged);connect(m_client,&QMqttClient::errorOccurred,this,&MyMqttClient::onErrorOccurred);connect(m_reconnectTimer,&QTimer::timeout,this,&MyMqttClient::attemptReconnect);}voidMyMqttClient::init(constQString&host,quint16 port,constQString&clientId,constQString&username,constQString&password){m_host=host;m_port=port;m_clientId=clientId.isEmpty()?"QtClient_"+QString::number(QDateTime::currentMSecsSinceEpoch()):clientId;m_username=username;m_password=password;m_client->setHostname(m_host);m_client->setPort(m_port);m_client->setClientId(m_clientId);if(!m_username.isEmpty())m_client->setUsername(m_username);if(!m_password.isEmpty())m_client->setPassword(m_password);// 工业级推荐配置m_client->setKeepAlive(60);// 60 秒心跳(1.5 倍规则)m_client->setAutoKeepAlive(true);// 自动管理 PINGm_client->setCleanSession(true);// 清除会话(掉线后不保留)}voidMyMqttClient::connectToBroker(){if(m_client->state()==QMqttClient::Connected)return;m_client->connectToHost();qDebug()<<"MQTT 正在连接:"<<m_host<<":"<<m_port;}voidMyMqttClient::disconnectFromBroker(){m_reconnectTimer->stop();m_client->disconnectFromHost();}voidMyMqttClient::onConnected(){qDebug()<<"MQTT 连接成功!ClientId:"<<m_client->clientId();emitconnected();// 项目中订阅设备主题// subscribeDevice("your_device_chipid");}voidMyMqttClient::onDisconnected(){qWarning()<<"MQTT 断开连接!";emitdisconnected();m_reconnectTimer->start(m_reconnectInterval);// 自动重连}voidMyMqttClient::onMessageReceived(constQByteArray&message,constQMqttTopicName&topic){// ★ 使用 QByteArrayView 零拷贝解析(性能关键)QByteArrayViewview(message);QJsonParseError error;QJsonDocument doc=QJsonDocument::fromJson(view.toByteArray(),&error);// view.toByteArray() 安全转换if(error.error==QJsonParseError::NoError){QJsonObject json=doc.object();qDebug()<<"收到 MQTT 消息 [Topic:"<<topic.name()<<"]"<<json;emitmessageReceived(topic.name(),json);}else{qWarning()<<"JSON 解析失败:"<<error.errorString();}}voidMyMqttClient::onStateChanged(QMqttClient::ClientState state){qDebug()<<"MQTT 状态变化:"<<state;}voidMyMqttClient::onErrorOccurred(QMqttClient::ClientError error){qWarning()<<"MQTT 错误:"<<error;}voidMyMqttClient::attemptReconnect(){if(m_client->state()!=QMqttClient::Connected){qDebug()<<"MQTT 自动重连...";connectToBroker();}}voidMyMqttClient::publish(constQString&topic,constQJsonObject&json,intqos,boolretain){QByteArray payload=QJsonDocument(json).toJson(QJsonDocument::Compact);m_client->publish(QMqttTopicName(topic),payload,qos,retain);qDebug()<<"发布 MQTT 消息 [Topic:"<<topic<<"]"<<json;}voidMyMqttClient::subscribeDevice(constQString&chipId){QString topic="device/"+chipId+"/#";// 项目中常用通配符autosubscription=m_client->subscribe(QMqttTopicName(topic),1);// QoS 1if(subscription){qDebug()<<"已订阅设备主题:"<<topic;}}

3. 使用方式(MainWindow 或主类中)

MyMqttClient*mqtt=newMyMqttClient(this);mqtt->init("your_server_ip",1883,"","user","pass");// 项目中通常无用户名密码connect(mqtt,&MyMqttClient::messageReceived,this,[](constQString&topic,constQJsonObject&json){// 处理项目 JSON 协议(控制指令、状态上报等)});mqtt->connectToBroker();

发布示例(下发控制指令):

QJsonObject cmd;cmd["cmd"]="open_fan";cmd["value"]=100;mqtt->publish("device/your_chipid/cmd",cmd,1);

4. 关键信号/参数详解(工业重点)

信号/属性说明工业推荐设置
connected()连接成功立即订阅所有设备主题
disconnected()断开启动重连定时器
messageReceived()收到任意消息(推荐用QByteArrayView解析)结合QJsonDocument处理 JSON
keepAlive心跳间隔(秒)60(项目中常用)
autoKeepAlive自动发送 PINGREQtrue(强烈推荐)
cleanSession是否清除会话true(掉线不保留旧消息)
QoS0/1/2命令用 1,数据上报用 0

5. 工业级进阶建议(结合项目)

  • 自动重连:已封装在onDisconnected()中。
  • SSL 加密(云服务器安全):改用m_client->connectToHostEncrypted(sslConfig)
  • 多设备支持:维护QMap<QString, QMqttSubscription*>管理多个 ChipID 订阅。
  • 协议解析:项目使用 JSON,推荐全部走QByteArrayView+QJsonDocument(零拷贝)。
  • 日志:结合QsLogqDebug()记录所有 MQTT 事件。
  • Qt 6 迁移:代码几乎无需改动(QMqttClient API 高度稳定)。

在 Embedded-Integrated-Project 中的直接应用
把上面的MyMqttClient替换掉项目原有的 MQTT 代码(通常在mainwindow.cpp或专用通信类中),即可获得更健壮的连接、重连和 JSON 处理能力。

需要我提供:

  • 完整带 UI 的 MainWindow 示例?
  • SSL 加密连接版本?
  • 与项目中 JSON 协议完全匹配的解析代码?
  • Qt 6.11 最新 CMake 版本?

随时告诉我,我继续给出可直接复制的代码!

http://www.jsqmd.com/news/554725/

相关文章:

  • 2026年广州热门的电商服务公司推荐,东云助创行业口碑排名如何? - mypinpai
  • 【已验证】基于STM32的4*4矩阵软键盘驱动
  • AudioLDM-S快速上手:消费级显卡也能流畅运行,低显存占用
  • 讲讲高性价比的传统光缆交接箱,如何选择合适品牌 - 工业设备
  • 4个步骤掌握HiGHS线性优化求解器:从入门到解决供应链优化问题
  • Windows安全取证-evtx日志分析实战——从入侵痕迹到攻击者画像
  • 别再踩坑了!CentOS Stream 9下IPXE源码编译保姆级教程(附gcc版本对照表)
  • Blackbox 安全存储解决方案:跨环境部署与功能实现全解析
  • 多功能轮椅cad图纸
  • 2026惠州高企认定机构深科信选购要点 - 工业推荐榜
  • 2026年浙江地区好用的隧道风筒专业厂家推荐,靠谱之选 - myqiye
  • Java时间戳转日期踩坑实录:为什么你的SimpleDateFormat总是返回1970年?
  • OpenClaw多模态扩展:Qwen3.5-4B-Claude分析截图内容
  • 2026 年度 GEO 优化公司风向标:智推时代引领行业
  • DeepChat与区块链集成:构建去中心化对话应用
  • AIO PathProb 时序概率路径系统
  • 总结罐磨球磨机厂家推荐,怎么选择才靠谱? - 工业设备
  • 终极艾尔登法环存档编辑器:完全掌控你的交界地冒险
  • 别再写重复引导代码了!用Vue3+el-tour打造你的‘产品导览’工厂(支持Vant/Element UI)
  • 从驱动编译到数据传输:RK3588与FPGA的PCIe通信实战解析
  • 老旧Mac设备复活计划:使用OpenCore Legacy Patcher实现系统升级焕新体验
  • 8647883
  • DeepFace模型加载优化:从首次等待到秒级启动的全方案解析
  • 2026座椅升级指南:精选厂家助力舒适体验升级,内饰改装/座椅升级/真皮包覆,座椅升级品牌哪家好 - 品牌推荐师
  • Pixel Dream Workshop 对比测试:不同采样器与模型版本的出图效果
  • 首屏加载优化涉及指标(FCP, LCP, TTI)
  • 告别Light Blue!用App Inventor + BLE打造你的专属蓝牙指令发射器(支持十六进制)
  • 项目介绍 MATLAB实现基于ACO-BFOA 蚁群算法(ACO)结合细菌觅食优化算法(BFOA)进行无人机三维路径规划(含模型描述及部分示例代码) 还请多多点一下关注 加油 谢谢 你的鼓励是我前行的
  • 5个步骤让旧Mac重获新生:OpenCore Legacy Patcher的资源优化方案
  • 2026年口碑佳的光缆交接箱渠道,靠谱品牌哪家好 - 工业品牌热点