工业级运维app手机api
沈斌
2017-11-07 f0aa3d758d72891edb08f8e3ac14ffcd95fbb30c
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
278
279
280
281
282
283
284
285
286
287
288
289
package com.moral.monitor.listener;
 
import com.moral.monitor.dao.TaskDao;
import com.moral.monitor.entity.*;
import com.moral.monitor.listener.message.Tomq;
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 Listener implements MessageListener {
 
    @Resource
    RabbitTemplate rabbitTemplate;
 
    @Resource
    TaskDao taskDao;
 
    private Logger logger = LoggerFactory.getLogger(Listener.class);
 
    public void onMessage(Message message) {
 
        logger.warn("正在运行的线程名称=" + Thread.currentThread().getName());
 
        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 win = receiveMsgMap.remove("win");
        removeNotNumber(receiveMsgMap);
        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;
        }else {
            removeNotBind(receiveMsgMap,exsensorMap,bindsensor);
        }
 
        //为绑定传感器产生历史和即时数据
        List<State> states = taskDao.findstateBymac(mac);
        updateOrinsertstate(receiveMsgMap, mac, exsensorMap);
        if (states.size()==0){
            insertTohistory(receiveMsgMap, mac, exsensorMap);
        } else {
            insertTohistoryDistinct(receiveMsgMap,mac,exsensorMap,states);
        }
 
        //查找临界值表
        List<Critical> criticals = taskDao.findcritical();
        LinkedHashMap<String, Critical> sensor_criticals = new LinkedHashMap<String, Critical>();
        for (Critical c:criticals){
            String sensor = c.getSensor();
            sensor_criticals.put(sensor,c);
        }
 
        //查找此设备已绑定的传感器,超标判断
        //维护设备报警级别
        List<Integer> level = new ArrayList<Integer>();
        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);
            double value =Double.parseDouble(mac_value);
            //取出此传感器的 临界值对象
            Critical critical = sensor_criticals.get(sensor);
 
            int sensor_level = 0;
            if (value >= critical.getFirst()) {
                level.add(1);
                sensor_level =1;
            } else if (value >= critical.getSecond()) {
                level.add(2);
                sensor_level = 2;
            } else if (value >= critical.getThird()) {
                level.add(3);
                sensor_level = 3;
            }
 
            if(sensor_level!=0){
                String alarmMsg = "{\"mac\":\"" + mac + "\",\"" +mac_key + "\":" + value + ",\"level\":" + sensor_level + "}";
                Tomq tomq = new Tomq(rabbitTemplate, alarmMsg);
                tomq.run();
            }
 
        }
 
        //更新设备状态
        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) {
        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);
                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 insertTohistoryDistinct(Map<String, String> receiveMsgMap, String mac, Map<String, String> exsensorMap,List<State> states){
        LinkedHashMap<String, Double> state_kv = new LinkedHashMap<String, Double>();
        for(State s:states){
            state_kv.put(s.getMac_key(),s.getMac_value());
        }
        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();
            double value =Double.parseDouble(mac_value);
            String  sensor = exsensorMap.get(mac_key);
            Double statevalue = state_kv.get(mac_key);
                if(value!=statevalue){
                    taskDao.insertTohistory(mac, sensor, mac_key,mac_value);
                }
        }
 
 
    }
 
 
 
    private void insertTohistory(Map<String, String> receiveMsgMap, String mac, Map<String, String> exsensorMap) {
        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);
            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);//value没用到
            }
        }
        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  void removeNotBind(Map<String, String> receiveMsgMap,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 sensor = exsensorMap.get(mac_key);
            if(!bindsensor.containsKey(sensor)){
                iterator.remove();
            }
        }
    }
 
 
      private  void removeNotNumber(Map<String, String> receiveMsgMap){
          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_value = next.getValue();
              boolean str2Num = isStr2Num(mac_value);
              if (!str2Num) {
                  iterator.remove();
              }
          }
      }
 
 
    private boolean  isStr2Num(String str) {
        try {
            Double.parseDouble(str);
            return true;
        } catch (NumberFormatException e) {
            return false;
        }
    }
 
 
    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;
    }
 
}