使用MASA全家桶从零开始搭建IoT平台(六)使用规则引擎实现告警通知

发布时间 2023-07-13 09:21:01作者: MASA技术团队


前言

数据的挑战:
物联网的发展带来了海量的数据。这些数据来源多样,格式不一,处理起来十分复杂。同时,物联网中的设备数量庞大,需要设备间进行高效的协同和管理,这也对数据处理提出了更高的要求。如何从这些复杂的数据中提取有价值的信息,成为了一个重要的问题。在传统的IoT平台中,规则引擎通常是通过编程方式进行配置和管理的,需要专业的开发人员参与。然而,这种方式存在一些挑战和限制。
首先,编写和维护规则的过程相对复杂,需要深入了解编程语言和IoT平台的技术细节。这使得规则的创建和修改过程变得耗时且容易出错。
其次,对于非技术专业人员来说,参与规则编写和管理可能存在一定的门槛,限制了规则引擎的使用范围。
因此,引入可视化规则引擎成为解决这些问题的关键。它通过图形化界面和直观的操作方式,使非技术人员也能够轻松创建、管理和修改规则。它将规则的定义和配置过程可视化,使得规则引擎的使用变得更加灵活、高效且易于理解。通过可视化规则引擎,用户可以直接在界面上定义规则的条件和动作,而无需编写复杂的代码。这样一来,IoT平台的开发和维护变得更加简化和普及化。

方案

市面上的规则引擎比较多,我们这里选择了node-RED进行演示。

实施流程

安装Node-RED

我们这里使用最简单的docker安装

https://nodered.org/docs/getting-started/local#installing-with-docker

docker run -it -p 1880:1880 --name mynodered nodered/node-red

我们打开 http://127.0.0.1:1880/ 就能看到界面了。
左边有很多可用的节点

配置一个告警处理流程

我的这里以配置一个告警的流程作为演示
我们的思路是这样的,当接收到来自Hub的设备消息之后,我们将消息通过http发送到规则引擎,然后规则引擎判断是否触发告警,如果触发,就让规则引擎通过http,调用我们的告警接口进行通知。
1、我们拖入一个http in节点,名称设置为"接收hub消息",URL设置为"/api/msg-data",请求方式"POST",这样在我们收到hub的消息之后可以通过"http://127.0.0.1:1880/api/msg-data"这个api接口向Node-RED发送消息数据。

2、我们拖入一个http response,名称改为"回复hub消息",状态码为200,并将接收hub消息节点与该节点连接,表示我们收到来自应用的post请求之后回复一个200的状态码。

3、我们拖入一个function节点,名称为"PM2.5告警判断",函数中添加如下代码。并将该接收hub消息的输出与该节点输入连接

if (msg.payload.Pm_25>80){
    msg.payload.IsAlarm = true;
    msg.payload.AlarmMsg = "PM2.5超过80";
}
return msg;

这里判断设备的Pm_25属性值是否超过80,如果超过就设置IsAlarm 为True,并设置一个告警消息。然后将msg继续输出。

4、我们拖入一个switch组件,名称改为"判断是否有异常信息",属性设置为msg.payload.IsAlarm,并添加判断条件为为真,并将"PM2.5告警判断"节点输出与该节点输入连接,该节点用以判断上一个节点输出的信息中IsAlarm是否为True。

5、我们继续拖入一个http request节点,名称为"告警通知",请求方式"POST",URL:"http://192.120.5.204:5000/api/Alarm/TestAlarm",我们继续连接该节点的输入与"判断是否有异常信息"的输出。
这里的URL为我们的模拟告警通知接口,这里仅作为演示,实际的场景中需要对接MASA的Alert和MC系统,进行告警分级和通知。

6、我们分别拖入4个debug组件,连接除回复Hub消息之外的其他节点的输出,并分别命名,输出设置为"msg.payload",目标勾选"调试窗口",并点开最右侧的调试按钮打开调试窗口。这样我们就可以debug整个流程,观察各个节点的输出了。

7、完成之后我们点击右上角的部署,当前流程即可生效。

编写代码

我们新建一个RulesEngineGateWay用以向规则引擎提交数据。

    public class RulesEngineGateWay : IRulesEngineGateWay
    {
        private readonly AppSettings _appSettings;
        public RulesEngineGateWay(IOptions<AppSettings> settings)
        {
            _appSettings = settings.Value;
        }

        public async Task<bool> SendDataAsync(PubSubOptions pubSubOptions)
        {
            var url = $"{_appSettings.nodeREDSetting.Url}/api/msg-data";
            var response = await url.WithHeader("Content-Type", "application/json; charset=utf-8").PostStringAsync(pubSubOptions.Msg);
            if (response.StatusCode is (int)HttpStatusCode.OK)
            {
                return true;
            }
            else
            {
                throw new UserFriendlyException(await response.GetStringAsync());
            }
        }
    }

我们再新建一个AlarmController用以模拟告警通知的接口(仅作为演示,后期会对接MASA Alert和MC)

    [Route("api/[controller]/[Action]")]
    [ApiController]
    public class AlarmController : ControllerBase
    {
        [HttpPost]

        public string TestAlarm(DeviceAlarmRequest request)
        {
            Console.WriteLine($"DeviceName:{request.DeviceName},AlarmMsg:{request.AlarmMsg}");
            return "告警通知成功";
        }
    }

我们修改一下之前直接写入数据库的DeviceMessageAsync方法,将hub传递过来的数据发送到规则引擎。

        [Topic("pubsub", "DeviceMessage")]
        [HttpPost("DeviceMessage")]
        public async Task DeviceMessageAsync([FromBody] PubSubOptions pubSubOptions)
        {
            await _rulesEngineGateWay.SendDataAsync(pubSubOptions);
        }

测试

我们使用MQTTX上报一条PM2.5为100,可以触发告警的数据

{
  "DeviceName":"284202304230001",
  "Pm_25":100,
  "Temperature":25,
  "Humidity":50
}

我们可以在控制台看到告警打印的日志,如果日志不正确,可以通过debug检查各个节点的输出。

总结

可视化规则引擎在IoT中的引入具有重要的必要性和作用。它提供了一种简化和普及规则管理的方式,使非技术人员也能够参与其中。通过可视化规则引擎,IoT系统可以实现实时决策、自动化操作、灵活性、可扩展性和复杂事件处理。这将加速IoT技术的推广和应用,并为各行各业带来更多的智能化解决方案。我们这里仅作最简单的演示,具体的使用场景会更复杂,Node-RED还支持很多node扩展,例如可以读取redis,写入数据库等,还可以自己开发自定义的node。
完整代码在这里:https://github.com/sunday866/MASA.IoT-Training-Demos