Administrator
2024-07-16 ee711d38f66222915bc81332c98af677fa5cd96c
Merge branch 'master' of http://8.140.179.55:20000/r/pipIrr-SV
16个文件已修改
11个文件已添加
849 ■■■■■ 已修改文件
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/ByteUtil.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/ByteUtilUnsigned.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/RtuDataNode.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1_0_0/TkDealClientAmountDay.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1_0_0/TkDealControllerNoTramp.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1_0_0/TkDealIntakeAmountDay.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1_0_0/TkFindP206V1_0_0.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1_0_0/TkPreGenObjs.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V202404/TkDealControllerNoTrampV202404.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V202404/TkFindP206V202404.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/application-database.yml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-mwTest-rtu/src/main/java/com/dy/pipIrrMwTestRtu/PipIrrMwTestRtuApplication.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-mwTest-rtu/src/main/java/com/dy/pipIrrMwTestRtu/Server.java 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-mwTest-rtu/src/main/java/com/dy/pipIrrMwTestRtu/ServerProperties.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-mwTest-rtu/src/main/java/com/dy/pipIrrMwTestRtu/p206V1_0_0/RtuP206V1_0_0Ctrl.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-mwTest-rtu/src/main/java/com/dy/pipIrrMwTestRtu/tcpClient/LocalEncoder.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-mwTest-rtu/src/main/java/com/dy/pipIrrMwTestRtu/tcpClient/TcpClUnit.java 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-mwTest-rtu/src/main/java/com/dy/pipIrrMwTestRtu/tcpClient/TcpClUnitConfigVo.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-mwTest-rtu/src/main/java/com/dy/pipIrrMwTestRtu/tcpClient/TcpHandler.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-mwTest-rtu/src/main/java/com/dy/pipIrrMwTestRtu/tcpClient/upData/UpCd83Close.java 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-mwTest-rtu/src/main/java/com/dy/pipIrrMwTestRtu/tcpClient/upData/UpCd83Open.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-mwTest-rtu/src/main/java/com/dy/pipIrrMwTestRtu/tcpClient/upData/UpConstant.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-mwTest-rtu/src/main/java/com/dy/pipIrrMwTestRtu/tcpClient/upData/UpData.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-mwTest-rtu/src/main/java/com/dy/pipIrrMwTestRtu/tcpClient/upData/UpHeartBeat.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-mwTest-rtu/src/main/resources/Config.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-mwTest-rtu/说明.txt 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-mwTest-web/说明.txt 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/ByteUtil.java
@@ -511,9 +511,9 @@
            for (int i = 0; i < 4; i++) {
                bs[from + i] = Integer.valueOf(value & 0xff).byteValue();// å°†æœ€ä½Žä½ä¿å­˜åœ¨ä½Žå­—节
                value = value >> 8; // å‘右移8位
            if(value == 0){
                break ;
            }
                if(value == 0){
                    break ;
                }
            }
        } else {
            throw new Exception("int2Bytes时数组越界");
@@ -1210,6 +1210,31 @@
    }
    /**
     * å°ç«¯æ¨¡å¼ã€Šæ•°æ®ä½Žä½åœ¨æ•°ç»„低字节》
     * æ•´å½¢è½¬æˆBCD编码,字节顺序是倒的
     * @param i
     * @param bs
     * @param from
     * @return è¿”回
     */
    public static void int2BCD_LE(int i, byte[] bs, int from)throws Exception {
        String str = "" + i;
        byte[] b = null;
        if (str.length() % 2 == 0) {
            b = new byte[str.length() / 2];
        } else {
            b = new byte[(str.length() / 2) + 1];
        }
        encodeBCD_LE(str, b, 0, b.length);
        int len = bs.length ;
        int bLen = b.length ;
        for(int j = 0; (j < len && j < bLen); j++){
            bs[from + j] = b[j] ;
        }
    }
    /**
     * å¤§ç«¯æ¨¡å¼ã€Šæ•°æ®ä½Žä½åœ¨æ•°ç»„高字节》
     * é•¿æ•´å½¢è½¬æˆBCD编码
     * @param l
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/ByteUtilUnsigned.java
@@ -60,7 +60,7 @@
        }
        boolean b = isOutOfArrLength(bs.length, (from - 1) + len);
        if (!b) {
            for (int i = 0; i > len ; i++) {
            for (int i = 0; i <= len ; i++) {
                bs[from + i] = Integer.valueOf(temp & 0xff).byteValue();// å°†æœ€ä½Žä½ä¿å­˜åœ¨ä½Žå­—节
                temp = temp >> 8; // å‘右移8位
            }
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/RtuDataNode.java
@@ -34,8 +34,9 @@
                                log.error("未得到RTU主动上报数据处理任务!");
                            }
                        }catch(Exception e){
                            log.error("上行数据任务池处理数据时发生异常", e);
                        }finally {
                            if(task != null){
                                //当有异常时,try catch中的代码可没有执行freeAndCleanTask
                                TaskPool.freeAndCleanTask(task);
                            }
                        }
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1_0_0/TkDealClientAmountDay.java
@@ -108,12 +108,10 @@
                        poHistory = this.updateRmClientAmountBySameDateNewData(clientVo, poHistory, poLast, dV1_0_1, cdData);
                        sv.updateRmClientAmountDay(poHistory);
                    }
                    sv.saveRmClientAmountLast(poLast);
                }else if(upYmd.after(poLast.dt)){
                    //新的日期
                    poLast = this.updateRmClientAmountLastByNewDateNewData(clientVo, dV1_0_1, cdData, poLast);
                    this.newAndSaveHistoryDataDeal(sv, clientVo, dV1_0_1, cdData, poLast);
                    sv.saveRmClientAmountLast(poLast);
                }else{
                    //这种情况不存在
                }
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1_0_0/TkDealControllerNoTramp.java
@@ -1,8 +1,10 @@
package com.dy.rtuMw.server.rtuData.p206V1_0_0;
import com.dy.common.mw.protocol.Data;
import com.dy.common.mw.protocol.p206V1_0_0.DataV1_0_1;
import com.dy.common.mw.protocol.p206V1_0_0.upVos.DataCd02Vo;
import com.dy.pipIrrGlobal.pojoPr.PrControllerTramp;
import com.dy.rtuMw.server.rtuData.TaskSurpport;
import com.dy.rtuMw.server.rtuData.dbSv.DbSv;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -26,10 +28,21 @@
     */
    @Override
    public void execute(Object data) {
        Data d = (Data)data ;
        Object[] objs = this.getTaskResults(TkPreGenObjs.taskId) ;
        PrControllerTramp tramp = (PrControllerTramp)objs[2] ;
        if(tramp == null){
            this.toNextTasks(data);
            boolean toNext = true ;
            if(d.getSubData() != null) {
                DataV1_0_1 dataV1_0_1 = (DataV1_0_1)d.getSubData() ;
                if(dataV1_0_1 != null && dataV1_0_1.subData != null && dataV1_0_1.subData instanceof DataCd02Vo){
                    //过滤掉心跳数据
                    toNext = false ;
                }
            }
            if(toNext){
                this.toNextTasks(data);
            }
        }
    }
}
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1_0_0/TkDealIntakeAmountDay.java
@@ -107,7 +107,6 @@
                        poLast = this.updateRmIntakeAmountLastByControllerChange(poLast, controller, rtuAddr, dV1_0_1, dataVo);
                        this.newAndSaveHistoryDataDeal(sv, controller, rtuAddr, dV1_0_1, dataVo, poLast);
                    }
                    sv.saveRmIntakeAmountLast(poLast);
                }else{
                    //未更换控制器
                    if(DateTime.dateFrom_yyyy_MM_dd1(dV1_0_1.dt).equals(poLast.dt)){
@@ -123,12 +122,10 @@
                            poHistory = this.updateRmIntakeAmountBySameDateNewData(poHistory, poLast, controller, rtuAddr, dV1_0_1, dataVo);
                            sv.updateRmIntakeAmountDay(poHistory);
                        }
                        sv.saveRmIntakeAmountLast(poLast);
                    }else if(DateTime.dateFrom_yyyy_MM_dd1(dV1_0_1.dt).after(poLast.dt)){
                        //新的日期
                        poLast = this.updateRmIntakeAmountLastByNewDateNewData(poLast, controller, rtuAddr, dV1_0_1, dataVo);
                        this.newAndSaveHistoryDataDeal(sv, controller, rtuAddr, dV1_0_1, dataVo, poLast);
                        sv.saveRmIntakeAmountLast(poLast);
                    }else{
                        //这种情况不存在
                    }
