当前位置: 首页 > article >正文

物联网平台组件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();
        }
    }
}


http://www.kler.cn/news/283685.html

相关文章:

  • 如何构建社区康养养老系统:Java SpringBoot与Vue实战养老管理系统
  • uniapp的锁屏上文字的显示与隐藏
  • ES6中新增的Set方法详解
  • 小资人群“轻社交”需求与创新营销模式——以“2+1 链动模式小程序、AI 智能名片、S2B2C 商城系统”为例
  • 代码随想录Day 28|题目:122.买卖股票的最佳时机Ⅱ、55.跳跃游戏、45.跳跃游戏Ⅱ、1005.K次取反后最大化的数组和
  • 防抖函数 debounce debouncePromise
  • 获得两类相关点之间的线性关系
  • 简易STL实现 | List的实现
  • 【leetcode刷题记录】二叉树遍历
  • 易查分如何查询图片?
  • 梧桐数据库(WuTongDB):什么是“顺序扫描”
  • 1.3金融术语的宝典
  • PHP房产管理多终端系统灵活应对各种管理需求系统小程序源码
  • 16.神经网络 - 卷积层
  • Python-MNE-源空间和正模型07:修复BEM和头表面
  • Linux 7 静默安装oracle 19c 单机
  • 深度学习常见面试题(2024.8.30笔记)
  • 如何在知行之桥上通过业务单号查找原始报文?
  • 英文论文格式编辑(二)
  • redis list 单推送消息,批量消费消息,springboot实现
  • Nginx配置实例-负载均衡
  • 密码学(二)---DES、SM、RSA
  • c++中的匿名对象及内存管理及模版初阶
  • 【系统架构师软考】计算机网络知识(四)
  • 在类Unix操作系统(如Linux)上运行Windows应用程序方法小记
  • flutter和原生Android以及IOS开发相比有什么优缺点?
  • Gradio学习——图像流输出
  • ShenNiusModularity项目源码学习(3:用户登录)
  • MFC工控项目实例之七点击下拉菜单弹出对话框
  • Python使用总结之Flask-SocketIO介绍