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 不能重复 换成不一样的 可以搞一个随机数
后言
创作不易,要是本文章对广大读者有那么一点点帮助 不妨三连支持一下,您的鼓励就是博主创作的动力