使用mqttws31.js的WebSocket MQTT无法接收消息求助
问题分析与解决
核心原因
你的代码在MQTT连接成功后没有执行主题订阅操作——HiveMQ测试时你手动完成了订阅步骤,所以能收到消息,但自己的业务代码里缺失了关键的订阅逻辑,导致客户端无法接收任何主题的消息。
修复方案
1. 添加主题订阅逻辑
在onConnect函数中补充订阅代码,指定你需要接收消息的主题(比如你代码里判断的voltas):
function onConnect() { console.log("Connected "); // 订阅目标主题,qos参数可根据需求设为0/1/2 mqtt.subscribe("voltas", { qos: 0 }); // 如需订阅多个主题,可多次调用subscribe // mqtt.subscribe("other/topic", { qos: 1 }); }
2. 修复页面内容覆盖问题
原代码中使用document.write会清空当前页面,建议改用DOM操作更新内容:
先在HTML中添加一个消息展示容器:
<div id="message-box"></div>
然后修改onMessageArrived函数:
function onMessageArrived(msg){ const logMsg = `收到消息:${msg.payloadString} | 主题:${msg.destinationName}`; console.log(logMsg); // 向容器追加内容,而非覆盖页面 document.getElementById("message-box").innerHTML += logMsg + "<br>"; if (msg.destinationName === "voltas") { alert(msg.payloadString); } }
额外排查点
- 确认Node-RED的MQTT Broker配置中,WebSocket客户端拥有对应主题的订阅权限(无ACL限制或已正确配置权限规则)。
- 发布消息的主题需与订阅主题完全匹配(MQTT主题区分大小写,层级用
/分隔)。 - 可给订阅操作添加回调,排查潜在错误:
mqtt.subscribe("voltas", { qos: 0 }, (success, error) => { if (error) console.error("订阅失败:", error); else console.log("订阅成功"); });
内容的提问来源于stack exchange,提问作者Vagner Mocelin
相关产品推荐
相关产品推荐

