You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 23:50:21