Skip to content

使用 Node-RED 连接 EMQX

Node-RED 是一款基于流程的编程工具,提供浏览器端编辑器,用于将硬件设备、API 与在线服务连接在一起。它采用可视化节点界面,通过连接预置节点来创建数据流,无需编写大量代码。Node-RED 通过内置的 mqtt-in(订阅)和 mqtt-out(发布)节点原生支持 MQTT 协议,是处理来自 EMQX 的物联网数据的常用工具。

本页面介绍如何安装 Node-RED、将其连接到 EMQX,并构建一个能够解析、过滤和转换 MQTT 消息的数据处理流程。

前提条件

  • 受支持的 Node.js LTS 版本,例如 Node.js 18 或更高版本(使用 NPM 安装时需要)
  • 已部署的 EMQX 实例,或使用 EMQX 公共 Broker 进行测试
  • MQTTX 或其他 MQTT 客户端,用于发送测试消息

安装 Node-RED

通过 NPM 安装:

bash
npm install -g --unsafe-perm node-red

然后启动 Node-RED:

bash
node-red

通过 Docker 安装:

bash
docker run -it -p 1880:1880 --name mynodered nodered/node-red

启动后,在浏览器中访问 http://127.0.0.1:1880 即可打开 Node-RED 编辑器。

access_node_red_editor

如需了解更多安装方式(包括树莓派和云端部署),请参阅 Node-RED 官方文档

MQTT Broker 设置

您需要一个 MQTT Broker 供 Node-RED 连接。本指南使用 EMQX,它支持 MQTT 3.1、3.1.1 和 5.0。

EMQX 公共 Broker(测试用途)

若您希望快速测试且不部署自己的 Broker,可以使用 EMQX 公共 Broker。

参数
Broker 地址broker.emqx.io
TCP 端口1883
SSL/TLS 端口8883
WebSocket 端口8083
加密 WebSocket 端口8084

该公共 Broker 仅用于测试与演示目的。

EMQX Enterprise 部署

在生产场景中,请使用您环境中定义的 Broker 地址、端口及认证凭据,将 Node-RED 连接到您自己的 EMQX Enterprise 部署。

典型配置包括:

  • 自定义 Broker 主机名或 IP 地址
  • 用户名/密码认证或双向 TLS
  • 对主题应用访问控制规则(ACL)

配置 Node-RED Broker 连接时,请参考您 EMQX Enterprise 的监听器与认证配置。

除自托管的 EMQX Enterprise 部署外,您也可以将 Node-RED 连接到全托管 MQTT 服务 EMQX Cloud(Serverless 或 Dedicated)。请使用 EMQX Cloud 提供的 Broker 地址、端口和认证信息。

构建基础 MQTT 流程

以下步骤将创建一个最简流程,用于订阅某个主题并将接收到的消息转发到另一个主题。

步骤 1:添加 MQTT 订阅节点

  1. 在 Node-RED 编辑器中,从左侧节点面板将 mqtt-in 节点拖至画布。

  2. 双击该节点,打开其属性面板。

  3. 点击 Server 字段旁的铅笔图标,创建新的 Broker 连接。

  4. Server 地址栏输入 broker.emqx.io,点击 Add

    add_subscribe_node

  5. Topic 设置为 test/node_red/in

  6. 按需设置 QoS 级别,然后点击 Done

    subscribe_to_topic

步骤 2:添加 MQTT 发布节点

  1. mqtt-out 节点拖至画布。

  2. 双击该节点,打开其属性面板。

  3. Server 下拉列表中选择步骤 1 中配置的 Broker。

  4. Topic 设置为 test/node_red/out

  5. 按需配置 QoSRetain,然后点击 Done

    config_publish_node

步骤 3:连接节点并部署

  1. mqtt-in 节点的输出端口拖线至 mqtt-out 节点的输入端口。
  2. 点击右上角的 Deploy 按钮。
  3. 确认两个节点均显示绿色 connected 状态指示器。

至此,您已创建一个将 test/node_red/in 上接收到的所有消息转发至 test/node_red/out 的流程。

connect_nodes

构建进阶数据处理流程

Node-RED 的强大之处在于可以将多个节点串联,在重新发布数据之前对其进行过滤和转换。以下示例构建了一条处理管道,实现以下功能:

  1. 通过 MQTT 接收 JSON 格式的传感器数据。
  2. 将原始消息体解析为 JavaScript 对象。
  3. 过滤重复的温度数据。
  4. 对结果进行格式化后重新发布。

