|
@@ -0,0 +1,128 @@
|
|
|
+AalrmModule
|
|
|
+
|
|
|
+# 简介
|
|
|
+AalrmModule 是一个报警模块,可以通过扫描数据库中的数据,根据设置的规则进行故障报警的独立程序
|
|
|
+
|
|
|
+# 安装启动
|
|
|
+前置条件:需要mysql数据库,linux c环境(centos等)
|
|
|
+1.拷贝本项目到服务器,在AlarmModule目录下执行
|
|
|
+```
|
|
|
+make
|
|
|
+```
|
|
|
+2.启动服务
|
|
|
+```
|
|
|
+cd bin
|
|
|
+make reboot
|
|
|
+```
|
|
|
+3.停止服务
|
|
|
+```
|
|
|
+cd bin
|
|
|
+make stop
|
|
|
+```
|
|
|
+4.查看日志
|
|
|
+```
|
|
|
+tail -f -n 1000 /tmp/log/xinyun_mqtt_alarm.svr.log
|
|
|
+```
|
|
|
+
|
|
|
+# 分析
|
|
|
+ 考虑到物联网项目中,设备数量和节点数量的不断增多,
|
|
|
+
|
|
|
+ 使用之前扫描数据库历史表和逐条解析接收报文方式,会导致性能问题和其他误报警等问题,
|
|
|
+
|
|
|
+ 因此采用此方式定时扫描数据库status表,根据设定的阈值规则进行告警判断。
|
|
|
+
|
|
|
+### 项目启动了2个线程
|
|
|
+
|
|
|
+ int CoreAlarmGateway() //扫描网关设备数据
|
|
|
+
|
|
|
+ int CoreAlarmNode() //扫描节点设备数据
|
|
|
+
|
|
|
+### 不管是网关还是节点处理的报警逻辑是一样的,报警的类型分以下2大类
|
|
|
+
|
|
|
+ 1.继电器数据判断(错误码中包括了设备上传的各种报警)
|
|
|
+ ```
|
|
|
+ //继电器状态:
|
|
|
+ #define SW_ON 0 //0x0000:继电器合闸
|
|
|
+ #define SW_MANUAL_CONTROL 32 //0x0020:继电器远程拉闸
|
|
|
+ #define SW_TIMER_CONTROL 16 //0x0010: 继电器自动时间段拉闸
|
|
|
+ #define SW_TEMPERATURE_HUMIDITY_ALARM 513 //0x0201:继电器温湿度报警拉闸 需报警
|
|
|
+ #define SW_FIRE_ALARM 514 //0x0202:继电器烟感报警拉闸 需报警
|
|
|
+ #define SW_TILT_ALARM 515 //0x0203:继电器倾斜报警拉闸 需报警
|
|
|
+ #define SW_LOCK_ALARM 516 //0x0204:继电器锁具报警拉闸 需报警
|
|
|
+ #define SW_LINE_TEMPERATURE_ALARM 517 //0x0205:继电器线温报警拉闸 需报警
|
|
|
+ #define SW_OVERVOLTAGE 1 //0x0001:过压拉闸 需报警
|
|
|
+ #define SW_UNDERVOLTAGE 2 //0x0002:欠压拉闸 需报警
|
|
|
+ #define SW_OVERLOAD_ALARM 4 //0x0004: 过载拉闸 需报警
|
|
|
+ #define SW_ELECTRIC_EXCESS 8 //0x0008:用电超额拉闸
|
|
|
+ #define SW_OVER_SWITCH_OUT_COUNT 64 //0x0040:超自动合闸次数
|
|
|
+ #define SW_FAST_CURRENT 128 //0x0080:快速电流拉闸
|
|
|
+ ```
|
|
|
+ 这部分数据通过RelayAlarm函数处理
|
|
|
+
|
|
|
+ 2.结合时间段,拉合闸状态、电流阈值的告警
|
|
|
+ + 自动模式合闸时间段继电器拉闸 告警
|
|
|
+ + 自动模式拉闸时间继电器合闸 告警
|
|
|
+ + 继电器拉闸状态有电流 告警
|
|
|
+ + 继电器合闸状态无电流 告警
|
|
|
+ + 继电器合闸状态电流偏离正常阈值 告警(需事先采集正常电流最大最小值)
|
|
|
+
|
|
|
+### 报警其他情况排除
|
|
|
+ 1. 告警dev_fault表计数字段fault_count=3 连续报警3次才会真正报警
|
|
|
+ 2. dev_status表中新增alarm_enable=0 不报警
|
|
|
+ 3. 设备在拉合闸相关指令下发的2分钟内,则不进行报警判断
|
|
|
+ 4. 设备在拉合闸时间点的4个时间点附近2分钟内,则不进行报警判断
|
|
|
+ 5. 判断过的数据不进行重复读取判断 通过dev_status表标记位electric_update_flag=2
|
|
|
+
|
|
|
+### 数据库sql
|
|
|
+```
|
|
|
+-- 报警清理
|
|
|
+UPDATE dev_fault SET fault_state=3
|
|
|
+
|
|
|
+-- 设置设备能报警 SELECT * FROM dev_status WHERE alarm_enable=1
|
|
|
+UPDATE dev_status SET alarm_enable=1 where gateway_mac='39FFD7054658383726860743'
|
|
|
+
|
|
|
+----------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
+-- 网关报警数据查询
|
|
|
+SELECT t1.device_mac,t1.gateway_mac,t2.device_name,t2.control_mode,t1.update_time,
|
|
|
+ t1.current_on_off,t1.current_electric,t1.original_relay,t2.swith_time1,t2.swith_time2,t2.swith_time3,t2.swith_time4,
|
|
|
+ t2.electric_wave_set,t2.electric_wave_min,t2.electric_wave_max,t1.command_update_time
|
|
|
+FROM dev_status AS t1
|
|
|
+INNER JOIN dev_info_gateway AS t2
|
|
|
+ON t1.device_mac = t2.device_mac
|
|
|
+WHERE TIMESTAMPDIFF(MINUTE, t1.update_time, NOW()) < 10
|
|
|
+AND t1.current_online=1
|
|
|
+AND t1.original_relay IS NOT NULL
|
|
|
+AND t1.current_electric IS NOT NULL
|
|
|
+AND t1.electric_update_flag=1
|
|
|
+AND t1.alarm_enable=1
|
|
|
+
|
|
|
+-- 故障表查询
|
|
|
+select device_mac,device_mac_node,fault_state,fault_count,fault_time,relay_code from dev_fault
|
|
|
+where device_mac = '39FFD7054658383726860743'
|
|
|
+and device_mac_node = '0F0000000001'
|
|
|
+and relay_code = 1105
|
|
|
+
|
|
|
+
|
|
|
+-----------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
+-- 节点报警数据查询
|
|
|
+SELECT t1.device_mac,t1.gateway_mac,t3.device_name,t2.device_name,t2.control_mode,t1.update_time,t1.current_on_off,t1.current_electric,
|
|
|
+ t1.original_relay,t2.swith_time1,t2.swith_time2,t2.swith_time3,t2.swith_time4,t2.electric_wave_set,t2.electric_wave_min,t2.electric_wave_max,t1.command_update_time
|
|
|
+FROM dev_status AS t1
|
|
|
+INNER JOIN dev_info_node AS t2
|
|
|
+ON t1.device_mac = t2.device_mac
|
|
|
+AND t1.gateway_mac=t2.gateway_mac
|
|
|
+INNER JOIN dev_info_gateway AS t3
|
|
|
+ON t2.gateway_mac = t3.device_mac
|
|
|
+WHERE TIMESTAMPDIFF(MINUTE, t1.update_time, NOW()) < 10
|
|
|
+AND t1.current_online=1
|
|
|
+AND t1.original_relay IS NOT NULL
|
|
|
+AND t1.current_electric IS NOT NULL
|
|
|
+AND t1.electric_update_flag=1
|
|
|
+AND t1.alarm_enable=1
|
|
|
+
|
|
|
+-- 故障表查询
|
|
|
+select device_mac,device_mac_node,fault_state,fault_count,fault_time,relay_code from dev_fault
|
|
|
+where device_mac = '39FFD7054658383726860743'
|
|
|
+and device_mac_node = '202105070106'
|
|
|
+and relay_code = 1105
|
|
|
+```
|