工业级运维app手机api
沈斌
2017-11-28 6cce9ad4c95a9cf7c1afc066fe71d8eac482f76f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
package com.moral.monitor.listener;
 
import com.moral.monitor.dao.TaskDao;
import com.moral.monitor.entity.*;
import com.moral.monitor.listener.message.*;
import net.sf.json.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import javax.annotation.Resource;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;
 
public class MonitorListener implements MessageListener {
    @Resource
    RabbitTemplate rabbitTemplate;
    @Resource
    TaskDao taskDao;
    private Logger logger = LoggerFactory.getLogger(MonitorListener.class);
    public void onMessage(Message message) {
        String receiveMsg = null;
        try {
            receiveMsg = new String(message.getBody(), "utf-8");
        } catch (UnsupportedEncodingException e) {
            logger.warn(e.getMessage());
        }
        logger.warn(receiveMsg);
        Map<String, String> receiveMsgMap = toMap(receiveMsg);
        String mac = receiveMsgMap.remove("mac");
        String ver = receiveMsgMap.remove("ver");
        String rtime = receiveMsgMap.remove("time");
        String date = getDate();//logger,noticelog使用
        Equipment equipment = taskDao.selectFromequipment(mac);
        if (equipment==null) {
            logger.warn("设备" + mac + "不在设备表中");
            return;
        }
        //设置设备在线状态4
        if (equipment.getState()==0) {
            taskDao.updateequipmentstate(4, mac);
        }
        //eX和传感器的映射关系,根据设备版本号动态产生
        Map<String, String> exsensorMap = exSensortoMap(ver);
        taskDao.insertTologger(mac, receiveMsg, date);
        //获取设备已绑定的传感器
        Map<String, String> bindsensor = macBindSensor(mac);
        if (bindsensor.size()<=0) {
            logger.warn("设备" + mac + "没有绑定任何传感器");
            return;
        }
        //根据绑定传感器产生历史和即时数据
        insertTohistory(receiveMsgMap, mac, exsensorMap, bindsensor);
        updateOrinsertstate(receiveMsgMap, mac, exsensorMap, bindsensor);
        //已绑定传感器且与报警组关联才会返回一个AlarmSensor
        List<AlarmSensor> sensors = taskDao.findAllsensorBymac(mac, ver);
        if (!(sensors.size() > 0)) {
            logger.warn("设备" + mac + "传感器与报警组没有关联");
            return;
        }
        //维护设备报警级别
        List<Integer> level = new ArrayList<Integer>();
        for (AlarmSensor sensor : sensors) {
            if (!(receiveMsgMap.containsKey(sensor.getMac_key()))) {
                logger.warn("设备绑定的传感器" + sensor.getSensor() + "没有接收到对应的数据");
                continue;
            }
            int alarm_type = 0;
            //微信推送用
            int sensor_level = 0;
            String alarm_desc = null;
            double value = Double.parseDouble(receiveMsgMap.get(sensor.getMac_key()));
            String displayvalue = digit(value, sensor.getDigit());
            if (value >= sensor.getFirst()) {
                alarm_type = sensor.getFirst_notice();
                level.add(1);
                alarm_desc = "一级";
                sensor_level =1;
            } else if (value >= sensor.getSecond()) {
                alarm_type = sensor.getSecond_notice();
                level.add(2);
                alarm_desc = "二级";
                sensor_level = 2;
            } else if (value >= sensor.getThird()) {
                alarm_type = sensor.getThird_notice();
                level.add(3);
                alarm_desc = "三级";
                sensor_level = 3;
            }
            if (alarm_desc == null) {
                String sensorname = sensor.getSensor();
                if (sensorname.equals("湿度") || sensorname.equals("温度")) {
                    Double inverse_first = sensor.getInverse_first();
                    Double inverse_second = sensor.getInverse_second();
                    Double inverse_third = sensor.getInverse_third();
                    if (value <= (inverse_first == null?Integer.MIN_VALUE:inverse_first)) {
                        alarm_type = sensor.getFirst_notice();
                        level.add(1);
                        alarm_desc = "一级";
                        sensor_level = 1;
                    } else if (value <= (inverse_second==null?Integer.MIN_VALUE:inverse_second)){
                        alarm_type = sensor.getSecond_notice();
                        level.add(2);
                        alarm_desc = "二级";
                        sensor_level = 2;
                    } else if (value <= (inverse_third==null?Integer.MIN_VALUE:inverse_third)) {
                        alarm_type = sensor.getThird_notice();
                        level.add(3);
                        alarm_desc= "三级";
                        sensor_level=3;
                    }
                }
            }
 
            Alarmlog alarmlog = taskDao.selectFromalarmlogBysensor(mac, sensor.getSensor());
            //根据alarm_desc判断是否有超标,并更改传感器报警记录表中最近一条的状态
            if (alarm_desc == null) {
                if (alarmlog!=null&&alarmlog.getAlarmstate()!=0) {
                    int id = alarmlog.getId();
                    taskDao.updatealarmlogstate(id);
                }
                logger.warn("设备" + mac + "的" + sensor.getSensor() + "传感器没有超标");
                continue;
            }
 
            HashMap<String, Integer> alarmstate = new HashMap<String, Integer>();
            alarmstate.put("三级", 3);
            alarmstate.put("二级", 2);
            alarmstate.put("一级", 1);
            //至此传感器超标。但是否要存入传感器此次的报警数据和是否报警看最近一条报警记录的状态字段,且要成功报警要先有报方式和报警用户
            if (alarmlog == null || alarmlog.getAlarmstate() == 0){
                taskDao.insertToalarmlog(mac, sensor.getSensor(), value, alarm_desc, equipment.getAddress(), alarmstate.get(alarm_desc),equipment.getName(),sensor.getUnits());
                String alarmMsg = "{\"mac\":\"" + mac + "\",\"" + sensor.getMac_key() + "\":" + value + ",\"level\":" + sensor_level + "}";
                Tomq tomq = new Tomq(rabbitTemplate, alarmMsg);
                tomq.run();
                //是否有报警方式
                if (alarm_type == 0) {
                    logger.warn("设备" + mac + "的" + sensor.getSensor() + "传感器没有设置报警方式");
                    continue;
                }
                //最终有无关联到用户
                String alarm = sensor.getAlarm();
                //一个报警组对应一个用户组,不需要循环
                List<User> users = taskDao.findAlluserBysensor(alarm);
                if (!(users.size() > 0)) {
                    logger.warn("报警组没有关联接收报警的用户");
                    continue;
                }
                for (User u : users){
                    //保存报警通知和邮件通知使用
                    String alarm_content = equipment.getAddress() + ":" + sensor.getSensor() + "超标!" + alarm_desc + ":" + displayvalue + "" + sensor.getUnits() + "!";
                    if ((alarm_type & 1) > 0){
                        String noticetype = "邮件通知";
                        saveNotice(equipment, u, sensor, alarm_content, noticetype, sensor_level, date);
                        logger.warn("发送邮件报警给" + u.getName() + "用户");
                    }
                    if ((alarm_type & 2) > 0){
                        String noticetype = "微信通知";
                        saveNotice(equipment, u, sensor, alarm_content, noticetype, sensor_level, date);
                        logger.warn("发送微信报警给" + u.getName() + "用户");
                    }
                    if ((alarm_type & 4) > 0){
                        String noticetype = "短信通知";
                        saveNotice(equipment, u, sensor, alarm_content, noticetype, sensor_level, date);
                        logger.warn("发送短信报警给" + u.getName() + "用户");
                    }
                    if ((alarm_type & 8) > 0){
                        String noticetype = "电话通知";
                        saveNotice(equipment, u, sensor, alarm_content, noticetype, sensor_level, date);
                        logger.warn("发送电话报警给" + u.getName() + "用户");
                    }
                }
            }
        }
        //更新设备状态
        if (!(level.size() > 0)) {
            taskDao.updateequipmentstate(4, mac);//用户角度没有报警就是正常
            return;
        }
        Integer maxlevel = Collections.max(level);
        taskDao.updateequipmentstate(maxlevel, mac);
    }
 
