MacOS下无法连接Aedes MQTT Broker的问题排查与解决
MQTT服务器(Aedes + Node.js)无法被MQTT X客户端连接的问题
问题描述
我正在使用Aedes和Node.js编写一个简单的MQTT服务器,以下是Broker代码:
import aedes from "aedes"; import net from "net"; const port = 1883; // MQTT Port const broker = net.createServer(aedes.handle); broker.listen(port, () => { console.log(`Find the server at: mqtt://localhost:${port}/`); });
我在MacOS Ventura 13.2系统上使用MQTT X作为客户端,尝试连接服务器时出现超时,无法成功连接。已尝试将localhost改为127.0.0.1,但依然无效。
通过telnet测试可以看到端口处于开放状态:
$ telnet localhost 1883 Trying ::1... Connected to localhost. Escape character is '^]'. sdfsdf ^C
请问是什么原因导致客户端无法连接Broker?该如何解决?
原因分析与解决方法
问题原因
你没有创建Aedes的实例,直接将模块的aedes.handle传给了net.createServer。Aedes的handle方法需要绑定到具体的Aedes实例上才能正确处理MQTT协议的连接请求,当前写法会导致服务器无法解析MQTT客户端的连接报文,最终引发客户端连接超时。
解决步骤
修改代码,先创建Aedes实例,再将实例的handle方法传入net.createServer:
import aedes from "aedes"; import net from "net"; const port = 1883; // MQTT Port // 创建Aedes实例 const aedesInstance = aedes(); const broker = net.createServer(aedesInstance.handle); broker.listen(port, () => { console.log(`Find the server at: mqtt://localhost:${port}/`); });
验证方式
可以给Aedes实例添加连接监听事件,确认客户端是否成功连接:
aedesInstance.on('client', (client) => { console.log(`客户端已连接: ${client.id}`); });
修改完成后,重新启动服务器,再用MQTT X客户端连接mqtt://localhost:1883或mqtt://127.0.0.1:1883即可正常连接。
内容的提问来源于stack exchange,提问作者Mendes
相关产品推荐
相关产品推荐

