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 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 exsensorMap = exSensortoMap(ver); taskDao.insertTologger(mac, receiveMsg, date); //获取设备已绑定的传感器 Map bindsensor = macBindSensor(mac); if (bindsensor.size()<=0) { logger.warn("设备" + mac + "没有绑定任何传感器"); return; }else { removeNotBind(receiveMsgMap,exsensorMap,bindsensor); } //为绑定传感器产生历史和即时数据 List states = taskDao.findstateBymac(mac); updateOrinsertstate(receiveMsgMap, mac, exsensorMap); if (states.size()==0){ insertTohistory(receiveMsgMap, mac, exsensorMap); } else { insertTohistoryDistinct(receiveMsgMap,mac,exsensorMap,states); } //查找临界值表 List criticals = taskDao.findcritical(); LinkedHashMap sensor_criticals = new LinkedHashMap(); for (Critical c:criticals){ String sensor = c.getSensor(); sensor_criticals.put(sensor,c); } //查找此设备已绑定的传感器,超标判断 //维护设备报警级别 List level = new ArrayList(); Set> entries = receiveMsgMap.entrySet(); Iterator> iterator = entries.iterator(); while (iterator.hasNext()){ Map.Entry 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 receiveMsgMap, String mac, Map exsensorMap) { Set> entries = receiveMsgMap.entrySet(); Iterator> iterator = entries.iterator(); while (iterator.hasNext()) { Map.Entry next = iterator.next(); String mac_key = next.getKey(); String mac_value = next.getValue(); String sensor = exsensorMap.get(mac_key); List 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 receiveMsgMap, String mac, Map exsensorMap,List states){ LinkedHashMap state_kv = new LinkedHashMap(); for(State s:states){ state_kv.put(s.getMac_key(),s.getMac_value()); } Set> entries = receiveMsgMap.entrySet(); Iterator> iterator = entries.iterator(); while(iterator.hasNext()){ Map.Entry 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 receiveMsgMap, String mac, Map exsensorMap) { Set> entries = receiveMsgMap.entrySet(); Iterator> iterator = entries.iterator(); while (iterator.hasNext()) { Map.Entry 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 macBindSensor(String mac) { Map bindsensor = new LinkedHashMap(); List 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 exSensortoMap(String ver) { List sensors = taskDao.selectFromsensorByver(ver); Map ex_sensorMap = new LinkedHashMap(); for (Sensor sensor : sensors) { ex_sensorMap.put(sensor.getMacKey(), sensor.getSensor()); } return ex_sensorMap; } private void removeNotBind(Map receiveMsgMap,Map exsensorMap,Map bindsensor){ Set> entries = receiveMsgMap.entrySet(); Iterator> iterator = entries.iterator(); while (iterator.hasNext()) { Map.Entry next = iterator.next(); String mac_key = next.getKey(); String sensor = exsensorMap.get(mac_key); if(!bindsensor.containsKey(sensor)){ iterator.remove(); } } } private void removeNotNumber(Map receiveMsgMap){ Set> entries = receiveMsgMap.entrySet(); Iterator> iterator = entries.iterator(); while (iterator.hasNext()) { Map.Entry 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 toMap(String receiveMsg) { Map receiveMsgMap = new LinkedHashMap(); 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; } }