# FastBee IoT平台 - 规则引擎原理与操作说明 ## 一、规则引擎概述 **规则引擎**是FastBee IoT平台的核心组件,用于处理设备数据、实现场景联动、数据转发等功能。它基于**LiteFlow**框架,支持Groovy脚本,通过EL表达式构建规则链,实现灵活的业务逻辑处理。 ### 核心特性 - **基于LiteFlow**: 轻量级规则引擎框架 - **Groovy脚本**: 支持动态脚本执行 - **EL表达式**: 使用表达式语言构建规则链 - **异步执行**: 非阻塞式规则执行 - **动态构建**: 运行时动态创建规则链和脚本节点 ## 二、规则引擎工作原理 ### 2.1 整体架构 ``` 设备上报数据 ↓ 数据处理器 (DataHandler) ↓ 规则引擎处理器 (RuleEngineHandler) ↓ 查询关联规则 (Script/Scene) ↓ 构建规则链 (LiteFlow) ↓ 执行规则脚本 (Groovy) ↓ 执行动作 (设备控制/告警/转发等) ``` ### 2.2 核心组件 #### 1. FlowLogExecutor(规则执行器) - **位置**: `fastbee-plugs/fastbee-ruleEngine/src/main/java/com/fastbee/ruleEngine/core/FlowLogExecutor.java` - **作用**: 封装LiteFlow执行器,提供日志记录功能 - **功能**: - 执行规则链 - 记录执行日志 - 处理执行结果 #### 2. SceneContext(场景上下文) - **位置**: `fastbee-iot-data/src/main/java/com/fastbee/iot/data/ruleEngine/SceneContext.java` - **作用**: 场景联动的执行上下文 - **包含数据**: - 设备编号 - 产品ID - 数据类型(属性/功能/事件) - 物模型数据列表 #### 3. MsgContext(消息上下文) - **位置**: `fastbee-plugs/fastbee-ruleEngine/src/main/java/com/fastbee/ruleEngine/context/MsgContext.java` - **作用**: 规则脚本的消息上下文 - **包含数据**: - 主题(topic) - 负载(payload) - 设备编号 - 产品ID - 协议编码 ### 2.3 规则链构建原理 #### EL表达式语法 规则引擎使用EL(Expression Language)表达式来构建规则链,支持以下语法: 1. **IF-THEN结构** ``` IF(条件, THEN(动作1, 动作2)) ``` 2. **逻辑运算符** - `AND(条件1, 条件2, ...)`: 所有条件都满足 - `OR(条件1, 条件2, ...)`: 任一条件满足 - `NOT(条件)`: 条件不满足 3. **执行模式** - `THEN(动作1, 动作2, ...)`: 串行执行(顺序执行) - `WHEN(动作1, 动作2, ...)`: 并行执行(同时执行) #### 规则链示例 **场景联动规则链**: ``` IF(AND(T1, T2, T3), THEN(A1, A2, A3)) ``` - `T1, T2, T3`: 触发器脚本(条件判断) - `A1, A2, A3`: 执行动作脚本(执行操作) **数据流规则链**: ``` THEN(script1, script2, httpBridge) ``` - `script1, script2`: 数据处理脚本 - `httpBridge`: HTTP桥接节点 ### 2.4 脚本类型 #### 1. 脚本用途(scriptPurpose) - `1`: 数据流 - 处理设备上报数据 - `2`: 触发器 - 条件判断脚本(返回boolean) - `3`: 执行动作 - 执行操作脚本 #### 2. 脚本类型(scriptType) - `script`: 普通脚本 - `boolean_script`: 条件脚本(返回boolean值) - `switch_script`: 选择脚本 - `for_script`: 循环脚本 #### 3. 脚本事件(scriptEvent) - `1`: 设备上报 - `2`: 平台下发 - `3`: 设备上线 - `4`: 设备离线 - `5`: HTTP桥接数据 - `6`: MQTT桥接数据 #### 4. 脚本动作(scriptAction) - `1`: 消息重发 - `2`: 消息通知 - `3`: HTTP推送 - `4`: MQTT桥接 - `5`: 数据库存储 ### 2.5 执行流程详解 #### 场景联动执行流程 ``` 1. 设备上报数据 ↓ 2. RuleEngineHandler.ruleMatch() 接收数据 ↓ 3. 查询设备关联的场景 sceneDeviceService.selectTriggerDeviceRelateScenes() ↓ 4. 遍历场景列表 ↓ 5. 创建SceneContext上下文 ↓ 6. 执行规则链 flowExecutor.execute2FutureWithRid(chainName, context) ↓ 7. LiteFlow解析EL表达式 例如: IF(AND(T1, T2), THEN(A1, A2)) ↓ 8. 执行触发器脚本(T1, T2) - 检查静默时间 - 匹配设备数据 - 判断条件是否满足 ↓ 9. 如果条件满足,执行动作脚本(A1, A2) - 设备控制 - 告警推送 - 场景恢复等 ``` #### 规则脚本执行流程 ``` 1. 设备上报数据 ↓ 2. RuleProcess.processRuleScript() 处理 ↓ 3. 查询匹配的规则脚本 selectExecRuleScriptList(scriptCondition) ↓ 4. 构建规则链 LiteFlowChainELBuilder.createChain() ↓ 5. 执行脚本 flowExecutor.execute2RespWithRid() ↓ 6. 执行脚本动作 - HTTP推送 - MQTT桥接 - 数据库存储等 ``` ## 三、规则引擎操作指南 ### 3.1 规则脚本管理 **功能位置**: 规则引擎 → 规则脚本 **路径**: `/iot/scene/script` **权限**: `iot:script:list` #### 创建规则脚本 1. **进入规则脚本页面** - 点击"新增"按钮 2. **配置脚本基本信息** - **脚本名称**: 脚本的显示名称 - **脚本标识**: 唯一标识(字母开头,可包含数字) - **执行顺序**: 值越大优先级越高 - **脚本事件**: 选择触发事件(设备上报/平台下发/设备上线/设备离线等) - **脚本动作**: 选择执行动作(消息重发/消息通知/HTTP推送/MQTT桥接/数据库存储) - **脚本状态**: 启用/禁用 3. **选择关联对象** - **产品**: 选择关联的产品(设备上报/平台下发时) - **桥接**: 选择HTTP/MQTT桥接(桥接数据时) 4. **编写脚本代码** - 使用Groovy语言编写 - 脚本中可以使用上下文变量 - 支持脚本验证 5. **脚本验证** - 点击"验证"按钮检查脚本语法 - 验证通过后才能保存 6. **保存脚本** - 点击"确定"保存脚本 - 系统会自动构建规则链 #### 脚本编写示例 **数据流脚本示例**: ```groovy // 获取消息上下文 def msgContext = _meta.getContextBean("com.fastbee.ruleEngine.context.MsgContext") // 获取设备编号 def serialNumber = msgContext.getSerialNumber() // 获取产品ID def productId = msgContext.getProductId() // 获取消息负载 def payload = msgContext.getPayload() // 处理数据逻辑 // ... // 设置处理后的数据 msgContext.setPayload(processedData) ``` **条件脚本示例**: ```groovy // 获取场景上下文 def sceneContext = _meta.getContextBean("com.fastbee.iot.data.ruleEngine.SceneContext") // 处理规则脚本 String json = "..."; // JSON格式的脚本模板 return sceneContext.process(json); ``` #### 查看脚本日志 1. 在脚本列表中点击"日志"按钮 2. 查看脚本执行日志 3. 日志包含: - 执行时间 - 上下文数据 - 执行步骤 - 错误信息 ### 3.2 场景联动中的规则引擎 场景联动会自动使用规则引擎,用户无需直接操作规则引擎,但需要了解其工作原理: #### 场景创建时的规则构建 1. **创建场景时** - 系统自动为每个触发器创建规则脚本(T开头) - 系统自动为每个执行动作创建规则脚本(A开头) - 自动生成EL表达式 2. **规则链构建** - 根据执行条件(或/且/非)构建IF表达式 - 根据执行方式(串行/并行)构建THEN/WHEN表达式 - 生成完整的规则链名称(chainName) 3. **动态加载** - 规则链和脚本节点动态构建到内存 - 无需重启服务即可生效 #### EL表达式生成规则 **执行条件为"且"(所有条件满足)**: ``` IF(AND(T1, T2, T3), THEN(A1, A2)) ``` **执行条件为"或"(任一条件满足)**: ``` IF(OR(T1, T2, T3), THEN(A1, A2)) ``` **执行条件为"非"(条件不满足)**: ``` IF(NOT(T1), THEN(A1, A2)) ``` **执行方式为并行**: ``` IF(AND(T1, T2), WHEN(A1, A2)) ``` ### 3.3 规则脚本使用场景 #### 场景1: 数据转发 **需求**: 将设备上报的数据转发到第三方系统 **操作步骤**: 1. 创建规则脚本 2. 脚本事件选择"设备上报" 3. 脚本动作选择"HTTP推送"或"MQTT桥接" 4. 编写脚本处理数据 5. 配置桥接信息 6. 保存并启用脚本 #### 场景2: 数据转换 **需求**: 转换设备数据格式 **操作步骤**: 1. 创建规则脚本 2. 脚本事件选择"设备上报" 3. 脚本动作选择"消息重发" 4. 编写脚本转换数据格式 5. 保存并启用脚本 #### 场景3: 数据存储 **需求**: 将设备数据存储到数据库 **操作步骤**: 1. 创建规则脚本 2. 脚本事件选择"设备上报" 3. 脚本动作选择"数据库存储" 4. 编写脚本处理数据 5. 保存并启用脚本 ## 四、规则引擎核心代码 ### 4.1 规则执行器 ```java // FlowLogExecutor.java @Component public class FlowLogExecutor { @Resource private FlowExecutor flowExecutor; // 执行规则链(带请求ID) public LiteflowResponse execute2FutureWithRid( String chainId, Object param, String requestId, Object... contextBeanArray ) { // 打印上下文 printContextBeanWithRid(requestId, contextBeanArray); // 执行规则链 Future future = flowExecutor.execute2FutureWithRid(chainId, param, requestId, contextBeanArray); LiteflowResponse response = future.get(); // 打印执行结果 printResponseWithRid(requestId, response); return response; } } ``` ### 4.2 规则链构建 ```java // SceneServiceImpl.java private void dynamicBuildRule(List