文章
- 前言
- 错误场景
- 问题分析
- 解决方案
- 后言
前言
✨✨ 他们是天生勇敢的开发者,我们创造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 不能重复 换成不一样的 可以搞一个随机数
后言
创作不易,要是本文章对广大读者有那么一点点帮助 不妨三连支持一下,您的鼓励就是博主创作的动力