package com.dy.rtuMw.server.mqtt; import com.dy.common.mw.protocol4Mqtt.status.DevRunSt; import com.dy.rtuMw.server.forTcp.RtuLogDealer; import com.dy.rtuMw.server.local.localProtocol.RtuOnLineStateStatisticsVo; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; /** * @Author: liurunyu * @Date: 2025/6/10 15:00 * @Description */ public class DevStatusDealer { private static Map map = new HashMap() ; public static HashMap allOnLine(){ synchronized (map){ HashMap rsMap = new HashMap<>(); Iterator> it = map.entrySet().iterator() ; Map.Entry entry = null ; while(it.hasNext()){ entry = it.next() ; rsMap.put(entry.getKey(), entry.getValue().onLine) ; } return rsMap ; } } public static HashMap partOnLine(String[] devIds){ synchronized (map){ HashMap rsMap = new HashMap(); for(String devid : devIds){ DevStatus st = map.get(devid) ; if(st != null){ rsMap.put(devid, st.onLine) ; } } return rsMap ; } } /** * 统计在线与不在线情况 */ public static RtuOnLineStateStatisticsVo statisticsOnLine(){ RtuOnLineStateStatisticsVo vo = new RtuOnLineStateStatisticsVo() ; vo.onLineNum = 0 ; vo.offLineNum = 0 ; synchronized (map){ Iterator> it = map.entrySet().iterator() ; Map.Entry entry = null ; while(it.hasNext()){ entry = it.next() ; if((entry.getValue()).onLine != null && (entry.getValue()).onLine.booleanValue()){ vo.onLineNum++ ; }else{ vo.offLineNum++ ; } } } return vo ; } /** * 得到全部状态 * @return */ public static Map allStatus(){ return map ; } /** * 得到部分状态 * @return */ public static Map someStatus(String[] devIdArrGrp){ synchronized (map){ Map rsMap = new HashMap<>(); for(String devId : devIdArrGrp){ DevStatus status = map.get(devId) ; if(status != null){ rsMap.put(devId, status) ; } } return rsMap ; } } /** * 得到一个RTU的状态 * @return */ public static DevStatus oneStatus(String devId){ return map.get(devId) ; } public static void updateOnLineState() { if (MqttUnit.confVo != null && MqttUnit.confVo.noSubThenOff != null && MqttUnit.confVo.noSubThenOff.longValue() > 0) { Long now = System.currentTimeMillis() ; synchronized (map){ Set> entrySet = map.entrySet() ; Iterator> it = entrySet.iterator() ; Map.Entry entry ; DevStatus st; while(it.hasNext()){ entry = it.next() ; st = entry.getValue(); if(st.onLine != null && st.onLine.booleanValue() && st.lastUpDataTime != null){ if(now - st.lastUpDataTime > MqttUnit.confVo.noSubThenOff.longValue()){ st.onLine = false ; RtuLogDealer.log4Mqtt(entry.getKey(), "因较长时间未收上行数据,认为设备离线"); } } } } } } /** * 发送消息后 * @param devId */ public static void afterSendPubMessage(String devId){ DevStatus st = map.get(devId); if(st != null){ st.lastDownComTime = System.currentTimeMillis() ; } } /** * 接收消息后 * @param devId */ public static void afterReceiveSubMessage(String devId){ DevStatus st = map.get(devId); if(st != null){ st.lastUpDataTime = System.currentTimeMillis() ; } } public static void onLine(String devId, String protocol){ DevStatus vo = map.get(devId) ; if(vo == null) { vo = new DevStatus(); vo.id = devId ; vo.protocol = protocol ; vo.onLine = true ; map.put(devId, vo); }else { vo.onLine = true ; } } public static void offLine(String devId){ DevStatus vo = map.get(devId) ; if(vo == null) { vo = new DevStatus(); vo.onLine = false ; map.put(devId, vo); }else { vo.onLine = false ; } } public static void setStatus(String devId, DevRunSt st){ DevStatus vo = map.get(devId) ; if(vo != null) { if(st.stirRunning != null){ vo.stirRunning = st.stirRunning ; } if(st.injectRunning != null){ vo.injectRunning = st.injectRunning ; } if(st.irrRunning != null){ vo.irrRunning = st.irrRunning ; } if(st.alarm != null){ vo.alarm = st.alarm ; } } } }