Node-RED的介绍及优点
随着物联网的不断发展,各种物联网相关的技术也在不断发展,开源的平台也有很多,其中就有一个特别优秀的项目,它就是Node-RED,这个项目是由IBM新兴技术服务团队构建的可视化物联网编排工具,可基于浏览器的流程编辑器连接设备、服务器和 API 应用。 这句对于Node-RED的介绍是来自官方的,增加了很多概念性的词语,这里稍作解释一下。 首先这个项目是有IBM公司的二名研究员创建的,旨在用于快速,低成本地搭建一个Iot平台,但后来的反正,改项目不仅仅用于构建一个物联网平台,还有很多用处。目前这个项目已经是OpenJS Foundation的一部分了。 此外他是一个可视化的项目,后台使用的是NodeJS语言,提供了Web页面,来编写Flow, 这是改项目提供的页面。
Node-Red的官网地址:https://nodered.org
Node-RED是一个编程工具,用于以新的有趣方式将硬件设备、API和在线服务连接在一起。
它提供了一个基于浏览器的编辑器,可以轻松地使用调色板中的各种节点将流连接在一起,这些节点可以一键部署到其运行时。
基于浏览器的流程编辑
Node-RED提供了一个基于浏览器的流量编辑器,可以轻松地使用调色板中的各种节点将流连接在一起。然后,只需单击一下即可将流部署到运行时。
可以使用富文本编辑器在编辑器中创建JavaScript函数。
内置库允许您保存有用的功能、模板或流程以供重复使用。
基于Node.js
轻量级运行时建立在Node.js上,充分利用其事件驱动的非阻塞模型。这使得在树莓派等低成本硬件和云端运行成为理想的选择。
Node的软件包存储库中有超过225,000个模块,可以轻松扩展调色板节点的范围以添加新功能。
社会发展
在Node-RED中创建的流使用JSON存储,JSON可以轻松导入和导出以与其他人共享。
在线流程库允许您与世界共享您的最佳流程。
Node-Red入门使用
这里推荐使用docker运行Node-Red,有官方提供的景象,可以直接使用。当然也可以通过npm安装的方式来安装Node-Red。
我这里使用的是docker
- 第一步下载镜像
docker pull nodered/node-red
- 第二步启动镜像
sudo docker run -it -p 1880:1880 --name=nodered --restart=always --user=root --net=host -v /data/nodered:/data -e TZ=Asia/Shanghai nodered/node-red
- 第三步打开浏览器访问
访问http://{host-ip}:1880
就能够进入Node-RED的操作页面了。
打开默认带一个comment,里面是docker运行的一些说明,大致意思就是数据会存储在/home/user/node_red_data
文件夹里等等。
Node-RED 截止目前共有 42 个逻辑节点,按照共通、功能、网络、序列、解析、存储分为六大类。
所有节点都可能有左右连接点,左连接点是输入,右连接点是输出,特殊节点可能有多个输入或多个输出,其实对应代码也不难理解,就是入参和出参。
下面依次介绍每个节点的功能。
共通
-
inject
手动输入节点。可以定期产生一些输入,由下一个节点消费。
当然这里是用 UI 表单配置的:
之后就是消费,几乎后面任何节点都可以消费,比如利用change
节点来设置一些环境变量时,或者利用 template
节点设置html
模版时,都可以拿到这里输入的变量。如果在模版里,变量通过 {{msg.payload}}
访问,如果是其它表单,甚至可以通过下拉框直接枚举选择。
然而这个节点往往用来设置静态变量,更多的输入情况是来自其它程序或者用户的,比如http in
,这个后面会讲到。其实通过这种组合关系,我们可以把任意节点的输入从生产节点替换为inject
节点,从而实现一些 mock
效果,而inject
节点也支持配置定时自动触发:
-
debug
调试节点,当输出节点连接到 debug 的输入后,将会在控制台打印出输出信息,方便调试。
例如:我想要每天早上六点获取本地的天气,我们就可以这样写
点击部署按钮,之后执行inject
,就会在控制台输出如图所示
- complete
监听某些节点触发完成动作。通过这个节点,我们可以捕获任意节点触发的动作,可以接入 debug 节点打印日志,或者 function 节点处理一下逻辑。 - catch
错误捕获节点,当任何或指定节点触发错误时输出,输出的格式为:
error.message 字符串错误消息。
error.source.id 字符串引发错误的节点的ID。
error.source.type 字符串引发错误的节点的类型。
error.source.name 字符串引发错误的节点的名称。(如果已设置)
- status
监听节点状态变化。 - link in
只能连接link out
。link in、link out
就像一个传送门,用来整理逻辑编排节点,使之看上去易于维护。 - link out
和link in
成对出现,用来导出输入值,后面对接link out
可以像传送门一样将值传送过去,在视觉上不会形成连接线。 - comment
注释,配合 link 系列使用,可以让逻辑编排 UI 更易于维护。
功能
-
function
核心的 js 函数模块,你可以用它做很多事:
这里所有上级节点的值到这里都会在msg对象中,所以这里可以对msg进行处理,之后再流转到下一个节点中。
-
switch
对应代码的 switch,只是用起来更加方便,因为我们可以根据不同 case 导出不同的节点:
- change
用来改变环境变量。环境变量分为三种,分别是当前节点、流程(flow)、全局(跨应用)。也就是说,变量可以存储在某个节点上,也可以存储在整个画布上,也可以跨画布存储在全局。
访问参数分别为msg.
、flow.
、global.
,设置这些参数后,就像全局变量一样,任何节点都可以在任何地方使用,比较方便。
比如应用固定了一些URL
地址,直接把一串字符串写死在某个http in
节点里并不明智,因为后面的html
或者其它节点里可能会访问它,一旦你进行修改,影响面会非常广,因此最好将其设置为全局变量,在节点中通过变量方式访问:
这里输入变成由流程传入,具体的值如下图所示。
最后输出结果在控制台
-
range
区间映射,将一个范围的值映射到另一个范围。其实通过 function 模块也能完成,只是因为比较常用所以封装了一个特殊节点。其实用户也可以自己封装节点,具体方式可以参考官方文档。这里不再解释 -
template
以模版方式生成字符串或 json。
其实本质上也可以被 function 代替,只是用来写模版的话有高亮,维护起来比较方便。
内置了 mustache 模版语法,通过 {{}} 方式使用变量。例如:将流程修改为:
结果输出:
-
delay
延迟发消息,一个快捷的工具,可以放在任何输入与输出中间,比如让上面的例子中,inject
触发后 5s 再打印结果,可以这么配置: -
trigger
一个消息触发器,相比inject
,可以更灵活的设置何时重新触发。具体设置如下图,设置项比inject
更灵活的多。 -
exec
执行系统命令,例如,ls -A,cp -r 等,这里是运行时的操作系统命令,是极其危险的操作。例如我权限充足,执行以下操作: -
filter
异常报告节点(Report by Exception)
网络
网络这里有很多种,http、socket、tcp、udp等,这里只介绍常用的http。
- http in
创建一个http
服务,可以是任何接口或者web
服务。
当你把Method
设置为post
,连接到http response
就创建了后端接口;当设置为get
请求,并连接template
写上html
模版,并连接到http response
就创建了web
服务。这里其实就是一种BFF
的使用场景,只不过并没有GraphQL
那种灵活度,不过可以是一种新的尝试。
虽然这种方式创建web
服务难以使用react
或vue
框架,不过自定义节点还是为其创造了可能性,或许真的可以把前端模块化文件定义为节点相互串联。 - http response
http
的返回结果,只能对接http in
的输出,总是与http in
成对使用。
如果只用了http in
但没有用http response
,就相当于Node后端代码里处理了请求,但是并没有对res
做处理,所以请求会一直不中断,知道超时为止。 - http request
与http in
创建一个http
服务不同,http request
直接发送一个网络请求并将返回值导入到输出节点。
序列
- split
顾名思义将一条消息处理为多条消息。 - join
将消息序列合并为一条消息。 - sort
对应代码sort
,只能根据key
做简单的升序降序处理,对于简单场景比较方便,但对于复杂场景可能还会使用function
节点代替。 - batch
批量接收输入流后,根据数量进行打包后统一输出,等于批量打包,可以按照数量或者时间间隔进行分组。不过貌似不能像Q
或者Promise
那样批量处理http
请求,我这里使用join
处理的http
批量请求。
解析
其实以下的解析方法都可以用function
代替,只不过在API层面上已经封装好了
- csv
在CSV格式的字符串及其JavaScript对象表示形式之间进行相互转换。 - html
使用CSS选择器从msg.payload中保存的html文档中提取元素。 - json
在JSON字符串及其JavaScript对象表示形式之间相互转换。 - xml
在XML字符串及其JavaScript对象表示形式之间进行相互转换。 - yaml
在YAML格式的字符串及其JavaScript对象表示形式之间相互转换。
存储
- write file
将msg.payload写入文件,添加到末尾或替换现有内容。或者,它也可以删除文件。 - read file
以字符串或二进制缓冲区的形式读取文件的内容。 - watch
监视目录或文件中的更改。
总结
在使用function
函数时,还可以使用异步的方法Promise
,函数处理时会显性的存在node
对象,在node
中会包含很多函数处理,只要最后调用node.send()
,效果与return msg
一致。并且也会显性存在以下函数提供调用:
- Buffer – Node.js的Buffer模块
- console – Node.js的console模块(node.log是首选的日志方法)
- util – Node.js的util模块
- setTimeout/clearTimeout – JavaScript的timeout函数
- setInterval/clearInterval – JavaScript的interval函数
在调研Node-Red时发现,Node-Red是一个大而全的Node框架或解决方案。就BFF而言,Node-Red与GraphQL还是存在很大差距的,总结一下几点:
- 没有数据模型(Scheme),或者没法规范化的约束数据类型。这不是Node-Red的问题,是其本身并不是为BFF而生,只是其中某些特性比较像BFF而已。
- 没有GraphQL灵活,好多不可定制化,当然Node-Red也可以使用其他NPM包来扩展,对于开源项目代码来说,这都不是问题,但对于使用者来说成本更高。
- 对于开发者来说使用不够方便,虽然提供了function,也暴露了几个Node的方法,但是对于开发者来说,这显然还不太够。
虽然作为BFF工具来说,Node-Red并不完美,但是对于其他方面来说,他能做的事情很多。以上就是Node-Red的全部内容,有缺点和不足点评一下吧。
本文章来源于互联网,如有侵权,请联系删除!原文地址:Node-Red
10月31日消息,“5G使能千行百业”,这一切都将在园区发生。电信网络的飞速发展开启了万物互联时代,5G超高带宽、超低时延、全连接覆盖的网络能力更将促使业务的不断丰富。GSMA智库的调研结果显示,约有70%的运营商CEO认为,企业市场是未来5G重要的价值来源…