规则引擎

提供可视化,流程化的数据(逻辑)处理工具.

规则模型

新建规则模型

  • 登录物联网管理平台。
  • 选择左侧导航栏,选择规则引擎 > 规则模型。
  • 在规则模型板块中,单击新建模型操作按钮。
  • 在弹出设计器中,拖拽节点和连线生成相应规则,填写模型id和名称点击保存
  • 规则模型提供配置的导出、导入(支持批量导入)、复制功能

新建规则模型

规则节点

  • 数据的处理逻辑由规则节点执行. 不同的节点类型需要不同的配置.
  • 节点就像一个java方法,接收上一个节点的参数,处理之后输出到下一个节点.
  • 节点之间使用连线进行连接,组成一个完整到流程.
  • 节点可以不接收数据,只生产数据.如: 定时任务,消息网关.
  • 节点可分布在不同的服务器上执行(专业版支持).

输入输出

规则节点的输入和输出数据均为RuleData格式为:

  1. {
  2. "data": {},//输入参数或者输出结果
  3. "attributes": {}//拓展属性,通常用于传递节点产生的特殊变量,如异常信息等.
  4. }

在一些节点里,会将RuleData转为内置变量以进行一些自定义操作,比如脚本执行,表达式判断等. 通常情况下,内置变量与RuleData格式一致.例如:

上一节点输出RuleData.data{"username":"admin","password":"m123"} 内置变量会被转为Map,变成:

  1. {
  2. "attr":{}, //attributes的简写
  3. "data":{
  4. "username":"admin",
  5. "password":"m123"
  6. },
  7. "username":"admin", //data里的数据被平铺里
  8. "password":"m123"
  9. }

注意

