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

Qt 官方提供了 **QtMqtt** 模块(`QMqttClient` 类),这是目前最推荐、最稳定的 MQTT 客户端实现 Qt MQTT 连接代码详解Qt 5.9.9 ~ Qt 6.11 通用适用于 Embedded-Integrated-ProjectQt 官方提供了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 c17 # 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#includeQMqttClient#includeQMqttSubscription#includeQJsonDocument#includeQJsonObject#includeQTimer#includeQDebugclassMyMqttClient:publicQObject{Q_OBJECTpublic:explicitMyMqttClient(QObject*parentnullptr);// 初始化参数项目中常用voidinit(constQStringhost,quint16 port1883,constQStringclientIdQString(),constQStringusernameQString(),constQStringpasswordQString());voidconnectToBroker();// 连接voiddisconnectFromBroker();// 断开voidpublish(constQStringtopic,constQJsonObjectjson,intqos0,boolretainfalse);// 订阅示例项目中设备 ChipID 主题voidsubscribeDevice(constQStringchipId);signals:voidconnected();// 连接成功voiddisconnected();// 断开连接voidmessageReceived(constQStringtopic,constQJsonObjectjson);// JSON 消息privateslots:voidonConnected();voidonDisconnected();voidonMessageReceived(constQByteArraymessage,constQMqttTopicNametopic);voidonStateChanged(QMqttClient::ClientState state);voidonErrorOccurred(QMqttClient::ClientError error);voidattemptReconnect();// 自动重连private:QMqttClient*m_clientnullptr;QTimer*m_reconnectTimernullptr;QString m_host;quint16 m_port1883;QString m_clientId;QString m_username;QString m_password;intm_reconnectInterval5000;// 重连间隔ms};#endif// MYMQTTCLIENT_H源文件mymqttclient.cpp#includemymqttclient.hMyMqttClient::MyMqttClient(QObject*parent):QObject(parent){m_clientnewQMqttClient(this);m_reconnectTimernewQTimer(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(constQStringhost,quint16 port,constQStringclientId,constQStringusername,constQStringpassword){m_hosthost;m_portport;m_clientIdclientId.isEmpty()?QtClient_QString::number(QDateTime::currentMSecsSinceEpoch()):clientId;m_usernameusername;m_passwordpassword;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(constQByteArraymessage,constQMqttTopicNametopic){// ★ 使用 QByteArrayView 零拷贝解析性能关键QByteArrayViewview(message);QJsonParseError error;QJsonDocument docQJsonDocument::fromJson(view.toByteArray(),error);// view.toByteArray() 安全转换if(error.errorQJsonParseError::NoError){QJsonObject jsondoc.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(constQStringtopic,constQJsonObjectjson,intqos,boolretain){QByteArray payloadQJsonDocument(json).toJson(QJsonDocument::Compact);m_client-publish(QMqttTopicName(topic),payload,qos,retain);qDebug()发布 MQTT 消息 [Topic:topic]json;}voidMyMqttClient::subscribeDevice(constQStringchipId){QString topicdevice/chipId/#;// 项目中常用通配符autosubscriptionm_client-subscribe(QMqttTopicName(topic),1);// QoS 1if(subscription){qDebug()已订阅设备主题topic;}}3. 使用方式MainWindow 或主类中MyMqttClient*mqttnewMyMqttClient(this);mqtt-init(your_server_ip,1883,,user,pass);// 项目中通常无用户名密码connect(mqtt,MyMqttClient::messageReceived,this,[](constQStringtopic,constQJsonObjectjson){// 处理项目 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处理 JSONkeepAlive心跳间隔秒60项目中常用autoKeepAlive自动发送 PINGREQtrue强烈推荐cleanSession是否清除会话true掉线不保留旧消息QoS0/1/2命令用 1数据上报用 05. 工业级进阶建议结合项目自动重连已封装在onDisconnected()中。SSL 加密云服务器安全改用m_client-connectToHostEncrypted(sslConfig)。多设备支持维护QMapQString, QMqttSubscription*管理多个 ChipID 订阅。协议解析项目使用 JSON推荐全部走QByteArrayViewQJsonDocument零拷贝。日志结合QsLog或qDebug()记录所有 MQTT 事件。Qt 6 迁移代码几乎无需改动QMqttClient API 高度稳定。在 Embedded-Integrated-Project 中的直接应用把上面的MyMqttClient替换掉项目原有的 MQTT 代码通常在mainwindow.cpp或专用通信类中即可获得更健壮的连接、重连和 JSON 处理能力。需要我提供完整带 UI 的 MainWindow 示例SSL 加密连接版本与项目中 JSON 协议完全匹配的解析代码Qt 6.11 最新 CMake 版本随时告诉我我继续给出可直接复制的代码