业务需求:
- 设备告警或者场景联动:
通过规则来实现设备告警, 上线, 离线等条件触发时, 来执行一系列的场景联动的控制等等。
- 数据转发:
对数据进行过滤或者其他计算处理后转发到第三方系统,
该规则不需要触发器, 执行动作也是将过滤的数据通过网络组件推送到第三方平台
- 其他复杂的自定义场景:
如多级场景联动, 以及涉及复杂的分支及业务数据处理的场景。
表结构设计
规则实例表:rule_instance
id : 规则实例ID, 字符串类型, 主键,
name: 规则实例名称, 字符串类型
type: 规则实例类型, 1设备告警, 2数据转发, 规则编排
flow_id: 流程ID, 规则实例类型为“规则编排”时,该项为对应的NedRed流程
status:启用状态
业务流程:
1: 业务系统创建一个空的规则编排实例, 调用Node-Rule 的接口创建一个空的流程, 并将流程ID 回写到规则实例表中的flow_id 字段中。
2:查看规则编排实例详情时, 通过规则编排实例的flow_id直接打开该流程的编辑页面
3:编辑流程, 并部署
规则编排:
Node-RED介绍
Node-RED 是一种低代码编程工具,用于以新颖有趣的方式将硬件设备、API 和在线服务连接在一起。提供了一个基于浏览器的编辑器,可以使用编辑器中的各种节点轻松地将流连接在一起,只需单击一下即可将其部署到其运行时。Node-RED 基于NodeJs 构建,无需依赖其他组件,比如数据库等等,
优点:
- 基于浏览器的流程编辑,且提供丰富的流程节点, 如网络, 函数等相关节点, 且流程节点支持根据业务自定义创建。
- 基于 Node.js 构建,充分利用其事件驱动的非阻塞模型。这使得它非常适合在树莓派等低成本硬件以及云中运行。
-
Node-RED 中创建的流使用 JSON 存储,可以轻松导入和导出以与他人共享。
Node-RED集成
Node-RED 使用NodeJs 构建, 因此可以将Node-RED 作为一个module 集成到其他的NodeJs的web应用中,
Node-RED 集成到其他NodeJs的web服务中的Demo:
var http = require('http');
var express = require("express");
var RED = require("node-red");
var app = express();
// 暴露静态文件
app.use("/",express.static("public"));
app.get('/api/ping', (req, res) => {
res.send('pong')
})
var server = http.createServer(app);
// 覆盖 Node-Red settings.js
var settings = {
httpAdminRoot:"/red",
httpNodeRoot: "/api",
userDir:"/home/nol/.nodered/",
functionGlobalContext: { } // enables global context
};
// 初始化Node-red 运行时
RED.init(server,settings);
app.use(settings.httpAdminRoot,RED.httpAdmin);
app.use(settings.httpNodeRoot,RED.httpNode);
server.listen(8001);
RED.start();
业务系统集成需解决的问题:
问题1:如何解决登录校验的问题, 防止直接打开Node-Red编辑器?
• 需屏蔽Node-Red 的登录页面, 并关闭Node-Red 的权限校验
• 业务系统登录后前端缓存token,
• 业务系统打开Node-Red 页面时需携带token, Node-Red 拿到请求头中的token后调用IOT的API接口对token 进行合法性校验, 校验通过后才允许访问,
技术实现:
Node-Red中使用express 中间件功能对所有请求进行拦截, 在中间件中拿到token后对token进行校验
问题2:Node-Red 编辑器如何只能编辑一个流程,
因目前Node-Red编辑器页面是对全部流程进行统一管理, 如果实现在业务系统中打开某个规则编排实例编辑页面时只显示器绑定的流程,
编辑器需隐藏下述按钮, 直接通过流程编辑按钮打开(编辑)一个流程,
如果规则编排实例未绑定流程时, 则打开编辑器时自动打开一个新流程, 发布后和规则编排实例进行绑定,
打开一个新的流程:http://localhost:8001/red
修改时通过流程ID打开编辑页面:http://localhost:8001/red/#flow/fb114737e8a940cc
问题3:如何绑定规则编排实例和对应流程, 流程ID如何回传到业务系统
1: 业务系统创建规则编排实例时, 调用Node-Red 的API 接口新增一个流程,
2: 业务系统将Node-Red 返回的流程ID作为该实规则实例需绑定的流程,
问题4:规则编排实例启用/禁用时, Node-Red是否暴露启用/禁用对应流程的API接口?
通过修改流程对应的disabled 属性, 后重新发布的方法, 实现流程的启用和禁用
1: 通过下图中的接口获取全部的流程信息
2: 迭代获取到对应的流程, 并修改属性后,重复发布流程。