物联网平台组件2: 平台校验规则
加载不通的规则引擎配置文件,使用DynamicExpresso校验采集数据,得出是否告警
rules.json
{ "Rules": [ { "Description": "温度超过阈值警报", "Condition": "temperature > 30", "Action": "HT" }, { "Description": "湿度低于阈值警报", "Condition": "humidity < 20", "Action": "LH" }, { "Description": "温度和湿度都正常", "Condition": "temperature <= 30 AND humidity >= 20", "Action": "THN" } ] }
RuleMgr.cs
using DynamicExpresso; using System.Text.Json; namespace ConfigRules { // 用于存储来自 JSON 文件的规则 public class Rule { public string Description { get; set; } public string Condition { get; set; } public string Action { get; set; } } public class RuleSet { public List<Rule> Rules { get; set; } } public class RuleMgr { static List<Rule> rules; public static void LoadConfig(string filePath) { try { var jsonString = File.ReadAllText(filePath); var ruleSet = JsonSerializer.Deserialize<RuleSet>(jsonString); rules = ruleSet?.Rules ?? new List<Rule>(); } catch (Exception ex) { Console.WriteLine($"[Error] RuleMgr,LoadConfig,errmsg:{ex.Message}"); } } public static void CompileCondition(Dictionary<string, double> datas) { try { var lstParam = new List<Parameter>(); foreach (var data in datas) { lstParam.Add(new Parameter(data.Key, data.Value));// 将传感器数据填入表达式的参数 } // 评估规则 var interpreter = new Interpreter(); foreach (var rule in rules) { var condition = rule.Condition.Replace(" AND ", " && ").Replace(" OR ", " || "); bool result = (bool)interpreter.Eval(condition, lstParam.ToArray()); if (result) { Console.WriteLine(rule.Description); switch (rule.Action) { case "HT": break; case "LH": break; case "THN": break; } } } } catch (Exception ex) { Console.WriteLine($"[Error] RuleMgr,CompileCondition,errmsg:{ex.Message}"); } } } }
Program.cs
namespace ConfigRules { internal class Program { static void Main(string[] args) { // 模拟传感器数据 var sensorData = new Dictionary<string, double> { { "temperature", 50 }, { "humidity", 10 } }; // 读取 JSON 文件中的规则 RuleMgr.LoadConfig("rules.json"); RuleMgr.CompileCondition(sensorData); Console.ReadLine(); } } }