首页专栏详情
打赏
物联网平台Node-RED系列(四):Node-RED函数节点的使用
易百纳技术社区 不完整教程 2021-01-05 15:11:35

上一期我们讲到了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。

模式 输入 输出
scale 12 120
limit 12 100
wrap 12 20

示例,将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节点可以同时处理多个主题。


声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。

23528
12
101
打赏
共1人已赏
完整的教程https://fizzz.blog.csdn.net。该网站都是残缺
评论
0个
内容存在敏感词
相关专栏
打赏作者
易百纳技术社区
不完整教程
您的支持将鼓励我继续创作!
打赏金额:
¥1 易百纳技术社区
¥5 易百纳技术社区
¥10 易百纳技术社区
¥50 易百纳技术社区
¥100 易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区 微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
Loading...
易百纳技术社区
确定要删除此文章、专栏、评论吗?
确定
取消
易百纳技术社区
易百纳技术社区
在专栏模块发布专栏,可获得其他E友的打赏
易百纳技术社区
回答悬赏问答,被题主采纳后即可获得悬赏金
易百纳技术社区
在上传资料时,有价值的资料可设置为付费资源
易百纳技术社区
达到一定金额,收益即可提现~
收益也可用来充值ebc,下载资料、兑换礼品更容易
易百纳技术社区
活动规则
  • 1.周任务为周期性任务,每周周一00:00刷新,上周完成的任务不会累计到本周,本周需要从头开始任务,当前任务完成后才可以完成下一个任务
  • 2.发布的专栏与资料需要与平台的板块有相关性,禁止注水,专栏/资料任务以审核通过的篇数为准,专栏需为原创文章且首次在社区发布
  • 3.任务完成后,现金奖励直接打款到微信账户;EBC/收益将自动发放到个人账户,可前往“我的钱包”查看;其他奖励请联系客服兑换
易百纳技术社区
升级提醒
易百纳技术社区

恭喜您由入门

社区送出礼品一份

请填写您的收件地址,礼品将在3个工作日寄出

易百纳技术社区