    private String getDate() {
        Date d = new Date();
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return formatter.format(d);
    }
 
    private void saveNotice(Equipment equipment, User u, AlarmSensor sensor, String alarm_content, String noticetype, int sensor_level, String date) {
        taskDao.insertTonoticelog(u.getId(), u.getName(), noticetype, equipment.getMac(), equipment.getName(), alarm_content, sensor.getSensor(), equipment.getAddress(), sensor_level, date);
    }
 
    public String digit(double num, int digit) {
        BigDecimal y = new BigDecimal(num);
        double b = y.setScale(digit, BigDecimal.ROUND_HALF_UP).doubleValue();
        double c = b - (int) b;
        if (c == 0) {
            return String.valueOf((int) b);
        } else {
            return String.valueOf(b);
        }
    }
 
    private void updateOrinsertstate(Map<String, String> receiveMsgMap, String mac, Map<String, String> exsensorMap, Map<String, String> bindsensor) {
        Set<Map.Entry<String, String>> entries = receiveMsgMap.entrySet();
        Iterator<Map.Entry<String, String>> iterator = entries.iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, String> next = iterator.next();
            String mac_key = next.getKey();
            String mac_value = next.getValue();
            String sensor = exsensorMap.get(mac_key);
            if (bindsensor.containsKey(sensor)) {
                List<State> states = taskDao.selectFromstate(mac, mac_key);//防止并发时会有多条
                if (states.size() == 0) {
                    taskDao.insertTostate(mac, sensor, mac_key, mac_value);
                } else if (states.size() == 1) {
                    taskDao.updatestate(mac_value, mac, mac_key);
                } else if (states.size() >= 2) {
                    taskDao.deleteFromstateBymacandmackey(mac, mac_key);
                    taskDao.insertTostate(mac, sensor, mac_key, mac_value);
                }
            }
        }
    }
 
    private void insertTohistory(Map<String, String> receiveMsgMap, String mac, Map<String, String> exsensorMap, Map<String, String> bindsensor) {
        Set<Map.Entry<String, String>> entries = receiveMsgMap.entrySet();
        Iterator<Map.Entry<String, String>> iterator = entries.iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, String> next = iterator.next();
            String mac_key = next.getKey();
            String mac_value = next.getValue();
            String sensor = exsensorMap.get(mac_key);
            if (bindsensor.containsKey(sensor)) {
                taskDao.insertTohistory(mac, sensor, mac_key, mac_value);
            }
        }
    }
 
    private Map<String, String> macBindSensor(String mac) {
        Map<String, String> bindsensor = new LinkedHashMap<String, String>();
        List<AlarmSensor> alarmSensors = taskDao.selectFrommacBymac(mac);
        for (AlarmSensor sensor : alarmSensors) {
            String sensorname = sensor.getSensor();
            if (StringUtils.isNotBlank(sensorname)) {
                bindsensor.put(sensorname, sensorname);
            }
        }
        return bindsensor;
    }
 
    private Map<String, String> exSensortoMap(String ver) {
        List<Sensor> sensors = taskDao.selectFromsensorByver(ver);
        Map<String, String> ex_sensorMap = new LinkedHashMap<String, String>();
        for (Sensor sensor : sensors) {
            ex_sensorMap.put(sensor.getMac_key(), sensor.getSensor());
        }
        return ex_sensorMap;
    }
 
    private Map<String, String> toMap(String receiveMsg) {
        Map<String, String> receiveMsgMap = new LinkedHashMap<String, String>();
        JSONObject jsonObject = JSONObject.fromObject(receiveMsg);
        Iterator it = jsonObject.keys();
        while (it.hasNext()) {
            String key = it.next().toString();
            String value = jsonObject.get(key).toString();
            receiveMsgMap.put(key, value);
        }
        return receiveMsgMap;
    }
}