如何在 Reactjs 中通过 websocket 使用 MQTT?
Posted
技术标签:
【中文标题】如何在 Reactjs 中通过 websocket 使用 MQTT?【英文标题】:How to use MQTT over websocket in Reactjs? 【发布时间】:2021-05-18 04:02:30 【问题描述】:我使用 aedes 创建服务器是这样的:
const aedes = require('aedes')()
const httpServer = require('http').createServer()
const ws = require('websocket-stream')
const port = 8888
ws.createServer( server: httpServer , aedes.handle)
httpServer.listen(port, function ()
console.log('websocket server listening on port ', port)
)
这段代码在 8888 端口运行正常。之后在 Reactjs 中使用 mqtt-react-hooks,我创建了文件:
import React from 'react';
import Connector from 'mqtt-react-hooks';
import useMqttState from 'mqtt-react-hooks';
export default function App()
const connectionStatus = useMqttState();
return (
<Connector brokerUrl="mqtt://domain.com:8888">
<h1>`Status: $connectionStatus`</h1>
</Connector>
);
发生错误:它显示状态:未定义。网络损坏和超载。我尝试在网络浏览器上通过 websocket 使用 MQTT,所以需要另外设置吗?
更新: 我使用 tls,所以它必须与密钥、证书、ca 一起使用。使用上面的代码,浏览器发送状态强制使用 wss。我更改服务器文件如下:
const fs = require('fs');
const aedes = require('aedes')();
var wsSslPort = 8888;
var ws = require('websocket-stream');
// WsSsl server
var wsSslServer = require('https').createServer(
key: fs.readFileSync("cert/key.pem"),
cert: fs.readFileSync("cert/crt.pem"),
requestCert: false, // client send their certificate
rejectUnauthorized: false,
ca: [ fs.readFileSync("cert/ca.ca") ]
, aedes.handle);
wsSslServer.listen(wsSslPort, "domain.com", function ()
console.log('MQTT websocket tls server listening on port', wsSslPort)
);
这段代码运行正常。
我还更改了客户端文件:
import React from 'react';
var optionsMqtt=
clientId: uuidv4(),
rejectUnauthorized : false,
ca: cert_mqtt.ca_mqtt,
key: cert_mqtt.key_mqtt,
cert: cert_mqtt.crt_mqtt
const websocketUrl = "wss://domain.com:8888";
export default function App()
const client = mqtt.connect(websocketUrl,optionsMqtt);
client.stream.on("error", (err) =>
console.log(`Connection to $websocketUrl failed`);
client.end();
);
client.on('connect', function ()
console.log('Connected');
);
return (
<>
<h1>TEST</h1>
<>
);
还是报错:
ws.js:108 WebSocket 连接到“wss://domain.com:8888/”失败: 连接建立错误:net::ERR_CONNECTION_REFUSED
我也关闭了防火墙,打开8888端口。
【问题讨论】:
【参考方案1】:您已通过在 URL 中使用 mqtt://
架构明确告诉客户端使用本机 MQTT。
改成ws://
【讨论】:
谢谢您,先生。我在上面更新了一点以上是关于如何在 Reactjs 中通过 websocket 使用 MQTT?的主要内容,如果未能解决你的问题,请参考以下文章
我将如何在 Javascript 中通过 WebSocket 发送和接收数据包
如何在 Express 应用程序中通过 SSL 获取 websocket?
如何在 ruby on rails 中通过 websocket 发送保持活动的数据包
如何在 Tornado 中通过 websocket 传输 .png 或 .jpg 文件