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

mqtt客户端订阅一直重复连接?

文章

  • 前言
  • 错误场景
  • 问题分析
  • 解决方案
  • 后言

前言

✨✨ 他们是天生勇敢的开发者,我们创造bug,传播bug,毫不留情地消灭bug,在这个过程中我们创造了很多bug以供娱乐。
前端bug这里是博主总结的一些前端的bug以及解决方案,感兴趣可以看一下,有不同方案可以在评论区提出

在这里插入图片描述


正文开始

错误场景

一个mq客户端负责发布数据 代码如下:

// 连接到 MQTT 服务器
const url = "mqtt://127.0.0.1:1883";

const options = {
  // 可以在这里添加额外的连接选项,比如 clientId 等
  clientId: "MQTT1",
  connectTimeout: 4000,
  reconnectPeriod: 1000,
  clean: true,
  username: "c37",
  password: "vi123456",
};
let mqttClient = mqtt.connect(url, options);
// 监听 MQTT 消息
mqttClient.on("connect", () => {
  console.log("MQTT Connected");
});
mqttClient.on("error", (err) => {
  console.error("MQTT client error:", err);
});

// 确保在 Electron 应用关闭时清理 MQTT 客户端
app.on("window-all-closed", () => {
  if (process.platform !== "darwin") {
    app.quit();
  }
  if (mqttClient) {
    mqttClient.end();
  }
});

app.on("quit", () => {
  if (mqttClient) {
    mqttClient.end();
  }
});

const Index = 32;
const Value = 100;
const message = `Variable${Index}:${Value}`;

mqttClient.publish("/MQTT1/pub", message, { qos: 1 }, (err) => {
    if (err) {
        console.error("Failed to publish message:", err);
    } else {
        console.log("Message sent successfully:", message);
    }
});

另外一个mq客户端负责订阅数据 代码如下:

async function connectAndSubscribe(mqttModule, variables) {
    try {
        const options = {
            clientId: "MQTT1",
            connectTimeout: 4000,
            reconnectPeriod: 1000,
            clean: true,
            username: "c37",
            password: "vi123456",
        };
        
        const mqttClient = mqttModule.connect('mqtt://127.0.0.1:1883', options);
        
        let isConnected = false; // 添加标志变量

        mqttClient.on('connect', function () {
            if (!isConnected) {
                isConnected = true;
                console.log('连接到 MQTT Broker 成功');
                mqttClient.subscribe('/MQTT1/pub', function (err) {
                    if (!err) {
                        console.log('已订阅 MQTT 主题 /MQTT1/pub');
                    } else {
                        console.error('订阅失败:', err);
                    }
                });
            }
        });

        mqttClient.on('message', function (topic, message) {
            console.log(`接收到来自主题 ${topic} 的消息: ${message.toString()}`);
            const receivedMessage = message.toString();
            const parts = receivedMessage.split(':');
            if (parts.length === 2) {
                const variableName = parts[0];
                const value = parseFloat(parts[1]);
                if (variables[variableName] !== undefined) {
                    variables[variableName].value = value;
                    console.log(`已更新 ${variableName}${value}`);
                } else {
                    console.log(`未知变量名称: ${variableName}`);
                }
            } else {
                console.log(`消息格式无效: ${receivedMessage}`);
            }
        });

        mqttClient.on('error', function (err) {
            console.error('MQTT 客户端错误:', err);
        });

        mqttClient.on('reconnect', function () {
            console.log('尝试重新连接到 MQTT Broker...');
        });

        mqttClient.on('offline', function () {
            console.log('MQTT 客户端离线');
        });

    } catch (err) {
        console.error("连接或订阅过程中发生错误:", err);
    }
}

问题分析

不报错 但是信息一直发送不过去 并且一直重连
原因:options中的clientId 重复了,mq允许一个用户在两个客户端登陆 代表我们用户名和密码可以一致,但是clientId不行
Client ID:每个 MQTT 客户端在连接到 Broker 时都需要提供一个唯一的 Client ID。如果多个客户端使用相同的 Client ID,则后一个连接将会替换掉前一个连接。这是 MQTT 协议的标准行为。

解决方案

options中的Client ID 不能重复 换成不一样的 可以搞一个随机数

后言

创作不易,要是本文章对广大读者有那么一点点帮助 不妨三连支持一下,您的鼓励就是博主创作的动力


http://www.kler.cn/news/353538.html

相关文章:

  • 详解SSH和bash
  • 【Linux】嵌入式Linux系统的组成、u-boot编译
  • 灵当CRM data/pdf.php 任意文件读取漏洞复现
  • 计算机网络(五)—— 运输层
  • Springboot +Mybatis项目用log4j2打印SQL语句
  • 推动AI技术研发与应用,景联文科技提供专业高效图像采集服务
  • Spring Cloud 组件的使用
  • 新手爬虫DAY1
  • exchange邮件系统ADFS双因素认证技术方案
  • [移植] tgi 编译
  • element-ui的树形结构样式调整,添加线条和边框样式
  • Git中从dev分支恢复master分支
  • 爬虫逆向学习(十二):一个案例入门补环境
  • perl文件测试操作符及其意义
  • 线性代数知识学习
  • JAVA 中的 String 类
  • 【C++笔记】类和对象(上)
  • Java 小游戏《超级马里奥》
  • 【网页设计】CSS Part2
  • [Linux] Linux 模拟实现 Shell