上一期我们讲到了Node-RED中公共节点的使用,利用公共节点我们可以调试程序,捕获错误,监听状态的改变,本篇文章我再来给大家讲一下Node-RED中函数功能分类下的节点,该分类下有9个节点,主要是用于处理流中的逻辑部分,还有一些命令行的执行,以及模板的使用. 分别是function, switch,change,range,template,delay,trigger,exec,rbe,让我们来一个一个地分析如何使用这些节点完成Iot中流的处理。
functionfunction可以用于操作消息体.可以通过该节点,修改或验证消息体中的数据,在编写函数中,msg对象是函数体中可以直接操作的数据, 你可以这样 msg.name=fizz 将name属性定义为fizz,如果之前已经有了name属性,这句话则会变成修改。 最后将msg返回到下一节点 return msg
此外还有一点,一个函数节点可以设置输出次数,在节点编辑区域的底部可以设置,如果设置n次,则该节点的出口则会有n个
switchswitch是用于处理逻辑分支,比如判断一个变量,小于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内容复制到剪贴板中,点击导入。
changechange节点是用于操作消息体中某些变量,比如讲msg.payload的值 修改为Mizz, 搜索msg.payload的值将其中的z替换为x 也可以删除一个值,或者新增一个值
如下面
rangerange节点可以将一个原有的属性通过一种线性算法映射出新的值, 如规定,原有的值区域在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节点可以对节点的消息进行延迟发送或限制。应用场景是,如果并发量大的话,服务器处理不过来,就可以使用该节点来限制一定时间内 通过允许通过多少条,你也可以在流中重置延迟的时间,可以很好低动态调整消息的处理权重,有了这个节点可以很容易就复现一些耗时任务的中间状态的变化。 延迟有二种一种是延迟每一条消息,第二种是限制信息的速率。
triggertrigger节点触发后,将会发送一条消息。如果被拓展或重置,则可以选择发送第二条消息。
该节点可用于在流中创建一个超时。 默认情况下,当它收到一条消息时,它将发送一条带有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节点可以同时处理多个主题。
免责声明:文章内容来自互联网,本站不对其真实性负责,也不承担任何法律责任,如有侵权等情况,请与本站联系删除。
转载请注明出处:物联网平台Node-RED系列(四):Node-RED函数节点的使用 https://www.yhzz.com.cn/a/13256.html