1、RTU模拟测试系统开发;
2、RTU模拟测试系统管控系统开发;
3、联合测试中发现的协议bug修改;
4、联合测试中发现通信中间件的bug修改。
15 文件已重命名
27个文件已修改
6个文件已添加
1个文件已删除
1028 ■■■■ 已修改文件
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/CommonV1_0_1.java 52 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/DataCdC0Vo.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/DataV1_0_1.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/DriverV1_0_1.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/PrefixedDataAvailableV1_0_1.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/ProtocolConstantV206V1_0_0.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_02_Down.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_71_Down.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_83_Down.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_84_Down.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_C0_Down.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/global/GlCreate.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/global/GlParse.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/pom.xml 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/PipIrrMwAcceptApplication.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/Server.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/AdapterImp_RtuDataUnit.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/busi/deal/Tree.xml 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/forTcp/MidResultActionFromRtu.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/rtuData/RtuDataCache.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/rtuData/RtuDataNode.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/rtuData/RtuDataUnit.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/rtuData/RtuDataUnitAdapter.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/rtuData/RtuDataUnitConfigVo.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/rtuData/Task.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/rtuData/TaskConfig.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/rtuData/TaskPool.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/rtuData/TaskSurpport.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/rtuData/TkReceive.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/rtuData/TkRtuData.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/rtuData/TreeConfig.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/rtuData/TreeParse.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/rtuData/dbSv/RtuSv.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/rtuData/dbSv/说明.txt 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/rtuData/p206V1_0_0/TkFindP206V1_0_0.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/rtuData/p206V1_0_0/TkPreGenObjs.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/tasks/FromRtuConstantTask.java 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/resources/RtuDataDealTree.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/resources/Tree_.xml 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/pom.xml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/rmiClient/RmiClUnit.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/rmiClient/RmiRequestVo.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpClient/LocalDecoder.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpClient/MyThreadJob.java 118 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpClient/TcpClUnit.java 142 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpClient/TcpConnect.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-server/src/main/java/com/dy/testServer/console/Command.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-server/src/main/java/com/dy/testServer/forRmi/Manager.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-server/src/main/java/com/dy/testServer/forRmi/RmiRequestVo.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/CommonV1_0_1.java
@@ -2,6 +2,7 @@
import com.dy.common.util.ByteUtil;
import com.dy.common.util.ByteUtilUnsigned;
import com.dy.common.util.CRC8_for_2_0;
public class CommonV1_0_1 {
@@ -49,13 +50,26 @@
    /**
     * åˆ†æžæ•°æ®å­—节数
     * åˆ†æžå¸§é•¿åº¦
     * @param bs ä¸Šè¡Œå­—节数组
     * @return æ•°æ®é•¿åº¦
     * @throws Exception å¼‚常
     */
    public int parseFrameLen(byte[] bs)throws Exception{
        int len = ByteUtilUnsigned.byte2Byte(bs, ProtocolConstantV206V1_0_0.dataLenIndex) ;
        return len + ProtocolConstantV206V1_0_0.lenHead2ctrl + ProtocolConstantV206V1_0_0.lenTail ;
    }
    /**
     * åˆ†æžç”¨æˆ·æ•°æ®åŸŸå­—节数
     * @param bs ä¸Šè¡Œå­—节数组
     * @return æ•°æ®é•¿åº¦
     * @throws Exception å¼‚常
     */
    public int parseDataLen(byte[] bs)throws Exception{
        return ByteUtilUnsigned.bytes2Short_BE(bs, ProtocolConstantV206V1_0_0.dataLenIndex) ;
        int len = ByteUtilUnsigned.byte2Byte(bs, ProtocolConstantV206V1_0_0.dataLenIndex) ;
        return len + ProtocolConstantV206V1_0_0.lenHead2ctrl + ProtocolConstantV206V1_0_0.lenTail ;
    }
@@ -68,7 +82,7 @@
    public String parseRtuAddr(byte[] bs)throws Exception{
        String rtuAddrBCD = "" + ByteUtil.BCD2Long_BE(bs, ProtocolConstantV206V1_0_0.rtuAddr1Index_start, ProtocolConstantV206V1_0_0.rtuAddr1Index_end) ;
        String rtuAddrStr = "" + ByteUtilUnsigned.bytes2Short_BE(bs, ProtocolConstantV206V1_0_0.rtuAddr2Index_start) ;
        while(rtuAddrStr.length() < 6){
        while(rtuAddrStr.length() < 4){
            rtuAddrStr = "0" + rtuAddrStr ;
        }
        return rtuAddrBCD + rtuAddrStr ;
@@ -83,20 +97,6 @@
        return ByteUtil.bytes2Hex(bs, false, ProtocolConstantV206V1_0_0.codeIndex, 1) ;
    }
    /**
     * æ ¡éªŒå’Œæ£€æŸ¥
     * @param bs ä¸Šè¡Œå­—节数组
     * @return é€šè¿‡true,未通过false
     */
    public boolean checkCrc(byte[] bs) {
        byte he = 0 ;
        for(int i = 0 ; i <= bs.length - 3 ; i++){
            he = (byte)(he + bs[i]) ;
        }
        return bs[bs.length - 2] == he ;
    }
    /**
     * æ ¡éªŒå’Œæ£€æŸ¥
     * @param bs  ä¸Šè¡Œå­—节数组
@@ -104,16 +104,12 @@
     * @throws Exception å¼‚常
     */
    public String checkCrc_str(byte[] bs) throws Exception {
        byte[] he = new byte[1] ;
        for(int i = 0 ; i <= bs.length - 3 ; i++){
            he[0] = (byte)(he[0] + bs[i]) ;
        }
        short hes = ByteUtilUnsigned.byte2Byte(he, 0);
        short heOrg = ByteUtilUnsigned.byte2Byte(bs, bs.length - 2);
        if(hes == heOrg){
        byte crcCompute = (byte)new CRC8_for_2_0().CRC8(bs, ProtocolConstantV206V1_0_0.ctrlIndex, bs.length - 3) ;
        byte crcInBs = bs[bs.length - 2] ;
        if(crcCompute == crcInBs){
            return null ;
        }else{
            return "计算校验和是:" + hes + ",上传校验和是" + heOrg ;
            return "计算CRC是:" + crcCompute + ",上传CRC是" + crcInBs ;
        }
    }
@@ -123,11 +119,11 @@
    D7                  D6                  D5~D4            D3~D0
    ä¼ è¾“方向位 DIR        æ‹†åˆ†æ ‡å¿—位 DIV       å¸§è®¡æ•°ä½ FCB       åŠŸèƒ½ç 
    */
    public byte createCtrl(byte funcCode){
        byte b = 0 ;
    public byte createCtrl(byte dir, byte funcCode){
        byte b = dir;//(byte)0x80//控制域:DIR=1,表示此帧报文是由终端发出的上行报文;
        b = (byte)(b | funcCode) ;
        //FCB == 3
        b = (byte)(b | (byte)60) ;
        b = (byte)(b | (byte)0x18) ;
        //DIV = 0
        //DIR = 0
        return b ;
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/DataCdC0Vo.java
@@ -41,10 +41,14 @@
        sb.append("      æŽ§åˆ¶å™¨æ—¶é’Ÿï¼š");
        sb.append(rtuDt==null?"":rtuDt);
        sb.append("\n");
        sb.append(alarmVo==null?"":alarmVo.toString());
        sb.append("\n");
        sb.append(stateVo==null?"":stateVo.toString());
        sb.append("\n");
        if(alarmVo != null){
            sb.append(alarmVo.toString());
            sb.append("\n");
        }
        if(stateVo != null){
            sb.append(stateVo.toString());
            sb.append("\n");
        }
        return sb.toString() ;
    }
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/DataV1_0_1.java
@@ -25,6 +25,21 @@
        if(dataCd02Vo != null){
            sb.append(dataCd02Vo.toString()) ;
        }
        if(dataCdC0Vo != null){
            sb.append(dataCdC0Vo.toString()) ;
        }
        if(dataCd83OpenVo != null){
            sb.append(dataCd83OpenVo.toString()) ;
        }
        if(dataCd83CloseVo != null){
            sb.append(dataCd83CloseVo.toString()) ;
        }
        if(dataCd84Vo != null){
            sb.append(dataCd84Vo.toString()) ;
        }
        if(dataCd71Vo != null){
            sb.append(dataCd71Vo.toString()) ;
        }
        return sb.toString() ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/DriverV1_0_1.java
@@ -9,7 +9,7 @@
@AnnotationDriver(name= ProtocolConstantV206V1_0_0.protocolName)
public class DriverV1_0_1 extends Driver {
    
    private static String scanRootPackage = "" ;
    private static String scanRootPackage = "com.dy.common.mw.protocol.p206V1_0_0." ;
    
    //在Driver中是单例,随Driver的单例对象在单线程中运行
    private ParseParamsForUpV1_0_1 upCpParams ;
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/PrefixedDataAvailableV1_0_1.java
@@ -100,7 +100,7 @@
            return null ;
        }
        Integer dataLen = parseCommon.parseDataLen(preByte) ;
        Integer dataLen = parseCommon.parseFrameLen(preByte) ;
        if(dataLen == null){
            String headHex = ByteUtil.bytes2Hex(preByte, true) ;
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/ProtocolConstantV206V1_0_0.java
@@ -14,7 +14,7 @@
     * RTU上线数据(上线后第一包数据)最小长度,设置该属性以备进行完整性检查,
     * å³æ–­åŒ…检查,使尽可能收全上线数据(取值范围1-100)
     */
    public static final int onLineDataMinLength = 30 ;//采用阀控回执(其长度最短)的字节数
    public static final int onLineDataMinLength = 13 ;//采用心跳上行数据长度
    /**
     * RTU上报数据的头部最小长度,上报数据中,取这个最小长度的部分数据中,
@@ -33,7 +33,8 @@
    public static final String P_Head_Hex = "68" ;
    public static final String P_Tail_Hex = "16" ;
    public static final byte lenHead2Code = 10 ; //从头到功能码字节数组长度
    public static final byte lenHead2ctrl = 3 ; //从头到控制域(不包括)字节数组长度
    public static final byte lenHead2Code = 10 ; //从头到功能码(包括)字节数组长度
    public static final byte lenTail = 2 ; //帧尾部字节数组长度
    /**
     * æ‰€åœ¨å­—节数组的位置(下标)
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_02_Down.java
@@ -56,7 +56,7 @@
        bsHead[index] = ProtocolConstantV206V1_0_0.P_Head_Byte ;
        index++ ;
        bsHead[index] = commonV1_0_1.createCtrl((byte)0) ;
        bsHead[index] = commonV1_0_1.createCtrl((byte)0, (byte)0) ;
        index++ ;
        GlCreate.createRtuAddr(para.rtuAddr, bsHead, index);
@@ -72,7 +72,9 @@
        GlCreate.createLen(bytes);//长度放字节数组中
        bytes = GlCreate.createCrcTail(bytes) ;//CRC和尾叠加字节数组中
        byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾叠加字节数组中
        bytes = ByteUtil.bytesMerge(bytes, bsTail) ;
        return bytes ;
    }
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_71_Down.java
@@ -59,7 +59,7 @@
        bsHead[index] = ProtocolConstantV206V1_0_0.P_Head_Byte ;
        index++ ;
        bsHead[index] = commonV1_0_1.createCtrl((byte)0) ;
        bsHead[index] = commonV1_0_1.createCtrl((byte)0, (byte)0) ;
        index++ ;
        GlCreate.createRtuAddr(para.rtuAddr, bsHead, index);
@@ -77,7 +77,9 @@
        GlCreate.createLen(bytes);//长度放字节数组中
        bytes = GlCreate.createCrcTail(bytes) ;//CRC和尾叠加字节数组中
        byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾叠加字节数组中
        bytes = ByteUtil.bytesMerge(bytes, bsTail) ;
        return bytes ;
    }
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_83_Down.java
@@ -60,7 +60,7 @@
        bsHead[index] = ProtocolConstantV206V1_0_0.P_Head_Byte ;
        index++ ;
        bsHead[index] = commonV1_0_1.createCtrl((byte)0) ;
        bsHead[index] = commonV1_0_1.createCtrl((byte)0, (byte)0) ;
        index++ ;
        GlCreate.createRtuAddr(para.rtuAddr, bsHead, index);
@@ -79,7 +79,9 @@
        GlCreate.createLen(bytes);//长度放字节数组中
        bytes = GlCreate.createCrcTail(bytes) ;//CRC和尾叠加字节数组中
        byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾叠加字节数组中
        bytes = ByteUtil.bytesMerge(bytes, bsTail) ;
        return bytes ;
    }
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_84_Down.java
@@ -60,7 +60,7 @@
        bsHead[index] = ProtocolConstantV206V1_0_0.P_Head_Byte ;
        index++ ;
        bsHead[index] = commonV1_0_1.createCtrl((byte)0) ;
        bsHead[index] = commonV1_0_1.createCtrl((byte)0, (byte)0) ;
        index++ ;
        GlCreate.createRtuAddr(para.rtuAddr, bsHead, index);
@@ -79,7 +79,9 @@
        GlCreate.createLen(bytes);//长度放字节数组中
        bytes = GlCreate.createCrcTail(bytes) ;//CRC和尾叠加字节数组中
        byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾叠加字节数组中
        bytes = ByteUtil.bytesMerge(bytes, bsTail) ;
        return bytes ;
    }
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_C0_Down.java
@@ -60,7 +60,7 @@
        bsHead[index] = ProtocolConstantV206V1_0_0.P_Head_Byte ;
        index++ ;
        bsHead[index] = commonV1_0_1.createCtrl((byte)0) ;
        bsHead[index] = commonV1_0_1.createCtrl((byte)0, (byte)0) ;
        index++ ;
        GlCreate.createRtuAddr(para.rtuAddr, bsHead, index);
@@ -79,7 +79,9 @@
        GlCreate.createLen(bytes);//长度放字节数组中
        bytes = GlCreate.createCrcTail(bytes) ;//CRC和尾叠加字节数组中
        byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾叠加字节数组中
        bytes = ByteUtil.bytesMerge(bytes, bsTail) ;
        return bytes ;
    }
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/global/GlCreate.java
@@ -12,7 +12,6 @@
        String rtuAddr1 = rtuAddr.substring(0, 6) ;
        String rtuAddr2 = rtuAddr.substring(6) ;
        index++ ;
        ByteUtil.string2BCD_BE(bs, rtuAddr1, index) ;
        index += 3 ;
@@ -21,19 +20,19 @@
    }
    public static void createTp(byte[] bs, int index) throws Exception {
        ByteUtil.string2BCD_BE(bs, DateTime.yyMMddhhmmss(), index) ;
        ByteUtil.string2BCD_LE(bs, DateTime.yyMMddhhmmss(), index) ;
    }
    public static void createLen(byte[] bs) throws Exception {
        int len = bs.length + ProtocolConstantV206V1_0_0.lenTail;
        bs[ProtocolConstantV206V1_0_0.dataLenIndex] = (byte)len ;
    public static void createLen(byte[] bsNoTail) throws Exception {
        int len = bsNoTail.length - ProtocolConstantV206V1_0_0.lenHead2ctrl;
        bsNoTail[ProtocolConstantV206V1_0_0.dataLenIndex] = (byte)len ;
    }
    public static byte[] createCrcTail(byte[] bs) throws Exception {
        int crc = new CRC8_for_2_0().CRC8(bs, ProtocolConstantV206V1_0_0.ctrlIndex, bs.length -1) ;
        bs = new byte[ProtocolConstantV206V1_0_0.lenTail] ;
        bs[0] = (byte)crc ;
        bs[1] = ProtocolConstantV206V1_0_0.P_Tail_Byte ;
        return ByteUtil.bytesMerge(bs, bs) ;
    public static byte[] createCrcTail(byte[] bsNoTail) throws Exception {
        int crc = new CRC8_for_2_0().CRC8(bsNoTail, ProtocolConstantV206V1_0_0.ctrlIndex, bsNoTail.length -1) ;
        byte[] bytes = new byte[ProtocolConstantV206V1_0_0.lenTail] ;
        bytes[0] = (byte)crc ;
        bytes[1] = ProtocolConstantV206V1_0_0.P_Tail_Byte ;
        return bytes ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/global/GlParse.java
@@ -40,9 +40,9 @@
            index++ ;
            dt = ByteUtil.BCD2String_BE(bs, index, index) + ":" + dt ;//分
            index++ ;
            dt = ByteUtil.BCD2String_BE(bs, index, index) + " " + dt ;//时
            dt = ByteUtil.BCD2String_BE(bs, index, index) + ":" + dt ;//时
            index++ ;
            dt = ByteUtil.BCD2String_BE(bs, index, index) + "-" + dt ;//日
            dt = ByteUtil.BCD2String_BE(bs, index, index) + " " + dt ;//日
            index++ ;
            bs[index] = (byte)(bs[index] & 0x10);
            dt = ByteUtil.BCD2String_BE(bs, index, index) + "-" + dt ;//月
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/pom.xml
@@ -132,4 +132,124 @@
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <!-- ç”Ÿæˆä¸åŒ…含依赖jar的可执行jar包
            <plugin>
                !- spring boot提供的maven打包插件 -
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        !-
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                        -
                        <configuration>
                            !- ä¸åŠ çš„è¯æœ€ç»ˆåŒ…åä¸º: ${artifactId}-${version}.jar, åŠ äº†çš„è¯æœ€ç»ˆåŒ…å: ${artifactId}-${version}-${classifier}.jar  -
                            <classifier>execute</classifier>
                            !- ä¸æŒ‡å®šç”Ÿæˆè·¯å¾„的话, é»˜è®¤ä¿å­˜åœ¨ ${build.directory} ä¸‹ -
                            <outputDirectory>${project.build.directory}/execute</outputDirectory>
                            <finalName>${artifactId}-${version}</finalName>
                            <layout>ZIP</layout>
                            <mainClass>com.dy.pipIrrBase.PipIrrBaseApplication</mainClass>
                            <includes>
                                <include>
                                    <groupId>com.dy</groupId>
                                    <artifactId>pipIrr-common</artifactId>
                                </include>
                                <include>
                                    <groupId>com.dy</groupId>
                                    <artifactId>pipIrr-global</artifactId>
                                </include>
                            </includes>
                            <excludes>
                                <exclude>
                                    <groupId>org.projectlombok</groupId>
                                    <artifactId>lombok</artifactId>
                                </exclude>
                            </excludes>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            -->
            <!-- æ‹·è´ä¾èµ–çš„jar包到lib目录-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <configuration>
                            <!-- ä¸åŠ çš„è¯æœ€ç»ˆåŒ…åä¸º: ${artifactId}-${version}.jar, åŠ äº†çš„è¯æœ€ç»ˆåŒ…å: ${artifactId}-${version}-${classifier}.jar
                            <classifier>execute</classifier>
                            -->
                            <!-- ${project.build.directory}是maven变量,内置的,表示target目录,如果不写,将在根目录下创建/lib -->
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                            <!-- excludeTransitive:是否不包含间接依赖包,比如我们依赖A,但是A又依赖了B,我们是否也要把B打进去 é»˜è®¤ä¸æ‰“-->
                            <excludeTransitive>false</excludeTransitive>
                            <!-- å¤åˆ¶çš„jar文件去掉版本信息 -->
                            <stripVersion>false</stripVersion>
                            <finalName>${project.artifactId}-${project.version}</finalName>
                            <layout>ZIP</layout>
                            <mainClass>com.dy.aceMw.PipIrrMwAcceptApplication</mainClass>
                            <includes>
                                <include>
                                    <groupId>com.dy</groupId>
                                    <artifactId>pipIrr-common</artifactId>
                                </include>
                                <include>
                                    <groupId>com.dy</groupId>
                                    <artifactId>pipIrr-global</artifactId>
                                </include>
                            </includes>
                            <excludes>
                                <exclude>
                                    <groupId>org.projectlombok</groupId>
                                    <artifactId>lombok</artifactId>
                                </exclude>
                            </excludes>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <!-- è®¾ç½®java编译版本,运行环境版本 -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <!-- source: æºä»£ç ç¼–译版本;target: ç›®æ ‡å¹³å°ç¼–译版本;encoding: å­—符集编码。 -->
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <encoding>${encoding}</encoding>
                </configuration>
            </plugin>
            <plugin>
                <!-- è§£å†³èµ„源文件的编码问题 -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <configuration>
                    <encoding>${encoding}</encoding>
                </configuration>
            </plugin>
            <plugin>
                <!-- maven里执行测试用例的插件 -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>
            <plugin>
                <!-- ä¸‹é¢è§£å†³ï¼šå½“进行Maven Lifecycle package时报错:Could not find artifact org.apache.mina:mina-core:bundle:2.2.1 in maven (https://repo1.maven.org/maven2/)-->
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <extensions>true</extensions>
            </plugin>
        </plugins>
    </build>
</project>
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/PipIrrMwAcceptApplication.java
@@ -13,7 +13,7 @@
@EnableAspectJAutoProxy
@EnableMultiDataSource
@ComponentScan(basePackages = {"com.dy.common", "com.dy.pipIrrGlobal", "com.dy.aceMw"})
@MapperScan(basePackages={"com.dy.pipIrrGlobal.daoBa"})
@MapperScan(basePackages={"com.dy.pipIrrGlobal.daoRm"})
public class PipIrrMwAcceptApplication implements CommandLineRunner {
    public static void main(String[] args) {
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/Server.java
@@ -3,7 +3,10 @@
import java.util.ArrayList;
import java.util.List;
import com.dy.aceMw.server.tasks.BusiConstantTask;
import com.dy.aceMw.server.*;
import com.dy.aceMw.server.rtuData.RtuDataUnit;
import com.dy.aceMw.server.rtuData.RtuDataUnitConfigVo;
import com.dy.aceMw.server.tasks.FromRtuConstantTask;
import com.dy.common.mw.UnitInterface;
import com.dy.common.mw.UnitStartedCallbackInterface;
import com.dy.common.mw.channel.rmi.RmiConfigVo;
@@ -16,16 +19,9 @@
import com.dy.common.mw.protocol.ProtocolUnit;
import com.dy.common.mw.support.SupportUnit;
import com.dy.common.mw.support.SupportUnitConfigVo;
import com.dy.aceMw.server.AdapterImp_CoreUnit;
import com.dy.aceMw.server.AdapterImp_ProtocolUnit;
import com.dy.aceMw.server.AdapterImp_RmiUnit;
import com.dy.aceMw.server.AdapterImp_TcpUnit;
import com.dy.aceMw.server.ServerProperties;
import com.dy.aceMw.server.tasks.ToRtuConstantTask;
import com.dy.aceMw.server.AdapterImp_SupportUnit;
import com.dy.aceMw.resource.ResourceUnit;
import com.dy.aceMw.resource.ResourceUnitConfigVo;
import com.dy.aceMw.server.AdapterImp_ResourceUnit;
import com.dy.common.springUtil.SpringContextUtil;
import com.dy.common.util.ConfigXml;
import com.dy.common.util.IDLongGenerator;
@@ -147,7 +143,7 @@
            //TCP上行数据时刻缓存时长,当达到时长时,TCP上行数据时刻被清空,采用TCP上行数据时刻目的是,阻止上数据同时下发数据,因为RTU处理不过来
            ServerProperties.lastUpDataTimeLive = conf.getSetAttrPlusInt(doc, "config.base", "lastUpDataTimeLive", null, 0, 5, null) * 1000L ;
            //数据库数据id生成器的id后缀,0是默认的后缀,一般web系统应用,数据中间件id后缀大于等于1
            ServerProperties.dbDataIdSuffix = conf.getSetAttrInt(doc, "config.base", "dbDataIdSuffix", null, 1, 9, null);
            ServerProperties.dbDataIdSuffix = conf.getSetAttrInt(doc, "config.base", "dbDataIdSuffix", null, 0, 99, null);
            //上下行数据缓存队列中缓存数据个数的报警量,这个与现实项目所接水表数相关
            ServerProperties.cacheUpDownDataWarnCount = conf.getSetAttrPlusInt(doc, "config.base", "cacheUpDownDataWarnCount", null, 1, null, null) ;
            //上下行数据缓存队列中缓存数据个数的最大值,这个与现实项目所接水表数相关
@@ -172,10 +168,7 @@
            protoAdap.setConfig(protoVo);
            ProtocolUnit protoUnit = ProtocolUnit.getInstance();
            protoUnit.setAdapter(protoAdap);
            protoUnit.start(new UnitStartedCallbackInterface(){
                @Override
                public void call(Object obj) {
                }
            protoUnit.start(obj -> {
            });
            units.add(protoUnit) ;
            
@@ -225,10 +218,7 @@
            supAdap.setConfig(supVo);
            SupportUnit supUnit = SupportUnit.getInstance() ;
            supUnit.setAdapter(supAdap);
            supUnit.start(new UnitStartedCallbackInterface(){
                @Override
                public void call(Object obj) {
                }
            supUnit.start(obj -> {
            });
            units.add(supUnit) ;
            
@@ -257,10 +247,7 @@
            //当前支持spring + hibernate
            resUnit.setSpringContext(SpringContextUtil.getApplicationContext());
            resUnit.start(new UnitStartedCallbackInterface(){
                @Override
                public void call(Object obj) {
                }
            resUnit.start(obj -> {
            });
            units.add(resUnit) ;
@@ -277,14 +264,25 @@
                rmiAdap.setConfig(rmiVo);
                RmiUnit rmiUnit = RmiUnit.getInstance();
                rmiUnit.setAdapter(rmiAdap);
                rmiUnit.start(new UnitStartedCallbackInterface(){
                    @Override
                    public void call(Object obj) {
                    }
                rmiUnit.start(obj -> {
                });
                RmiSvUrl = "[ip]:" + rmiVo.port + "/" + rmiVo.context ;
                units.add(rmiUnit) ;
            }
            /////////////////
            //RTU上行数据处理模块
            RtuDataUnitConfigVo rducVo = new RtuDataUnitConfigVo();
            AdapterImp_RtuDataUnit rducAdap = new AdapterImp_RtuDataUnit();
            rducAdap.setConfig(rducVo);
            RtuDataUnit rducUnit = RtuDataUnit.getInstance();
            rducUnit.setAdapter(rducAdap);
            rducUnit.start(obj -> {
            });
            units.add(rducUnit) ;
            // ///////////////
            // æ ¸å¿ƒ
@@ -299,11 +297,8 @@
            CoreUnit coreUnit = CoreUnit.getInstance();
            coreUnit.setAdapter(coreAdap);
            CoreUnit.addConstantTask(new ToRtuConstantTask());
            CoreUnit.addConstantTask(new BusiConstantTask());
            coreUnit.start(new UnitStartedCallbackInterface(){
                @Override
                public void call(Object obj) {
                }
            CoreUnit.addConstantTask(new FromRtuConstantTask());
            coreUnit.start(obj -> {
            });
            units.add(coreUnit) ;
@@ -321,10 +316,7 @@
                tcpAdap.setConfig(tcpVo);
                TcpUnit tcpUnit = TcpUnit.getInstance();
                tcpUnit.setAdapter(tcpAdap);
                tcpUnit.start(new UnitStartedCallbackInterface(){
                    @Override
                    public void call(Object obj) {
                    }
                tcpUnit.start(obj -> {
                });
                TcpSvUrl = "[ip]:" + tcpVo.port ;
                units.add(tcpUnit) ;
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/AdapterImp_RtuDataUnit.java
New file
@@ -0,0 +1,19 @@
package com.dy.aceMw.server;
import com.dy.aceMw.server.rtuData.RtuDataUnitAdapter;
import com.dy.aceMw.server.rtuData.RtuDataUnitConfigVo;
public class AdapterImp_RtuDataUnit implements RtuDataUnitAdapter {
    private RtuDataUnitConfigVo configVo ;
    public RtuDataUnitConfigVo getConfig() {
        return configVo;
    }
    public void setConfig(RtuDataUnitConfigVo configVo){
        this.configVo = configVo ;
    }
}
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/busi/deal/Tree.xml
File was deleted
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/forTcp/MidResultActionFromRtu.java
@@ -1,7 +1,7 @@
package com.dy.aceMw.server.forTcp;
import com.dy.aceMw.server.busi.AboutRtuNode;
import com.dy.aceMw.server.busi.TcpUpDataCache;
import com.dy.aceMw.server.rtuData.RtuDataNode;
import com.dy.aceMw.server.rtuData.RtuDataCache;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -49,7 +49,7 @@
     */
    private void nextDeal(boolean reportOrResponse_trueOrFalse, MidResultFromRtu resFromRtu){
        try{
            TcpUpDataCache.cacheRtuUpData(reportOrResponse_trueOrFalse, new AboutRtuNode(resFromRtu.data));
            RtuDataCache.cacheRtuUpData(reportOrResponse_trueOrFalse, new RtuDataNode(resFromRtu.data));
        }catch(Exception e){
            log.error(e.getMessage(), e);
        }
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/rtuData/RtuDataCache.java
File was renamed from pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/busi/TcpUpDataCache.java
@@ -1,21 +1,21 @@
package com.dy.aceMw.server.busi;
package com.dy.aceMw.server.rtuData;
import com.dy.aceMw.server.ServerProperties;
import com.dy.common.queue.Node;
import com.dy.common.queue.Queue;
public class TcpUpDataCache {
public class RtuDataCache {
    //TCP下行命令缓存队列
    private static Queue cacheQueue = new Queue("tcpUpDataQueue") ;
    private static TcpUpDataCache instance = new TcpUpDataCache() ;
    private static RtuDataCache instance = new RtuDataCache() ;
    private TcpUpDataCache(){
    private RtuDataCache(){
        cacheQueue.setLimit(ServerProperties.cacheUpDownDataWarnCount, ServerProperties.cacheUpDownDataMaxCount);
    }
    public static TcpUpDataCache getInstance(){
    public static RtuDataCache getInstance(){
        return instance ;
    }
@@ -25,7 +25,7 @@
     * @param node node
     * @throws Exception å¼‚常
     */
    public static void cacheRtuUpData(boolean reportOrResponse_trueOrFalse, AboutRtuNode node) throws Exception{
    public static void cacheRtuUpData(boolean reportOrResponse_trueOrFalse, RtuDataNode node) throws Exception{
        if(node != null && node.obj != null){
            if(reportOrResponse_trueOrFalse){
                cacheQueue.pushHead(node);
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/rtuData/RtuDataNode.java
File was renamed from pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/busi/AboutRtuNode.java
@@ -1,20 +1,18 @@
package com.dy.aceMw.server.busi;
package com.dy.aceMw.server.rtuData;
import com.dy.aceMw.server.busi.deal.TaskPool;
import com.dy.aceMw.server.busi.deal.TaskSurpport;
import com.dy.common.queue.NodeObj;
import com.dy.common.threadPool.ThreadPool;
import com.dy.common.threadPool.TreadPoolFactory;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class AboutRtuNode implements NodeObj {
public class RtuDataNode implements NodeObj {
    private static final Logger log = LogManager.getLogger(AboutRtuNode.class.getName());
    private static final Logger log = LogManager.getLogger(RtuDataNode.class.getName());
    public Object obj ;//数据
    public AboutRtuNode(Object obj){
    public RtuDataNode(Object obj){
        this.obj = obj ;
    }
    /**
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/rtuData/RtuDataUnit.java
New file
@@ -0,0 +1,47 @@
package com.dy.aceMw.server.rtuData;
import com.dy.common.mw.UnitAdapterInterface;
import com.dy.common.mw.UnitInterface;
import com.dy.common.mw.UnitStartedCallbackInterface;
public class RtuDataUnit  implements UnitInterface {
    private static RtuDataUnit instance = new RtuDataUnit() ;
    public static RtuDataUnitAdapter adapter ;
    public static RtuDataUnitConfigVo confVo ;
    private RtuDataUnit(){} ;
    public static RtuDataUnit getInstance(){
        return instance ;
    }
    @Override
    public void setAdapter(UnitAdapterInterface adapter) throws Exception {
        if(adapter == null){
            throw new Exception("RTU数据处理模块适配器对象不能为空!") ;
        }
        RtuDataUnit.adapter = (RtuDataUnitAdapter)adapter ;
        RtuDataUnit.confVo = RtuDataUnit.adapter.getConfig() ;
        if(RtuDataUnit.confVo == null){
            throw new Exception("RTU数据处理模块配置对象不能为空!") ;
        }
    }
    /**
     * åˆå§‹åŒ–上行数据处理任务池
     */
    @Override
    public void start(UnitStartedCallbackInterface callback) throws Exception {
        TaskPool.setTaskTreeCofig(new TreeParse().parseConfig());
        callback.call(null) ;
        System.out.println("RTU数据处理模块成功启动");
    }
    @Override
    public void stop(UnitStartedCallbackInterface callback) throws Exception {
    }
}
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/rtuData/RtuDataUnitAdapter.java
New file
@@ -0,0 +1,10 @@
package com.dy.aceMw.server.rtuData;
import com.dy.common.mw.UnitAdapterInterface;
public interface RtuDataUnitAdapter extends UnitAdapterInterface {
    public RtuDataUnitConfigVo getConfig() ;
}
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/rtuData/RtuDataUnitConfigVo.java
New file
@@ -0,0 +1,5 @@
package com.dy.aceMw.server.rtuData;
public class RtuDataUnitConfigVo {
}
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/rtuData/Task.java
File was renamed from pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/busi/deal/Task.java
@@ -1,4 +1,4 @@
package com.dy.aceMw.server.busi.deal;
package com.dy.aceMw.server.rtuData;
public interface Task {
    
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/rtuData/TaskConfig.java
File was renamed from pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/busi/deal/TaskConfig.java
@@ -1,4 +1,4 @@
package com.dy.aceMw.server.busi.deal;
package com.dy.aceMw.server.rtuData;
public class TaskConfig {
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/rtuData/TaskPool.java
File was renamed from pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/busi/deal/TaskPool.java
@@ -1,4 +1,4 @@
package com.dy.aceMw.server.busi.deal;
package com.dy.aceMw.server.rtuData;
import java.util.ArrayList;
import java.util.List;
@@ -108,7 +108,8 @@
        if (c == null) {
            throw new Exception("实例化上行数据处理任务对象树失败!任务类为" + clazz + "!");
        }else{
            return (TaskSurpport)c.newInstance();
            return (TaskSurpport)c.getDeclaredConstructor().newInstance();
            //return (TaskSurpport)c.newInstance();
        }
    }
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/rtuData/TaskSurpport.java
File was renamed from pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/busi/deal/TaskSurpport.java
@@ -1,4 +1,4 @@
package com.dy.aceMw.server.busi.deal;
package com.dy.aceMw.server.rtuData;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/rtuData/TkReceive.java
File was renamed from pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/busi/deal/TkReceive.java
@@ -1,4 +1,4 @@
package com.dy.aceMw.server.busi.deal;
package com.dy.aceMw.server.rtuData;
import com.dy.common.mw.protocol.Data;
import org.apache.logging.log4j.LogManager;
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/rtuData/TkRtuData.java
File was renamed from pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/busi/deal/TkRtuData.java
@@ -1,4 +1,4 @@
package com.dy.aceMw.server.busi.deal;
package com.dy.aceMw.server.rtuData;
import com.dy.common.mw.protocol.Data;
import org.apache.logging.log4j.LogManager;
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/rtuData/TreeConfig.java
File was renamed from pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/busi/deal/TreeConfig.java
@@ -1,4 +1,4 @@
package com.dy.aceMw.server.busi.deal;
package com.dy.aceMw.server.rtuData;
public class TreeConfig {
    public TaskConfig taskConf ;
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/rtuData/TreeParse.java
File was renamed from pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/busi/deal/TreeParse.java
@@ -1,4 +1,4 @@
package com.dy.aceMw.server.busi.deal;
package com.dy.aceMw.server.rtuData;
import java.net.URL;
@@ -29,7 +29,8 @@
     */
    protected TreeConfig parseConfig() {
        try {
            URL configFileURL = TreeParse.class.getResource("Tree.xml");
            ClassLoader classLoader = ClassLoader.getSystemClassLoader();
            URL configFileURL = classLoader.getResource("RtuDataDealTree.xml");
            return this.parse(this.createDom(configFileURL)) ;
        } catch (Exception e) {
            System.out.println("系统启动时,初始上行数据处理任务配置出错 !");
@@ -68,7 +69,7 @@
    private TreeConfig parse(Document doc) throws Exception {
        Element root = doc.getRootElement();
        if (root == null) {
            throw new Exception("未得到上行数据处理任务配置文件根元素config!");
            throw new Exception("未得到上行数据处理任务配置文件根元素project!");
        }
        List<Element> rootTasks = root.getChildren("task") ;
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/rtuData/dbSv/RtuSv.java
File was renamed from pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/busi/deal/dbSv/RtuSv.java
@@ -1,4 +1,4 @@
package com.dy.aceMw.server.busi.deal.dbSv;
package com.dy.aceMw.server.rtuData.dbSv;
import org.springframework.stereotype.Service;
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/rtuData/dbSv/˵Ã÷.txt
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/rtuData/p206V1_0_0/TkFindP206V1_0_0.java
File was renamed from pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/busi/deal/p206V1_0_0/TkFindP206V1_0_0.java
@@ -1,7 +1,7 @@
package com.dy.aceMw.server.busi.deal.p206V1_0_0;
package com.dy.aceMw.server.rtuData.p206V1_0_0;
import com.dy.aceMw.server.busi.deal.TaskSurpport;
import com.dy.aceMw.server.rtuData.TaskSurpport;
import com.dy.common.mw.protocol.Data;
import com.dy.common.mw.protocol.p206V1_0_0.ProtocolConstantV206V1_0_0;
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/rtuData/p206V1_0_0/TkPreGenObjs.java
File was renamed from pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/busi/deal/p206V1_0_0/TkPreGenObjs.java
@@ -1,6 +1,6 @@
package com.dy.aceMw.server.busi.deal.p206V1_0_0;
package com.dy.aceMw.server.rtuData.p206V1_0_0;
import com.dy.aceMw.server.busi.deal.TaskSurpport;
import com.dy.aceMw.server.rtuData.TaskSurpport;
import com.dy.common.mw.protocol.Data;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -20,6 +20,7 @@
    public void execute(Object data) {
        Data d = (Data)data ;
        String rtuAddr = d.getRtuAddr() ;
        log.info("RTU" + rtuAddr + "数据到此,还未实现处理:" + data.toString());
        //得到本地RTU æ•°æ®ï¼Œä»¥å¤‡åŽé¢èŠ‚ç‚¹åº”ç”¨
        /*
        BuziInterface baseBusi = BuziGeter.getBaseBusi() ;
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/tasks/FromRtuConstantTask.java
File was renamed from pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/tasks/BusiConstantTask.java
@@ -1,7 +1,7 @@
package com.dy.aceMw.server.tasks;
import com.dy.aceMw.server.busi.AboutRtuNode;
import com.dy.aceMw.server.busi.TcpUpDataCache;
import com.dy.aceMw.server.rtuData.RtuDataNode;
import com.dy.aceMw.server.rtuData.RtuDataCache;
import com.dy.common.mw.core.CoreTask;
import com.dy.common.queue.Node;
import org.apache.logging.log4j.LogManager;
@@ -10,8 +10,8 @@
/**
 * å¯¹RTU上行数据进行业务处理
 */
public class BusiConstantTask  extends CoreTask {
    private static final Logger log = LogManager.getLogger(BusiConstantTask.class.getName());
public class FromRtuConstantTask extends CoreTask {
    private static final Logger log = LogManager.getLogger(FromRtuConstantTask.class.getName());
    /**
     * åœ¨å•线程环境中运行
@@ -19,7 +19,7 @@
    @Override
    public Integer excute() {
        try{
            return dealRtuUpdata() ;
            return dealRtuUpData() ;
        }catch(Exception e){
            log.error(e);
        }
@@ -29,12 +29,12 @@
    /**
     * å¤„理上行数据
     */
    public Integer dealRtuUpdata() {
        Node first = TcpUpDataCache.getFirstQueueNode() ;
    public Integer dealRtuUpData() {
        Node first = RtuDataCache.getFirstQueueNode() ;
        if(first != null){
            Integer count = TcpUpDataCache.size() ;
            Node last = TcpUpDataCache.getLastQueueNode() ;
            this.doDealRtuUpdata(first, last);
            Integer count = RtuDataCache.size() ;
            Node last = RtuDataCache.getLastQueueNode() ;
            this.doDealRtuUpData(first, last);
            return count ;
        }
        return null ;
@@ -45,18 +45,18 @@
     * @param first ç¬¬ä¸€ä¸ªèŠ‚ç‚¹
     * @param last æœ€åŽä¸€ä¸ªèŠ‚ç‚¹
     */
    private void doDealRtuUpdata(Node first, Node last){
    private void doDealRtuUpData(Node first, Node last){
        if(last != null){
            //在dealNode方法中,可能要把last从队列中移除,这时last.pre为空,所以提前把last.pre取出来
            Node pre = last.pre ;
            dealNode(last) ;
            if(first != null && first != last){
                doDealRtuUpdata(first, pre) ;
                doDealRtuUpData(first, pre) ;
            }else if(first != null && first == last){
                //停止
            }else if(first == null){
                //这种情况不会存在
                doDealRtuUpdata(null, pre) ;
                doDealRtuUpData(null, pre) ;
            }
        }
    }
@@ -66,9 +66,9 @@
     * @param node èŠ‚ç‚¹
     */
    private void dealNode(Node node){
        AboutRtuNode obj = (AboutRtuNode)node.obj ;
        RtuDataNode obj = (RtuDataNode)node.obj ;
        obj.dealSelf() ;
        TcpUpDataCache.removeNode(node);
        RtuDataCache.removeNode(node);
    }
}
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/resources/RtuDataDealTree.xml
New file
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE project>
<project>
    <!--
    id:与对应类中的静态成员变量taskId一致
    enable:标识本节点是否执行,若本节点不执行,则直接进入其子节点
    -->
    <task id="TkReceive" name="接收数据" enable="true" class="com.dy.aceMw.server.rtuData.TkReceive">
        <task id="TkRtuData" name="接收RTU数据" enable="true" class="com.dy.aceMw.server.rtuData.TkRtuData">
            <task id="TkFindP206V1_0_0" name="识别P206V1_0_0数据" enable="true" class="com.dy.aceMw.server.rtuData.p206V1_0_0.TkFindP206V1_0_0">
                <task id="TkPreGenObjs" name="预先准备各对象" enable="true" class="com.dy.aceMw.server.rtuData.p206V1_0_0.TkPreGenObjs">
                </task>
            </task>
        </task>
    </task>
</project>
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/resources/Tree_.xml
New file
@@ -0,0 +1,95 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE project>
<project>
<!--
id:与对应类中的静态成员变量taskId一致
enable:标识本节点是否执行,若本节点不执行,则直接进入其子节点
-->
<task id="TkReceive" name="接收数据" enable="true" class="com.dy.aceMw.server.rtuData.TkReceive">
    <task id="TkRtuData" name="接收RTU数据" enable="true" class="com.dy.aceMw.server.rtuData.TkRtuData">
        <task id="TkFindP206V1_0_0" name="识别P206V1_0_0数据" enable="true" class="com.dy.aceMw.server.rtuData.p206V1_0_0.TkFindP206V1_0_0">
            <task id="TkPreGenObjs" name="预先准备各对象" enable="true" class="com.dy.aceMw.server.rtuData.p206V1_0_0.TkPreGenObjs">
                <!-- è¯†åˆ«æµæµªè€…RTU,数据库中没有或数据库存在但未分配置供水机构 -->
                <task id="TkDealRtuTramp" name="识别流浪者RTU" enable="true" class="com.dy.aceMw.server.rtuData.p206V1_0_0.TkDealRtuTramp" />
                <!-- éžæµæµªè€…RTU,必须放在TkDealRtuTramp后面 -->
                <task id="TkDealNoRtuTramp" name="非流浪者RTU" enable="true" class="com.dy.aceMw.server.rtuData.p206V1_0_0.TkDealNoRtuTramp">
                    <!-- è¯†åˆ«ä¸»åŠ¨ä¸ŠæŠ¥æ•°æ® -->
                    <task id="TkFindAutoReport" name="识别主动上报及触发上报数据" enable="true" class="com.dy.aceMw.server.rtuData.p206V1_0_0.TkFindAutoReport">
                        <!-- æ£€æŸ¥æ—¶é—´ç­‰ä¸æ­£ç¡®çš„上报数据 -->
                        <task id="TkCheckAutoReport" name="检查时间等不正确的上报数据" enable="true" class="com.dy.aceMw.server.rtuData.p206V1_0_0.autoReport.TkCheckAutoReport">
                            <!-- æ£€æŸ¥é‡å¤ä¸ŠæŠ¥æ•°æ® -->
                            <task id="TkCheckRepeatReport" name="检查重复上报数据" enable="true" class="com.dy.aceMw.server.rtuData.p206V1_0_0.autoReport.TkCheckRepeatReport">
                                <!-- Mn运维系统 -->
                                <task id="TkMnRtuDealAutoReportLastAlarm" name="运维RTU上报最新报警" enable="true" class="com.dy.aceMw.server.rtuData.p206V1_0_0.autoReport.TkMnRtuDealAutoReportLastAlarm" />
                                <!-- RTU主动上报数据必须在RTU主动上报报警任务的下面,以备主动上报数据中记录是否有报警-->
                                <task id="TkMnRtuDealAutoReportLastData" name="运维RTU主动上报最新数据" enable="true" class="com.dy.aceMw.server.rtuData.p206V1_0_0.autoReport.TkMnRtuDealAutoReportLastData" />
                                <!-- RTU实时(触发)上报数据必须在RTU主动上报报警任务的下面,以备主动上报数据中记录是否有报警-->
                                <task id="TkMnRtuDealRealReportLastData" name="运维RTU实时(触发)上报最新数据" enable="true" class="com.dy.aceMw.server.rtuData.p206V1_0_0.autoReport.TkMnRtuDealRealReportLastData" />
                                <!-- Org供水机构系统 -->
                                <task id="TkOrgRtuDealAutoReportLastAlarm" name="供水机构RTU主动上报最新报警" enable="true" class="com.dy.aceMw.server.rtuData.p206V1_0_0.autoReport.TkOrgRtuDealAutoReportLastAlarm">
                                    <task id="TkOrgRtuDealAutoReportAlarm" name="供水机构RTU主动上报报警" enable="true" class="com.dy.aceMw.server.rtuData.p206V1_0_0.autoReport.TkOrgRtuDealAutoReportAlarm" />
                                    <task id="TkOrgRtuDealReportValveOpResult" name="供水机构RTU主动上报开关阀结果" enable="true" class="com.dy.aceMw.server.rtuData.p206V1_0_0.autoReport.TkOrgRtuDealReportValveOpResult" />
                                </task>
                                <!-- RTU主动上报数据必须在RTU主动上报报警任务的下面,以备主动上报数据中记录是否有报警-->
                                <task id="TkOrgRtuDealDayAmountAlarm" name="供水机构RTU日结累计流量报警" enable="true" class="com.dy.aceMw.server.rtuData.p206V1_0_0.autoReport.TkOrgRtuDealDayAmountAlarm" >
                                    <task id="TkOrgRtuDeal48HourNoAmount" name="供水机构RTU48小时未用水" enable="true" class="com.dy.aceMw.server.rtuData.p206V1_0_0.autoReport.TkOrgRtuDeal48HourNoAmount" >
                                        <task id="TkOrgRtuDealAutoReportLastData" name="供水机构RTU主动上报最新数据" enable="true" class="com.dy.aceMw.server.rtuData.p206V1_0_0.autoReport.TkOrgRtuDealAutoReportLastData">
                                            <task id="TkOrgRtuDealAutoReportData" name="供水机构RTU主动上报数据" enable="true" class="com.dy.aceMw.server.rtuData.p206V1_0_0.autoReport.TkOrgRtuDealAutoReportData" />
                                            <task id="TkOrgRtuDealCycleData" name="供水机构RTU主动上报周期采集数据" enable="true" class="com.dy.aceMw.server.rtuData.p206V1_0_0.autoReport.TkOrgRtuDealCycleData">
                                                <task id="TkOrgRtuDealCycleLongSmallAmountAlarm" name="供水机构RTU主动上报周期采集数据长流水分析" enable="true" class="com.dy.aceMw.server.rtuData.p206V1_0_0.autoReport.TkOrgRtuDealCycleLongSmallAmountAlarm" />
                                            </task>
                                            <task id="TkOrgRtuDealAmountCost" name="供水机构RTU主动上报计算日水量、月水量、及水费" enable="true" class="com.dy.aceMw.server.rtuData.p206V1_0_0.autoReport.TkOrgRtuDealAmountCost" >
                                                <task id="TkOrgRtuDealPayCost" name="供水机构用水户水表电子钱包支付水费" enable="true" class="com.dy.aceMw.server.rtuData.p206V1_0_0.autoReport.TkOrgRtuDealPayCost" />
                                            </task>
                                        </task>
                                    </task>
                                </task>
                                <!-- RTU实时(触发)上报数据必须在RTU主动上报报警任务的下面,以备主动上报数据中记录是否有报警-->
                                <task id="TkOrgRtuDealRealReportLastData" name="供水机构RTU实时(触发)上报最新数据" enable="true" class="com.dy.aceMw.server.rtuData.p206V1_0_0.autoReport.TkOrgRtuDealRealReportLastData">
                                    <task id="TkOrgRtuDealRealReportData" name="供水机构RTU实时(触发)上报数据" enable="true" class="com.dy.aceMw.server.rtuData.p206V1_0_0.autoReport.TkOrgRtuDealRealReportData" />
                                </task>
                            </task>
                        </task>
                    </task>
                    <!-- è¯†åˆ«å‘½ä»¤å“åº”数据 -->
                    <task id="TkFindComResponse" name="识别响应命令数据" enable="true" class="com.dy.aceMw.server.rtuData.p206V1_0_0.TkFindComResponse">
                        <task id="TkRtuDealCommandResponse" name="RTU响应命令数据" enable="true" class="com.dy.aceMw.server.rtuData.p206V1_0_0.comResponse.TkRtuDealCommandResponse" >
                            <task id="TkRtuDealSetParamComResponse" name="RTU响应设置参数命令数据" enable="true" class="com.dy.aceMw.server.rtuData.p206V1_0_0.comResponse.TkRtuDealSetParamComResponse" />
                        </task>
                    </task>
                </task>
            </task>
        </task>
        <task id="TkFindHAC_NBhV2_5" name="识别HAC_NBhV2_5数据" enable="true" class="com.dy.busi.server.rtuData.HAC_NBhV2_5.TkFindHAC_NBhV2_5">
            <task id="TkPipPreGenObjs" name="预先准备各对象" enable="true" class="com.dy.busi.server.rtuData.HAC_NBhV2_5.TkPipPreGenObjs">
                <!-- è¯†åˆ«æµæµªè€…管网水表,数据库中没有或数据库存在但未分配置供水机构 -->
                <task id="TkPipDealRtuTramp" name="识别流浪者管网水表" enable="true" class="com.dy.busi.server.rtuData.HAC_NBhV2_5.TkPipDealRtuTramp" />
                <!-- éžæµæµªè€…管网水表,必须放在TkDealRtuTramp后面 -->
                <task id="TkPipDealNoRtuTramp" name="非流浪者管网水表" enable="true" class="com.dy.busi.server.rtuData.HAC_NBhV2_5.TkPipDealNoRtuTramp">
                    <!-- è¯†åˆ«ä¸»åŠ¨ä¸ŠæŠ¥æ•°æ® -->
                    <task id="TkPipFindAutoReport" name="识别主动上报及触发上报数据" enable="true" class="com.dy.busi.server.rtuData.HAC_NBhV2_5.TkPipFindAutoReport">
                        <!-- æ£€æŸ¥æ—¶é—´ç­‰ä¸æ­£ç¡®çš„上报数据 -->
                        <task id="TkPipCheckAutoReport" name="检查时间等不正确的上报数据" enable="true" class="com.dy.busi.server.rtuData.HAC_NBhV2_5.autoReport.TkPipCheckAutoReport">
                            <task id="TkPipCheckRepeatAutoReport" name="检查重复上报数据" enable="true" class="com.dy.busi.server.rtuData.HAC_NBhV2_5.autoReport.TkPipCheckRepeatAutoReport">
                                <!-- Mn运维系统 -->
                                <task id="TkPipMnRtuDealAutoReportLastAlarm" name="运维管网水表上报最新报警" enable="true" class="com.dy.busi.server.rtuData.HAC_NBhV2_5.autoReport.TkPipMnRtuDealAutoReportLastAlarm" />
                                <!-- RTU主动上报数据必须在RTU主动上报报警任务的下面,以备主动上报数据中记录是否有报警-->
                                <task id="TkPipMnRtuDealAutoReportLastData" name="运维管网水表主动上报最新数据" enable="true" class="com.dy.busi.server.rtuData.HAC_NBhV2_5.autoReport.TkPipMnRtuDealAutoReportLastData" />
                                <!-- Org供水机构系统 -->
                                <task id="TkPipOrgRtuDealAutoReportLastAlarm" name="供水机构管网水表主动上报最新报警" enable="true" class="com.dy.busi.server.rtuData.HAC_NBhV2_5.autoReport.TkPipOrgRtuDealAutoReportLastAlarm">
                                    <task id="TkPipOrgRtuDealAutoReportAlarm" name="供水机构管网水表主动上报报警" enable="true" class="com.dy.busi.server.rtuData.HAC_NBhV2_5.autoReport.TkPipOrgRtuDealAutoReportAlarm" />
                                </task>
                                <!-- RTU主动上报数据必须在RTU主动上报报警任务的下面,以备主动上报数据中记录是否有报警-->
                                <task id="TkPipOrgRtuDealAutoReportLastData" name="供水机构管网水表主动上报最新数据" enable="true" class="com.dy.busi.server.rtuData.HAC_NBhV2_5.autoReport.TkPipOrgRtuDealAutoReportLastData">
                                    <task id="TkPipOrgRtuDealAutoReportData" name="供水机构管网水表主动上报数据" enable="true" class="com.dy.busi.server.rtuData.HAC_NBhV2_5.autoReport.TkPipOrgRtuDealAutoReportData" />
                                    <task id="TkPipOrgRtuDealAmount" name="供水机构管网水表月流量统计" enable="true" class="com.dy.busi.server.rtuData.HAC_NBhV2_5.autoReport.TkPipOrgRtuDealAmount" />
                                </task>
                            </task>
                        </task>
                    </task>
                </task>
            </task>
        </task>
    </task>
</task>
</project>
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/pom.xml
@@ -37,6 +37,21 @@
    </dependencies>
    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.yml</include>
                </includes>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <!-- è¯¥æ’件不会将项目中引入的依赖打进最终的 Jar æ–‡ä»¶ -->
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/rmiClient/RmiClUnit.java
@@ -101,7 +101,7 @@
            rqVo.id = id ;
            rqVo.token = token ;
            rqVo.code = Code.cd5 ;
            rqVo.count = count ;
            rqVo.overCount = count ;
            String json = rqVo.toJson() ;
            frmWork.syncRequest(json) ;
        } catch (Exception e) {
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/rmiClient/RmiRequestVo.java
@@ -9,9 +9,11 @@
    public String token ;
    
    public String code ;
    public Integer count;//aepTest上报数据数量
    public Integer overCount;//aepTest结束上报数据数量
    public Boolean over ;//aepTest上报数据结束
    
    public Long seconds ;//aepTest上报数据用时(秒)
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpClient/LocalDecoder.java
@@ -1,5 +1,8 @@
package com.dy.testClient.tcpClient;
import com.dy.common.util.ByteUtil;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.CumulativeProtocolDecoder;
@@ -8,6 +11,8 @@
import java.io.IOException;
public class LocalDecoder extends CumulativeProtocolDecoder {
    private static final Logger log = LogManager.getLogger(LocalDecoder.class) ;
    private static final String DECODER_STATE_KEY = LocalDecoder.class.getName() + ".STATE";
@@ -23,6 +28,7 @@
            byte[] preByte = new byte[remain];
            in.get(preByte) ;
            in.position(0) ;
            log.info("收到中心应答数据:" + ByteUtil.bytes2Hex(preByte, true));
        }
        return true;
    }
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpClient/MyThreadJob.java
@@ -6,16 +6,20 @@
import com.dy.common.threadPool.ThreadPool;
import com.dy.common.util.ByteUtil;
import com.dy.testClient.ServerProperties;
import org.apache.mina.core.future.CloseFuture;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.mina.core.session.IoSession;
public class MyThreadJob  implements ThreadPool.Job {
    private static final Logger log = LogManager.getLogger(MyThreadJob.class) ;
    public String rtuAddr;
    public String serverIp;
    public Integer serverPort;
    public IoSession session ;
    public boolean exceptionOnConnect = false ;
    public static final int connectTimeout = 3000 ;
@@ -34,12 +38,9 @@
    @Override
    public void execute() throws Exception {
        if(session == null){
            IoSession se = new TcpConnect().createSession(this.rtuAddr, this, this.serverIp, this.serverPort, connectTimeout, new TcpHandler()) ;
            if(se != null){
                this.session = se ;
            }
        }else{
        log.info("RTU" + rtuAddr + "开始任务");
        if(session != null){
            log.info("RTU" + rtuAddr + "将要执行" + ServerProperties.sendTimes + "轮次任务,当前轮次是" + sendTimes);
            if(sendTimes <= ServerProperties.sendTimes){
                sendDataOfP206V1_0_0() ;
            }else{
@@ -53,9 +54,11 @@
            if(heartbeatTimes >= ServerProperties.heartbeatTimes){
                heartbeatTimes = 0 ;
                this.sendReportData() ;
                TcpClUnit.clientSendData();
                sendTimes++ ;
            }else{
                this.sendHeartbeat() ;
                TcpClUnit.clientSendData();
                heartbeatTimes++ ;
            }
        }catch(Exception e){
@@ -66,23 +69,30 @@
        try{
            byte[] bs = this.createHeartbeat() ;
            this.session.write(bs) ;
            log.info("RTU" + rtuAddr + "发送了心跳数据:" + ByteUtil.bytes2Hex(bs, false));
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    private void sendReportData(){
        TcpClUnit.clientSendData();
        try{
            byte[] bs = this.createReport() ;
            this.session.write(bs) ;
            log.info("RTU" + rtuAddr + "发送了上报数据:" + ByteUtil.bytes2Hex(bs, false));
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    private void jobOver(){
        CloseFuture closeFuture = session.closeOnFlush() ;
        session.closeOnFlush() ;
        this.isOver = true ;
        TcpClUnit.clientOver() ;
    }
    /**
     * æž„造下行数据
     * æž„造心跳数据
     * @return å­—节数组
     * @throws Exception å¼‚常
     */
@@ -100,7 +110,7 @@
        bsHead[index] = ProtocolConstantV206V1_0_0.P_Head_Byte ;
        index++ ;
        bsHead[index] = commonV1_0_1.createCtrl((byte)0) ;
        bsHead[index] = commonV1_0_1.createCtrl((byte)0x80, (byte)0) ;//控制域功能码:确认 è®¤å¯
        index++ ;
        GlCreate.createRtuAddr(this.rtuAddr, bsHead, index);
@@ -115,7 +125,91 @@
        GlCreate.createLen(bytes);//长度放字节数组中
        bytes = GlCreate.createCrcTail(bytes) ;//CRC和尾叠加字节数组中
        byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾叠加字节数组中
        bytes = ByteUtil.bytesMerge(bytes, bsTail) ;
        return bytes ;
    }
    /**
     * æž„造上报数据
     * @return å­—节数组
     * @throws Exception å¼‚常
     */
    public byte[] createReport( ) throws Exception {
        CommonV1_0_1 commonV1_0_1 = new CommonV1_0_1() ;
        byte[] bytes ;
        byte[] bsHead = new byte[ProtocolConstantV206V1_0_0.lenHead2Code] ;
        byte index = 0 ;
        bsHead[index] = ProtocolConstantV206V1_0_0.P_Head_Byte ;
        index++ ;
        bsHead[index] = 0 ;//帧长度
        index++ ;
        bsHead[index] = ProtocolConstantV206V1_0_0.P_Head_Byte ;
        index++ ;
        bsHead[index] = commonV1_0_1.createCtrl((byte)0x80, (byte)3) ;//控制域功能码3:自报帧,流量(水量)参数
        index++ ;
        GlCreate.createRtuAddr(this.rtuAddr, bsHead, index);
        index += 5 ;
        ByteUtil.hex2Bytes("C0", bsHead, index) ;
        byte[] bs = new byte[2] ;
        bs[0] = (byte)0x04 ;//有流量数据
        bs[1] = (byte)0xE0 ;//有水压、电池电压、信号强度
        bytes = ByteUtil.bytesMerge(bsHead, bs) ;
        bs = new byte[5] ;//瞬时流量
        bs[0] = ByteUtil.int2BCD_LE (21)[0] ;
        bs[1] = ByteUtil.int2BCD_LE (43)[0] ;
        bs[2] = ByteUtil.int2BCD_LE (65)[0] ;
        bytes = ByteUtil.bytesMerge(bytes, bs) ;
        bs = new byte[5] ;//累计流量
        bs[0] = ByteUtil.int2BCD_LE (21)[0] ;
        bs[1] = ByteUtil.int2BCD_LE (43)[0] ;
        bs[2] = ByteUtil.int2BCD_LE (65)[0] ;
        bs[3] = ByteUtil.int2BCD_LE (87)[0] ;
        bytes = ByteUtil.bytesMerge(bytes, bs) ;
        bs = new byte[5] ;//损失流量
        bs[0] = ByteUtil.int2BCD_LE (10)[0] ;
        bs[1] = ByteUtil.int2BCD_LE (32)[0] ;
        bs[2] = ByteUtil.int2BCD_LE (54)[0] ;
        bytes = ByteUtil.bytesMerge(bytes, bs) ;
        bs = new byte[4] ;//水压
        bs[0] = ByteUtil.int2BCD_LE (10)[0] ;
        bs[1] = ByteUtil.int2BCD_LE (32)[0] ;
        bs[2] = ByteUtil.int2BCD_LE (4)[0] ;
        bytes = ByteUtil.bytesMerge(bytes, bs) ;
        bs = new byte[4] ;//电池电压
        bs[0] = ByteUtil.int2BCD_LE (10)[0] ;
        bs[1] = ByteUtil.int2BCD_LE (32)[0] ;
        bs[2] = ByteUtil.int2BCD_LE (10)[0] ;
        bs[3] = ByteUtil.int2BCD_LE (32)[0] ;
        bytes = ByteUtil.bytesMerge(bytes, bs) ;
        bs = new byte[1] ;//信号强度
        bs[0] = ByteUtil.int2BCD_LE (21)[0] ;
        bytes = ByteUtil.bytesMerge(bytes, bs) ;
        bs = new byte[6] ;//时钟
        GlCreate.createTp(bs, 0);
        bytes = ByteUtil.bytesMerge(bytes, bs) ;
        GlCreate.createLen(bytes);//长度放字节数组中
        byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾叠加字节数组中
        bytes = ByteUtil.bytesMerge(bytes, bsTail) ;
        return bytes ;
    }
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpClient/TcpClUnit.java
@@ -5,10 +5,12 @@
import com.dy.common.mw.UnitStartedCallbackInterface;
import com.dy.common.threadPool.ThreadPool;
import com.dy.common.threadPool.TreadPoolFactory;
import com.dy.common.util.Callback;
import com.dy.testClient.ServerProperties;
import com.dy.testClient.rmiClient.RmiClUnit;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.mina.core.session.IoSession;
import java.util.Collection;
import java.util.HashMap;
@@ -26,7 +28,7 @@
    private static ThreadPool.Pool pool ;
    private static Map<String, MyThreadJob> jobMap = new HashMap<>() ;
    private static Integer totalRunedClientCount = 0;
    private static Integer totalRtuClientCount = 0;
    private static Integer totalSendDataCount = 0;
    private static Integer totalOverClientCount = 0;
@@ -72,23 +74,46 @@
                        if(!ServerProperties.startWork){
                            Thread.sleep(100L);
                        }else{
                            startTime = System.currentTimeMillis() ;
                            for(Long addr = ServerProperties.rtuAddrStart; addr <= ServerProperties.rtuAddrEnd; addr++){
                                totalRunedClientCount++ ;
                                createImitate(addr) ;
                            }
                            startJob() ;
                            while(true){
                                if(totalOverClientCount.longValue() >= totalRunedClientCount.longValue()){
                                    Long seconds = (System.currentTimeMillis() - startTime)/1000 ;
                                    RmiClUnit.getInstance().allOver(seconds) ;
                                    System.out.println("共用时" + seconds + "秒");
                                    break ;
                                }else{
                                    Thread.sleep(100L);
                            try{
                                startTime = System.currentTimeMillis() ;
                                for(Long addr = ServerProperties.rtuAddrStart; addr <= ServerProperties.rtuAddrEnd; addr++){
                                    totalRtuClientCount++ ;
                                    createImitate(addr) ;
                                }
                                log.info("共模拟了" + totalRtuClientCount + "台RTU");
                                Collection<MyThreadJob> collection = jobMap.values() ;
                                for(MyThreadJob job : collection){
                                    connectServer(job) ;
                                }
                                log.info("启动所有RTU连接通信中间件");
                                while (true){
                                    int noConnectedCount = checkConnected() ;
                                    if(noConnectedCount > 0){
                                        log.info("等待" + noConnectedCount + "台RTU连接网络");
                                        Thread.sleep(100L);
                                    }else{
                                        break ;
                                    }
                                }
                                startJob() ;
                                while(true){
                                    if(totalOverClientCount.longValue() >= totalRtuClientCount.longValue()){
                                        Long seconds = (System.currentTimeMillis() - startTime)/1000 ;
                                        RmiClUnit.getInstance().allOver(seconds) ;
                                        log.info("共用时" + seconds + "秒");
                                        break ;
                                    }else{
                                        Thread.sleep(100L);
                                    }
                                }
                            }catch (Exception e){
                                e.printStackTrace();
                            }finally {
                                break ;
                            }
                            break;
                        }
                    }
                } catch (Exception e) {
@@ -106,18 +131,71 @@
        jobMap.put("" + rtuAddr, new MyThreadJob("" + rtuAddr, ServerProperties.tcpServerIp, ServerProperties.tcpServerPort)) ;
    }
    private void connectServer(MyThreadJob job){
        if(job.session == null){
            try{
                new TcpConnect().createSession(job.rtuAddr,
                        job,
                        job.serverIp,
                        job.serverPort,
                        job.connectTimeout,
                        new TcpHandler(),
                        new Callback() {
                            @Override
                            public void call(Object obj) {
                                if(obj == null){
                                    log.error("创建网络会话返回为null");
                                }else{
                                    job.session = (IoSession)obj ;
                                }
                            }
                            @Override
                            public void call(Object... objs) {
                            }
                            @Override
                            public void exception(Exception e) {
                            }
                        }) ;
            }catch (Exception e){
                job.exceptionOnConnect = true ;
                e.printStackTrace();
            }
        }
    }
    private int checkConnected(){
        int noConnectedCount = 0 ;
        Collection<MyThreadJob> collection = jobMap.values() ;
        for(MyThreadJob job : collection){
            if(job.session == null && !job.exceptionOnConnect){
                noConnectedCount++ ;
            }
        }
        return noConnectedCount;
    }
    private void startJob(){
        new Thread(new Runnable(){
            @Override
            public void run() {
                try {
                    Thread.sleep(1000L);
                    int notOverCount;
                    while(true){
                        notOverCount = 0 ;
                        Collection<MyThreadJob> collection = jobMap.values() ;
                        for(MyThreadJob job : collection){
                            pool.putJob(job);
                            if(!job.isOver){
                                notOverCount++ ;
                                pool.putJob(job);
                            }
                        }
                        Thread.sleep(ServerProperties.sendInterval * 1000);
                        if(notOverCount > 0){
                            log.info("当前还有" + notOverCount + "台RTU未完成任务");
                            Thread.sleep(ServerProperties.sendInterval * 1000);
                        }else{
                            break ;
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
@@ -129,17 +207,37 @@
    public static synchronized void clientSendData(){
        totalSendDataCount++;
        if(totalSendDataCount % 100 == 0){
        if(totalOverClientCount.longValue() >= totalRtuClientCount.longValue()){
            RmiClUnit.getInstance().reportHadReportCount(totalSendDataCount);
            System.out.println("已经发送" + totalSendDataCount + "条数据");
        }else{
            if(totalRtuClientCount > 100){
                if(totalSendDataCount % 100 == 0){
                    RmiClUnit.getInstance().reportHadReportCount(totalSendDataCount);
                    System.out.println("已经发送" + totalSendDataCount + "条数据");
                }
            }else{
                RmiClUnit.getInstance().reportHadReportCount(totalSendDataCount);
                System.out.println("已经发送" + totalSendDataCount + "条数据");
            }
        }
    }
    public static synchronized void clientOver(){
        totalOverClientCount++;
        if(totalOverClientCount % 100 == 0){
        if(totalOverClientCount.longValue() >= totalRtuClientCount.longValue()){
            RmiClUnit.getInstance().reportHadReportOver(totalOverClientCount);
            System.out.println("已有" + totalOverClientCount + "完成了任务");
            System.out.println("已有" + totalOverClientCount + "个RTU完成了任务");
        }else{
            if(totalRtuClientCount > 100) {
                if (totalOverClientCount % 100 == 0) {
                    RmiClUnit.getInstance().reportHadReportOver(totalOverClientCount);
                    System.out.println("已有" + totalOverClientCount + "个RTU完成了任务");
                }
            }else{
                RmiClUnit.getInstance().reportHadReportOver(totalOverClientCount);
                System.out.println("已有" + totalOverClientCount + "个RTU完成了任务");
            }
        }
    }
}
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpClient/TcpConnect.java
@@ -1,5 +1,6 @@
package com.dy.testClient.tcpClient;
import com.dy.common.util.Callback;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
@@ -28,9 +29,18 @@
     * @param job rtu工作类
     * @param host æœåС噍URI
     * @param port æœåŠ¡å™¨ç«¯å£
     * @param connectTimeout è¿žæŽ¥è¶…æ—¶æ—¶é•¿
     * @param handler æ•°æ®å¤„理者
     * @param callback å›žè°ƒ
     * @return ç½‘络会话
     */
    public IoSession createSession(String rtuAddr, MyThreadJob job, String host , int port , int connectTimeout , TcpHandler handler) throws Exception{
    public void createSession(String rtuAddr,
                                   MyThreadJob job,
                                   String host ,
                                   int port ,
                                   int connectTimeout ,
                                   TcpHandler handler,
                                   Callback callback) throws Exception{
        SocketConnector connector = new NioSocketConnector();
        connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new LocalCodecFactory()));
        connector.setHandler(handler);
@@ -39,7 +49,7 @@
        IoSession se = connectFuture.getSession();
        se.setAttribute(rtuAddrKey, rtuAddr) ;
        se.setAttribute(threadJobKey, job) ;
        return se ;
        callback.call(se) ;
    }
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-server/src/main/java/com/dy/testServer/console/Command.java
@@ -108,6 +108,9 @@
                    if(sta.count != null){
                        prtWrt.println("    å·²ç»ä¸ŠæŠ¥æ•°æ®ï¼š" + sta.count + "条");
                    }
                    if(sta.overCount != null){
                        prtWrt.println("    å·²ç»å®Œæˆä¸ŠæŠ¥æ•°æ®ï¼š" + sta.overCount + "台RTU");
                    }
                    if(sta.over != null && sta.over){
                        prtWrt.println("    ä¸ŠæŠ¥æ•°æ®å·²ç»å®Œæˆï¼Œå…±ç”¨æ—¶ï¼š" + sta.seconds + "秒");
                    }
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-server/src/main/java/com/dy/testServer/forRmi/Manager.java
@@ -161,10 +161,10 @@
        MwTestClientStatus sta = token2ClientMap.get("" + token);
        if(sta == null){
            sta = new MwTestClientStatus() ;
            sta.overCount = rqVo.count ;
            sta.overCount = rqVo.overCount ;
            token2ClientMap.put("" + token, sta);
        }else{
            sta.count = rqVo.count ;
            sta.overCount = rqVo.overCount ;
        }
    }
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-server/src/main/java/com/dy/testServer/forRmi/RmiRequestVo.java
@@ -11,7 +11,9 @@
    public String code ;
    
    public Integer count;//mwTest上报数据数量
    public Integer overCount;//aepTest结束上报数据数量
    public Boolean over ;//mwTest上报数据结束
    
    public Long seconds ;//mwTest上报数据用时(秒)
@@ -83,5 +85,12 @@
    public void setSeconds(Long seconds) {
        this.seconds = seconds;
    }
    public Integer getOverCount() {
        return overCount;
    }
    public void setOverCount(Integer overCount) {
        this.overCount = overCount;
    }
}