使用MASA全家桶从零开始搭建IoT平台(六)使用规则引擎实现告警通知
前言
数据的挑战:
物联网的发展带来了海量的数据。这些数据来源多样,格式不一,处理起来十分复杂。同时,物联网中的设备数量庞大,需要设备间进行高效的协同和管理,这也对数据处理提出了更高的要求。如何从这些复杂的数据中提取有价值的信息,成为了一个重要的问题。在传统的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