我正在开发React Native移动应用程序。我使用MQTT.js与经纪人建立联系。作为第一个测试,我与Mosquitto public broker建立了联系。我设法只连接了WebSockets端口(8080和8081)。不幸的是,与我的本地Mosquitto代理的连接失败了,没有错误。
首先,我在Linux计算机上安装了Mosquitto和Node-RED。我分别从$ mosquitto -v
和$ node-red
开始。在Node-RED上,我创建了我的第一个流程:连接到inject node
的{{1}}和连接到mqtt publisher
的{{1}}。 mqtt发布者和订阅者都在同一主题上,并已成功连接到我的Mosquitto本地主机代理。我部署了:有效。
如果我尝试与React应用连接:
mqtt subscriber
它运行了,但是我的Mosquitto经纪人没有收到任何新连接。 debug node
返回此:
let mqtt = require('mqtt')
let client = mqtt.connect('mqtt://localhost:1883')
console.log('client', client)
client.on('connect', function () {
console.log('connected')
})
client.on('error', function (error) {
console.log('error', error)
})
console.log('client', client)
代表WebSockets,但是我的Mosquitto代理使用IP协议,因此我在'client',
{ options:
{ protocol: 'ws',
slashes: true,
auth: null,
host: 'localhost:1883',
port: 1883,
...
}
}
文件夹中创建了protocol: 'ws'
并写了行protocol.conf
。然后,当我重新启动Mosquitto /etc/mosquitto/conf.d
时,它显示:
protocol websockets
我重新编译我的React应用程序:不起作用。
除非$ mosquitto -v -c /etc/mosquitto/conf.d/protocol.conf
我的日志为空,否则出现任何错误。
我预计至少会出现连接错误,但即使Mosquitto经纪人也不会收到连接尝试。
答案 0 :(得分:0)
localhost
表示self-正在执行引用localhost
的代码的计算机。在React应用程序内部,这将是运行正在加载React应用程序的Web浏览器的计算机,我打赌不是正在运行Mosquitto经纪人的计算机。
您需要找出运行代理的计算机的IP地址,并使用它代替localhost
。并不是127.0.0.1
(即localhost
的IP地址)意味着同样的事情,并且会有同样的问题。它可能看起来像10.0.x.x
或192.168.x.x
。
也不应通过Web套接字将端口1883用于MQTT。它可以工作,但是1883是TCP端口上的默认MQTT。如果您尚未更改Mosquitto的默认配置,它将已经在端口1883上进行侦听。端口8883通常用于Web套接字上的MQTT-确切的端口号与确保其未使用无关紧要。因为您仅添加了protocol websockets
行,所以它现在可能正在工作。如果您永远不会将代理用于websocket之外的其他任何东西,那么可以放心地忽略此部分,但是,如果您希望通过TCP上的MQTT使用它来连接某些东西,端口1883上的websocket将很快变得令人困惑。 / p>
编辑 @hardlib提出了一个很好的建议,指出如果网页与运行MQTT代理的计算机是由同一台计算机提供的,则可以使用对location.host
的调用来获取服务器/代理的名称或IP地址。