Node-RED教程(四):Node-RED函数节点的使用

Node-RED系列文章目前已经写了16篇,介绍了Node-RED的安装以及默认安装的一些基本节点的使用,作为物联网的一个可视化拖动的流程,Node-RED的确实很容易上手。还没开始学习的同学可以先看下我以前的文章。

Node-RED教程(四):Node-RED函数节点的使用

上一期我们讲到了Node-RED中公共节点的使用,利用公共节点我们可以调试程序,捕获错误,监听状态的改变,本篇文章我再来给大家讲一下Node-RED中函数功能分类下的节点,该分类下有9个节点,主要是用于处理流中的逻辑部分,还有一些命令行的执行,以及模板的使用. 分别是function, switch,change,range,template,delay,trigger,exec,rbe,让我们来一个一个地分析如何使用这些节点完成Iot中流的处理。

function

function可以用于操作消息体.可以通过该节点,修改或验证消息体中的数据,在编写函数中,msg的对象是函数体中可以直接操作的数据,
你可以这样 msg.name='fizz' 将name属性定义为fizz,如果之前已经有了name属性,这句话则会变成修改。
最后将msg返回到下一节点 return msg

此外还有一点,一个函数节点可以设置输出次数,在节点编辑区域的底部可以设置,如果设置n次,则该节点的出口则会有n个

switch

switch是用于处理逻辑分支,比如判断一个变量,小于x,走第一条线,等于x走第二条线,大于x走第三条线,

使用此节点首先要有一个变量用于判断,可以是消息体中的变量,也可以是流中的变量,也可以是环境变量。也可以是一个表达式
而逻辑关系也有很多种,等于,大于,小于,包含,为真,为假。。。。

如下图

下面以实际情况演示一下,判断年龄age,如果大于0小于18则打印青少年,如果大于18小于30则打印青年,大于30小于60则打印中年

switch配置

流配置

该流的json配置为

