实现:经过一定时间(默认3分钟)RTU不上报数据,如果其Socket连接是连接态,中间件将其网络连接断开。
7个文件已修改
55 ■■■■ 已修改文件
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/Server.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/ServerProperties.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/forTcp/TcpSession.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/forTcp/TcpSessionCache.java 39 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1_0_0/TkDealLoss.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/tasks/ToRtuConstantTask.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/Server.java
@@ -161,6 +161,12 @@
            if(ServerProperties.cacheUpDownDataMaxCount <= ServerProperties.cacheUpDownDataWarnCount){
                throw new Exception("cacheUpDownDataMaxCount必须大于cacheUpDownDataWarnCount") ;
            }
            //没有上行数据的分钟数,达到这个分钟数,认为RTU断网了,取值范围是2_100
            ServerProperties.disconnectedByNoUpDataMinutes =  0L + conf.getSetAttrPlusInt(doc, "config.base", "disconnectedByNoUpDataMinutes", null, 1, 100, null) ;
            if(ServerProperties.disconnectedByNoUpDataMinutes < 1 || ServerProperties.disconnectedByNoUpDataMinutes > 100){
                throw new Exception("disconnectedByNoUpDataMinutes取值必须是1~100") ;
            }
            ServerProperties.disconnectedByNoUpDataMinutes = ServerProperties.disconnectedByNoUpDataMinutes * 60 * 1000 ;
            //设置ID生成器的后缀
            IDLongGenerator.setSuffix(ServerProperties.dbDataIdSuffix.intValue());
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/ServerProperties.java
@@ -33,4 +33,7 @@
    //上下行数据缓存队列中缓存数据个数的最大值,这个与实体项目所接水表数相关
    public static Integer cacheUpDownDataMaxCount = 1100000 ;
    //没有上行数据的分钟数,达到这个分钟数,认为RTU断网了,取值范围是2000_100000
    public static Long disconnectedByNoUpDataMinutes = 3000L ;
}
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/forTcp/TcpSession.java
@@ -9,4 +9,5 @@
    public String protocolName ;//通信协议名称
    public Long lastDownComTime ;//上次下发命令时刻(毫秒时刻 System.currentTimeMillis())
    public Long lastUpDataTime ;//上次收到上行数据时刻(毫秒时刻 System.currentTimeMillis())
    public Long lastUpDataTimeForOnlineCtrl ;//上次收到上行数据时刻(毫秒时刻 System.currentTimeMillis()),用于上线情况控制
}
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/forTcp/TcpSessionCache.java
@@ -2,12 +2,10 @@
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.*;
import java.util.Map.Entry;
import com.dy.common.util.DateTime;
import org.apache.mina.core.session.IoSession;
import com.dy.rtuMw.server.ServerProperties;
@@ -189,27 +187,54 @@
        TcpSession tcpSe = sessionTable.get(rtuAddr) ;
        if(tcpSe != null){
            tcpSe.lastUpDataTime = System.currentTimeMillis() ;
            tcpSe.lastUpDataTimeForOnlineCtrl = System.currentTimeMillis() ;
        }
    }
    
    /**
     * 更新上行数据时刻
     * 当上行数据时刻已经过去一定时长,上行数据时刻清空
     * 当一定时间内没有上行数据,则认为RTU离线
     */
    public static void updateUpDataTime(Long now){
    public static void updateRtuStatus(Long now){
        synchronized (sessionTable){
            Iterator<TcpSession> it = sessionTable.values().iterator() ;
            Set<Map.Entry<String, TcpSession>> entrySet = sessionTable.entrySet() ;
            Iterator<Map.Entry<String, TcpSession>> it = entrySet.iterator() ;
            Map.Entry<String, TcpSession> entry ;
            TcpSession tcpSe ;
            while(it.hasNext()){
                tcpSe = it.next() ;
                entry = it.next() ;
                tcpSe = entry.getValue();
                if(tcpSe.lastUpDataTime != null){
                    if(now - tcpSe.lastUpDataTime > ServerProperties.lastUpDataTimeLive){
                        tcpSe.lastUpDataTime = null ;
                    }
                }
                if(tcpSe.lastUpDataTimeForOnlineCtrl != null){
                    if(tcpSe.ioSession != null && tcpSe.ioSession.isConnected()){
                        if(now - tcpSe.lastUpDataTimeForOnlineCtrl > ServerProperties.disconnectedByNoUpDataMinutes){
                            tcpSe.ioSession.closeNow() ;
                        }
                    }
                }
            }
        }
    }
//    public static void updateRtuStatus(Long now){
//        synchronized (sessionTable){
//            Iterator<TcpSession> it = sessionTable.values().iterator() ;
//            TcpSession tcpSe ;
//            while(it.hasNext()){
//                tcpSe = it.next() ;
//                if(tcpSe.lastUpDataTime != null){
//                    if(now - tcpSe.lastUpDataTime > ServerProperties.lastUpDataTimeLive){
//                        tcpSe.lastUpDataTime = null ;
//                    }
//                }
//            }
//        }
//    }
}
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1_0_0/TkDealLoss.java
@@ -36,7 +36,7 @@
        Object subD = d.getSubData();
        if (subD != null) {
            DataV1_0_1 dV1_0_1 = (DataV1_0_1) subD;
            if (dV1_0_1 != null && dV1_0_1.subData != null) {
            if (dV1_0_1 != null && dV1_0_1.subData != null && dV1_0_1.subData instanceof DataCdC0Vo) {
                Object[] objs = this.getTaskResults(TkPreGenObjs.taskId);
                DbSv sv = (DbSv) objs[0];
                PrController controller = (PrController) objs[1];
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/tasks/ToRtuConstantTask.java
@@ -37,7 +37,7 @@
     * 处理TCP缓存中的各个TCP Session的上行数据时刻
     */
    private void dealTcpSession(){
        TcpSessionCache.updateUpDataTime(System.currentTimeMillis() ) ;
        TcpSessionCache.updateRtuStatus(System.currentTimeMillis() ) ;
    }
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config.xml
@@ -16,6 +16,7 @@
        dbDataIdSuffix:数据库数据id生成器的id后缀,0是默认的后缀,一般web系统应用,数据中间件id后缀大于等于1 
        cacheUpDownDataWarnCount:上下行数据缓存队列中缓存数据个数的报警量,这个与现实项目所接水表数相关
        cacheUpDownDataMaxCount:上下行数据缓存队列中缓存数据个数的最大值,这个与现实项目所接水表数相关
        disconnectedByNoUpDataMinutes:没有上行数据的分钟数,达到这个分钟数,认为RTU断网了,取值范围是2_100
         -->
        <base 
            isLowPower="false"
@@ -28,6 +29,7 @@
            dbDataIdSuffix="0"
            cacheUpDownDataWarnCount="100000"
            cacheUpDownDataMaxCount="110000"
            disconnectedByNoUpDataMinutes="3"
        />
        
        <!--