1. 概述
本文结合官方文档和v2.4.3版本源码总结了各规则引擎结点的功能。
官方文档的有些描述不太清楚,需要结合源码理清。
2. 核心概念
规则引擎是一个事件处理系统。
- 能对由设备和资产上传的消息进行 filter, enrich, transform 处理
- 并触发不同的动作,如 notification, 与外部系统交互等
2.1. Rule Engine Message 规则引擎消息
Rule Engine Message is a serializable, immutable data structure that represent various messages in the system. 例如:
- 上传数据、属性更新、设备调用服务端 RPC
- 实体生命周期事件: created, updated, deleted, assigned, unassigned, attributes updated;
- 设备状态事件: connected, disconnected, active, inactive, etc;
- 其它系统事件。
Rule Engine Message contains the following information:
- Message ID: time based, universally unique identifier;
- Originator of the message: Device, Asset or other Entity identifier;
- Message Type: “Post telemetry” or “Inactivity Event”, etc;
- Payload of the message: JSON body with actual message payload;
- Metadata: List of key-value pairs with additional data about the message.
消息中包含以下信息:
- Message ID: 基于时间的唯一 ID
- 消息来源者:设备、资产(Asset) 、其它实体的 ID
- 消息类型:
Post telemetry
,Inactivity Event
等 - 消息体 Payload: JSON body.
- Metadata: KV 键值对,消息的额外数据。
2.2. 预定义的消息类型
- POST_ATTRIBUTES_REQUEST: Post attributes, 设备请求上传属性值,metadata 数据有:
deviceName
,deviceType
, payload 例如{"currentState": "IDLE"}
。 - POST_TELEMETRY_REQUEST: Post telemetry, 设备请求上传遥测数据,metadata 数据有:
deviceName
,deviceType
,ts
(timestamp, 毫秒),payload 例如{"temperature": 22}
。 - TO_SERVER_RPC_REQUEST: RPC Request from Device, 设备(客户端)请求 RPC 调用,metadata 数据有:
deviceName
,deviceType
,requestId
(由客户端提供的 RPC 请求 ID),payload 例如{"method": "getTime", "params": {"param1":"val1"}}
。 - RPC_CALL_FROM_SERVER_TO_DEVICE: RPC Request to Device, 服务端请求 RPC 调用,metadata 数据有:
requestUUID
(服务端提供,用于区别应答),expirationTime
,oneway
(true 时无需应答,false 时需应用),payload 例如{"method": "getGpioStatus", "params": {"param1": "val1"}}
。 - ACTIVITY_EVENT: Activity Event, 设备切换为活跃状态,metadata 数据有
deviceName
,deviceType
。 - INACTIVITY_EVENT: Inactivity Event, 设备切换为非活跃状态。
- CONNECT_EVENT: Connect Event, 设备已连接。
- DISCONNECT_EVENT: Disconnect Event, 设备断开连接。
- ENTITY_CREATED: Entity Created, 新实体已创建事件,metadata 数据有
userName
(创建者名称),userId
(创建者ID), payload 包含实体信息,如{"id":{"entityType": "DEVICE", "id": "uuid"}, "createdTime": timestamp, ..., "name": "my-device", "type": "temp-sensor"}
. - ENTITY_UPDATED.
- ENTITY_DELETED.
- ENTITY_ASSIGNED, Entity Assigned, 现有实体分配给客户事件,metadata 数据有
userName
(操作者名称),userId
,assignedCustomerName
,assignedCustomerId
. - ENTITY_UNASSIGNED.
- ADDED_TO_ENTITY_GROUP.
- REMOVED_FROM_ENTITY_GROUP.
- ATTRIBUTES_UPDATED, Attributes Updated, 实体属性已更新事件,metadata 数据有
userName
(操作者名称),userId
,scope
(SERVER_SCOPE 或 SHARED_SCOPE),payload 为已更新的属性键值对,如{"softwareVersion": "1.2.3"}
. - ATTRIBUTES_DELETED.
- ALARM: Alarm Event, 当报警生成、更新、删除时产生该事件。
- REST_API_REQUEST: REST API Request to Rule Engine,当用户执行 REST API 调用时产生该事件。
2.3. 规则结点 Rule Node
规则结点一次处理一个传入消息,并生成一个或多个输出消息。能过滤、增强、变换传入消息,执行动作或与外部系统交互。
2.4. 规则结点关联 Rule Node Relation
规则结点可关联到其它规则结点。每种关联都有关联类似 (Relation Type), 即表示该关联的逻辑意思的名称。规则结点在生成输出消息时,通过指定关联类型将生成的消息路由到下一个结点。
规则结点关联类型(即名称)可为 Success
, Failure
, 也可为 True
, False
, Post Telemetry
, Attributes Updated
, Entity Created
等。
2.5. 规则链
规则结点其及关联的逻辑组合。
租户管理员可定义一个根规则链(Root Rule Chain,默认规则链) 和多个其它规则链。
根规则链处理所有的输入消息,并可将消息转发到其它规则链。消息可在规则链间进行转发。
2.6. 规则结点类型
- 过滤结点 Filter Nodes 用于消息过滤和路由
- 增强结点 Enrichment Nodes 用于更新消息的 metadata
- 变换结点 Transformation Nodes 用于变换消息中的信息项,如 Originator, Type, Payload, Metadata.
- 动作结点 Action Nodes 基于传入消息执行各种动作。
- 外部结点 External Nodes 用于和外部系统交互。
3. 体系结构
based on actor model and message queue:
4. 结点类型
4.1 Filter Node 过滤型结点
4.1.1. Check Relation Filter Node
消息发起者与当前结点中指定的实体关联性对比,比如结点中指定 Direction: From, Type: Asset, Asset: Field C, Relation type: Contains,
则当消息发起者是包含在 Field C 内的实体时,消息从 True
路流出,否则从 False
路流出。
4.1.2. Check Existence Fields Node
检测消息中的 data 和 metadata 中是否有相关字段。
4.1.3. Message Type Filter Node
检测消息类型。
4.1.4. Message Type Switch Node
根据消息类型路由到指定路径,未指定类型路径的消息路由到 Other 路径。
4.1.5. Originator Type Filter Node
检测输入消息中消息发起者的实体类型值,如果类型在结点中指定的类型中,则消息从 True
路流出,否则从 False
路流出。
4.1.6. Originator Type Switch Node
根据消息发起者的实体类型路由到指定路径。
4.1.7. Script Filter Node
结点中定义一个 bool 值 javascript 函数来过滤输入消息,函数有三个参数:
- msg
- metaData
- msgType
例如:
function Filter(msg, metadata, msgType) {
if(msgType === 'POST_TELEMETRY_REQUEST') {
if(metadata.deviceType === 'vehicle') {
return msg.humidity > 50;
} else</