Qt的qtmqtt库连接onenet出现QMQTT::SocketRemoteHostClosedError解决方法

问题描述

在Qt发开过程中使用qtmqtt库来连接onenet的mqtt服务器,在ClientId、Username和Password均填写正确的情况下还是连接不上,查看错误显示QMQTT::SocketRemoteHostClosedError

解决方法

client中的CleanSession标志位必须设置为true

cpp 复制代码
    client = new QMQTT::Client;
    client->setHostName("183.230.40.96");  // 服务器IP
    client->setPort(1883);      // 服务器端口
    client->setClientId("XXX"); // 设备名称
    client->setUsername("XXX"); // 产品ID
    client->setPassword("XXX"); // 鉴权信息,使用Token工具生成
    client->setVersion(QMQTT::MQTTVersion::V3_1_1);  // 设置MQTT协议版本
    client->setKeepAlive(60);                        // 设置保持连接时间
    client->setCleanSession(true);                   // 设置会话标志为true

分析过程

排除环境问题和qtmqtt库问题

  • 在主机中下载MQTTX工具,使用MQTTX连接onenet服务器。-> 连接成功
  • 使用qtmqtt库来连接主机内自己搭建的mosquittoMQTT服务器。-> 连接成功

使用Wireshark工具抓包来分析报文内的信息

  • qtmqtt库连接onenet服务器发送的报文如下图所示:
  • MQTTX工具连接onenet服务器发送的报文如下图所示:

    显而易见qtmqtt库最后发送FIN, ACK意味着断开连接,而MQTTX工具最后一个报文发送ACK表示成功建立连接,紧接着分析MQTT协议中的内容。
  • 以下为qtmqtt库发送报文中MQTT协议中的内容:
  • 以下为MQTT工具发送报文中MQTT协议中的内容:

    从上图可以发现两者的MQTT协议中只有Clean Session Flag Set这个标志位是不同的,那么原因就找到了,连接onenet的MQTT服务器必须将Clean Session Flag Set标志位设置为1。那么在Qt中增加clinet->setCleanSession(true);就可以解决这个问题,成功连接上onenet的MQTT服务器了。
相关推荐
小短腿的代码世界4 小时前
Qt Bluetooth源码深度解析:从HCI协议到跨平台API的完整架构
开发语言·qt·架构
小短腿的代码世界5 小时前
Qt WebEngine多进程架构与IPC通信:从Chromium多进程到Qt信号槽融合
qt·架构·系统架构
尘中远6 小时前
【Qwt 7.0 系列】快速入门与核心新特性概览 —— 更现代的 Qt 数据可视化库
qt·数据可视化·绘图·qwt·科学绘图
初阳7858 小时前
【Qt】系统相关(3)——多线程
qt
初阳78511 小时前
【Qt】系统相关(2)——文件
开发语言·qt
大侠锅锅1 天前
第 2 篇:MQTT 协议深度解析——物联网通信为什么选它
物联网·mqtt
尘中远1 天前
【Qwt 7.0 系列】坐标轴与刻度系统 —— 刻度引擎、网格、图例与刻度朝内
qt·数据可视化·qcustomplot·qwt·工业软件·科学绘图
sycmancia1 天前
Qt——多线程间的互斥
开发语言·qt
尘中远1 天前
【Qwt 7.0 系列】常用图表类型实战 —— 柱状图、散点图、箱线图与直方图
qt·qwt·工业软件·科学绘图
尘中远1 天前
【Qwt 7.0 系列】交互功能详解 —— 平移、缩放、坐标轴交互与数据拾取
qt·数据可视化·绘图·qcustomplot·qwt·科学绘图