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<String, DevStatus> map = new HashMap<String, DevStatus>() ;
|
|
public static HashMap<String, Boolean> allOnLine(){
|
synchronized (map){
|
HashMap<String, Boolean> rsMap = new HashMap<>();
|
Iterator<Map.Entry<String, DevStatus>> it = map.entrySet().iterator() ;
|
Map.Entry<String, DevStatus> entry = null ;
|
while(it.hasNext()){
|
entry = it.next() ;
|
rsMap.put(entry.getKey(), entry.getValue().onLine) ;
|
}
|
return rsMap ;
|
}
|
}
|
|
public static HashMap<String, Boolean> partOnLine(String[] devIds){
|
synchronized (map){
|
HashMap<String, Boolean> rsMap = new HashMap<String, Boolean>();
|
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<Map.Entry<String, DevStatus>> it = map.entrySet().iterator() ;
|
Map.Entry<String, DevStatus> entry = null ;
|
while(it.hasNext()){
|
entry = it.next() ;
|
if(((DevStatus)entry).onLine != null && ((DevStatus)entry).onLine.booleanValue()){
|
vo.onLineNum++ ;
|
}else{
|
vo.offLineNum++ ;
|
}
|
}
|
}
|
return vo ;
|
}
|
|
/**
|
* 得到全部状态
|
* @return
|
*/
|
public static Map<String, DevStatus> allStatus(){
|
return map ;
|
}
|
/**
|
* 得到部分状态
|
* @return
|
*/
|
public static Map<String, DevStatus> someStatus(String[] devIdArrGrp){
|
synchronized (map){
|
Map<String, DevStatus> 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<Map.Entry<String, DevStatus>> entrySet = map.entrySet() ;
|
Iterator<Map.Entry<String, DevStatus>> it = entrySet.iterator() ;
|
Map.Entry<String, DevStatus> 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 ;
|
}
|
}
|
}
|
}
|