liurunyu
2023-12-01 c40d049233f2706dd23aadf327dbf86ba0008a12
Merge branch 'master' of http://8.140.179.55:20000/r/pipIrr-SV
17 文件已重命名
49个文件已修改
13个文件已添加
20个文件已删除
2861 ■■■■ 已修改文件
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/channel/tcp/DataDecoder.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/Command.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/Data.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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 8 ●●●● 补丁 | 查看 | 原始文档 | 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-common/src/main/java/com/dy/common/threadPool/ThreadPoolImp.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/.gitignore 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/.gitignore 32 ●●●●● 补丁 | 查看 | 原始文档 | 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 15 ●●●● 补丁 | 查看 | 原始文档 | 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/AdapterImp_TcpClUnit.java 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/Server.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/ServerProperties.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/httpCl/HttpClUnit.java 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/httpCl/HttpClUnitAdapter.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/httpCl/HttpClUnitConfigVo.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/httpCl/HttpPost.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/httpCl/MyThreadJob.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/httpCl/RtuData4HAC_NBhV2_5.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/httpCl/RtuData4MeterV1_0.java 165 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/httpCl/TestBase64.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/httpCl/UpDataPayloadVo.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/httpCl/UpDataVo.java 174 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/rmiClient/Code.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/rmiClient/ResConfigVo.java 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/rmiClient/RmiClUnit.java 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/rmiClient/RmiRequestVo.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/rmiClient/RmiResponseVo.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpClient/LocalCodecFactory.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpClient/LocalDecoder.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpClient/LocalEncoder.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpClient/MyThreadJob.java 214 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpClient/TcpClUnit.java 163 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpClient/TcpClUnitConfigVo.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpClient/TcpConnect.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpClient/TcpHandler.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpConnect/LocalDecoder.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpConnect/LocalEncoder.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpConnect/MinaConnect.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpConnect/MinaConnectPool.java 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpConnect/MinaHandler.java 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/resources/Config.xml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/resources/application.yml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/resources/log4j2.xml 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/resources/log4j2.yml 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-server/pom.xml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-server/src/main/java/com/dy/testServer/Server.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-server/src/main/java/com/dy/testServer/ServerProperties.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-server/src/main/java/com/dy/testServer/console/Command.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-server/src/main/java/com/dy/testServer/console/CommandConsole.java 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-server/src/main/java/com/dy/testServer/forRmi/Code.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-server/src/main/java/com/dy/testServer/forRmi/Manager.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-server/src/main/java/com/dy/testServer/forRmi/MwConfigVo.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-server/src/main/java/com/dy/testServer/forRmi/MwTestClientStatus.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-server/src/main/java/com/dy/testServer/forRmi/RmiRequestVo.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-server/src/main/resources/Config.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-server/src/main/resources/log4j2.xml 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-server/src/main/resources/log4j2.yml 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pom.xml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-platform.iml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/.gitignore 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-sso/.gitignore 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/文档/文件加入了 .gitignore,但还是被 git 跟踪.docx 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/channel/tcp/DataDecoder.java
@@ -28,15 +28,15 @@
     *     org.apache.mina.filter.codec.ProtocolDecoderOutput)
     */
    protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) {
        String meterNo = (String)session.getAttribute(TcpIoSessionAttrIdIsRtuAddr.sessionArrIdKey) ;
        if(meterNo == null){
        String rtuAddr = (String)session.getAttribute(TcpIoSessionAttrIdIsRtuAddr.sessionArrIdKey) ;
        if(rtuAddr == null){
            //会话未被管理
            //会话管理器中不存在此会话,说明刚建立网络连接,
            return this.doDecode_onLineData(session, in, out) ;
        }else{
            //会话已被管理
            //会话管理器中存在此会话,说明已经上线了,
            return this.doDecode_data(session, in, out, meterNo) ;
            return this.doDecode_data(session, in, out, rtuAddr) ;
        }
    }
    
@@ -73,16 +73,16 @@
     * @param session IO会话
     * @param in è¾“å…¥Buffer
     * @param out åè®®è¾“出编码
     * @param meterNo æŽ§åˆ¶å™¨ç¼–号
     * @param rtuAddr æŽ§åˆ¶å™¨åœ°å€
     * @return æ˜¯å¦æ­£å¥½æˆ–粘包
     */
    @SuppressWarnings("unused")
    private boolean doDecode_data(IoSession session, IoBuffer in, ProtocolDecoderOutput out, String meterNo) {
    private boolean doDecode_data(IoSession session, IoBuffer in, ProtocolDecoderOutput out, String rtuAddr) {
        //非上线数据,可能会出现断包或粘包现象
        PrefixedDataAvailableStatus dataStatus = this.pdaHandle.forUpData(in) ;
        if(dataStatus == null){
            //不可能发生
            log.error("严重错误,Rtu (水表号为" + meterNo + ")上行数据完整性检查时,返回的对象为空。") ;
            log.error("严重错误,Rtu (RTU" + rtuAddr + ")上行数据完整性检查时,返回的对象为空。") ;
            this.nextDeal(in, null, out) ;
            return true;
        }else{
@@ -94,7 +94,7 @@
                this.nextDeal(in, dataStatus.getDataLen(), out) ;
                if(dataStatus.isAdjoined()){
                    //说明粘包了,还有数据,需要对这些数据再次执行doDecode_方法.
                    return this.doDecode_data(session, in, out, meterNo) ;//加上递归
                    return this.doDecode_data(session, in, out, rtuAddr) ;//加上递归
                }else if(dataStatus.isCompleted()){
                    //数据不断不粘
                    return true;
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/Command.java
@@ -152,17 +152,6 @@
        
        return this ;
    }
    /*
    public static void main(String[] args){
        String json = "{\"attachment\":null,\"code\":\"03\",\"deviceId\":\"d8c9601f214747d98d47a4736e5\",\"id\":\"999999999\",\"meterNo\":\"23040600377\",\"productId\":16873252,\"param\":\"0002\",\"protocol\":\"HAC_NBhV2_5\",\"rtuAddr\":\"863318060168996\",\"type\":\"outerCommand\"}" ;
        try {
            Command com = jsonToObject(json) ;
            System.out.println(com.param);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
     */
    public String getId() {
        return id;
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/Data.java
@@ -57,11 +57,9 @@
        Data d = new Data() ;
        d.code = "01" ;
        d.rtuAddr = "123234" ;
        d.meterNo = "1234567890123456" ;
        DataV1_0_1 subD = new DataV1_0_1() ;
        subD.rtuAddr = "2342345" ;
        subD.meterNo = "1234567890123456" ;
        
        d.subData = subD ;
        
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());
        if(alarmVo != null){
            sb.append(alarmVo.toString());
        sb.append("\n");
        sb.append(stateVo==null?"":stateVo.toString());
        }
        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-common/src/main/java/com/dy/common/threadPool/ThreadPoolImp.java
@@ -73,8 +73,7 @@
        /**
         * æ—¥å¿— 
         */
        private Logger log = LogManager.getLogger(MonitorThread.class.getName());
        private static final Logger log = LogManager.getLogger(MonitorThread.class) ;
        /**
         * çº¿ç¨‹æ± æž„造方法
pipIrr-platform/pipIrr-global/.gitignore
pipIrr-platform/pipIrr-mw/.gitignore
@@ -1,2 +1,34 @@
HELP.md
target/
/pipIrr-mw.iml
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
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() ;
@@ -35,7 +36,7 @@
                    if(orgBusi == null){
                        log.error("严重错误,未能得到标签为" + nbRtu.orgTag + "的供水机构数据库业务Busi");
                    }else{
                        BaMeter meter = DbOrgBuzi.getMeterByImeiAndNo(orgBusi, imei, meterNo) ;
                        BaMeter meter = DbOrgBuzi.getMeterByImeiAndNo(orgBusi, imei, rtuAddr) ;
                        //可能未查询到meter,即仍是流浪者RTU,但仍要后续处理:(1)、仍能识别出流浪者RTU,(2)、仍要记录其上报数据
                        if(meter != null){
                            String protocol = d.getProtocol() ;
@@ -57,9 +58,9 @@
                }else{
                    //NB产品(RTU实体)未分配给具体的供水机构
                    //流浪者RTU
                    rtuTramp = DbSyBuzi.getSyRtuTramp(baseBusi, imei, meterNo) ;
                    rtuTramp = DbSyBuzi.getSyRtuTramp(baseBusi, imei, rtuAddr) ;
                    if(rtuTramp == null){
                        rtuTramp = new SyRtuTramp(imei, meterNo) ;
                        rtuTramp = new SyRtuTramp(imei, rtuAddr) ;
                    }
                    this.taskResult = new Object[]{baseBusi, orgBusi, nbRtu, rtuTramp, null} ;
                    this.toNextOneTask(data, TkDealRtuTramp.taskId);
@@ -67,9 +68,9 @@
            }else{
                //数据库中未查询到NB产品(RTU实体)
                //流浪者RTU
                rtuTramp = DbSyBuzi.getSyRtuTramp(baseBusi, imei, meterNo) ;
                rtuTramp = DbSyBuzi.getSyRtuTramp(baseBusi, imei, rtuAddr) ;
                if(rtuTramp == null){
                    rtuTramp = new SyRtuTramp(imei, meterNo) ;
                    rtuTramp = new SyRtuTramp(imei, rtuAddr) ;
                }
                this.taskResult = new Object[]{baseBusi, orgBusi, nbRtu, rtuTramp, null} ;
                this.toNextOneTask(data, TkDealRtuTramp.taskId);
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/AdapterImp_TcpClUnit.java
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/Server.java
@@ -68,20 +68,40 @@
            //支持模块: springHibernate和 çº¿ç¨‹æ± 
            SupportUnitConfigVo supVo = new SupportUnitConfigVo() ;
            //短工作时长线程池,线程负责用时较短的工作任务
            supVo.short_maxThread = conf.getSetAttrPlusInt(doc, "config.support", "short_maxThread", null, 1, 1000, null) ;//池中最大线程数为所有CPU核数+1
            supVo.short_minThread = conf.getSetAttrPlusInt(doc, "config.support", "short_minThread", null, 1, 5, null) ;//池中最小线程数
            supVo.short_maxThread = conf.getSetAttrPlusInt(doc, "config.support", "short_maxThread", null, -1, 1000, null) ;//池中最大线程数为所有CPU核数+1
            if(supVo.short_maxThread < 0){
                supVo.short_maxThread = -1 ;
            }
            supVo.short_minThread = conf.getSetAttrPlusInt(doc, "config.support", "short_minThread", null, -1, 100, null) ;//池中最小线程数
            if(supVo.short_minThread < 0){
                supVo.short_minThread = -1 ;
            }
            supVo.short_freeTimeout = conf.getSetAttrPlusInt(doc, "config.support", "short_freeTimeout", null, 1, 90, null) * 1000 ;//线程数空闲时长,若池中线程数量大于minThread,且有的线程空闲时长超过freeTimeout,则清除该线程,为了不清除,把minThread与maxThread设置相等
            supVo.short_busyTimeout = conf.getSetAttrPlusInt(doc, "config.support", "short_busyTimeout", null, 1, 10, null) * 1000 ;//线程不间断工作时长(单位为秒)超时限,认为线程已经了崩溃,将强制清除,短工作时长设置为5秒
            if(supVo.short_maxThread == 0 || supVo.short_minThread == 0){
                supVo.enableShortThreadPool = false ;
            }else{
                supVo.enableShortThreadPool = true ;
            }
            //长工作时长线程池,线程负责用时较长的工作任务
            supVo.long_maxThread = conf.getSetAttrInt(doc, "config.support", "long_maxThread", null, -1, 1000, null)  ;//池中最大线程数,若为-1,不受限制
            if(supVo.long_maxThread < 0){
                supVo.long_maxThread = -1 ;
            }
            supVo.long_minThread = conf.getSetAttrPlusInt(doc, "config.support", "long_minThread", null, 0, 5, null) ;//池中最小线程数
            supVo.long_minThread = conf.getSetAttrPlusInt(doc, "config.support", "long_minThread", null, -1, 100, null) ;//池中最小线程数
            if(supVo.long_minThread < 0){
                supVo.long_minThread = -1 ;
            }
            supVo.long_freeTimeout = conf.getSetAttrPlusInt(doc, "config.support", "long_freeTimeout", null, 1, 90, null) * 1000 ;//线程数空闲时长,若池中线程数量大于minThread,且有的线程空闲时长超过freeTimeout,则清除该线程
            supVo.long_busyTimeout = conf.getSetAttrInt(doc, "config.support", "long_busyTimeout", null, -1, 10, null) ;//线程不间断工作时长(单位为秒)超时限,若为-1,不受限制
            if(supVo.long_busyTimeout < 0){
                supVo.long_busyTimeout = -1 ;
            }
            if(supVo.long_maxThread == 0 || supVo.long_minThread == 0){
                supVo.enableLongThreadPool = false ;
            }else{
                supVo.enableLongThreadPool = true ;
            }
            supVo.showStartInfo = showStartInfo ;
@@ -113,8 +133,6 @@
            // Tcp Client æ¨¡å—
            TcpClUnitConfigVo tcpClVo = new TcpClUnitConfigVo();
            tcpClVo.enable = conf.getSetAttrBoolean(doc, "config.tcpCl", "enable", null, null) ;
            tcpClVo.heartbeatTimes = conf.getSetAttrPlusInt(doc, "config.tcpCl", "heartbeatTimes", null, 1, 10, null) ;//连续配置次数心跳后发送一次数据
            tcpClVo.sendInterval = conf.getSetAttrPlusInt(doc, "config.tcpCl", "sendInterval", null, 1, 60, null) ;//发送心跳或数据的时间间隔
            if(tcpClVo.enable){
                AdapterImp_TcpClUnit httpClAdap = new AdapterImp_TcpClUnit();
                httpClAdap.setConfig(tcpClVo);
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/ServerProperties.java
@@ -7,9 +7,13 @@
    //RTU截止地址
    public static Long rtuAddrEnd = 0L ;
    //服务端IP
    public static String serverIp = "" ;
    public static String tcpServerIp = "" ;
    //服务端上下文
    public static Integer serverPort = 0 ;
    public static Integer tcpServerPort = 0 ;
    //发送数据数据间隔
    public static Integer sendInterval = 0 ;//秒
    //每一轮次发送数据,其中包括心跳数据的次数
    public static Integer heartbeatTimes = 3 ;
    //发送数据次数
    public static Integer sendTimes = 0 ;
    
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/httpCl/HttpClUnit.java
File was deleted
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/httpCl/HttpClUnitAdapter.java
File was deleted
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/httpCl/HttpClUnitConfigVo.java
File was deleted
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/httpCl/HttpPost.java
File was deleted
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/httpCl/MyThreadJob.java
File was deleted
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/httpCl/RtuData4HAC_NBhV2_5.java
File was deleted
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/httpCl/RtuData4MeterV1_0.java
File was deleted
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/httpCl/TestBase64.java
File was deleted
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/httpCl/UpDataPayloadVo.java
File was deleted
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/httpCl/UpDataVo.java
File was deleted
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/rmiClient/Code.java
@@ -10,6 +10,8 @@
    
    public static String cd4 = "004" ;//向服务端上报信息
    
    public static String cd5 = "005" ;//向服务端上报  æ•°æ®ä¸ŠæŠ¥å·¥ä½œå·²ç»å®Œæˆ
    public static String cd5 = "005" ;//向服务端上报  å®Œæˆä»»åŠ¡çš„æ•°é‡
    public static String cd6 = "006" ;//向服务端上报  å…¨éƒ¨ä»»åŠ¡å®Œæˆ
    
}
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/rmiClient/ResConfigVo.java
@@ -8,9 +8,13 @@
    //模拟客户的IMEI号截止号
    public Long rtuAddrEnd = 0L ;
    //服务端IP
    public String serverIp = "" ;
    public String tcpServerIp = "" ;
    //服务端上下文
    public Integer serverPort = 0 ;
    public Integer tcpServerPort = 0 ;
    //发送数据间隔
    public Integer sendInterval = 2 ;//秒
    //每一轮次发送数据,其中包括心跳发送次数
    public Integer heartbeatTimes = 3 ;
    //发送数据次数
    public Integer sendTimes = 0 ;
    
@@ -58,20 +62,36 @@
        this.rtuAddrEnd = rtuAddrEnd;
    }
    public String getServerIp() {
        return serverIp;
    public String getTcpServerIp() {
        return tcpServerIp;
    }
    public void setServerIp(String serverIp) {
        this.serverIp = serverIp;
    public void setTcpServerIp(String tcpServerIp) {
        this.tcpServerIp = tcpServerIp;
    }
    public Integer getServerPort() {
        return serverPort;
    public Integer getTcpServerPort() {
        return tcpServerPort;
    }
    public void setServerPort(Integer serverPort) {
        this.serverPort = serverPort;
    public void setTcpServerPort(Integer tcpServerPort) {
        this.tcpServerPort = tcpServerPort;
    }
    public Integer getSendInterval() {
        return sendInterval;
    }
    public void setSendInterval(Integer sendInterval) {
        this.sendInterval = sendInterval;
    }
    public Integer getHeartbeatTimes() {
        return heartbeatTimes;
    }
    public void setHeartbeatTimes(Integer heartbeatTimes) {
        this.heartbeatTimes = heartbeatTimes;
    }
    public Integer getSendTimes() {
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/rmiClient/RmiClUnit.java
@@ -94,13 +94,30 @@
    }
    
    //把数据上报完成情况  ä¸ŠæŠ¥ç»™mwTestServer
    public void reportHadReportOver(Long seconds){
    public void reportHadReportOver(Integer count){
        try {
            Thread.sleep(100L);
            RmiRequestVo rqVo = new RmiRequestVo() ;
            rqVo.id = id ;
            rqVo.token = token ;
            rqVo.code = Code.cd5 ;
            rqVo.overCount = count ;
            String json = rqVo.toJson() ;
            frmWork.syncRequest(json) ;
        } catch (Exception e) {
            log.error("把数据上报完成情况  ä¸ŠæŠ¥ç»™mwTestServer失败" + e.getMessage());
        }
    }
    //把数据上报完成情况  ä¸ŠæŠ¥ç»™mwTestServer
    public void allOver(Long seconds){
        try {
            Thread.sleep(100L);
            RmiRequestVo rqVo = new RmiRequestVo() ;
            rqVo.id = id ;
            rqVo.token = token ;
            rqVo.code = Code.cd6 ;
            rqVo.over = true ;
            rqVo.seconds = seconds ;
            String json = rqVo.toJson() ;
@@ -178,15 +195,19 @@
                                if(rVo != null){
                                    ServerProperties.rtuAddrStart = rVo.rtuAddrStart;
                                    ServerProperties.rtuAddrEnd = rVo.rtuAddrEnd;
                                    ServerProperties.serverIp = rVo.serverIp;
                                    ServerProperties.serverPort = rVo.serverPort;
                                    ServerProperties.tcpServerIp = rVo.tcpServerIp;
                                    ServerProperties.tcpServerPort = rVo.tcpServerPort;
                                    ServerProperties.sendInterval = rVo.sendInterval ;
                                    ServerProperties.heartbeatTimes = rVo.heartbeatTimes ;
                                    ServerProperties.sendTimes = rVo.sendTimes ;
                                    log.info("得到配置成功");
                                    log.info("    å¼€å§‹RtuAddr=" + ServerProperties.rtuAddrStart);
                                    log.info("    æˆªæ­¢RtuAddr=" + ServerProperties.rtuAddrEnd);
                                    log.info("    mwAccept服务IP=" + ServerProperties.serverIp);
                                    log.info("    mwAccept服务端口=" + ServerProperties.serverPort);
                                    log.info("    æ¯imei上报数据次数=" + ServerProperties.sendTimes);
                                    log.info("    mwAccept服务IP=" + ServerProperties.tcpServerIp);
                                    log.info("    mwAccept服务端口=" + ServerProperties.tcpServerPort);
                                    log.info("    å‘送数据间隔=" + ServerProperties.sendTimes);
                                    log.info("    æ¯è½®æ¬¡å‘送心跳次数=" + ServerProperties.heartbeatTimes);
                                    log.info("    æ¯RTU上报数据轮次=" + ServerProperties.sendTimes);
                                    break ;
                                }else{
                                    log.error("rmi得到配置失败:json转ResConfigVo为null");
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/rmiClient/RmiRequestVo.java
@@ -12,6 +12,8 @@
    
    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/rmiClient/RmiResponseVo.java
@@ -1,6 +1,7 @@
package com.dy.testClient.rmiClient;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
public class RmiResponseVo {
@@ -33,11 +34,10 @@
     */
    public static RmiResponseVo jsonToObject(String json, Class<?> clazz)throws Exception{
        try{
            return JSON.parseObject(json, RmiResponseVo.class) ;
            //JSONDeserializer<RmiResponseVo> jsonD = new JSONDeserializer<RmiResponseVo>() ;
            //jsonD.use("obj", clazz) ;
            //RmiResponseVo resp = jsonD.deserialize(json, RmiResponseVo.class) ;
            //return resp ;
            JSONObject jsonObject = JSON.parseObject(json);
            RmiResponseVo vo = jsonObject.to(RmiResponseVo.class) ;
            vo.obj = jsonObject.getObject("obj", clazz);
            return vo ;
        }catch(Exception e){
            throw new Exception(e.getMessage() , e ) ;
        }
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpClient/LocalCodecFactory.java
File was renamed from pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpConnect/LocalCodecFactory.java
@@ -1,9 +1,9 @@
package com.dy.testClient.tcpConnect;
package com.dy.testClient.tcpClient;
import org.apache.mina.filter.codec.ProtocolCodecFactory;
import org.apache.mina.filter.codec.ProtocolEncoder;
import org.apache.mina.filter.codec.ProtocolDecoder;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFactory;
import org.apache.mina.filter.codec.ProtocolDecoder;
import org.apache.mina.filter.codec.ProtocolEncoder;
public class LocalCodecFactory implements ProtocolCodecFactory {
    private ProtocolEncoder encoder;
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpClient/LocalDecoder.java
New file
@@ -0,0 +1,37 @@
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;
import org.apache.mina.filter.codec.ProtocolDecoderOutput;
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";
    public static final int MAX_SIZE = 2147483647 ;
    /**
     * å¯¹ç½‘络传输来的数据进行解码
     */
    protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws IOException, Exception{
        int remain = in.remaining() ;
        if(remain > 0){
            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/LocalEncoder.java
New file
@@ -0,0 +1,22 @@
package com.dy.testClient.tcpClient;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolEncoderAdapter;
import org.apache.mina.filter.codec.ProtocolEncoderOutput;
import java.io.IOException;
public class LocalEncoder extends ProtocolEncoderAdapter {
    /**
     * å¯¹æ•°æ®è¿›è¡Œç¼–码,以备网络传输
     */
    public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws IOException, Exception{
        byte[] data = (byte[])message;
        //log.info("下行数据:" + ByteUtil.bytes2Hex(data, true));
        out.write(IoBuffer.allocate((data==null?0:data.length), false).put(data).flip());
    }
}
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpClient/MyThreadJob.java
@@ -1,45 +1,219 @@
package com.dy.testClient.tcpClient;
import com.dy.common.mw.protocol.p206V1_0_0.CommonV1_0_1;
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.threadPool.ThreadPool;
import com.dy.testClient.httpCl.*;
import java.util.Base64;
import com.dy.common.util.ByteUtil;
import com.dy.testClient.ServerProperties;
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 ;
    public int sendTimes = 0 ;//发送数据次数
    public int heartbeatTimes = 0 ;//上报心跳次数
    public boolean isOver = false ;
    public MyThreadJob(){
    }
    public MyThreadJob(String rtuAddr){
    public MyThreadJob(String rtuAddr, String serverIp, Integer serverPort){
        this.rtuAddr = rtuAddr ;
        this.serverIp = serverIp ;
        this.serverPort = serverPort ;
    }
    @Override
    public void execute() throws Exception {
        testP206V1_0_0() ;
        log.info("RTU" + rtuAddr + "开始任务");
        if(session != null){
            log.info("RTU" + rtuAddr + "将要执行" + ServerProperties.sendTimes + "轮次任务,当前轮次是" + sendTimes);
            if(sendTimes <= ServerProperties.sendTimes){
                sendDataOfP206V1_0_0() ;
            }else{
                this.jobOver() ;
            }
        }
    }
    private void testP206V1_0_0(){
    private void sendDataOfP206V1_0_0(){
        try{
            RtuData4MeterV1_0 rd = new RtuData4MeterV1_0() ;
            byte[] bs = rd.create(rtuAddr) ;
            bs = Base64.getEncoder().encode(bs) ;
            UpDataPayloadVo payloadVo = new UpDataPayloadVo() ;
            payloadVo.APPdata = new String(bs, "UTF-8") ;
            UpDataVo vo = new UpDataVo(rtuAddr, "8086" + rtuAddr) ;
            vo.payload = payloadVo ;
            String json = vo.toJson() ;
            byte[] bytes = json.getBytes() ;
            HttpPost.post(bytes);
            if(heartbeatTimes >= ServerProperties.heartbeatTimes){
                heartbeatTimes = 0 ;
                this.sendReportData() ;
                TcpClUnit.clientSendData();
                sendTimes++ ;
            }else{
                this.sendHeartbeat() ;
                TcpClUnit.clientSendData();
                heartbeatTimes++ ;
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            HttpClUnit.clientOver() ;
        }
    }
    private void sendHeartbeat(){
        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(){
        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(){
        session.closeOnFlush() ;
        this.isOver = true ;
        TcpClUnit.clientOver() ;
    }
    /**
     * æž„造心跳数据
     * @return å­—节数组
     * @throws Exception å¼‚常
     */
    public byte[] createHeartbeat( ) 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)0) ;//控制域功能码:确认 è®¤å¯
        index++ ;
        GlCreate.createRtuAddr(this.rtuAddr, bsHead, index);
        index += 5 ;
        ByteUtil.hex2Bytes("02", bsHead, index) ;
        byte[] bs = new byte[1] ;
        bs[0] = (byte)0xF2 ;//数据域: 1 ä¸ªå­—节,F0 ç™»å½•, F1 é€€å‡ºç™»å½•,F2 åœ¨çº¿ä¿æŒã€‚
        bytes = ByteUtil.bytesMerge(bsHead, bs) ;
        GlCreate.createLen(bytes);//长度放字节数组中
        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 ;
    }
    @Override
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpClient/TcpClUnit.java
@@ -5,10 +5,16 @@
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;
import java.util.Map;
public class TcpClUnit  implements UnitInterface {
@@ -20,8 +26,10 @@
    public static TcpClUnitConfigVo confVo ;
    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;
    private static Long startTime = 0L ;
@@ -66,21 +74,126 @@
                        if(!ServerProperties.startWork){
                            Thread.sleep(100L);
                        }else{
                            try{
                            startTime = System.currentTimeMillis() ;
                            for(Long addr = ServerProperties.rtuAddrStart; addr <= ServerProperties.rtuAddrEnd; addr++){
                                totalRunedClientCount++ ;
                                startClient(addr) ;
                                    totalRtuClientCount++ ;
                                    createImitate(addr) ;
                            }
                                log.info("共模拟了" + totalRtuClientCount + "台RTU");
                                Collection<MyThreadJob> collection = jobMap.values() ;
                                for(MyThreadJob job : collection){
                                    connectServer(job) ;
                                }
                                log.info("启动所有RTU连接通信中间件");
                            while(true){
                                if(totalOverClientCount.longValue() >= totalRunedClientCount.longValue()){
                                    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().reportHadReportOver(seconds) ;
                                    System.out.println("共用时" + seconds + "秒");
                                        RmiClUnit.getInstance().allOver(seconds) ;
                                        log.info("共用时" + seconds + "秒");
                                    break ;
                                }else{
                                    Thread.sleep(100L);
                                }
                            }
                            }catch (Exception e){
                                e.printStackTrace();
                            }finally {
                                break ;
                            }
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
    /**
     * åˆ›å»ºRTU模拟MyThreadJob
     * @param rtuAddr rtu地址
     */
    private void createImitate(Long rtuAddr){
        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 {
                    int notOverCount;
                    while(true){
                        notOverCount = 0 ;
                        Collection<MyThreadJob> collection = jobMap.values() ;
                        for(MyThreadJob job : collection){
                            if(!job.isOver){
                                notOverCount++ ;
                                pool.putJob(job);
                            }
                        }
                        if(notOverCount > 0){
                            log.info("当前还有" + notOverCount + "台RTU未完成任务");
                            Thread.sleep(ServerProperties.sendInterval * 1000);
                        }else{
                            break;
                        }
                    }
@@ -91,20 +204,40 @@
        }).start();
    }
    private void startClient(Long rtuAddr){
        try {
            pool.putJob(new MyThreadJob("" + rtuAddr));
        } catch (Exception e) {
            log.error("TcpClUnit.startClient() ", e);
        }
    }
    public static synchronized void clientSendData(){
        totalSendDataCount++;
        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.longValue() >= totalRtuClientCount.longValue()){
            RmiClUnit.getInstance().reportHadReportOver(totalOverClientCount);
            System.out.println("已有" + totalOverClientCount + "个RTU完成了任务");
        }else{
            if(totalRtuClientCount > 100) {
        if(totalOverClientCount % 100 == 0){
            RmiClUnit.getInstance().reportHadReportCount(totalOverClientCount);
            System.out.println("已经发送" + totalOverClientCount + "条数据");
                    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/TcpClUnitConfigVo.java
@@ -2,6 +2,4 @@
public class TcpClUnitConfigVo {
    public boolean enable ;
    public int heartbeatTimes ;
    public int sendInterval ;
}
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpClient/TcpConnect.java
New file
@@ -0,0 +1,71 @@
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;
import org.apache.mina.transport.socket.SocketConnector;
import org.apache.mina.transport.socket.nio.NioSocketConnector;
import java.net.InetSocketAddress;
public class TcpConnect {
    public static final String rtuAddrKey = "rtuAddr" ;
    public static final String threadJobKey = "threadJob" ;
    /**
     * åˆ¤æ–­ä¼šè¯æ˜¯å¦æœ‰æ•ˆ
     * @param se ç½‘络会话
     * @return æ˜¯å¦è¿žæŽ¥
     */
    public boolean isConnected(IoSession se) {
        return (se != null && se.isConnected());
    }
    /**
     * åˆ›å»ºæ–°ä¼šè¯
     * @param rtuAddr rtu地址
     * @param job rtu工作类
     * @param host æœåС噍URI
     * @param port æœåŠ¡å™¨ç«¯å£
     * @param connectTimeout è¿žæŽ¥è¶…æ—¶æ—¶é•¿
     * @param handler æ•°æ®å¤„理者
     * @param callback å›žè°ƒ
     * @return ç½‘络会话
     */
    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);
        ConnectFuture connectFuture = connector.connect(new InetSocketAddress(host, port));
        connectFuture.awaitUninterruptibly(connectTimeout);
        IoSession se = connectFuture.getSession();
        se.setAttribute(rtuAddrKey, rtuAddr) ;
        se.setAttribute(threadJobKey, job) ;
        callback.call(se) ;
    }
    /**
     * å…³é—­ä¼šè¯è”接
     * @param se
     * @param connectTimeout
     */
    public void disconnect(IoSession se , int connectTimeout) {
        if (se != null) {
            try{
                se.closeNow().awaitUninterruptibly(connectTimeout);
            }catch(Exception e){
            }finally{
                se = null;
            }
        }
    }
}
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpClient/TcpHandler.java
New file
@@ -0,0 +1,77 @@
package com.dy.testClient.tcpClient;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.FilterEvent;
public class TcpHandler  extends IoHandlerAdapter {
    private static Logger log = LogManager.getLogger(TcpHandler.class.getName()) ;
    /**
     * {@inheritDoc}
     */
    @Override
    public void sessionCreated(IoSession session) throws Exception {
    }
    /**
     * {@inheritDoc}
     */
    @Override
    public void sessionOpened(IoSession session) throws Exception {
    }
    /**
     * {@inheritDoc}
     */
    @Override
    public void sessionClosed(IoSession session) throws Exception {
    }
    /**
     * {@inheritDoc}
     */
    @Override
    public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
    }
    /**
     * {@inheritDoc}
     */
    @Override
    public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
    }
    /**
     * {@inheritDoc}
     */
    @Override
    public void messageReceived(IoSession session, Object message) throws Exception {
    }
    /**
     * {@inheritDoc}
     */
    @Override
    public void messageSent(IoSession session, Object message) throws Exception {
    }
    /**
     * {@inheritDoc}
     */
    @Override
    public void inputClosed(IoSession session) throws Exception {
        session.closeNow();
    }
    /**
     * {@inheritDoc}
     */
    @Override
    public void event(IoSession session, FilterEvent event) throws Exception {
    }
}
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpConnect/LocalDecoder.java
File was deleted
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpConnect/LocalEncoder.java
File was deleted
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpConnect/MinaConnect.java
File was deleted
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpConnect/MinaConnectPool.java
File was deleted
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpConnect/MinaHandler.java
File was deleted
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/resources/Config.xml
@@ -32,17 +32,13 @@
     -->
    <rmiCl
        rmiSvUrl="127.0.0.1"
        rmiSvContext="mwTestServer"
        rmiSvPort="9898"
        rmiSvContext="mwTestSv"
        rmiSvPort="12345"
    />
    <!--
    enable:是否启动
    heartbeatTimes:连续配置次数心跳后发送一次数据
    sendInterval:发送心跳或数据的时间间隔
     -->
    <tcpCl
        enable="true"
        heartbeatTimes="3"
        sendInterval="3"
    />
</config>        
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/resources/application.yml
File was deleted
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/resources/log4j2.xml
New file
@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF">
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout charset="GBK" pattern="%d %-5p [%t] (%F:%L) - %m%n%throwable"/>
    </Console>
    <!--
        fileName="${sys:user.home}/logs/aepTest.log" filePattern="${sys:user.home}/logs/aepTest-%d{yyyy-MM}-%i.log.gz"
        fileName="/logs/testJgroups.log" filePattern="/logs/testJgroups-%d{yyyyMMdd}-%i.log.gz"
        fileName="logs/testJgroups.log" filePattern="logs/testJgroups-%d{yyyyMMdd}-%i.log.gz"
        sys:user.home当前用户在操作系统中的文档目录
        /logs/testJgroups.log当前软件所在硬盘根目录
        logs/testJgroups.log当前软件所在目录
     -->
    <RollingFile name="File" fileName="logs/mwTestCl.log" filePattern="logs/aepTest-%d{yyyyMMdd}-%i.log">
      <PatternLayout charset="UTF-8" pattern="%d %-5p [%t] (%class.%method:%L) - %m%n%throwable"/>
      <Policies>
        <TimeBasedTriggeringPolicy interval="7" />
        <SizeBasedTriggeringPolicy size="10MB"/>
      </Policies>
      <DefaultRolloverStrategy max="50" />
    </RollingFile>
  </Appenders>
  <Loggers>
      <!--
      <Logger name="com.zhzc.jgTest" level="debug">
      <AppenderRef ref="Console"/>
    </Logger>
      <Logger name="org.jgroups" level="info">
      <AppenderRef ref="File"/>
    </Logger>
      -->
    <!-- Root与各个Logger同时起作用 -->
    <Root level="info">
      <AppenderRef ref="Console"/>
      <AppenderRef ref="File"/>
    </Root>
  </Loggers>
</Configuration>
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/resources/log4j2.yml
File was deleted
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-server/pom.xml
@@ -20,6 +20,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-server/src/main/java/com/dy/testServer/Server.java
@@ -40,7 +40,7 @@
        long start = System.currentTimeMillis() ;
        try {
            sv.conf = new ConfigXml() ;
            sv.doc = sv.conf.createDom(sv.getClass(), "/config.xml") ;
            sv.doc = sv.conf.createDom(sv.getClass(), "config.xml") ;
            ////////////////
            //服务 é…ç½®
            sv.showStartInfo = sv.conf.getSetAttrBoolean(sv.doc, "config.server", "showStartInfo", null, null) ;
@@ -135,6 +135,8 @@
            }
            ServerProperties.tcpServerIp = conf.getSetAttrTxt(doc, "config.base", "tcpServerIp", null, false, null) ;
            ServerProperties.tcpServerPort = conf.getSetAttrPlusInt(doc, "config.base", "tcpServerPort", null, 1, 65535, null) ;
            ServerProperties.sendInterval = conf.getSetAttrPlusInt(doc, "config.base", "sendInterval", null, 1, null, null) ;
            ServerProperties.heartbeatTimes = conf.getSetAttrPlusInt(doc, "config.base", "heartbeatTimes", null, 1, null, null) ;
            ServerProperties.sendTimes = conf.getSetAttrPlusInt(doc, "config.base", "sendTimes", null, 1, null, null) ;
            
                
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-server/src/main/java/com/dy/testServer/ServerProperties.java
@@ -12,6 +12,10 @@
    public static String tcpServerIp = "" ;
    //服务端上下文
    public static Integer tcpServerPort = 60000 ;
    //发送数据间隔 ç§’
    public static Integer sendInterval = 0 ;
    //每一轮次发送数据,其中包括心跳发送次数
    public static Integer heartbeatTimes = 0 ;
    //发送数据次数
    public static Integer sendTimes = 0 ;
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-server/src/main/java/com/dy/testServer/console/Command.java
@@ -65,7 +65,9 @@
        prtWrt.println("  æ¯ä¸ªmwTest分配的RtuAddr数:" + ServerProperties.rtuAddrPerMwTest);
        prtWrt.println("  é€šä¿¡ä¸­é—´ä»¶IP:" + ServerProperties.tcpServerIp);
        prtWrt.println("  é€šä¿¡ä¸­é—´ä»¶ç«¯å£ï¼š" + ServerProperties.tcpServerPort);
        prtWrt.println("  mwTest发送数据间隔(秒):" + ServerProperties.sendInterval);
        prtWrt.println("  mwTest每RtuAddr号发送数据次数:" + ServerProperties.sendTimes);
        prtWrt.println("  mwTest每一轮次发送数据,其中包括心跳发送次数:" + ServerProperties.heartbeatTimes);
        prtWrt.println("本服务RMI Server配置");
        String ip = null ;
        try {
@@ -106,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/console/CommandConsole.java
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-server/src/main/java/com/dy/testServer/forRmi/Code.java
@@ -10,6 +10,7 @@
    
    public static String cd4 = "004" ;//向服务端上报信息
    
    public static String cd5 = "005" ;//向服务端上报  æ•°æ®ä¸ŠæŠ¥å·¥ä½œå·²ç»å®Œæˆ
    public static String cd5 = "005" ;//向服务端上报  å®Œæˆä»»åŠ¡çš„æ•°é‡
    public static String cd6 = "006" ;//向服务端上报  å…¨éƒ¨ä»»åŠ¡å®Œæˆ
}
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-server/src/main/java/com/dy/testServer/forRmi/Manager.java
@@ -82,6 +82,8 @@
            doDealReportCount(rqVo) ;
        }else if(rqVo.code.equals(Code.cd5)){
            doDealReportOver(rqVo) ;
        }else if(rqVo.code.equals(Code.cd6)){
            doDealAllOver(rqVo) ;
        }
        return resVo ;
    }
@@ -114,6 +116,8 @@
            conVo.rtuAddrEnd = (Long)rtuAddrs[1] ;
            conVo.tcpServerIp = ServerProperties.tcpServerIp ;
            conVo.tcpServerPort = ServerProperties.tcpServerPort ;
            conVo.sendInterval = ServerProperties.sendInterval ;
            conVo.heartbeatTimes = ServerProperties.heartbeatTimes ;
            conVo.sendTimes = ServerProperties.sendTimes ;
            sta = new MwTestClientStatus() ;
            sta.confVo = conVo ;
@@ -157,6 +161,19 @@
        MwTestClientStatus sta = token2ClientMap.get("" + token);
        if(sta == null){
            sta = new MwTestClientStatus() ;
            sta.overCount = rqVo.overCount ;
            token2ClientMap.put("" + token, sta);
        }else{
            sta.overCount = rqVo.overCount ;
        }
    }
    private static void doDealAllOver(RmiRequestVo rqVo){
        int token = Integer.parseInt(rqVo.token) ;
        MwTestClientStatus sta = token2ClientMap.get("" + token);
        if(sta == null){
            sta = new MwTestClientStatus() ;
            if(rqVo.over != null && rqVo.over){
                sta.over = true ;
                sta.seconds = rqVo.seconds ;
@@ -170,4 +187,6 @@
        }
    }
}
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-server/src/main/java/com/dy/testServer/forRmi/MwConfigVo.java
@@ -11,9 +11,12 @@
    public String tcpServerIp = "" ;
    //通信中间件端口
    public Integer tcpServerPort = 0 ;
    //发送数据数据间隔
    public Integer sendInterval = 2 ;//秒
    //每一轮次发送数据,其中包括心跳发送次数
    public Integer heartbeatTimes = 3 ;
    //发送数据次数
    public Integer sendTimes = 0 ;
    /**
     * å¯¹è±¡è½¬æˆjson
     * @return è¿”回 json
@@ -74,6 +77,22 @@
        this.tcpServerPort = tcpServerPort;
    }
    public Integer getSendInterval() {
        return sendInterval;
    }
    public void setSendInterval(Integer sendInterval) {
        this.sendInterval = sendInterval;
    }
    public Integer getHeartbeatTimes() {
        return heartbeatTimes;
    }
    public void setHeartbeatTimes(Integer heartbeatTimes) {
        this.heartbeatTimes = heartbeatTimes;
    }
    public Integer getSendTimes() {
        return sendTimes;
    }
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-server/src/main/java/com/dy/testServer/forRmi/MwTestClientStatus.java
@@ -8,6 +8,8 @@
    
    public Integer count ;//mwTest上报数据数量
    
    public Integer overCount ;//mwTest完成全部上报数据RTU数量
    public Boolean over ;//mwTest上报数据结束
    
    public Long seconds ;//mwTest上报数据用时(秒)
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-server/src/main/java/com/dy/testServer/forRmi/RmiRequestVo.java
@@ -12,6 +12,8 @@
    
    public Integer count;//mwTest上报数据数量
    
    public Integer overCount;//aepTest结束上报数据数量
    public Boolean over ;//mwTest上报数据结束
    
    public Long seconds ;//mwTest上报数据用时(秒)
@@ -84,4 +86,11 @@
        this.seconds = seconds;
    }
    
    public Integer getOverCount() {
        return overCount;
    }
    public void setOverCount(Integer overCount) {
        this.overCount = overCount;
    }
}
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-server/src/main/resources/Config.xml
@@ -8,6 +8,8 @@
        rtuAddrsPerMwTest: æ¯ä¸ªmwTest分配的RtuAddr数
        tcpServerIp: é€šä¿¡ä¸­é—´ä»¶IP
        tcpServerPort: é€šä¿¡ä¸­é—´ä»¶ç«¯å£
        sendInterval:发送数据间隔 ç§’
        heartbeatTimes:每一轮次发送数据,其中包括心跳发送次数
        sendTimes:发送数据次数
         -->
        <base
@@ -16,6 +18,8 @@
            rtuAddrPerMwTest="1"
            tcpServerIp="127.0.0.1"
            tcpServerPort="60000"
            sendInterval="2"
            heartbeatTimes="3"
            sendTimes="1"
        />
            
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-server/src/main/resources/log4j2.xml
New file
@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF">
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout charset="GBK" pattern="%d %-5p [%t] (%F:%L) - %m%n%throwable"/>
    </Console>
    <!--
        fileName="${sys:user.home}/logs/aepTest.log" filePattern="${sys:user.home}/logs/aepTest-%d{yyyy-MM}-%i.log.gz"
        fileName="/logs/testJgroups.log" filePattern="/logs/testJgroups-%d{yyyyMMdd}-%i.log.gz"
        fileName="logs/testJgroups.log" filePattern="logs/testJgroups-%d{yyyyMMdd}-%i.log.gz"
        sys:user.home当前用户在操作系统中的文档目录
        /logs/testJgroups.log当前软件所在硬盘根目录
        logs/testJgroups.log当前软件所在目录
     -->
    <RollingFile name="File" fileName="logs/mwTestSv.log" filePattern="logs/aepTest-%d{yyyyMMdd}-%i.log">
      <PatternLayout charset="UTF-8" pattern="%d %-5p [%t] (%class.%method:%L) - %m%n%throwable"/>
      <Policies>
        <TimeBasedTriggeringPolicy interval="7" />
        <SizeBasedTriggeringPolicy size="10MB"/>
      </Policies>
      <DefaultRolloverStrategy max="50" />
    </RollingFile>
  </Appenders>
  <Loggers>
    <!-- Root与各个Logger同时起作用 -->
    <Root level="info">
      <AppenderRef ref="Console"/>
      <AppenderRef ref="File"/>
    </Root>
  </Loggers>
</Configuration>
pipIrr-platform/pipIrr-mw/pipIrr-mwTest-server/src/main/resources/log4j2.yml
File was deleted
pipIrr-platform/pipIrr-mw/pom.xml
@@ -25,7 +25,11 @@
            <groupId>com.dy</groupId>
            <artifactId>pipIrr-common</artifactId>
            <version>1.0.0</version>
            <scope>provided</scope>
            <!--
            scope不能用provided,否则Server.java的运行不起来
            scope不能用runtime,否则不能编辑
            -->
            <scope>compile</scope>
            <optional>true</optional>
            <exclusions>
                <exclusion>
@@ -39,7 +43,7 @@
            <groupId>com.dy</groupId>
            <artifactId>pipIrr-global</artifactId>
            <version>1.0.0</version>
            <scope>provided</scope>
            <scope>compile</scope>
            <optional>true</optional>
            <exclusions>
                <exclusion>
pipIrr-platform/pipIrr-platform.iml
File was deleted
pipIrr-platform/pipIrr-web/.gitignore
@@ -1,2 +1,2 @@
target/
/pipIrr-web.iml
pipIrr-web.iml
pipIrr-platform/pipIrr-web/pipIrr-web-sso/.gitignore
@@ -1,6 +1,7 @@
HELP.md
target/
/pipIrr-web-sso.iml
mvnw
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
pipIrr-platform/Îĵµ/Îļþ¼ÓÈëÁË .gitignore£¬µ«»¹ÊDZ» git ¸ú×Ù.docx
Binary files differ