完整流程为:mqtt-injsonrbetemplatemqtt-out

步骤 1:添加 JSON 节点

  1. 从节点面板将 json 节点拖至画布。
  2. 双击进行配置,将 Action 设置为 Always Convert to JavaScript Object
  3. 点击 Done
  4. mqtt-in 的输出连接到 json 节点的输入。

此步骤确保传入的消息体被解析为 JavaScript 对象,以便下游节点可以访问各字段,例如 msg.payload.temperature

connect_json_nodes

步骤 2:添加过滤节点

  1. 从节点面板将 rbe(report by exception,异常上报)节点拖至画布。
  2. 双击进行配置:
    • Mode 设置为 block unless value changes(仅在值变化时通过)。
    • Property 设置为 msg.payload.temperature
  3. 点击 Done
  4. json 节点的输出连接到 rbe 节点的输入。

temperature 字段与上一条消息相比未发生变化时,该过滤节点将阻断消息,从而减少重复数据造成的冗余流量。

add_filter_node

步骤 3:添加模板节点

  1. template 节点拖至画布。

  2. 双击进行配置,使用 Mustache 语法输入所需的输出格式,例如:

    {"temperature": {{payload.temperature}}, "humidity": {{payload.humidity}}}
  3. 点击 Done

  4. rbe 节点的输出连接到 template 节点的输入。

add_template_node

步骤 4:连接输出节点并部署

  1. template 节点的输出连接到 mqtt-out 节点的输入。
  2. 点击 Deploy
  3. 确认所有节点均显示绿色 connected 状态。

如果不需要对过滤后的数据进行格式化,可以省略 template 节点,直接将 rbe 连接到 mqtt-out

connect_advanced_nodes

测试流程

使用 MQTTX 或其他 MQTT 客户端测试该处理管道:

  1. 订阅 test/node_red/out 以观察处理结果。

  2. test/node_red/in 发布一条 JSON 格式的测试消息,例如:

    json
    {"temperature": 25, "humidity": 60}
  3. 确认消息出现在输出主题上。

  4. 再次发布相同的消息。rbe 过滤节点应拦截此重复消息,输出主题上不应有任何输出。

  5. 发布一条温度值不同的消息:

    json
    {"temperature": 26, "humidity": 60}
  6. 确认该消息通过过滤节点并出现在输出主题上。

test_the_flow

故障排查

节点显示 "disconnected" 状态

现象

  • mqtt-inmqtt-out 节点在部署后显示红色 disconnected 状态指示器。

可能原因

  • Broker 地址或端口配置错误
  • 网络防火墙阻止了端口 18838883
  • Broker 未运行

解决方法

  • 双击节点,点击 Server 旁的铅笔图标,检查 Broker 地址和端口配置。
  • 使用 MQTTX 等其他 MQTT 客户端测试与 Broker 的基本连通性。
  • 如果使用 TLS,请确保已配置正确的端口(8883)和 CA 证书。

订阅主题上未收到消息

现象

  • mqtt-in 节点已连接,但没有消息到达。

可能原因

  • 发布方与订阅方的主题名称不一致
  • QoS 级别不兼容
  • Broker 上的 ACL 规则阻止了该订阅

解决方法

  • 确认发布方发送到的主题与 mqtt-in 节点中配置的主题(test/node_red/in)完全一致。
  • 在流程各阶段添加 debug 节点,以检查消息内容。
  • 检查 Broker 的认证与 ACL 配置。

过滤节点阻断所有消息

现象

  • 即使温度值发生变化,输出主题上也没有任何消息出现。

可能原因

  • rbe 节点的属性路径配置不正确
  • json 节点未在过滤节点之前解析消息体

解决方法

  • 确认 json 节点位于 rbe 节点之前,且已设置为 Always Convert to JavaScript Object
  • 确认 rbe 节点的属性设置为 msg.payload.temperature(而非 payload.temperature)。
  • json 节点之后添加 debug 节点,检查 msg.payload 的结构是否符合预期。

认证失败

现象

  • 节点在部署后立即显示 disconnected 状态,Broker 日志显示认证错误。

可能原因

  • Broker 配置中缺少或填写了错误的用户名/密码
  • 主题受到 ACL 限制

解决方法

  • 双击节点,打开 Broker 配置,在 Security 标签页中输入正确的用户名和密码。
  • 在 EMQX 中检查认证配置。

更多信息

如需了解详细的操作步骤、背景知识和更多示例,请参阅博客文章:使用 Node-RED 处理 MQTT 数据