跳转至

Node-RED基础节点全掌握实战教程(Inject、Debug、Switch、Function)

一、实验目标

基于ARMxy工业计算机,熟练掌握 Node-RED 开发中最核心、最高频的四个基础节点,分别为 Inject(注入节点)、Debug(调试节点)、Switch(判断节点)、Function(函数节点)。

宣传图

二、Node-RED 消息机制简介

Node-RED 所有节点的数据交互、流程传递均基于 msg 消息对象 实现,节点之间传输的所有数据都封装在该对象中,是 Node-RED 运行的核心载体。

标准基础消息格式示例:

{
    "payload": 35
}

核心参数说明:

msg.payload:消息主体数据,是整个流程中数据存储、处理、传输的核心字段,绝大多数节点的输入、输出、运算均围绕msg.payload展开。

简单来说,Node-RED 可视化编程的本质,就是对 msg.payload 数据的获取、运算、转换、判断与输出。

三、Inject

3.1 节点作用

Inject 节点是流程的触发源头,用于主动生成消息、启动整个业务流程,无需依赖外部设备、接口触发,是调试、测试、模拟场景的核心节点。

宣传图

常见应用场景:

  • 手动触发流程测试与调试
  • 定时自动执行业务逻辑
  • 模拟传感器、设备上报数据
  • 定时触发 MQTT 上传、Modbus 读取、接口请求等操作

3.2 手动触发模式

点击 Inject 节点左侧的蓝色按钮,即可手动发送一次消息,触发整条流程执行,适用于单次调试、功能验证。

3.3 定时触发模式

支持周期性自动触发流程,无需人工干预。配置方式:Repeat 选择 interval(间隔模式),设置对应时间周期。

示例:配置每10秒执行一次流程

适用场景:定时采集传感器数据、定时上传设备状态、定时读取工业设备参数、定时请求接口数据。

四、Debug

4.1 节点作用

Debug 节点是 Node-RED 开发的核心调试工具,用于实时查看流程中消息的数据内容、格式、传输状态,排查流程报错、数据异常问题,使用频率最高。

宣传图

4.2 查看核心数据(msg.payload)

节点配置:Output 选择msg.payload,仅输出消息主体数据,简化调试信息。

4.3 查看完整消息对象

节点配置:Output 选择 complete msg object (与调试输出相同),输出整条消息的所有参数,包含系统内置字段与自定义字段。

五、Switch

5.1 节点作用

Switch 节点为条件分流节点,类比编程语言中的 if、else if、else 逻辑,可根据自定义条件对消息数据进行判断,实现流程多路分支、条件分流。

宣传图

六、Function(函数节点)详解

6.1 节点作用

Function 节点是 Node-RED 的自定义逻辑核心,支持编写原生 JavaScript 代码处理消息数据,弥补可视化节点的功能短板,适用于复杂数据处理场景。

宣传图

核心应用场景:数据计算、数据格式转换、字符串处理、协议数据解析、自定义业务逻辑封装、复杂条件判断。

七、节点实战:温度采集报警模拟系统

7.1 实验目标

基于四大基础节点,搭建模拟温度采集报警系统,实现自动生成随机温度、智能判断温度状态、输出对应提示信息的完整流程:

  • 温度 ≥ 30℃:输出高温报警提示
  • 温度 < 30℃:输出温度正常提示

7.2 整体流程拓扑

Inject 节点(触发流程)

Function 节点(生成随机温度)

Switch 节点(温度条件分流)

├── 高温分支 → Function 节点(封装报警信息)→ Debug 输出

└── 正常分支 → Function 节点(封装正常信息)→ Debug 输出

7.3 温度模拟 Function 节点配置

通过随机函数生成 0~39℃ 的模拟温度数据,如图:

宣传图

代码说明:Math.random() * 40 生成 0-40 随机小数,Marh.floor()向下取整,最终得到 0~39 的整数温度值。

7.4 Switch 节点分流配置

判断对象:msg.payload

分流规则:

  • 输出1:条件 >30 → 高温报警分支
  • 输出2:otherwise → 温度正常分支

7.5 高温报警分支 Function 配置

对超温数据进行文字封装,生成报警提示,如图:

宣传图

7.6 正常温度分支 Function 配置

对正常温度数据进行文字封装,如图:

宣传图

7.7 最终 Debug 输出效果

宣传图

[
    {
        "id": "7e82b0e46aa45852",
        "type": "tab",
        "label": "流程 1",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "bb7092fcf4d6c569",
        "type": "inject",
        "z": "7e82b0e46aa45852",
        "name": "启动测试",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "timestamp",
        "payloadType": "str",
        "x": 80,
        "y": 380,
        "wires": [
            [
                "8c9ef9e7deba363c"
            ]
        ]
    },
    {
        "id": "7efa7c99c98594b2",
        "type": "debug",
        "z": "7e82b0e46aa45852",
        "name": "debug 1",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 760,
        "y": 340,
        "wires": []
    },
    {
        "id": "8c9ef9e7deba363c",
        "type": "function",
        "z": "7e82b0e46aa45852",
        "name": "随机温度生成",
        "func": "msg.payload = Math.floor(Math.random() * 40);\n\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 260,
        "y": 380,
        "wires": [
            [
                "4c80c43f8159efc9"
            ]
        ]
    },
    {
        "id": "f6e83eb71fe0f177",
        "type": "function",
        "z": "7e82b0e46aa45852",
        "name": "高温",
        "func": "msg.payload =\n    \"温度过高报警:\" +\n    msg.payload +\n    \"℃\";\n\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 610,
        "y": 340,
        "wires": [
            [
                "7efa7c99c98594b2"
            ]
        ]
    },
    {
        "id": "e795c25f083eda29",
        "type": "function",
        "z": "7e82b0e46aa45852",
        "name": "正常",
        "func": "msg.payload =\n    \"温度正常:\" +\n    msg.payload +\n    \"℃\";\n\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 610,
        "y": 420,
        "wires": [
            [
                "f601d27593217c84"
            ]
        ]
    },
    {
        "id": "f601d27593217c84",
        "type": "debug",
        "z": "7e82b0e46aa45852",
        "name": "debug 2",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 760,
        "y": 420,
        "wires": []
    },
    {
        "id": "4c80c43f8159efc9",
        "type": "switch",
        "z": "7e82b0e46aa45852",
        "name": "温度判断",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "gte",
                "v": "30",
                "vt": "num"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 460,
        "y": 380,
        "wires": [
            [
                "f6e83eb71fe0f177"
            ],
            [
                "e795c25f083eda29"
            ]
        ]
    }
]

售后支持:0755-29451836