首页 > 解决方案 > MQTT 连接在 Node 中工作,但不能作为 ReactJS 组件

问题描述

我有这个 mqtt 连接,当我在 nodeJS 中运行它时可以正常工作......但是当我将它移动到一个反应组件中时,我得到了这个错误:

WebSocket 握手期间出错:net::ERR_CONNECTION_RESET

我已经读到这是由此处的默认端口引起的…… 在 React 中使用 MQTT 协议, 但我找不到我理解的答案来解决它。

任何人都可以帮忙吗?干杯

import React, { Component } from "react";
import mqtt from "mqtt";

let topic = "vendingmachine2/command";
const options = {
  port: 16987,
  host: "mqtt://address.cloudmqtt.com",
  clientId: "***",
  username: "***",
  password: "***",
  keepalive: 60,
  reconnectPeriod: 1000,
  protocolId: "MQIsdp",
  protocolVersion: 3,
  clean: true,
  encoding: "utf8",
  timeout: 3,
  useSSL: true
};
function CheckoutForm() {
const MQTTConnect = () => {
    const client = mqtt.connect("mqtt://address.cloudmqtt.com", options);
    client.on("connect", function() {
      // When connected
      console.log("connected");
      client.subscribe("vendingmachine2/feedback", error => {
        if (error) console.error(error);
        else {
          client.publish(topic, "0");
        }
      });
      openDoor();
    });
    client.on("message", (topic, message) => {
      console.log(topic, message.toString());
    });
    function openDoor() {
      let door = [1, 2];
      for (let i = 0; i < door.length; i++) {
        client.publish(topic, `${door[i]}`);
      }
    }
};
return (
    <div>

        <button onClick={MQTTConnect}>asdasd</button>

    </div>
  );
}
export default CheckoutForm;

标签: javascriptnode.jsreactjswebsocketmqtt

解决方案


您正在尝试使用mqtt://代理 URL 的架构强制本地 MQTT 连接。

问题是当 ReactJS 代码在浏览器中运行时它不能使用原生 MQTT(因为浏览器沙箱),你需要使用 MQTT over Websockets。

为此,您可以将 URL 架构更改为wss://(MQTT over Secure Websockets)并更改端口号。Cloudmqtt文档说该端口将是36987而不是16987.

您应该能够通过 NodeJS 和 ReactJS 的 Websockets 使用 MQTT。


推荐阅读