MQTT.js 无法建立本地代理连接

Posted

技术标签:

【中文标题】MQTT.js 无法建立本地代理连接【英文标题】:MQTT.js unable to make localhost broker connection 【发布时间】:2019-08-03 14:51:41 【问题描述】:

我在一个 React Native 移动应用上工作。我使用MQTT.js 与经纪人建立连接。作为第一个测试,我与Mosquitto public broker 建立了联系。我设法只连接了 WebSockets 端口(8080 和 8081)。不幸的是,与我的 localhost Mosquitto 代理的连接失败且没有错误。

首先,我在我的 Linux 计算机上安装了 Mosquitto 和 Node-RED。我分别从$ mosquitto -v$ node-red 开始。在 Node-RED 上,我创建了我的第一个流:inject node 连接到 mqtt publishermqtt subscriber 连接到 debug node。 mqtt 发布者和订阅者在同一个主题上,并成功连接到我的 Mosquitto localhost 代理。我部署了:它有效。

如果我尝试连接我的 React 应用:

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)
)

它运行但我的 Mosquitto 代理没有收到任何新连接。 console.log('client', client) 回复这个:

'client', 
  options: 
    protocol: 'ws',
     slashes: true,
     auth: null,
     host: 'localhost:1883',
     port: 1883,
     ...
   

protocol: 'ws' 代表 WebSockets,但我的 Mosquitto 代理是基于 IP 协议的,所以我在 /etc/mosquitto/conf.d 文件夹中创建了一个 protocol.conf 并写入 protocol websockets 行。然后当我重新启动 Mosquitto $ mosquitto -v -c /etc/mosquitto/conf.d/protocol.conf 它显示:

mosquitto version 1.6.4 starting
Config loaded from /etc/mosquitto/conf.d/protocol.conf.
Opening websockets listen socket on port 1883.

我重新编译了我的 React 应用程序:不起作用。

除非console.log('client', client)我的日志是空的,否则任何错误。

我预计至少会出现连接错误,但即使是 Mosquitto 代理也不会收到连接尝试。

【问题讨论】:

【参考方案1】:

localhost 表示自身 - 执行引用 localhost 的代码的计算机。在 React 应用程序中,这将是运行加载 React 应用程序的网络浏览器的计算机,我敢打赌,它不是运行 Mosquitto 代理的计算机。

您需要找出运行代理的计算机的 IP 地址并使用它而不是 localhost。那不会是127.0.0.1,它是localhost 的IP 地址,意味着同样的事情并且会有同样的问题。它可能看起来像 10.0.x.x192.168.x.x

您也不应该将端口 1883 用于基于 Web 套接字的 MQTT。它可以工作,但 1883 是默认的 MQTT over TCP 端口。如果您没有更改 Mosquitto 的默认配置,它将已经在端口 1883 上进行侦听。端口 8883 通常用于 Web 套接字上的 MQTT - 确切的端口号与确保它没有被使用无关紧要。它现在可能正在工作,因为您只添加了 protocol websockets 行。如果您永远不会将代理用于 websockets 以外的任何东西,那么您可以放心地忽略这部分,但如果您想要使用 MQTT over TCP 连接到它,那么端口 1883 上的 websockets 将很快变得混乱。

编辑 @hardlib 有一个很好的建议,指出如果网页由运行 MQTT 代理的同一台计算机提供服务,您可以调用 location.host 来获取服务器/代理的名称或 IP 地址。

【讨论】:

另外,由于 React 在浏览器中运行,MQTT.js 库只能在 Websockets 上运行 MQTT(由于浏览器沙箱)。您可以将localhost 交换为location.host,这将映射到您加载页面的任何主机。 我仍然不知道我怎么会犯这个愚蠢的错误......显然使用我的本地IP它可以工作。感谢您的港口建议。 @JackPots 它发生了很多很多...不丢人。 @hardlib 对location.host 的好建议,谢谢!

以上是关于MQTT.js 无法建立本地代理连接的主要内容,如果未能解决你的问题,请参考以下文章

MQTT 无法通过 TLS 连接

Ngrok“客户端无法建立到本地地址的连接”错误

使用 Paho MQTT Js 成功连接到 Mosquitto 代理后突然断开连接

离线时无法建立与本地主机的连接

无法建立从工作台到 nodejs 的本地 mysql 连接

结合python实现的netcat与python实现的tcp代理,建立一个流量隧道