MQTT连接后收不到消息是怎么回事?
我用MQTT.js在浏览器里连上了本地的Mosquitto服务器,订阅了topic也没报错,但就是收不到别人发的消息。是我哪里配置错了?
我已经确认服务端能收到其他客户端的消息,前端代码也照着文档写的:
const client = mqtt.connect('ws://localhost:9001');
client.on('connect', () => {
console.log('Connected');
client.subscribe('test/topic');
});
client.on('message', (topic, payload) => {
console.log('Received:', topic, payload.toString());
});
控制台只打印了“Connected”,之后再发消息就完全没反应,求指点!
1. 检查消息是否真的发到了
test/topic这个 topic 上。可以使用 Mosquitto 自带的mosquitto_sub工具来订阅这个 topic,确保消息确实在发送。2. 确认 MQTT broker 是否允许跨域访问。有时候浏览器连接到本地服务器会受到 CORS 的限制,你需要在 Mosquitto 配置文件中添加相关配置来允许跨域请求。
3. 确保消息是在客户端连接并订阅了 topic 之后才被发布的。如果消息发布的时间早于客户端订阅,那么客户端是收不到的。
解决方法:
对于跨域问题,可以在 Mosquitto 配置文件(通常是
mosquitto.conf)中添加以下配置:记得把
http://localhost:你的前端端口替换为实际的前端应用地址和端口。然后重启 Mosquitto 服务,看看是否解决了跨域问题。如果消息确实是发到正确的 topic 并且时间上没问题,再检查一下网络是否有阻塞或者防火墙设置阻止了 WebSocket 通信。
最可能的问题:订阅根本没成功
你的代码里只调用了
subscribe(),但没监听订阅结果。MQTT的subscribe操作是异步的,而且可能失败但不会报错。比如topic不存在、权限不够、QoS不匹配等情况,订阅就直接失败了,但你完全不知道。解决方案
在subscribe后面加上回调,同时监听订阅事件:
加上这些之后重新跑一下,如果看到
Subscribe error或者granted里的QoS是128(通常表示失败),那就是订阅这步就已经跪了。第二个可能:WebSocket端口没配好
你连的是
ws://localhost:9001,但Mosquitto默认的WebSocket端口不是9001,或者根本没开WebSocket。检查一下Mosquitto的配置文件(通常是mosquitto.conf),确保有这几行:
如果没有,就加上然后重启Mosquitto。
第三个可能:测试方法不对
你确认"服务端能收到其他客户端的消息",那其他客户端是用的TCP端口(1883)还是WebSocket(9001)?如果其他客户端走的是1883,你的前端走的是9001,那这两个根本不通——Mosquitto默认情况下TCP和WebSocket的topic是隔离的。
如果想两边互通,需要在Mosquitto配置里加上:
快速验证方法
先用命令行工具验证Mosquitto和topic是否正常工作:
如果命令行能通,那问题基本就在前端配置上。如果命令行也不行,那就是Mosquitto配置或者topic本身的问题。
先按我上面说的加上错误处理和回调,看console输出什么再反馈。