如何通过服务器隧道浏览器端 mqtt?

How to tunnel browser-side mqtt through the server?

浏览器使用它连接到 mosquitto(websockets 模式):

new Paho.MQTT.Client('localhost', 9001, '');

据我了解,这是从浏览器到代理的直接连接。当浏览器在不同的机器上时,它不会在正常设置中工作。

在正常设置中,nodejs 和代理在同一台机器上。如何通过 nodejs 路由,以便 nodejs 可以将连接转发到 localhost:9001?而且我不想写很多代码来重新打包消息和重新实现不同的订阅API。

localhost 是一种特殊情况的主机名,它指的是某些代码在 运行 上的机器。

假设您要连接的代理位于托管网页的同一台计算机上,您可以使用 location 变量来获取您需要的信息。

var client = new Paho.MQTT.Client(location.hostname, 9001, '');

假设您正在代理 webapp,那么 websockets 也可以在同一个端口上被代理,最终会是:

var client = new Paho.MQTT.Client(location.hostname, parseInt(location.port), '');

同时代理 mqtt(使用 nginx):

location /mqtt {
    proxy_pass          http://127.0.0.1:9001/;
    proxy_http_version  1.1;
    proxy_set_header    Upgrade $http_upgrade;
    proxy_set_header    Connection "upgrade";
}

您可以只打开另一个端口,然后设置 SSH 隧道(即 MQTT 数据的 SSH 隧道)。这样做的好处是它允许您轻松地将此端口暴露或不暴露到互联网并且它是安全的(加密的)。

本教程介绍了如何执行此操作。显然,由于 MQTT 数据是通过 SSH(通过 SSH 隧道)传输的,因此它是 100% 加密的,因此是安全的。您当然也可以使用 RSA 密钥(使 SSH 连接确实非常安全),然后编写一个简单的 BASH 脚本来自动化我猜的所有这些过程。教程Link: SSH Tunnel MQTT