@@ -245,9 +242,13 @@
        //lastPo.dt = DateTime.dateFrom_yyyy_MM_dd1(dV1_0_1.dt);//日期没变
        lastPo.dtLast = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dV1_0_1.dt);
        lastPo.rtuDtLast = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(cdData.rtuDt);
        Double difference = cdData.totalAmount - lastPo.totalAmountLast ;
        if(difference > 0){
            lastPo.amount = difference;
        Double added = cdData.totalAmount - lastPo.totalAmountLast ;
        if(added > 0){
            if(lastPo.amount == null){
                lastPo.amount = added ;
            }else{
                lastPo.amount += added ;
            }
        }else{
            //po.amount = po.amount ; //日累计取水量不变
        }
@@ -271,9 +272,10 @@
        lastPo.dt = DateTime.dateFrom_yyyy_MM_dd1(dV1_0_1.dt);//日期变了
        lastPo.dtLast = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dV1_0_1.dt);
        lastPo.rtuDtLast = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(cdData.rtuDt);
        Double difference = cdData.totalAmount - lastPo.totalAmountLast ;
        if(difference > 0){
            lastPo.amount = difference;
        Double added = cdData.totalAmount - lastPo.totalAmountLast ;
        if(added > 0){
            //新的一天的处理方式与同一天的处理方式不一样
            lastPo.amount = added;
        }else{
            lastPo.amount = 0.0D; //日累计水量归0
        }
@@ -321,7 +323,7 @@
        po.dtLast = lastPo.dtLast;
        po.rtuDtLast = lastPo.rtuDtLast;
        po.amount = lastPo.amount ;
        po.amount = lastPo.amount ;//此时lastPo.amount已经增加上了增量
        po.totalAmountLast = lastPo.totalAmountLast ;
        return po ;
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1_0_0/TkFindP206V1_0_0.java
@@ -21,18 +21,7 @@
        Data d = (Data)data ;
        if(d.getProtocol() != null && d.getProtocol().equals(ProtocolConstantV206V1_0_0.protocolName)){
            //识别出是P206V1.0.0协议数据
            //无命令ID
            boolean toNext = true ;
            if(d.getSubData() != null) {
                DataV1_0_1 dataV1_0_1 = (DataV1_0_1)d.getSubData() ;
                if(dataV1_0_1 != null && dataV1_0_1.subData != null && dataV1_0_1.subData instanceof DataCd02Vo){
                    //过滤掉心跳数据
                    toNext = false ;
                }
            }
            if(toNext){
                this.toNextTasks(data);
            }
            this.toNextTasks(data);
        }else{
            //不是本协议的数据
        }
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1_0_0/TkPreGenObjs.java
@@ -20,8 +20,12 @@
import java.text.ParseException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class TkPreGenObjs extends TaskSurpport {
    private static final Map<String, Boolean> onceUpDataRtus = new HashMap<>();
    
    private static final Logger log = LogManager.getLogger(TkPreGenObjs.class.getName()) ;
@@ -36,6 +40,19 @@
    public void execute(Object data) throws ParseException {
        Data d = (Data)data ;
        String rtuAddr = d.getRtuAddr() ;//TkRtuData里判断了rtuAddr为空
        if(d.subData != null && d.subData instanceof DataV1_0_1){
            DataV1_0_1 dataV1_0_1 = (DataV1_0_1)d.subData ;
            if(dataV1_0_1.subData != null && dataV1_0_1.subData instanceof DataCd02Vo){
                //过滤掉心跳数据
                if(onceUpDataRtus.containsKey(rtuAddr)){
                    return ;
                }
            }
        }
        if(!onceUpDataRtus.containsKey(rtuAddr)){
            onceUpDataRtus.put(rtuAddr, true) ;
        }
        DbSv sv = (DbSv)SpringContextUtil.getBean(DbSv.class) ;
        if(sv != null){
            PrController controller = sv.getControllersByRtuAddrAndIntakeNotNull(rtuAddr) ;
@@ -53,8 +70,7 @@
                }
            }else{
                if(d.subData != null && d.subData instanceof DataV1_0_1){
                    DataV1_0_1 d1 = (DataV1_0_1)d.subData ;
                    clientVo = this.getClient(sv, d1);
                    clientVo = this.getClient(sv, (DataV1_0_1)d.subData);
                }
            }
            //不论是否为流浪控制器(RTU实体),都要进行下步工作,记录其上报的一些数据,当绑定控制器后,数据自动有了归属
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V202404/TkDealControllerNoTrampV202404.java
@@ -1,8 +1,10 @@
package com.dy.rtuMw.server.rtuData.p206V202404;
import com.dy.common.mw.protocol.Data;
import com.dy.common.mw.protocol.p206V202404.DataV202404;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd02Vo;
import com.dy.pipIrrGlobal.pojoPr.PrControllerTramp;
import com.dy.rtuMw.server.rtuData.TaskSurpport;
import com.dy.rtuMw.server.rtuData.dbSv.DbSv;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -26,10 +28,22 @@
     */
    @Override
    public void execute(Object data) {
        Data d = (Data)data ;
        Object[] objs = this.getTaskResults(TkPreGenObjsV202404.taskId) ;
        PrControllerTramp tramp = (PrControllerTramp)objs[2] ;
        if(tramp == null){
            this.toNextTasks(data);
            //无命令ID
            boolean toNext = true ;
            if(d.getSubData() != null) {
                DataV202404 dataV202404 = (DataV202404)d.getSubData() ;
                if(dataV202404 != null && dataV202404.subData != null && dataV202404.subData instanceof DataCd02Vo){
                    //过滤掉心跳数据
                    toNext = false ;
                }
            }
            if(toNext){
                this.toNextTasks(data);
            }
        }
    }
}
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V202404/TkFindP206V202404.java
@@ -23,18 +23,7 @@
        Data d = (Data)data ;
        if(d.getProtocol() != null && d.getProtocol().equals(ProtocolConstantV206V202404.protocolName)){
            //识别出是P206V202404协议数据
            //无命令ID
            boolean toNext = true ;
            if(d.getSubData() != null) {
                DataV202404 dataV202404 = (DataV202404)d.getSubData() ;
                if(dataV202404 != null && dataV202404.subData != null && dataV202404.subData instanceof DataCd02Vo){
                    //过滤掉心跳数据
                    toNext = false ;
                }
            }
            if(toNext){
                this.toNextTasks(data);
            }
            this.toNextTasks(data);
        }else{
            //不是本协议的数据
        }
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/application-database.yml
@@ -4,8 +4,7 @@
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
#        url: jdbc:mysql://192.168.40.166:3306/pipIrr_ym?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&zeroDateTimeBehavior=convertToNull
        url: jdbc:mysql://127.0.0.1:3306/pipIrr_ym?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&zeroDateTimeBehavior=convertToNull
#        url: jdbc:mysql://8.140.179.55:3306/pipIrr_ym?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&zeroDateTimeBehavior=convertToNull
        url: jdbc:mysql://192.168.40.166:3306/pipIrr_ym?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&zeroDateTimeBehavior=convertToNull
        username: root
        password: dysql,;.abc!@#
        druid:
pipIrr-platform/pipIrr-web/pipIrr-mwTest-rtu/src/main/java/com/dy/pipIrrMwTestRtu/PipIrrMwTestRtuApplication.java
@@ -1,5 +1,7 @@
package com.dy.pipIrrMwTestRtu;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
@@ -24,10 +26,43 @@
                })
        }
)
public class PipIrrMwTestRtuApplication{
public class PipIrrMwTestRtuApplication implements CommandLineRunner {
    public static void main(String[] args) {
        SpringApplication.run(PipIrrMwTestRtuApplication.class, args);
    }
    /**
     * Spring容器启动完成后,执行下面方法
     * @param args å‚æ•°
     * @throws Exception å¼‚常
     */
    @Override
    public void run(String... args) throws Exception {
        try{
            //等待一下
            Thread.sleep(500L);
        }catch (Exception e){
            e.printStackTrace();
        }
        finally {
            this.startMwSv() ;
        }
    }
    private void startMwSv(){
        if(sv != null){
            sv.startServer();
        }
    }
    private Server sv ;
    @Autowired
    public void setSv(Server sv){
        this.sv = sv ;
    }
}
pipIrr-platform/pipIrr-web/pipIrr-mwTest-rtu/src/main/java/com/dy/pipIrrMwTestRtu/Server.java
New file
@@ -0,0 +1,116 @@
package com.dy.pipIrrMwTestRtu;
import com.dy.common.mw.UnitInterface;
import com.dy.common.util.ConfigXml;
import com.dy.pipIrrMwTestRtu.tcpClient.TcpClUnit;
import com.dy.pipIrrMwTestRtu.tcpClient.TcpClUnitConfigVo;
import org.jdom2.Document;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
/**
 * @Author: liurunyu
 * @Date: 2024/7/12 8:50
 * @Description
 */
@Component
public class Server {
    private ConfigXml conf = null ;
    private Document doc = null ;
    private boolean showStartInfo = false ;
    private String mwServerUrl ;
    private List<UnitInterface> units = new ArrayList<UnitInterface>() ;
    /*
     * @param args å‚æ•°
    public static void main(String[] args) {
        new Server().startServer();
    }
    */
    /**
     * å¯åŠ¨æœåŠ¡
     */
    public void startServer(){
        long start = System.currentTimeMillis() ;
        try {
            //ConfigProperties.init(this.getClass().getResourceAsStream("/config/config.properties"), false);
            this.conf = new ConfigXml() ;
            this.doc = this.conf.createDom(this.getClass(), "config.xml") ;
            ////////////////
            //服务 é…ç½®
            this.showStartInfo = this.conf.getSetAttrBoolean(this.doc, "config.server", "showStartInfo", null, null) ;
            this.startUnits() ;
            String svName ;
            try{
                svName = this.conf.getSetAttrTxt(this.doc, "config.server", "name", null, false, null) ;
            }catch(Exception e){
                svName = "" ;
            }
            String company ;
            try{
                company = this.conf.getSetAttrTxt(this.doc, "config.server", "company", null, true, null) ;
            }catch(Exception e){
                company = "" ;
            }
            System.out.println("OOOOOOOOOO           OOOOOOOO       OOOOOOOO") ;
            System.out.println("@@@@@@@@@@@@@@@@#O    $@@@@@@@@&    @@@@@@@@#") ;
            System.out.println("@@@@@@@@@@@@@@@@@@@#    @@@@@@@@# $@@@@@@@@&") ;
            System.out.println("@@@@@@@@@@@@@@@@@@@@@#   #@@@@@@@@@@@@@@@@O") ;
            System.out.println("@@@@@@@@@@@@@@@@@@@@@@@   &@@@@@@@@@@@@@@") ;
            System.out.println("@@@@@@$      $@@@@@@@@@&   O@@@@@@@@@@@#") ;
            System.out.println("@@@@@@$        @@@@@@@@@     @@@@@@@@@&      " + svName ) ;
            System.out.println("@@@@@@$       O@@@@@@@@@     &@@@@@@@@") ;
            if(this.mwServerUrl != null){
                System.out.println("@@@@@@$       O@@@@@@@@@     &@@@@@@@@       ä¸­é—´ä»¶æœåŠ¡ç«¯ " + this.mwServerUrl ) ;
            }else{
                System.out.println("@@@@@@$       O@@@@@@@@@     &@@@@@@@@") ;
            }
            System.out.println("@@@@@@$      #@@@@@@@@@$     &@@@@@@@@" ) ;
            System.out.println("@@@@@@@@@@@@@@@@@@@@@@#      &@@@@@@@@       Runing in standalone mode" ) ;
            System.out.println("@@@@@@@@@@@@@@@@@@@@@&       &@@@@@@@@       Startup in " + (System.currentTimeMillis() - start) + " MS" ) ;
            System.out.println("@@@@@@@@@@@@@@@@@@@#         &@@@@@@@@       " + company) ;
            System.out.println("@@@@@@@@@@@@@@@@#O           &@@@@@@@@") ;
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    private void startUnits() {
        try {
            // ///////////////
            // åŸºç¡€é…ç½®
            ServerProperties.rtuAddr = conf.getSetAttrTxt(doc, "config.base", "rtuAddr", null, false, null);
            ServerProperties.icCardAddr = conf.getSetAttrTxt(doc, "config.base", "icCardAddr", null, false, null);
            ServerProperties.icCardNo = conf.getSetAttrTxt(doc, "config.base", "icCardNo", null, false, null);
            // ///////////////
            // TCP æ¨¡å—
            TcpClUnitConfigVo tcpVo = new TcpClUnitConfigVo();
            tcpVo.mwServerIp = conf.getSetAttrTxt(doc, "config.tcpCl", "mwServerIp", null, false, null);
            tcpVo.mwServerPort = conf.getSetAttrPlusInt(doc, "config.tcpCl", "mwServerPort", null, 100, 65535, null);
            tcpVo.connectTimeout = conf.getSetAttrPlusInt(doc, "config.tcpCl", "connectTimeout", null, 1000, 10000, null);
            this.mwServerUrl = tcpVo.mwServerIp + ":" + tcpVo.mwServerPort ;
            AdapterImp_TcpClUnit tcpAdap = new AdapterImp_TcpClUnit();
            tcpAdap.setConfig(tcpVo);
            TcpClUnit tcpUnit = TcpClUnit.getInstance();
            tcpUnit.setAdapter(tcpAdap);
            tcpUnit.start(obj -> {
            });
            units.add(tcpUnit) ;
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
pipIrr-platform/pipIrr-web/pipIrr-mwTest-rtu/src/main/java/com/dy/pipIrrMwTestRtu/ServerProperties.java
New file
@@ -0,0 +1,12 @@
package com.dy.pipIrrMwTestRtu;
/**
 * @Author: liurunyu
 * @Date: 2024/7/12 8:19
 * @Description
 */
public class ServerProperties {
    public static String rtuAddr ;
    public static String icCardAddr ;
    public static String icCardNo ;
}
pipIrr-platform/pipIrr-web/pipIrr-mwTest-rtu/src/main/java/com/dy/pipIrrMwTestRtu/p206V1_0_0/RtuP206V1_0_0Ctrl.java
New file
@@ -0,0 +1,49 @@
package com.dy.pipIrrMwTestRtu.p206V1_0_0;
import com.dy.common.webUtil.BaseResponse;
import com.dy.pipIrrMwTestRtu.tcpClient.upData.UpCd83Close;
import com.dy.pipIrrMwTestRtu.tcpClient.upData.UpCd83Open;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * @Author: liurunyu
 * @Date: 2024/6/29 6:46
 * @Description
 */
@Slf4j
@RestController
@RequestMapping(path="rtuP206V1_0_0")
@SuppressWarnings("unchecked")//java版本越高,对泛型约束越严,所以配置SuppressWarnings("unchecked")
public class RtuP206V1_0_0Ctrl {
    @GetMapping(path = "test")
    public BaseResponse<String> test(String com) {
        if(com.equals("83Open")){
            this.cd83Open() ;
        }else if(com.equals("83Close")){
            this.cd83Close() ;
        }
        BaseResponse<String> rt = new BaseResponse<String>() ;
        rt.setCode("001") ;
        rt.setMsg("已经上报数据") ;
        rt.setSuccess(true) ;
        return rt ;
    }
    private void cd83Open(){
        UpCd83Open.upCd83Data();
    }
    private void cd83Close(){
        UpCd83Close.upCd83Data();
    }
}
pipIrr-platform/pipIrr-web/pipIrr-mwTest-rtu/src/main/java/com/dy/pipIrrMwTestRtu/tcpClient/LocalEncoder.java
@@ -19,7 +19,7 @@
     */
    public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws IOException, Exception{
        byte[] data = (byte[])message;
        log.info("下行数据:" + ByteUtil.bytes2Hex(data, true));
        //log.info("上行数据:" + ByteUtil.bytes2Hex(data, true));
        out.write(IoBuffer.allocate((data==null?0:data.length), false).put(data).flip());
    }
pipIrr-platform/pipIrr-web/pipIrr-mwTest-rtu/src/main/java/com/dy/pipIrrMwTestRtu/tcpClient/TcpClUnit.java
New file
@@ -0,0 +1,124 @@
package com.dy.pipIrrMwTestRtu.tcpClient;
import com.dy.common.mw.UnitAdapterInterface;
import com.dy.common.mw.UnitInterface;
import com.dy.common.mw.UnitStartedCallbackInterface;
import com.dy.common.util.Callback;
import com.dy.pipIrrMwTestRtu.ServerProperties;
import com.dy.pipIrrMwTestRtu.tcpClient.upData.UpData;
import com.dy.pipIrrMwTestRtu.tcpClient.upData.UpHeartBeat;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.mina.core.session.IoSession;
public class TcpClUnit implements UnitInterface {
    private static final Logger log = LogManager.getLogger(TcpClUnit.class) ;
    private static TcpClUnit instance = new TcpClUnit() ;
    public static TcpClUnitAdapter adapter ;
    public static TcpClUnitConfigVo confVo ;
    public static IoSession session ;
    private TcpClUnit(){} ;
    public static TcpClUnit getInstance(){
        return instance ;
    }
    @Override
    public void setAdapter(UnitAdapterInterface adapter) throws Exception {
        if(adapter == null){
            throw new Exception("Tcp Client模块适配器对象不能为空!") ;
        }
        TcpClUnit.adapter = (TcpClUnitAdapter)adapter ;
        TcpClUnit.confVo = TcpClUnit.adapter.getConfig() ;
        if(TcpClUnit.confVo == null){
            throw new Exception("Tcp Client模块配置对象不能为空!") ;
        }
    }
    @Override
    public void start(UnitStartedCallbackInterface callback) throws Exception {
        System.out.println("Tcp Client模块成功启动");
        this.doStart();
        callback.call(null) ;
    }
    @Override
    public void stop(UnitStartedCallbackInterface callback) throws Exception {
        callback.call(null);
    }
    private void doStart(){
        new Thread(new Runnable(){
            @Override
            public void run() {
                Exception ex = null ;
                while(true){
                    ex = null ;
                    try {
                        new TcpConnect().createSession(
                                confVo.mwServerIp,
                                confVo.mwServerPort,
                                confVo.connectTimeout,
                                new TcpHandler(),
                                new Callback() {
                                    @Override
                                    public void call(Object obj) {
                                        if (obj == null) {
                                            log.error("创建网络会话返回为null");
                                        } else {
                                            TcpClUnit.session = (IoSession) obj;
                                            log.info("成功创建与通信中间件的网络连接");
                                            UpData.setSession(TcpClUnit.session);
                                            heartBeat() ;
                                        }
                                    }
                                    @Override
                                    public void call(Object... objs) {
                                    }
                                    @Override
                                    public void exception(Exception e) {
                                    }
                                });
                    }catch (Exception e){
                       ex = e ;
                    }
                    if(ex == null){
                        break ;
                    }else{
                        try{
                            Thread.sleep(100);
                        }catch (Exception e){
                        }
                    }
                }
            }
        }).start();
    }
    private void heartBeat(){
        new Thread(new Runnable(){
            @Override
            public void run() {
                while(true){
                    try {
                        UpHeartBeat.upCd02Data(ServerProperties.rtuAddr);
                        Thread.sleep(30000L);
                        //Thread.sleep(30000000L);
                    }catch (Exception e){
                        continue;
                    }
                }
            }
        }).start();
    }
}
pipIrr-platform/pipIrr-web/pipIrr-mwTest-rtu/src/main/java/com/dy/pipIrrMwTestRtu/tcpClient/TcpClUnitConfigVo.java
@@ -3,4 +3,5 @@
public class TcpClUnitConfigVo {
    public String  mwServerIp ;
    public Integer  mwServerPort ;
    public Integer  connectTimeout ;
}
pipIrr-platform/pipIrr-web/pipIrr-mwTest-rtu/src/main/java/com/dy/pipIrrMwTestRtu/tcpClient/TcpHandler.java
@@ -1,5 +1,6 @@
package com.dy.pipIrrMwTestRtu.tcpClient;
import com.dy.common.util.ByteUtil;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.mina.core.service.IoHandlerAdapter;
@@ -16,6 +17,7 @@
     */
    @Override
    public void sessionCreated(IoSession session) throws Exception {
        super.sessionCreated(session);
    }
    /**
@@ -23,6 +25,7 @@
     */
    @Override
    public void sessionOpened(IoSession session) throws Exception {
        super.sessionOpened(session);
    }
    /**
@@ -30,6 +33,7 @@
     */
    @Override
    public void sessionClosed(IoSession session) throws Exception {
        super.sessionClosed(session);
    }
    /**
@@ -37,6 +41,7 @@
     */
    @Override
    public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
        super.sessionIdle(session, status);
    }
    /**
@@ -51,6 +56,10 @@
     */
    @Override
    public void messageReceived(IoSession session, Object message) throws Exception {
        if(message != null){
            byte[] bs = (byte[])message ;
            log.info("收到中间件数据:" + ByteUtil.bytes2Hex(bs, true));
        }
    }
    /**
@@ -58,6 +67,12 @@
     */
    @Override
    public void messageSent(IoSession session, Object message) throws Exception {
        log.info("网络发送了数据,"
                + (session==null?"":(session.getRemoteAddress() != null?("中间件网址是:" + session.getRemoteAddress().toString()):"")) );
        if(message != null){
            byte[] bs = (byte[])message ;
            log.info("网络发送了数据:" + ByteUtil.bytes2Hex(bs, true));
        }
    }
    /**
pipIrr-platform/pipIrr-web/pipIrr-mwTest-rtu/src/main/java/com/dy/pipIrrMwTestRtu/tcpClient/upData/UpCd83Close.java
New file
@@ -0,0 +1,109 @@
package com.dy.pipIrrMwTestRtu.tcpClient.upData;
import com.dy.common.mw.protocol.p206V1_0_0.parse.global.GlCreate;
import com.dy.common.util.ByteUtil;
import com.dy.common.util.ByteUtilUnsigned;
import com.dy.pipIrrMwTestRtu.ServerProperties;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/**
 * @Author: liurunyu
 * @Date: 2024/7/15 14:58
 * @Description
 */
public class UpCd83Close extends UpData {
    private static final Logger log = LogManager.getLogger(UpCd83Close.class);
    public static void upCd83Data() {
        try {
            if (UpData.session != null && UpData.session.isConnected()) {
                byte[] bs = createData(ServerProperties.rtuAddr);
                UpData.upSend(bs);
            } else {
                log.error("未连接通信中间件,不能发送数据");
            }
        } catch (Exception e) {
            log.error("向通信中间件发送数据产生异常", e);
        }
    }
    /**
     * æž„造心跳数据
     *
     * @return å­—节数组
     * @throws Exception å¼‚常
     */
    private static byte[] createData(String rtuAddr) throws Exception {
        UpConstant.closeValve();
        byte[] bytes = creatHead(rtuAddr, "83", (byte)0xB0);
        byte[] bs = new byte[1] ;
        bs[0] = (byte)0x02 ;//刷卡关阀
        bytes = ByteUtil.bytesMerge(bytes, bs) ;
        bs = new byte[5] ;//累计流量
        ByteUtil.int2BCD_LE(UpConstant.totalAmount, bs, 0);
        bytes = ByteUtil.bytesMerge(bytes, bs) ;
        bs = new byte[8] ;//IC卡编号
        GlCreate.createIcCardNo(ServerProperties.icCardNo, bs, 0);
        bytes = ByteUtil.bytesMerge(bytes, bs) ;
        bs = new byte[4] ;//IC卡地址
        ByteUtil.hex2Bytes_LE(ServerProperties.icCardAddr, bs, 0);
        bytes = ByteUtil.bytesMerge(bytes, bs) ;
        bs = new byte[4] ;//用水户余额
        ByteUtil.int2BCD_LE(UpConstant.remainMoney, bs, 0);
        bytes = ByteUtil.bytesMerge(bytes, bs) ;
        bs = new byte[6] ;//开阀时间
        GlCreate.createTp(UpConstant.openValveDt(), bs, 0);
        bytes = ByteUtil.bytesMerge(bytes, bs) ;
        UpConstant.clearOpenValveDt();//清空开阀时间
        bs = new byte[6] ;//关阀时间
        GlCreate.createTp(UpConstant.closeValveDt(), bs, 0);
        bytes = ByteUtil.bytesMerge(bytes, bs) ;
        bs = new byte[5] ;//用水户本次用水量
        ByteUtil.int2BCD_LE(UpConstant.thisAmount, bs, 0);
        bytes = ByteUtil.bytesMerge(bytes, bs) ;
        bs = new byte[4] ;//用水户本次消费金额
        ByteUtil.int2BCD_LE(UpConstant.thisMoney, bs, 0);
        bytes = ByteUtil.bytesMerge(bytes, bs) ;
        bs = new byte[2] ;//用水户本次用水时长
        ByteUtil.int2BCD_LE(UpConstant.thisTime, bs, 0);
        bytes = ByteUtil.bytesMerge(bytes, bs) ;
        bs = new byte[1] ;//水价类型
        bs[0] = ByteUtil.int2BCD_LE (1)[0] ;
        bytes = ByteUtil.bytesMerge(bytes, bs) ;
        bs = new byte[2] ;//æ°´ä»·
        ByteUtil.int2BCD_LE(UpConstant.thisPrice, bs, 0);
        bytes = ByteUtil.bytesMerge(bytes, bs) ;
        bs = new byte[1] ;//卡类型
        bs[0] = ByteUtil.int2BCD_LE (1)[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-web/pipIrr-mwTest-rtu/src/main/java/com/dy/pipIrrMwTestRtu/tcpClient/upData/UpCd83Open.java
New file
@@ -0,0 +1,79 @@
package com.dy.pipIrrMwTestRtu.tcpClient.upData;
import com.dy.common.mw.protocol.p206V1_0_0.parse.global.GlCreate;
import com.dy.common.util.ByteUtil;
import com.dy.common.util.ByteUtilUnsigned;
import com.dy.pipIrrMwTestRtu.ServerProperties;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/**
 * @Author: liurunyu
 * @Date: 2024/7/15 14:58
 * @Description
 */
public class UpCd83Open extends UpData {
    private static final Logger log = LogManager.getLogger(UpCd83Open.class);
    public static void upCd83Data() {
        try {
            if (UpData.session != null && UpData.session.isConnected()) {
                byte[] bs = createData(ServerProperties.rtuAddr);
                UpData.upSend(bs);
            } else {
                log.error("未连接通信中间件,不能发送数据");
            }
        } catch (Exception e) {
            log.error("向通信中间件发送数据产生异常", e);
        }
    }
    /**
     * æž„造心跳数据
     *
     * @return å­—节数组
     * @throws Exception å¼‚常
     */
    private static byte[] createData(String rtuAddr) throws Exception {
        byte[] bytes = creatHead(rtuAddr, "83", (byte)0xB0);
        byte[] bs = new byte[1] ;
        bs[0] = (byte)0x01 ;//刷卡开阀
        bytes = ByteUtil.bytesMerge(bytes, bs) ;
        bs = new byte[5] ;//累计流量
        ByteUtil.int2BCD_LE(UpConstant.totalAmount, bs, 0);
        bytes = ByteUtil.bytesMerge(bytes, bs) ;
        bs = new byte[8] ;//IC卡编号
        GlCreate.createIcCardNo(ServerProperties.icCardNo, bs, 0);
        bytes = ByteUtil.bytesMerge(bytes, bs) ;
        bs = new byte[4] ;//IC卡地址
        ByteUtil.hex2Bytes_LE(ServerProperties.icCardAddr, bs, 0);
        bytes = ByteUtil.bytesMerge(bytes, bs) ;
        bs = new byte[4] ;//用水户余额
        ByteUtil.int2BCD_LE(UpConstant.remainMoney, bs, 0);
        bytes = ByteUtil.bytesMerge(bytes, bs) ;
        bs = new byte[6] ;//开阀时间
        GlCreate.createTp(UpConstant.openValveDt(), bs, 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-web/pipIrr-mwTest-rtu/src/main/java/com/dy/pipIrrMwTestRtu/tcpClient/upData/UpConstant.java
New file
@@ -0,0 +1,47 @@
package com.dy.pipIrrMwTestRtu.tcpClient.upData;
import java.text.SimpleDateFormat;
import java.util.Locale;
/**
 * @Author: liurunyu
 * @Date: 2024/7/15 15:02
 * @Description
 */
public class UpConstant {
    private static String openValveDt ;
    private static String closeValveDt ;
    public static Integer totalAmount = 1234567;//实为12345.67
    public static Integer remainMoney = 56789;//实为567.89
    public static Integer thisAmount = 1000;//实为10.00
    public static Integer thisMoney = 1000;//实为10.00
    public static Integer thisTime = 10;//实为10
    public static Integer thisPrice = 100;//实为1.00
    public static Integer perAmount = thisAmount;
    public static Integer perMoney = thisMoney;
    public static void clearOpenValveDt(){
        openValveDt = null ;
    }
    public static String openValveDt(){
        if(openValveDt == null){
            openValveDt = new SimpleDateFormat("yyMMddHHmmss", Locale.CHINA).format(System.currentTimeMillis());
        }
        return openValveDt ;
    }
    public static String closeValveDt(){
        closeValveDt = new SimpleDateFormat("yyMMddHHmmss", Locale.CHINA).format(System.currentTimeMillis());
        return closeValveDt ;
    }
    public static void closeValve(){
        totalAmount = totalAmount + perAmount ;
        remainMoney = remainMoney - perMoney ;
    }
}
pipIrr-platform/pipIrr-web/pipIrr-mwTest-rtu/src/main/java/com/dy/pipIrrMwTestRtu/tcpClient/upData/UpData.java
New file
@@ -0,0 +1,51 @@
package com.dy.pipIrrMwTestRtu.tcpClient.upData;
import com.dy.common.mw.protocol.p206V1_0_0.ProtocolConstantV206V1_0_0;
import com.dy.common.mw.protocol.p206V1_0_0.parse.global.GlCreate;
import com.dy.common.util.ByteUtil;
import org.apache.mina.core.session.IoSession;
/**
 * @Author: liurunyu
 * @Date: 2024/7/15 14:20
 * @Description
 */
public class UpData {
    protected static IoSession session ;
    private static Object synObj = new Object() ;
    public static void setSession(IoSession session){
        UpData.session = session ;
    }
    protected static void upSend(byte[] bs) throws Exception{
        synchronized (synObj){
            session.write(bs) ;
        }
    }
    protected static byte[] creatHead(String rtuAddr, String code, byte ctrl)throws Exception {
        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] = ctrl; //控制域功能码
        index++ ;
        GlCreate.createRtuAddr(rtuAddr, bsHead, index);
        index += 5 ;
        ByteUtil.hex2Bytes(code, bsHead, index) ;
        return bsHead ;
    }
}
pipIrr-platform/pipIrr-web/pipIrr-mwTest-rtu/src/main/java/com/dy/pipIrrMwTestRtu/tcpClient/upData/UpHeartBeat.java
New file
@@ -0,0 +1,52 @@
package com.dy.pipIrrMwTestRtu.tcpClient.upData;
import com.dy.common.mw.protocol.p206V1_0_0.parse.global.GlCreate;
import com.dy.common.util.ByteUtil;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/**
 * @Author: liurunyu
 * @Date: 2024/7/15 14:18
 * @Description
 */
public class UpHeartBeat extends UpData {
    private static final Logger log = LogManager.getLogger(UpHeartBeat.class) ;
    public static void upCd02Data(String rtuAddr){
        try{
            if(UpData.session != null && UpData.session.isConnected()){
                byte[] bs = createData(rtuAddr) ;
                UpData.upSend(bs) ;
            }else{
                log.error("未连接通信中间件,不能发送数据");
            }
        }catch (Exception e){
            log.error("向通信中间件发送数据产生异常", e);
        }
    }
    /**
     * æž„造心跳数据
     * @return å­—节数组
     * @throws Exception å¼‚常
     */
    private static byte[] createData(String rtuAddr) throws Exception {
        byte[] bytes = creatHead(rtuAddr, "02", (byte)0xB0);
        byte[] bs = new byte[1] ;
        bs[0] = (byte)0xF2 ;//数据域: 1 ä¸ªå­—节,F0 ç™»å½•, F1 é€€å‡ºç™»å½•,F2 åœ¨çº¿ä¿æŒã€‚
        bytes = ByteUtil.bytesMerge(bytes, bs) ;
        GlCreate.createLen(bytes);//长度放字节数组中
        byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾叠加字节数组中
        bytes = ByteUtil.bytesMerge(bytes, bsTail) ;
        return bytes ;
    }
}
pipIrr-platform/pipIrr-web/pipIrr-mwTest-rtu/src/main/resources/Config.xml
@@ -1,9 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<config>
    <server name="RTU模拟" showStartInfo="true" company="http://www.dyjs.com"/>
    <server name="RTU模拟器" showStartInfo="true" company="http://www.dyjs.com"/>
    <!--
    enable:是否启动
     -->
    <tcpCl mwServerIp="127.0.0.1" mwServerPort="60000" />
    <base rtuAddr="532328059995" icCardAddr="3B7D1E1A" icCardNo="61181622830147821"></base>
    <!-- -->
    <tcpCl mwServerIp="127.0.0.1" mwServerPort="60000" connectTimeout="3000" />
</config>        
pipIrr-platform/pipIrr-web/pipIrr-mwTest-rtu/˵Ã÷.txt
New file
@@ -0,0 +1 @@
RTU模拟器
pipIrr-platform/pipIrr-web/pipIrr-mwTest-web/˵Ã÷.txt
New file
@@ -0,0 +1 @@
模拟web端向通信中间件下发命令