在规则引擎节点中,大部分表达式使用的是SpEL表达式,所以要注意引用内置变量的方式为: ${#data[username]} 而不是${#data.username}.

连线

节点之间通过连线连接,连线保证多个节点连续执行和有序执行.连线类型分为: 连接事件.

连接表示当上一个节点输出数据后,数据会流入下一个节点. 事件表示当上一个节点触发一下事件时,数据才会流入下一个节点.

连线可以指定条件,当满足条件表达式时,数据才会流入下一个节点. 条件表达式为javascript. 表达式返回true则表示满足条件.

调试

  • 单击相应的节点,在右侧节点对应的功能表单中,填写好对应的数据。
  • 点击运行,填写运行时需要的执行参数。
  • 点击确认。
  • 在下方日志展示栏中,查看节点对应的调试日志

规则实例

生成规则实例

  • 在规则模型列表中,选择对应的模型。
  • 在对应的模型列表中,单击操作列中的发布操作,用该规则模型生成规则实例。

启动

选择规则引擎 > 规则实例。选择规则实例发布生成的规则实例,单击操作列中启动操作 用以启动该规则。
规则引擎启动

停止

选择规则引擎 > 规则实例。选择已启动的规则实例,单击操作列中停止操作 用以停止该规则。
规则引擎停止

执行

  • 点击规则实例列表操作列中的查看详情操作
  • 在弹出的界面中点击执行按钮
  • 点击执行按钮后弹出的界面中选择开始节点、结束节点(开始、结束节点来自于规则 实例中的所有节点,且开始、结束节点可选择相同节点),填写执行参数。单击确认按钮, 在弹窗下方响应栏查看执行结果。
  • 节点执行日志:执行日志主要记录节点在执行过程中的错误信息或主动输出打印的日志信息。
    在第二步界面中,选择日志栏查看规则实例所有日志。
    • 选中规则实例中不同节点用以查看该节点对应的日志。
    • 选中规则实例页空白处,重新查看该规则实例所有节点日志。
  • 节点执行事件:执行事件主要记录节点执行前后节点中的数据 在第二步界面中,选择事件栏查看规则实例所有事件记录。
    • 选中规则实例中不同节点用以查看该节点对应的事件记录。
    • 选中规则实例页空白处,重新查看该规则实例所有节点事件记录。

节点支持

通用说明

  • 节点会在设计器中展示节点自身所需要的参数表单。
  • 每个节点通用的表单参数有 节点ID、节点类型、节点名称、节点大小、节点颜色、调度规则
  • 节点ID: 规则模型中每个节点的独立标识(自动生成不可修改)
  • 节点类型: 节点所对应的功能类型(自动生成不可修改)
  • 节点名称: 节点方块在设计器中所展示的名称
  • 节点大小: 节点方块在设计器中的尺寸大小
  • 节点颜色: 节点方块在设计器中展示的颜色
  • 调度规则: 节点在集群中的哪些主机中运行(专业版支持)。

定时任务

定时任务节点用于需要周期性执行某业务规则。如定时同步数据

定时器配置项

参数用途是否必须用例
cron表达式生成定时任务规则cron表达式(在线cron表达式规则引擎 - 图4)

通知

通过此节点可调用消息通知组件进行消息发送.

参数说明

参数用途是否必须用例
通知类型设置通知类型短信通知
通知器设置通知类型对应的配置选择通知器
通知模板设置通知需要发送的内容选择通知模板

注意

在通知模版中可使用规则引擎节点的内置变量,具体是否支持需要看通知器实现是否支持.

路由

路由节点将数据转发到多个节点,通过连线条件可实现同一个数据进行不同的处理逻辑.

消息网关

消息网关为平台内部的一个消息总线,统称消息网关,是一个基于topic实现消息的消息订阅与发布功能.通常用于订阅设备消息,进行处理.

注意

topic是一个以/分割的字符,与MQTT的topic类似. 支持通配符***, 例如: /device/*/online 表示所有的设备上线消息. /device/**表示所有设备的所有消息.

注意: 通配符不支持前后匹配. 例如/device/dev*/ 是不支持的.

消息网关配置项

参数用途是否必须用例
网关选择要订阅的网关默认网关
类型设置推送消息还是订阅消息订阅消息
Topic订阅主题,多个主题使用逗号(,)分割/device/**

常用topic

不同的Topic返回的消息格式不同,具体格式请查看对用topic定义文档.

  • 设备消息Topic (TODO)

MQTT客户端

该节点使用网络组件中的Mqtt客户端进行消息订阅和消息推送。 可使用此功能,将消息处理后通知给第三方MQTT服务.

MQTT客户端配置项

参数用途是否必须用例
mqtt客户端设置客户端基本配置选择MQTT客户端
操作定义mqtt客户端操作类型订阅消息
消息体类型根据不同的类型解析为对应的数据JSON
主题Topic定义推送或订阅消息的主题/topic/${#data.id}
主题变量将把topic中的占位符提取为变量传递到下一个节点(仅订阅生效)/{productId}/{deviceId}/event/{eventId}

MQTT客户端内置变量

推送数据格式(由上一个节点传入):

  1. {
  2. "topic":"/1/a/event/temp", //可选,如果传递了topic则配置中的topic失效.
  3. "payloadType":"JSON",//可选,如果未设置则以配置项中的为准.
  4. "payload": {}, //要推送的消息内容
  5. }

订阅数据格式(将传入下一个节点):

  1. {
  2. "topic":"/1/a/event/temp", //主题topic
  3. "will":false,
  4. "qos":0,
  5. "dup":false,
  6. "retain":false,
  7. "clientId":"客户端Id",
  8. "payloadType":"JSON",//接收消息类型
  9. "payload": {}, //接收的消息内容,不同的消息类型,格式不同
  10. "vars":{//topic占位符变量
  11. "productId":"型号Id",
  12. "deviceId":"设备Id",
  13. "eventId":"事件Id"
  14. }
  15. }

TCP客户端

该节点使用网络组件中的TCP客户端进行消息订阅和消息推送

TCP客户端配置项

参数用途是否必须用例
tcp客户端设置客户端基本配置弹出框选择
操作定义tcp客户端操作类型订阅消息
消息体类型订阅或发送消息体类型JSON

TCP客户端内置变量

推送数据格式(由上一步传入):

  1. {
  2. "payloadType":"BINARY",//消息类型
  3. "payload": "BASE64" //发送的消息
  4. }

订阅数据格式:

  1. {
  2. "payloadType":"BINARY",//消息类型
  3. "payload": "BASE64" //接收的消息
  4. }

WebSocket客户端

(专业版支持)

该节点使用网络组件中的Websocket客户端进行消息订阅和发布.

WebSocket客户端参数说明

参数用途是否必须用例
WebSocket客户端设置客户端基本配置弹出框中选择
操作定义WebSocket客户端操作类型订阅消息
消息体类型定义WebSocket客户端消息类型JSON

WebSocket客户端内置变量

推送数据格式(由上一步传入):

  1. {
  2. "payloadType":"JSON",//消息类型
  3. "payload": {} //发送的消息
  4. }

订阅数据格式:

  1. {
  2. "payloadType":"JSON",//消息类型
  3. "payload": {} //接收的消息
  4. }

HTTP客户端

(专业版支持)

使用网络组件中的HTTP客户端发起HTTP请求

HTTP客户端参数说明

参数用途是否必须用例
Http客户端设置客户端基本配置弹出框中选择
uri资源详细路径/demo/user/${#data[id]}
请求方式定义Http请求方式GET
contentType定义Http contentTypeapplication/json
请求消息体类型定义Http客户端请求体的消息类型JSON
响应消息体类型定义Http服务端响应的消息类型JSON

HTTP客户端内置变量

请求(通过上一步传入):

  1. {
  2. "headers":[{"name":"header","value":["value"]}],
  3. "queryParameters":{}, //URL 参数
  4. "payload":{} //消息体
  5. }

响应:

  1. {
  2. "payload":{}, //接收的消息
  3. "payloadType":"JSON",//接收消息类型
  4. "status":200,
  5. "headers":[
  6. {
  7. "name":"请求头名称",
  8. "value":[
  9. "请求头值1",
  10. "请求头值2"
  11. ]
  12. }
  13. ],
  14. "contentType":"application/json"
  15. }

CoAP客户端

该节点使用网络组件中的CoAP客户端进行CoAP讲求

CoAP客户端参数说明

参数用途是否必须用例
CoAP客户端设置客户端基本配置弹出框中选择
uri资源详细路径/demo/user/{id}
请求方法定义CoAP请求方式GET
消息体类型定义CoAP客户端消息类型JSON

CoAP客户端内置变量

请求参数(由上一节点传入):

  1. {
  2. "payload":{},//消息内容
  3. "options":{},//自定义Options
  4. "payloadType":"JSON",//可选,消息体类型
  5. "path":""//可选,请求路径
  6. }

响应结果:

  1. {
  2. "payload":{ //接收的消息
  3. },
  4. "path":"/demo/user/{id}",//请求路径
  5. "code":200, //响应状态码
  6. "options":{},//options
  7. "success":true //响应结果
  8. }

执行SQL

该节点执行SQL语句.

执行SQL配置项

参数用途是否必须用例
sql定义所选择数据源支持的sql语句select 1

执行SQL说明

当sql为查询时,查询的每一条结果都会被传入下一个节点.而不是传入整个结果集.

字段转换

该节点可转换数据的字段。如 source:a=1 target:b=1

字段转换配置项

参数用途是否必须用例
保留源字段源字段是否保留在转换结果中
转换规则配置转换方式
  1. 单击转换规则
  2. 在弹出框中,单击添加字段
  3. 输入原字段、目标字段、类型
    • 原字段:需要转换的字段
    • 目标字段:转换后生成的字段
    • 字段类型: 该字段的数据类型
  4. 点击保存生成字段转换配置

注意

源字段支持SpEL表达式

动态脚本

该节点可执行脚本,通过脚本进行一些自定义的逻辑.

动态脚本配置项

参数用途是否必须用例
脚本语言定于将要执行的脚本语言类型javascript
脚本定于将要执行的脚本

脚本案例

javascrpt:

  1. handler.onMessage(function(ruleData){
  2. var map = new java.utils.HashMap();
  3. map.put("payload":"hello js");
  4. return map;
  5. }));

groovy:

  1. handler.onMessage({ ruleData ->
  2. return [
  3. "messageType":"READ_PROPERTY_REPLY",
  4. "deviceId":ruleData.data.payload.deviceId,
  5. "messageId":ruleData.data.payload.messageId,
  6. "success":true,
  7. "properties":[name:"test"]
  8. ]
  9. });