Node-RED物联网应用开发技术详解
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.3.2 基于流程引擎

Node-RED内置了一个功能强大的规则引擎,支持用户定义条件和触发器,实现自动化和响应式的流程。这使用户可以根据特定的规则来控制和操作流程中的节点。这种方式叫基于流的编程(Flow Based Programming,FBP),它是一种基于组件的软件工程方法,由J. Paul Morrison在IBM工作时创建。在详细了解Node-RED之前,我们先简单介绍一下FBP。虽然FBP创建的时间非常早,但是直到今天才逐渐被广泛采用,主要原因是当前物联网应用的爆发,要求快速开发更多物联网中间件、物联网平台、边缘计算网关等面向各种物理硬件设备的项目,而FBP的特性十分适合这些场景,因此Node-RED设计的基础就是FBP的开发模式。

FBP不是具体的开发语言,也不是开发工具,只是一种编码方式。常见的编码方式还有面向脚本的方式、面向过程的方式、面向对象的方式。面向对象的编码方式是当前最为流行且应用广泛的编程方式。大家熟悉的Java就是基于面向对象的编码方式发明的语言,其他主流语言如PHP、Python、Go等都有框架来支持面向对象的编码方式。这种方式主要适用于应用级系统的开发,用在物联网和底层的通信级别的开发中将会显得“笨拙”,也不适用于有大量物联网数据的场景,以及有不同协议交换的场景或设备控制的场景。

FBP是将程序概念化为由一系列节点和连接线组成的流程图,通过图形化的方式进行组装,利用图形化、流程化、组件、连接点、消息包等主要概念完成整个系统的开发和调试。FBP使用图形来表示程序的结构。节点是组件的实例,节点之间通过端口连接。一个节点上的输出端口只能连接到另外一个节点的输入端口。图形被构建为程序的静态视图,该视图在运行环境中运行。目前,一些编辑FBP流程图的工具如DrawFBP、NoFlo等可视化工具,也可以使用文本语言XML格式进行构建。基于FBP的图形创建工具DrawFBP的工作流程如图1-3所示。

图1-3 基于FBP的图形创建工具DrawFBP的工作流程

图形化是一种非常适合视觉表达的方式,使用户可以更容易地理解流程。如果能把一个问题分解成离散的步骤,就可以创建一个流程,并知道它在做什么,而不必理解每个节点对应的每行代码。

组件是FBP的基础模块。下面介绍一些基本组件,这些组件通常是用传统编程语言编写的类、函数或小程序。每个组件包含实现的逻辑(黑盒子)、连接线、输入点、输出点4个部分,如图1-4所示。

1)节点(黑盒子):每个组件代表一项已经开发好的功能代码,类似一个黑盒子,用户不需要关心里面的运行过程,只需要关注实现的功能。这个“黑盒子”在FBP中又名“节点”。一个FBP流程可以用到多个同一种组件(比如function组件、change组件等)的节点,每个节点都是一个独立的组件实例。

图1-4 FBP组件示例

2)输入点:每个“黑盒子”可以有0个、1个或多个输入点,是外界将信息传递进节点的地方。如果节点的输入点数量是0,表示这是流程的第一个节点,即开始节点。该节点可以通过自动或者手动的方式启动。

3)输出点:每个“黑盒子”可以有0个、1个或多个输出点,是节点对外输出结果的地方。如果节点的输出点数量为0,表示该节点为流程分支上的最后一个节点,执行完毕后不需要输出信息。

4)连接线:连接线是连接节点的输出点和输入点的连线,程序会按照连线的顺序执行。连接线具有一对一、一对多、多对一的形式。连接线具有节点合并和节点拆分两个功能。

■ 节点合并:当两个或多个输出点需要连接到节点上的单个输入点时,必须进行某种形式的合并。可以添加一个合并节点(具有多个输入点),将消息包按到达顺序发送到单个输入点,或者将接收节点上的单个输入点替换为阵列输入点。也可以提供自动合并功能。

■ 节点拆分:当一个输出点需要连接到多个输入点时,数据包需要被拆分,为了实现这一目的,需要一个能够拆分数据包的组件。它可以创建一个数据包的副本并将其发送到每个连接的输出点。运行时可以提供此功能,而不需要显式组件来完成。

消息包是各个节点之间传递的数据包。该数据包可以包括各种通用的数据结构,比如String类型、JSON类型、Num类型等。当然,JSON是最为常用的格式,因为可以在每个节点去扩展,修改里面的数据项,方便实现不同的功能要求。

在一个FBP图中,每个流程都可以有一个初始消息包作为最开始的数据进行配置。在流程启动之前,它不会生效,只有通过手动或者自动触发的方式启动。流程启动后,初始消息包才开始生效,并按照流程向下传递。

当节点的输入点有数据传入时,该节点被激活。节点被激活后开始执行任务,当任务完成后返回修改过的数据包,然后继续向后传递。消息包传递过程如图1-5所示。

图1-5 消息包传递过程