// 代码归“拿我格子衫来”所属
[
    {
        "id": "adbf762d.d91148",
        "type": "tab",
        "label": "流程 1",
        "disabled": false,
        "info": ""
    },
    {
        "id": "77961796.2ab1a8",
        "type": "switch",
        "z": "adbf762d.d91148",
        "name": "age逻辑分支",
        "property": "age",
        "propertyType": "msg",
        "rules": [
            {
                "t": "btwn",
                "v": "0",
                "vt": "num",
                "v2": "17",
                "v2t": "num"
            },
            {
                "t": "btwn",
                "v": "18",
                "vt": "num",
                "v2": "30",
                "v2t": "num"
            },
            {
                "t": "btwn",
                "v": "31",
                "vt": "num",
                "v2": "59",
                "v2t": "num"
            }
        ],
        "checkall": "false",
        "repair": false,
        "outputs": 3,
        "x": 610,
        "y": 340,
        "wires": [
            [
                "e93cd13a.4fc8e"
            ],
            [
                "def579e4.e9feb8"
            ],
            [
                "ae7e827b.fbc1b"
            ]
        ]
    },
    {
        "id": "8dcde4d8.9befa8",
        "type": "inject",
        "z": "adbf762d.d91148",
        "name": "注入年龄",
        "props": [
            {
                "p": "age",
                "v": "15",
                "vt": "num"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "x": 160,
        "y": 340,
        "wires": [
            [
                "c68b2fe.99a75d"
            ]
        ]
    },
    {
        "id": "c68b2fe.99a75d",
        "type": "function",
        "z": "adbf762d.d91148",
        "name": "改变年龄",
        "func": "msg.age = 37\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "x": 360,
        "y": 340,
        "wires": [
            [
                "77961796.2ab1a8"
            ]
        ]
    },
    {
        "id": "ae855879.0d1968",
        "type": "debug",
        "z": "adbf762d.d91148",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": true,
        "tostatus": false,
        "complete": "ageRange",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 1150,
        "y": 340,
        "wires": []
    },
    {
        "id": "e93cd13a.4fc8e",
        "type": "function",
        "z": "adbf762d.d91148",
        "name": "青少年",
        "func": "msg.ageRange = '青少年'\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "x": 890,
        "y": 200,
        "wires": [
            [
                "ae855879.0d1968"
            ]
        ]
    },
    {
        "id": "def579e4.e9feb8",
        "type": "function",
        "z": "adbf762d.d91148",
        "name": "青年",
        "func": "msg.ageRange = '青年'\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "x": 890,
        "y": 340,
        "wires": [
            [
                "ae855879.0d1968"
            ]
        ]
    },
    {
        "id": "ae7e827b.fbc1b",
        "type": "function",
        "z": "adbf762d.d91148",
        "name": "中年",
        "func": "msg.ageRange = '中年'\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "x": 890,
        "y": 480,
        "wires": [
            [
                "ae855879.0d1968"
            ]
        ]
    }
]

如果要使用该流的话,可以点击右上角的菜单按钮,选择导入,将json内容复制到剪贴板中,点击导入。

change

change节点是用于操作消息体中某些变量,比如讲msg.payload的值 修改为Mizz, 搜索msg.payload的值将其中的z替换为x
也可以删除一个值,或者新增一个值

如下面

range

range节点可以将一个原有的属性通过一种线性算法映射出新的值, 如规定,原有的值区域在0-10, 映射后的区域是0-100,那么就是讲原有的值乘以10,其实就是设计一个线性的函数,只不过不是直接写,而是规定二个定义域来展示。

来看下官方的解释
该节点将线性缩放所接收到的数值。在默认情况下,结果不限于节点中定义的范围。

缩放并限制到目标范围表示结果永远不会超出目标范围内指定的范围。

在目标范围内缩放并折叠表示结果将会被限制(折叠)在目标范围内。

例如,输入0-10映射到0-100。

模式输入输出
scale12120
limit12100
wrap1220

示例,将0-5 映射成0-100,

template

模板节点可用于将一个或多个变量填充到一个文本中,首先是设置好一个模板,在模板中不确定的文本使用一个变量作为占位符,如
${name}同学的成绩是${scoce}分

举例说明,我们使用inject,template, debug三个节点来演示一下
首先在inject节点注入,msg.payload = { “name”: “Fizz”, “score”: 90}
然后在template节点,使用mustache语法,将msg payload的值映射成模板
{{payload.name}}同学的分数为{{payload.score}}!
最后我们再打印msg对象

最后演示结果是

流的json数据是

// 代码归“拿我格子衫来”所属
[
    {
        "id": "36273aee.b79d06",
        "type": "tab",
        "label": "流程 6",
        "disabled": false,
        "info": ""
    },
    {
        "id": "282daeb.736bb52",
        "type": "template",
        "z": "36273aee.b79d06",
        "name": "同学分数模板",
        "field": "payload",
        "fieldType": "msg",
        "format": "handlebars",
        "syntax": "mustache",
        "template": "\n{{payload.name}}同学的分数为{{payload.score}}!",
        "output": "str",
        "x": 480,
        "y": 420,
        "wires": [
            [
                "be5d4acc.2292f8"
            ]
        ]
    },
    {
        "id": "c49cfc3.76723",
        "type": "inject",
        "z": "36273aee.b79d06",
        "name": "学生成绩",
        "props": [
            {
                "p": "payload"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "{\"name\":\"小明\",\"score\":90}",
        "payloadType": "json",
        "x": 230,
        "y": 420,
        "wires": [
            [
                "282daeb.736bb52"
            ]
        ]
    },
    {
        "id": "be5d4acc.2292f8",
        "type": "debug",
        "z": "36273aee.b79d06",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": true,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 740,
        "y": 420,
        "wires": []
    }
]

delay

delay节点可以对节点的消息进行延迟发送或限制。应用场景是,如果并发量大的话,服务器处理不过来,就可以使用该节点来限制一定时间内
通过允许通过多少条,你也可以在流中重置延迟的时间,可以很好的低动态调整消息的处理权重,有了这个节点可以很容易就复现一些耗时任务的中间状态的变化。
延迟有二种一种是延迟每一条消息,第二种是限制信息的速率。

trigger

trigger节点触发后,将会发送一条消息。如果被拓展或重置,则可以选择发送第二条消息。

该节点可用于在流中创建一个超时。 默认情况下,当它收到一条消息时,它将发送一条带有1的有效荷载的消息。然后它将等待250毫秒,再发送第二条消息,其有效荷载为0。这可以用于使连接到Raspberry Pi GPIO引脚的LED闪烁等例子上。

exec

运行系统命令并返回其输出。

可以将节点配置为等待命令完成,或者在命令生成时发送其输出。

运行的命令可以在节点中配置,也可以由收到的消息提供。

输入

  • payload 字符串 如果这样配置,则将被附加到执行命令中。
  • kill 字符串 指定发送到现有的exec节点进程的kill信号类型。
  • pid 数值|字符串 要杀死的现有exec节点进程的进程ID

输出

  • payload字符串 命令的标准输出。
  • rcobject (仅执行模式)一个返回代码对象的副本(在端口3上也可用

rbe

一个提供异常报告(RBE)和死区功能的Node-RED节点。

除非传入值发生更改-RBE模式,或更改幅度超过一定量(绝对值或百分比)-带隙模式,否则该节点将阻塞。

仅在数据已更改的情况下传递数据。

这在每个msg.topic基础上起作用。这意味着单个rbe节点可以同时处理多个主题。

拿我格子衫来 CSDN认证博客专家 拿我格子衫来 范马勇次郎 琦玉君
积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里;不积小流,无以成江海。骐骥一跃,不能十步;驽马十驾,功在不舍。锲而舍之,朽木不折;锲而不舍,金石可镂。蚓无爪牙之利,筋骨之强,上食埃土,下饮黄泉,用心一也。蟹六跪而二螯,非蛇鳝之穴无可寄托者,用心躁也。
<p> <span style="color:#313d54;font-family:'Helvetica Neue', Helvetica, 'Hiragino Sans GB', Arial, sans-serif;font-size:16px;background-color:#ffffff;">Node-RED是工业网物联网的重要组成部分,我最开始接触Node-RED,也算是一个偶然的机会吧,上班后领导安排我的第一个任务就是调研一下Node-RED,我之后上网查了一下,那个时候网上相对于Node-RED的资料也比较少,只知道它是IBM公司的一个开源项目。直到最近,发现许多大公司的产品都支持Node-RED,比如西门子公司的IoT2000,研华公司的WISE PaaS 网关,美国OPTO 22等设备中都安装了Node-RED,表明它在工业物联网和控制中已经广泛应用了。</span> </p> <p> <img src="https://img-bss.csdnimg.cn/202010200935441926.png" alt="" width="1316" height="524" /> </p> <p style="font-family:'Helvetica Neue', Helvetica, 'Hiragino Sans GB', Arial, sans-serif;color:#313d54;font-size:16px;background-color:#ffffff;"> 那么工业物联网为什么要用它?它又处于工业物联网那个层次?它具有哪些特性?它帮助物联网解决了什么问题?为什么说它是柔性动态可重构的解决方案呢? </p> <p style="font-family:'Helvetica Neue', Helvetica, 'Hiragino Sans GB', Arial, sans-serif;color:#313d54;font-size:16px;background-color:#ffffff;">   </p> <p style="font-family:'Helvetica Neue', Helvetica, 'Hiragino Sans GB', Arial, sans-serif;color:#313d54;font-size:16px;background-color:#ffffff;"> ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ </p> <p style="font-family:'Helvetica Neue', Helvetica, 'Hiragino Sans GB', Arial, sans-serif;color:#313d54;font-size:16px;background-color:#ffffff;">   </p> <p style="font-family:'Helvetica Neue', Helvetica, 'Hiragino Sans GB', Arial, sans-serif;color:#313d54;font-size:16px;background-color:#ffffff;"> 本门课程,老师将带领你从Node-RED的发展,工业物联网定位开始讲解,并带领着大家进行手把手安装Node-RED,实际操作演练Node-RED,并搭建一个物联网小平台,给大家带来更好的学习效果。 </p> <p style="font-family:'Helvetica Neue', Helvetica, 'Hiragino Sans GB', Arial, sans-serif;color:#313d54;font-size:16px;background-color:#ffffff;"> <img src="https://img-bss.csdnimg.cn/202010200936289051.png" alt="" width="1841" height="948" /> </p> <p style="font-family:'Helvetica Neue', Helvetica, 'Hiragino Sans GB', Arial, sans-serif;color:#313d54;font-size:16px;background-color:#ffffff;"> <img src="https://img-bss.csdnimg.cn/202010200936561564.png" alt="" width="1920" height="977" /> </p> <p style="font-family:'Helvetica Neue', Helvetica, 'Hiragino Sans GB', Arial, sans-serif;color:#313d54;font-size:16px;background-color:#ffffff;">   </p> <p style="font-family:'Helvetica Neue', Helvetica, 'Hiragino Sans GB', Arial, sans-serif;color:#313d54;font-size:16px;background-color:#ffffff;"> ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ </p> <p style="font-family:'Helvetica Neue', Helvetica, 'Hiragino Sans GB', Arial, sans-serif;color:#313d54;font-size:16px;background-color:#ffffff;">   </p> <p style="font-family:'Helvetica Neue', Helvetica, 'Hiragino Sans GB', Arial, sans-serif;color:#313d54;font-size:16px;background-color:#ffffff;"> 为了能够让小伙伴们快速了解本门课程的结构,本门课程从以下几个方面展开: </p> <p style="font-family:'Helvetica Neue', Helvetica, 'Hiragino Sans GB', Arial, sans-serif;color:#313d54;font-size:16px;background-color:#ffffff;"> Node-RED入门 </p> <p style="font-family:'Helvetica Neue', Helvetica, 'Hiragino Sans GB', Arial, sans-serif;color:#313d54;font-size:16px;background-color:#ffffff;"> Node-RED安装与配置 </p> <p style="font-family:'Helvetica Neue', Helvetica, 'Hiragino Sans GB', Arial, sans-serif;color:#313d54;font-size:16px;background-color:#ffffff;"> Node-RED教学实战 </p> <p style="font-family:'Helvetica Neue', Helvetica, 'Hiragino Sans GB', Arial, sans-serif;color:#313d54;font-size:16px;background-color:#ffffff;"> Node-RED的优势与不足 </p> <p style="font-family:'Helvetica Neue', Helvetica, 'Hiragino Sans GB', Arial, sans-serif;color:#313d54;font-size:16px;background-color:#ffffff;"> Node-RED能为我们带来什么 </p> <p style="font-family:'Helvetica Neue', Helvetica, 'Hiragino Sans GB', Arial, sans-serif;color:#313d54;font-size:16px;background-color:#ffffff;"> Node-RED总结与展望 </p>
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页