liurunyu
2023-11-20 fb31efc4c1efee99164dc83f6f67f1f609d1ba40
接入中间件代码整理后
33个文件已修改
9个文件已添加
888 ■■■■ 已修改文件
pipIrr-platform/pipIrr-common/pipIrr-common.iml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/CodeParseCallback.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/CommandType.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/Data.java 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/Driver.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/DriverParserDataCallback.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/OnLine.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/OnLineHandle.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/OnLinePool.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/PrefixedDataAvailable.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/PrefixedDataAvailableHandleImp.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/PrefixedDataAvailablePool.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/ProtocolCach.java 45 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/ProtocolConfigVo.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/ProtocolUnit.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/ProtocolUnitAdapter.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206/ProtocolConstantV206.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/pMeterV1_0_1/OnLineV1_0_1.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/rtuStatus/RtuStatuz.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/rtuStatus/StDownData.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/rtuStatus/StOnOffLine.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/rtuStatus/StPumpStatus.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/rtuStatus/StUpData.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/support/SupportUnitConfigVo.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/pom.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/PipIrrMwAcceptApplication.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/Server.java 316 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/resource/ResourceUnit.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/resource/ResourceUnitConfigVo.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/AdapterImp_CoreUnit.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/AdapterImp_ProtocolUnit.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/AdapterImp_ResourceUnit.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/AdapterImp_RmiUnit.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/AdapterImp_SupportUnit.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/AdapterImp_TcpUnit.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/ServerProperties.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/forRmi/RmiRequestedCallback.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/forTcp/MidResultActionFromRtu.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/forTcp/RtuLogDealer.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/tasks/RtuUpTask.java 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/tasks/ToRtuConstantTask.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/resources/config.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/pipIrr-common.iml
@@ -105,6 +105,5 @@
    <orderEntry type="library" name="Maven: org.jdom:jdom2:2.0.6.1" level="project" />
    <orderEntry type="library" name="Maven: cn.hutool:hutool-all:5.8.21" level="project" />
    <orderEntry type="library" name="Maven: org.apache.mina:mina-core:2.2.1" level="project" />
    <orderEntry type="library" name="Maven: org.quartz-scheduler:quartz-weblogic:2.1.7" level="project" />
  </component>
</module>
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/CodeParseCallback.java
@@ -5,7 +5,7 @@
    /**
     * 设置上行数据类型,上报数据:true,命令应答:false,其他(如心跳、链路维持):null
     * 取得数据中的rtuAddr
     * @param reportOrResponse_trueOrFalse
     * @param reportOrResponse_trueOrFalse 上报是true,命令响应是false
     */
    void callback(Boolean reportOrResponse_trueOrFalse) ;
    
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/CommandType.java
@@ -12,6 +12,7 @@
     * 针对Rtu外部命令
     * 只能是异步,命令结果通过相关的信息发布通道发布出去
     */
    @SuppressWarnings("unused")
    public static final String outerCommand = "outerCommand" ;
    
    /**
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/Data.java
@@ -2,17 +2,17 @@
import com.alibaba.fastjson2.JSON;
import java.io.Serial;
/**
 * 数据根
 * @author Administrator
 *
 */
public class Data  implements java.io.Serializable{
    @Serial
    private static final long serialVersionUID = 20160805192500101L;
    public static String ALIAS = Data.class.getName() ;
    private String commandId ;//命令ID,可能为null
    private String rtuAddr ;//终端地址
    private String meterNo ;//水表号
@@ -22,17 +22,17 @@
    private String hex ;//上报数据的十六进制
    public String toString() {
        StringBuffer sb = new StringBuffer() ;
        sb.append("上行报文(十六进制): " + (hex == null?"":hex) + "\n") ; //
        sb.append("IMEI号 : " + (rtuAddr==null?"":rtuAddr) + "\n") ;
        sb.append("水表号 : " + (meterNo==null?"":meterNo) + "\n") ;
        StringBuilder sb = new StringBuilder() ;
        sb.append("上行报文(十六进制): ").append((hex == null?"":hex)).append("\n") ; //
        sb.append("IMEI号 : ").append((rtuAddr==null?"":rtuAddr)).append("\n") ;
        sb.append("水表号 : ").append((meterNo==null?"":meterNo)).append("\n") ;
        if(commandId != null){
            sb.append("命令ID : " + commandId + "\n") ; //命令ID
            sb.append("命令ID : ").append(commandId).append("\n") ; //命令ID
        }
        sb.append("协议 : " + (protocol == null?"":protocol) + "\n") ; //
        sb.append("协议 : ").append((protocol == null?"":protocol)).append("\n") ; //
        sb.append((code == null ? "" : ("功能码:" + code + "\n"))) ;
        if(this.subData  != null){
            sb.append("上行数据:\n" + this.subData.toString()) ;
            sb.append("上行数据:\n").append(this.subData) ;
        }
        return sb.toString() ;
    }
@@ -40,19 +40,18 @@
    /**
     * 对象转成json
     * @return json
     * @throws Exception
     * @return 对象
     */
    public String toJson()throws Exception{
    public String toJson(){
        return JSON.toJSONString(this);
    }
    /**
     * json转成对象
     * @param json
     * @return Data
     * @throws Exception
     * @param json json
     * @return Data Date
     */
    public static Data jsonToObject(String json)throws Exception{
    @SuppressWarnings("unused")
    public static Data jsonToObject(String json){
        return JSON.parseObject(json, Data.class) ;
    }
@@ -119,6 +118,7 @@
        this.subData = subData;
    }
    @SuppressWarnings("unused")
    public String getHex() {
        return hex;
    }
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/Driver.java
@@ -113,7 +113,7 @@
            }
            if(clazz != null){
                //codeParse = clazz.newInstance() ;
                codeParse = clazz.getDeclaredConstructor(CodeParse.class).newInstance();
                codeParse = clazz.getDeclaredConstructor().newInstance();
                upCode2ClassInstance.put(code, codeParse) ;
            }
        }
@@ -135,7 +135,7 @@
            }
            if(clazz != null){
                //codeParse = clazz.newInstance() ;
                codeParse = clazz.getDeclaredConstructor(CodeParse.class).newInstance();
                codeParse = clazz.getDeclaredConstructor().newInstance();
                downCode2ClassInstance.put(code, codeParse) ;
            }
        }
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/DriverParserDataCallback.java
@@ -5,7 +5,7 @@
    /**
     * 解析上行数据后回调
     * @param rtuAddr 上行数据协议头中的IMEI号
     * @param rtuAddr 上行数据协议头中的水表号
     * @param meterNo 上行数据协议头中的水表号
     * @param code 上行数据 功能码
     * @param upHex 上行数据
     * @param reportOrResponse_trueOrFalse 上行数据是主动上报还是命令结果
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/OnLine.java
@@ -4,11 +4,10 @@
    /**
     * 对上线数据进行分析 
     * @param aepImei 电信平台传来的IMEI号
     * @param upBuf 上行数据
     * @return OnLineResult
     */
    OnLineResult parse(String aepImei, byte[] upBuf)throws Exception ;
    OnLineResult parse(byte[] upBuf)throws Exception ;
    
    /**
     * 分析结果
@@ -28,9 +27,9 @@
        }
    }
    
    public static final int OnLineAction_fail = 0; //分析上线数据失败,如提供的数据为null等原因
    public static final int OnLineAction_success = 1; //分析上线数据成功,并能得到IMEI号
    public static final int OnLineAction_success_noMe = 2; //分析上线数据成功,识别出不是本协议数据
    public static final int OnLineAction_success_response = 3; //分析上线数据成功,并需要向Rtu回写数据
    int OnLineAction_fail = 0; //分析上线数据失败,如提供的数据为null等原因
    int OnLineAction_success = 1; //分析上线数据成功,并能得到IMEI号
    int OnLineAction_success_noMe = 2; //分析上线数据成功,识别出不是本协议数据
    int OnLineAction_success_response = 3; //分析上线数据成功,并需要向Rtu回写数据
    
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/OnLineHandle.java
@@ -10,7 +10,7 @@
     * @param bs 字节数组
     * @return OnLine.OnLineResult
     */
    public OnLine.OnLineResult parse(String aepImei, byte[] bs)throws Exception{
    public OnLine.OnLineResult parse(byte[] bs)throws Exception{
        OnLine.OnLineResult rs = null ;
        HashMap<String, AnnotationOnLineVo> onLineMap = ProtocolCach.getOnLineMap() ;
        Collection<AnnotationOnLineVo> set = onLineMap.values() ;
@@ -27,7 +27,7 @@
                //说明上线处理集合已经遍历完了。
                break ;
            }
            rs = onLine.parse(aepImei, bs) ;
            rs = onLine.parse(bs) ;
            OnLinePool.freeInstance(((AnnotationOnLineVo)objs[1]).clazz, onLine);
            if(rs != null){
                if(rs.result == OnLine.OnLineAction_success){
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/OnLinePool.java
@@ -6,7 +6,7 @@
public class OnLinePool {
    
    protected static HashMap<String, List<OnLine>> pool = new HashMap<String, List<OnLine>>() ;
    protected static HashMap<String, List<OnLine>> pool = new HashMap<>() ;
    
    /**
     * 生成对象
@@ -15,14 +15,14 @@
     */
    public static synchronized OnLine getInstance(Class<?> clazz)throws Exception {
        if(pool == null){
            pool = new HashMap<String, List<OnLine>>() ;
            pool = new HashMap<>() ;
        }
        String className = clazz.getName() ;
        OnLine obj = null ;
        
        List<OnLine> list = pool.get(className) ;
        if(list == null){
            list = new ArrayList<OnLine>() ;
            list = new ArrayList<>() ;
        }else{
            obj = list.get(0) ;
        }
@@ -32,7 +32,8 @@
            return obj ;
        }else{
            try {
                obj = (OnLine)clazz.newInstance();
                obj = (OnLine)clazz.getDeclaredConstructor().newInstance() ;
                //obj = (OnLine)clazz.newInstance();
            } catch (Exception e) {
                throw new Exception( "由" + className + "生成实例失败!");
            }
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/PrefixedDataAvailable.java
@@ -26,7 +26,7 @@
     * @param remain 一定时大于0的数据
     * @param minDataLength 最小数据长度
     * @param maxDataLength 最大数据长度,达到或超过此长度,认为是垃圾数据。例如:数据头部是正确的,但合法数据结尾总不出现,认为此数据垃圾数据
     * @return
     * @return PrefixedDataAvailableStatus
     * @throws Exception 异常
     */
    PrefixedDataAvailableStatus forUpData(IoBuffer in,
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/PrefixedDataAvailableHandleImp.java
@@ -13,15 +13,14 @@
public class PrefixedDataAvailableHandleImp implements PrefixedDataAvailableHandle {
    
    private static Logger log = LogManager.getLogger(PrefixedDataAvailableHandleImp.class) ;
    private static final Logger log = LogManager.getLogger(PrefixedDataAvailableHandleImp.class) ;
    
    /**
     * 在多线程环境中运行
     * 分析上线数据(网络连接后第一包数据)是否可获得
     * @param in
     * @return
     * @throws Exception
     * @param in IoBuffer
     * @return PrefixedDataAvailableStatus
     */
    public PrefixedDataAvailableStatus forOnLine(IoBuffer in){
        int remain = in.remaining() ;
@@ -33,7 +32,7 @@
                
                HashMap<String, AnnotationPrefixedDataAvailableVo> prefixedDataAvailableMap = ProtocolCach.getPrefixedDataAvailableMap() ;
                Collection<AnnotationPrefixedDataAvailableVo> set = prefixedDataAvailableMap.values() ;
                if(set == null || set.size() == 0){
                if(set.size() == 0){
                    throw new Exception("上线数据完整性检查时,得到的协议完整性检查类集合为空。") ;
                }
                int prority = ProtocolConstant.firstPriority ;
@@ -80,11 +79,8 @@
    /**
     * 在多线程环境中运行
     * 分析上行数据(网络连接后第二(包含)包以后数据)是否可获得
     * @param in
     * @param clientProtocol
     * @param maxDataLength
     * @return
     * @throws Exception
     * @param in IoBuffer
     * @return PrefixedDataAvailableStatus
     */
    public PrefixedDataAvailableStatus forUpData(IoBuffer in){
        int remain = in.remaining() ;
@@ -96,7 +92,7 @@
                
                HashMap<String, AnnotationPrefixedDataAvailableVo> prefixedDataAvailableMap = ProtocolCach.getPrefixedDataAvailableMap() ;
                Collection<AnnotationPrefixedDataAvailableVo> set = prefixedDataAvailableMap.values() ;
                if(set == null || set.size() == 0){
                if(set.size() == 0){
                    throw new Exception("上线数据完整性检查时,得到的协议集合为空。") ;
                }
                int prority = ProtocolConstant.firstPriority ;
@@ -144,10 +140,10 @@
    /**
     * 得到处理类对象
     * @param prority
     * @param set
     * @return
     * @throws Exception
     * @param prority 优先级
     * @param set 集合
     * @return Object[]
     * @throws Exception 异常
     */
    private Object[] getClassObjAndAnnotationVo(int prority, Collection<AnnotationPrefixedDataAvailableVo> set) throws Exception{
        PrefixedDataAvailable obj = null ;
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/PrefixedDataAvailablePool.java
@@ -6,24 +6,24 @@
public class PrefixedDataAvailablePool {
    
    protected static HashMap<String, List<PrefixedDataAvailable>> pool = new HashMap<String, List<PrefixedDataAvailable>>() ;
    protected static HashMap<String, List<PrefixedDataAvailable>> pool = new HashMap<>() ;
    
    /**
     * 生成对象
     * 线程非安全的,所以用到synchronized
     * @param className
     * @return
     * @param clazz 预处理类
     * @return 预处理类对象
     */
    public static synchronized PrefixedDataAvailable getInstance(Class<?> clazz)throws Exception {
        if(pool == null){
            pool = new HashMap<String, List<PrefixedDataAvailable>>() ;
            pool = new HashMap<>() ;
        }
        String className = clazz.getName() ;
        PrefixedDataAvailable obj = null ;
        
        List<PrefixedDataAvailable> list = pool.get(className) ;
        if(list == null){
            list = new ArrayList<PrefixedDataAvailable>() ;
            list = new ArrayList<>() ;
        }else{
            obj = list.get(0) ;
        }
@@ -33,7 +33,8 @@
            return obj ;
        }else{
            try {
                obj = (PrefixedDataAvailable)clazz.newInstance();
                obj = (PrefixedDataAvailable)clazz.getDeclaredConstructor().newInstance() ;
                //obj = (PrefixedDataAvailable)clazz.newInstance();
            } catch (Exception e) {
                throw new Exception( "由" + className + "生成实例失败!");
            }
@@ -43,10 +44,10 @@
    
    /**
     * 把对象放回池中
     * @param className
     * @return
     * @param clazz 预处理类
     * @param obj  预处理类对象
     */
    public static void freeInstance(Class<?> clazz, PrefixedDataAvailable obj)throws Exception {
    public static void freeInstance(Class<?> clazz, PrefixedDataAvailable obj) {
        if(pool != null){
            String className = clazz.getName() ;
            List<PrefixedDataAvailable> list = pool.get(className) ;
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/ProtocolCach.java
@@ -1,7 +1,6 @@
package com.dy.common.mw.protocol;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -9,26 +8,27 @@
public class ProtocolCach {
    
    //本系统中,Driver在单线程中运行,所以只用一个实例
    private static HashMap<String, Driver> drivers = new HashMap<String, Driver>() ;
    private static final HashMap<String, Driver> drivers = new HashMap<>() ;
    //注解与处理类的映射
    private static HashMap<String, AnnotationDriverVo> driverMap = new HashMap<String, AnnotationDriverVo>() ;
    private static HashMap<String, AnnotationPrefixedDataAvailableVo> prefixedDataAvailableMap = new HashMap<String, AnnotationPrefixedDataAvailableVo>() ;
    private static HashMap<String, AnnotationOnLineVo> onLineMap = new HashMap<String, AnnotationOnLineVo>() ;
    private static final HashMap<String, AnnotationDriverVo> driverMap = new HashMap<>() ;
    private static final HashMap<String, AnnotationPrefixedDataAvailableVo> prefixedDataAvailableMap = new HashMap<>() ;
    private static final HashMap<String, AnnotationOnLineVo> onLineMap = new HashMap<>() ;
    
    /**
     * 在单线程环境中运行
     * 通过协议驱动的类名,得到类单例
     * @param protocolName
     * @return
     * @throws Exception
     * @param protocolName 协议名称
     * @return 驱动
     * @throws Exception 异常
     */
    public static Driver getDriver(String protocolName) throws Exception{
        Driver dri = drivers.get(protocolName);
        if(dri == null){
            AnnotationDriverVo vo = driverMap.get(protocolName) ;
            if(vo != null && vo.clazz != null){
                dri = (Driver)vo.clazz.newInstance() ;
                dri = (Driver)vo.clazz.getDeclaredConstructor().newInstance();
                //dri = (Driver)vo.clazz.newInstance() ;
                drivers.put(protocolName, dri) ;
            }
        }
@@ -37,10 +37,10 @@
    
    /**
     * 得到驱动的数量,即中间件支持的协议数量
     * @return
     * @return 驱动总数
     */
    public static int driverCount(){
        if(drivers == null || drivers.size() == 0){
        if(drivers.size() == 0){
            return 0 ;
        }else{
            return drivers.size() ;
@@ -49,11 +49,11 @@
    
    /**
     * 得到第一个驱动
     * @return
     * @return 驱动
     */
    public static Driver getFirstDriver() throws Exception{
    public static Driver getFirstDriver(){
        Driver dri = null ;
        if(drivers != null && drivers.size() > 0){
        if(drivers.size() > 0){
            Map.Entry<String, Driver> ent = drivers.entrySet().iterator().next() ;
            dri = ent.getValue();
        }
@@ -62,15 +62,11 @@
    /**
     * 得到所有协议名称
     * @return
     * @return 协议名称集合
     */
    @SuppressWarnings("unused")
    public static List<String> getProtocolList() {
        List<String> list = new ArrayList<String>() ;
        Collection<String> col = driverMap.keySet() ;
        for(String pname : col){
            list.add(pname) ;
        }
        return list;
        return new ArrayList<>(driverMap.keySet()) ;
    }
    protected static HashMap<String, AnnotationDriverVo> getDriverMap() {
@@ -83,4 +79,11 @@
        return onLineMap;
    }
    public static void main(String[] args){
        HashMap<String, Integer> mp = new HashMap<>() ;
        mp.put("a1", 1) ;
        mp.put("a2", 2) ;
        List<String> list = new ArrayList<>(mp.keySet()) ;
        System.out.println(list);
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/ProtocolConfigVo.java
@@ -4,8 +4,6 @@
    public Integer centerAddr ;//中心地址
    public Boolean synchroRtuClock ;//是否对RTU校时
    public Integer synchroRtuClockTimepieces ;//当RTU与服务器时钟相差一定毫秒(配置文件是秒钟)后,进行校时
    public String serverIp ;//服务端IP地址,汉威协议中用到
    public Integer serverPort ;//服务端端口,汉威协议中用到
    public Boolean showStartInfo; //是否在控制台上显示信息
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/ProtocolUnit.java
@@ -46,13 +46,12 @@
        //各个协议驱动类扫描自己的功能码注解
        HashMap<String, AnnotationDriverVo> drivers =  ProtocolCach.getDriverMap() ;
        Collection<String> colDrivers = drivers.keySet() ;
        String totalProtocols = null ;
        StringBuilder totalProtocols = new StringBuilder() ;
        for(String protocolName : colDrivers){
            if(totalProtocols == null){
                totalProtocols = protocolName ;
            }else{
                totalProtocols += "," + protocolName ;
            if(!totalProtocols.isEmpty()){
                totalProtocols.append(",") ;
            }
            totalProtocols.append(protocolName) ;
            Driver dri = ProtocolCach.getDriver(protocolName) ;
            if(dri != null){
                dri.scanAnnotationCode();
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/ProtocolUnitAdapter.java
@@ -11,19 +11,19 @@
    ProtocolConfigVo getConfig() ;
    /**
     * 单线程环境中运行,得到单个处理RTU下行数据的action执行对象
     * @param protocolName
     * @param protocolName 协议名称
     * @return MidResultAction
     */
    MidResultAction getSingleActionToRtu(String protocolName) ;
    /**
     * 单线程环境中运行,得到单个处理RTU上行数据的action执行对象
     * @param protocolName
     * @param protocolName 协议名称
     * @return MidResultAction
     */
    MidResultAction getSingleActionFromRtu(String protocolName) ;
    /**
     * 单线程环境中运行,得到单个处理出错的action执行对象
     * @param protocolName
     * @param protocolName 协议名称
     * @return MidResultAction
     */
    MidResultAction getSingleActionError(String protocolName) ;
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206/ProtocolConstantV206.java
New file
@@ -0,0 +1,4 @@
package com.dy.common.mw.protocol.p206;
public class ProtocolConstantV206 {
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/pMeterV1_0_1/OnLineV1_0_1.java
@@ -10,12 +10,11 @@
    /**
     * 对上线数据进行分析 
     * @param aepImei 电信平台传来的IMEI号
     * @param bs
     * @param upBuf 上行数据
     * @return
     */
    @Override
    public OnLineResult parse(String aepImei, byte[] upBuf)throws Exception {
    public OnLineResult parse(byte[] upBuf)throws Exception {
        OnLineResult olr = new OnLineResult() ;
        CommonV1_0_1 cp = new CommonV1_0_1() ;
        Boolean flag = cp.isThisProtocolHead(upBuf) ;
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/rtuStatus/RtuStatuz.java
@@ -1,10 +1,16 @@
package com.dy.common.mw.protocol.rtuStatus;
import java.io.Serial;
//用类名RtuStatuz而不是RtuStatus,因为与com.dy.dataMw.protocol.local.RtuStatus冲突
public class RtuStatuz implements java.io.Serializable{
    private static final long serialVersionUID = 201606281038001L;
    @Serial
    private static final long serialVersionUID;
    static {
        serialVersionUID = 201606281038001L;
    }
    public String rtuAddr ;
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/rtuStatus/StDownData.java
@@ -1,8 +1,14 @@
package com.dy.common.mw.protocol.rtuStatus;
import java.io.Serial;
public class StDownData extends RtuStatuz {
    private static final long serialVersionUID = 201606281038003L;
    @Serial
    private static final long serialVersionUID;
    static {
        serialVersionUID = 201606281038003L;
    }
    public Integer downBufferLen ;
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/rtuStatus/StOnOffLine.java
@@ -1,9 +1,15 @@
package com.dy.common.mw.protocol.rtuStatus;
import java.io.Serial;
public class StOnOffLine extends RtuStatuz {
    private static final long serialVersionUID = 201606281038004L;
    @Serial
    private static final long serialVersionUID;
    static {
        serialVersionUID = 201606281038004L;
    }
    public Boolean onOff_trueFalse ;
    public String ip ; 
    public Integer port ;
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/rtuStatus/StPumpStatus.java
@@ -1,9 +1,15 @@
package com.dy.common.mw.protocol.rtuStatus;
import java.io.Serial;
public class StPumpStatus extends RtuStatuz {
    private static final long serialVersionUID = 201706241034001L;
    @Serial
    private static final long serialVersionUID;
    static {
        serialVersionUID = 201706241034001L;
    }
    public Integer pumpStatus ;//0:泵启动了,1泵停止,null未知态
    
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/rtuStatus/StUpData.java
@@ -1,9 +1,15 @@
package com.dy.common.mw.protocol.rtuStatus;
import java.io.Serial;
public class StUpData extends RtuStatuz {
    private static final long serialVersionUID = 201606281038005L;
    @Serial
    private static final long serialVersionUID;
    static {
        serialVersionUID = 201606281038005L;
    }
    public Integer upBufferLen ;
    
    public boolean isReport ;
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/support/SupportUnitConfigVo.java
@@ -15,19 +15,7 @@
    public int long_minThread ; 
    public long long_freeTimeout; 
    public long long_busyTimeout ;
    //单个Ssdb接连池配置文件
    public String singleSsdbPoolXmlFile ;
    //多个Ssdb接连池配置文件
    public String multiSsdbPoolXmlFile ;
    //Redis集群配置文件
    public String redisClusterXmlFile ;
    //单个Redis接连池配置文件
    public String singleRedisPoolXmlFile ;
    //多个Redis接连池配置文件
    public String multiRedisPoolXmlFile ;
    public Boolean showStartInfo; //是否在控制台上显示信息
    
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/pom.xml
@@ -26,5 +26,10 @@
            <artifactId>mina-filter-compression</artifactId>
            <version>2.2.1</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>2.0.7</version>
        </dependency>
    </dependencies>
</project>
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/PipIrrMwAcceptApplication.java
@@ -2,9 +2,11 @@
import com.dy.common.multiDataSource.EnableMultiDataSource;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@@ -19,6 +21,11 @@
        SpringApplication.run(PipIrrMwAcceptApplication.class, args);
    }
    /**
     * Spring容器启动完成后,执行下面方法
     * @param args
     * @throws Exception
     */
    @Override
    public void run(String... args) throws Exception {
        try{
@@ -31,6 +38,14 @@
    }
    private void startAceSv(){
        if(sv != null){
            sv.startServer();
        }
    }
    private Server sv ;
    @Autowired
    public void setSv(Server sv){
        this.sv = sv ;
    }
}
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/Server.java
New file
@@ -0,0 +1,316 @@
package com.dy.aceMw;
import java.util.ArrayList;
import java.util.List;
import com.dy.common.mw.UnitInterface;
import com.dy.common.mw.UnitStartedCallbackInterface;
import com.dy.common.mw.channel.rmi.RmiConfigVo;
import com.dy.common.mw.channel.rmi.RmiUnit;
import com.dy.common.mw.channel.tcp.TcpConfigVo;
import com.dy.common.mw.channel.tcp.TcpUnit;
import com.dy.common.mw.core.CoreUnit;
import com.dy.common.mw.core.CoreUnitConfigVo;
import com.dy.common.mw.protocol.ProtocolConfigVo;
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;
import org.jdom2.Document;
import org.springframework.stereotype.Component;
@Component
public class Server {
    private ConfigXml conf = null ;
    private Document doc = null ;
    private boolean showStartInfo = false ;
    private String RmiSvUrl ;
    private String TcpSvUrl ;
    private List<UnitInterface> units = new ArrayList<UnitInterface>() ;
    /*
     * @param args 参数
    public static void main(String[] args) {
        new Server().startServer();
    }
    */
    /**
     * 启动服务
      */
    public void startServer(){
//        try {
//            URL url = Server.class.getResource("/config/sv.licence");
//            if(!new Lnp(null).parese(url.getPath())){
//                System.out.println("zhzc licence error!") ;
//                return ;
//            }
//        } catch (Exception e) {
//            System.out.println("zhzc licence error!") ;
//            return ;
//        }
        Server sv = new Server();
        long start = System.currentTimeMillis() ;
        try {
            //ConfigProperties.init(sv.getClass().getResourceAsStream("/config/config.properties"), false);
            sv.conf = new ConfigXml() ;
            sv.doc = sv.conf.createDom(sv.getClass(), "config.xml") ;
            ////////////////
            //服务 配置
            sv.showStartInfo = sv.conf.getSetAttrBoolean(sv.doc, "config.server", "showStartInfo", null, null) ;
            sv.startUnits() ;
            String svName ;
            try{
                svName = sv.conf.getSetAttrTxt(sv.doc, "config.server", "name", null, false, null) ;
            }catch(Exception e){
                svName = "" ;
            }
            svName += (ServerProperties.isLowPower?"(低功耗)": "") + "-" ;
            String company ;
            try{
                company = sv.conf.getSetAttrTxt(sv.doc, "config.server", "company", null, true, null) ;
            }catch(Exception e){
                company = "" ;
            }
            System.out.println("OOOOOOOOOO           OOOOOOOO       OOOOOOOO") ;
            System.out.println("@@@@@@@@@@@@@@@@#O    $@@@@@@@@&    @@@@@@@@#") ;
            System.out.println("@@@@@@@@@@@@@@@@@@@#    @@@@@@@@# $@@@@@@@@&") ;
            System.out.println("@@@@@@@@@@@@@@@@@@@@@#   #@@@@@@@@@@@@@@@@O") ;
            System.out.println("@@@@@@@@@@@@@@@@@@@@@@@   &@@@@@@@@@@@@@@") ;
            System.out.println("@@@@@@$      $@@@@@@@@@&   O@@@@@@@@@@@#") ;
            System.out.println("@@@@@@$        @@@@@@@@@     @@@@@@@@@&      " + svName + "RtuMw 1.0.00" ) ;
            System.out.println("@@@@@@$        @@@@@@@@@     &@@@@@@@@") ;
            if(sv.TcpSvUrl != null){
                System.out.println("@@@@@@$       O@@@@@@@@@     &@@@@@@@@       TcpSv " + sv.TcpSvUrl ) ;
            }else{
                System.out.println("@@@@@@$       O@@@@@@@@@     &@@@@@@@@") ;
            }
            if(sv.RmiSvUrl != null){
                System.out.println("@@@@@@$      #@@@@@@@@@$     &@@@@@@@@       RmiSv " + sv.RmiSvUrl ) ;
            }else{
                System.out.println("@@@@@@$      #@@@@@@@@@$     &@@@@@@@@" ) ;
            }
            System.out.println("@@@@@@@@@@@@@@@@@@@@@@#      &@@@@@@@@       Runing in standalone mode" ) ;
            System.out.println("@@@@@@@@@@@@@@@@@@@@@&       &@@@@@@@@       Startup in " + (System.currentTimeMillis() - start) + " MS" ) ;
            System.out.println("@@@@@@@@@@@@@@@@@@@#         &@@@@@@@@       " + company) ;
            System.out.println("@@@@@@@@@@@@@@@@#O           &@@@@@@@@") ;
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    private void startUnits(){
        try {
            ///////////////
            //基本配置
            ServerProperties.isLowPower = conf.getSetAttrBoolean(doc, "config.base", "isLowPower", null, null) ;
            if(ServerProperties.isLowPower == null){
                ServerProperties.isLowPower = false ;
            }
            //在支持多通信协议时,只有RTU上线了,才能识别出该RTU实际用的通信协议,进而用此协议解析上行数据及构造下行命令。
            //如果RTU未曾上线(通信中间件启动后该RTU未曾上线),那么在向它发送下行命令时,不能判断出其采用的协议,也不能构造命令,尤其是低功耗情况下,不上线是正常现象。
            // 当只有一个协议情况下,在RTU未曾上线时,也能用此协议构造命令并缓存下来,尤其适合低功耗情况。
            //onlyOne=true: 通信中间件当前只有一个协议
            ServerProperties.onlyOneProtocol = conf.getSetAttrBoolean(doc, "config.base", "onlyOneProtocol", null, null) ;
            if(ServerProperties.onlyOneProtocol == null){
                ServerProperties.onlyOneProtocol = false ;
            }
            //下行命令允许发送的最大次数X,即允许重发X-1
            ServerProperties.downComandMaxResendTimes = conf.getSetAttrPlusInt(doc, "config.base", "downComandMaxResendTimes", null, 1, 5, null).byteValue() ;
            //针对一个RTU,下发命令的时间间隔
            ServerProperties.commandSendInterval = conf.getSetAttrPlusInt(doc, "config.base", "commandSendInterval", null, 1, 40, null) * 1000L ;
            //命令已经发送达最大次数,仍未收到命令结果,需要在缓存继续等待,其等待最大时长
            ServerProperties.cachWaitResultTimeout = conf.getSetAttrPlusInt(doc, "config.base", "cachWaitResultTimeout", null, 10, 60, null) * 1000L ;
            //不在线缓存的命令最大缓存时长
            ServerProperties.offLineCachTimeout = conf.getSetAttrPlusInt(doc, "config.base", "offLineCachTimeout", null, 15, 172800, null) * 1000L ;
            //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);
            //设置ID生成器的后缀
            IDLongGenerator.setSuffix(ServerProperties.dbDataIdSuffix.intValue());
            ////////////////
            //协议模块
            ProtocolConfigVo protoVo = new ProtocolConfigVo();
            protoVo.centerAddr = conf.getSetAttrPlusInt(doc, "config.protocol", "centerAddr", null, 1, 4, null) ;
            protoVo.synchroRtuClock = conf.getSetAttrBoolean(doc, "config.protocol", "synchroRtuClock", null, null) ;
            //当RTU与服务器时钟相差一定秒钟后,进行校时
            protoVo.synchroRtuClockTimepieces = 1000 * conf.getSetAttrPlusInt(doc, "config.protocol", "synchroRtuClockTimepieces", null, null, null, null) ;
            protoVo.showStartInfo = showStartInfo ;
            AdapterImp_ProtocolUnit protoAdap = new AdapterImp_ProtocolUnit();
            protoAdap.setConfig(protoVo);
            ProtocolUnit protoUnit = ProtocolUnit.getInstance();
            protoUnit.setAdapter(protoAdap);
            protoUnit.start(new UnitStartedCallbackInterface(){
                @Override
                public void call(Object obj) {
                }
            });
            units.add(protoUnit) ;
            ////////////////////////////////////////////////////////
            //支持模块: 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_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秒
            //长工作时长线程池,线程负责用时较长的工作任务
            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_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 ;
            }
            supVo.enableThreadPool = conf.getSetAttrBoolean(doc, "config.support", "enableThreadPool", null, null) ;
//            supVo.enableSpringHibernate = conf.getSetAttrBoolean(doc, "config.support", "enableSpringHibernate", null, null) ;
//            if(supVo.enableSpringHibernate){
//                supVo.springXmlFile = conf.getSetAttrTxt(doc, "config.support", "springXmlFile", null, false, null) ;
//            }
            supVo.showStartInfo = showStartInfo ;
            AdapterImp_SupportUnit supAdap = new AdapterImp_SupportUnit() ;
            supAdap.setConfig(supVo);
            SupportUnit supUnit = SupportUnit.getInstance() ;
            supUnit.setAdapter(supAdap);
            supUnit.start(new UnitStartedCallbackInterface(){
                @Override
                public void call(Object obj) {
                }
            });
            units.add(supUnit) ;
            /////////////////////////
            //资源模块
            ResourceUnitConfigVo resVo = new ResourceUnitConfigVo() ;
            //RTU日志文件存储目录(相对目录)
            resVo.rtuLogDir = conf.getSetAttrTxt(doc, "config.resource", "rtuLogDir", null, false, null) ;
            //RTU日志文件最大字节数(KB)
            resVo.rtuLogFileMaxSize = conf.getSetAttrPlusInt(doc, "config.resource", "rtuLogFileMaxSize", null, 100000, 2000000, null) ;
            //RTU日志文件最大文件数
            resVo.rtuLogFileMaxCount = conf.getSetAttrPlusInt(doc, "config.resource", "rtuLogFileMaxCount", null, 1, 10, null) ;
            //Rtu状态监视间隔(分钟)
            resVo.monitorInterval = conf.getSetAttrPlusInt(doc, "config.resource", "monitorInterval", null, 1, 5, null) ;
            //Rtu状态存数据库间隔(分钟)
            resVo.saveDbInterval = conf.getSetAttrPlusInt(doc, "config.resource", "saveDbInterval", null, 5, 20, null) ;
            //Rtu无数据上传达到此值,则认为不在线了(分钟)
            //注意:noUpDataLimitTime在元素config.protocol中
            //resVo.noUpDataLimitTime = conf.getSetAttrPlusInt(doc, "config.protocol", "noUpDataLimitTime", null, 30, 60, null) ;
            AdapterImp_ResourceUnit resAdap = new AdapterImp_ResourceUnit() ;
            resAdap.setConfig(resVo);
            ResourceUnit resUnit = ResourceUnit.getInstance() ;
            resUnit.setAdapter(resAdap);
            //当前支持spring + hibernate
            resUnit.setSpringContext(SpringContextUtil.getApplicationContext());
            resUnit.start(new UnitStartedCallbackInterface(){
                @Override
                public void call(Object obj) {
                }
            });
            units.add(resUnit) ;
            /////////////////
            //RMI模块
            RmiConfigVo rmiVo = new RmiConfigVo();
            rmiVo.enable = conf.getSetAttrBoolean(doc, "config.rmi", "enable", null, null) ;
            if(rmiVo.enable){
                rmiVo.port = conf.getSetAttrPlusInt(doc, "config.rmi", "port", null, 100, 65535, null);
                rmiVo.context = conf.getSetAttrTxt(doc, "config.rmi", "context", null, false, null);
                rmiVo.showStartInfo = showStartInfo ;
                AdapterImp_RmiUnit rmiAdap = new AdapterImp_RmiUnit();
                rmiAdap.setConfig(rmiVo);
                RmiUnit rmiUnit = RmiUnit.getInstance();
                rmiUnit.setAdapter(rmiAdap);
                rmiUnit.start(new UnitStartedCallbackInterface(){
                    @Override
                    public void call(Object obj) {
                    }
                });
                RmiSvUrl = "[ip]:" + rmiVo.port + "/" + rmiVo.context ;
                units.add(rmiUnit) ;
            }
            // ///////////////
            // 核心
            CoreUnitConfigVo coreConfVo = new CoreUnitConfigVo();
            coreConfVo.sleepBigBusy = conf.getSetAttrPlusInt(doc, "config.core", "sleepBigBusy", null, 1, 200, null).longValue() ;
            coreConfVo.sleepSmallBusy = conf.getSetAttrPlusInt(doc, "config.core", "sleepSmallBusy", null, 2, 1000, null).longValue();
            coreConfVo.queueWarnSize = conf.getSetAttrPlusInt(doc, "config.core", "queueWarnSize", null, 500, 1000000, null) ;
            coreConfVo.queueMaxSize = conf.getSetAttrPlusInt(doc, "config.core", "queueMaxSize", null, 5000, 3000000, null)  ;
            coreConfVo.showStartInfo = showStartInfo ;
            AdapterImp_CoreUnit coreAdap = new AdapterImp_CoreUnit();
            coreAdap.setConfig(coreConfVo);
            CoreUnit coreUnit = CoreUnit.getInstance();
            coreUnit.setAdapter(coreAdap);
            CoreUnit.addConstantTask(new ToRtuConstantTask());
            coreUnit.start(new UnitStartedCallbackInterface(){
                @Override
                public void call(Object obj) {
                }
            });
            units.add(coreUnit) ;
            // ///////////////
            // TCP 模块
            TcpConfigVo tcpVo = new TcpConfigVo();
            tcpVo.enable = conf.getSetAttrBoolean(doc, "config.tcp", "enable", null, null) ;
            if(tcpVo.enable){
                tcpVo.port = conf.getSetAttrPlusInt(doc, "config.tcp", "port", null, 100, 65535, null);
                tcpVo.processors = conf.getSetAttrPlusInt(doc, "config.tcp", "processors", null, 1, 100, null);
                tcpVo.idle = conf.getSetAttrPlusInt(doc, "config.tcp", "idle", null, 1, 20, null);// 10分钟
                tcpVo.showStartInfo = showStartInfo ;
                AdapterImp_TcpUnit tcpAdap = new AdapterImp_TcpUnit();
                tcpAdap.setConfig(tcpVo);
                TcpUnit tcpUnit = TcpUnit.getInstance();
                tcpUnit.setAdapter(tcpAdap);
                tcpUnit.start(new UnitStartedCallbackInterface(){
                    @Override
                    public void call(Object obj) {
                    }
                });
                TcpSvUrl = "[ip]:" + tcpVo.port ;
                units.add(tcpUnit) ;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/resource/ResourceUnit.java
@@ -64,7 +64,7 @@
    }
    @Override
    public void start(UnitStartedCallbackInterface callback) throws Exception {
        if(confVo.enableSpringHibernate && ResourceUnit.springContext == null){
        if(ResourceUnit.springContext == null){
            throw new Exception("Spring上下文对象未设置!") ;
        }
        callback.call(null) ;
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/resource/ResourceUnitConfigVo.java
@@ -3,9 +3,7 @@
public class ResourceUnitConfigVo {
    
    public Boolean enableSpringHibernate ;
    //RTU日志文件存储目录(相对目录)
    //RTU日志文件存储目录(相对目录)
    public String rtuLogDir ;
    //RTU日志文件最大字节数(KB)
    public int rtuLogFileMaxSize ;
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/AdapterImp_CoreUnit.java
New file
@@ -0,0 +1,19 @@
package com.dy.aceMw.server;
import com.dy.common.mw.core.CoreUnitAdapter;
import com.dy.common.mw.core.CoreUnitConfigVo;
public class AdapterImp_CoreUnit implements CoreUnitAdapter {
    private CoreUnitConfigVo configVo = null ;
    @Override
    public CoreUnitConfigVo getConfig() {
        return this.configVo;
    }
    public void setConfig(CoreUnitConfigVo configVo) {
        this.configVo = configVo;
    }
}
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/AdapterImp_ProtocolUnit.java
New file
@@ -0,0 +1,60 @@
package com.dy.aceMw.server;
import com.dy.common.mw.protocol.MidResultAction;
import com.dy.common.mw.protocol.ProtocolConfigVo;
import com.dy.common.mw.protocol.ProtocolUnitAdapter;
import com.dy.aceMw.server.forTcp.MidResultActionError;
import com.dy.aceMw.server.forTcp.MidResultActionFromRtu;
import com.dy.aceMw.server.forTcp.MidResultActionToRtu;
public class AdapterImp_ProtocolUnit implements ProtocolUnitAdapter {
    private static final MidResultAction toRtu = new MidResultActionToRtu() ;
    private static final MidResultAction fromRtu = new MidResultActionFromRtu() ;
    private static final MidResultAction error = new MidResultActionError() ;
    private ProtocolConfigVo configVo = null ;
    @Override
    public ProtocolConfigVo getConfig() {
        return this.configVo;
    }
    public void setConfig(ProtocolConfigVo configVo) {
        this.configVo = configVo;
    }
    /**
     * 单线程环境中运行,得到单个 处理RTU下行数据的MidResultAction执行对象
     * @param protocolName 协议名称
     * @return MidResultAction
     */
    @Override
    public MidResultAction getSingleActionToRtu(String protocolName) {
        return toRtu ;
    }
    /**
     * 单线程环境中运行,得到单个处理RTU上行数据的MidResultAction执行对象
     * @param protocolName 协议名称
     * @return MidResultAction
     */
    @Override
    public MidResultAction getSingleActionFromRtu(String protocolName) {
        return fromRtu ;
    }
    /**
     * 单线程环境中运行,得到单个处理出错的MidResultAction执行对象
     * @param protocolName 协议名称
     * @return MidResultAction
     */
    @Override
    public MidResultAction getSingleActionError(String protocolName) {
        return error ;
    }
}
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/AdapterImp_ResourceUnit.java
New file
@@ -0,0 +1,19 @@
package com.dy.aceMw.server;
import com.dy.aceMw.resource.ResourceUnitAdapter;
import com.dy.aceMw.resource.ResourceUnitConfigVo;
public class AdapterImp_ResourceUnit implements ResourceUnitAdapter {
    private ResourceUnitConfigVo configVo = null ;
    @Override
    public ResourceUnitConfigVo getConfig() {
        return this.configVo;
    }
    public void setConfig(ResourceUnitConfigVo configVo) {
        this.configVo = configVo;
    }
}
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/AdapterImp_RmiUnit.java
New file
@@ -0,0 +1,26 @@
package com.dy.aceMw.server;
import com.dy.aceMw.server.forRmi.RmiRequestedCallback;
import com.dy.common.mw.channel.rmi.RmiConfigVo;
import com.dy.common.mw.channel.rmi.RmiRequestCallback;
import com.dy.common.mw.channel.rmi.RmiUnitAdapter;
public class AdapterImp_RmiUnit implements RmiUnitAdapter {
    private RmiConfigVo configVo ;
    @Override
    public RmiConfigVo getConfig() {
        return configVo;
    }
    public void setConfig(RmiConfigVo configVo){
        this.configVo = configVo ;
    }
    @Override
    public RmiRequestCallback newRequestCallback() {
        return new RmiRequestedCallback();
    }
}
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/AdapterImp_SupportUnit.java
New file
@@ -0,0 +1,20 @@
package com.dy.aceMw.server;
import com.dy.common.mw.support.SupportUnitAdapter;
import com.dy.common.mw.support.SupportUnitConfigVo;
public class AdapterImp_SupportUnit implements SupportUnitAdapter {
    private SupportUnitConfigVo configVo = null ;
    @Override
    public SupportUnitConfigVo getConfig() {
        return this.configVo;
    }
    public void setConfig(SupportUnitConfigVo configVo) {
        this.configVo = configVo;
    }
}
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/AdapterImp_TcpUnit.java
New file
@@ -0,0 +1,33 @@
package com.dy.aceMw.server;
import com.dy.common.mw.channel.tcp.PrefixedDataAvailableHandle;
import com.dy.common.mw.channel.tcp.TcpConfigVo;
import com.dy.common.mw.channel.tcp.TcpIoSessionEventCallback;
import com.dy.common.mw.channel.tcp.TcpUnitAdapter;
import com.dy.common.mw.protocol.PrefixedDataAvailableHandleImp;
import com.dy.aceMw.server.forTcp.TcpIoSessionCallback;
public class AdapterImp_TcpUnit implements TcpUnitAdapter {
    private TcpConfigVo configVo ;
    @Override
    public TcpConfigVo getConfig() {
        return configVo;
    }
    public void setConfig(TcpConfigVo configVo){
        this.configVo = configVo ;
    }
    @Override
    public PrefixedDataAvailableHandle newPrefixedDataAvailableHandle() {
        return new PrefixedDataAvailableHandleImp() ;
    }
    @Override
    public TcpIoSessionEventCallback newSessionEventCallback() {
        return new TcpIoSessionCallback() ;
    }
}
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/ServerProperties.java
@@ -22,7 +22,7 @@
    public static Long offLineCachTimeout = 60 * 1000L ;
    
    //TCP上行数据时刻缓存时长,当达到时长时,TCP上行数据时刻被清空,采用TCP上行数据时刻目的是,阻止上数据同时下发数据,因为RTU处理不过来
    public static Long lastUpDataTimeLive = 1 * 1000L ;
    public static Long lastUpDataTimeLive = 1000L ;
    
    //数据库数据id生成器的id后缀,0是默认的后缀,一般web系统应用,数据中间件id后缀大于等于1
    public static Integer dbDataIdSuffix = 1 ; 
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/forRmi/RmiRequestedCallback.java
New file
@@ -0,0 +1,30 @@
package com.dy.aceMw.server.forRmi;
import java.rmi.RemoteException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.dy.common.mw.channel.rmi.RmiRequestCallback;
public class RmiRequestedCallback implements RmiRequestCallback{
    @SuppressWarnings("unused")
    private static final Logger log;
    static {
        log = LogManager.getLogger(RmiRequestedCallback.class.getName());
    }
    @Override
    public Object syncRequest(Object obj) throws RemoteException {
        return null;
    }
    @Override
    public String asyncRequest(Object obj) throws RemoteException {
        return null;
    }
}
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/forTcp/MidResultActionFromRtu.java
@@ -3,12 +3,10 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.dy.aceMw.server.forMq.ToMqMessageCach;
import com.dy.common.mw.protocol.MidResult;
import com.dy.common.mw.protocol.MidResultAction;
import com.dy.common.mw.protocol.MidResultFromRtu;
import com.dy.common.mw.protocol.MidResultToRtu;
import com.dy.common.util.rtuMq.MessageType;
public class MidResultActionFromRtu implements MidResultAction {
@@ -44,11 +42,11 @@
    private void sendResult(boolean reportOrResponse_trueOrFalse, MidResultFromRtu resFromRtu){
        try{
            String json = resFromRtu.data.toJson() ;
            if(reportOrResponse_trueOrFalse){
                ToMqMessageCach.cachObj(MessageType.RtuAutoReport, json);
            }else{
                ToMqMessageCach.cachObj(MessageType.RtuCmdResponse, json);
            }
//            if(reportOrResponse_trueOrFalse){
//                ToMqMessageCach.cachObj(MessageType.RtuAutoReport, json);
//            }else{
//                ToMqMessageCach.cachObj(MessageType.RtuCmdResponse, json);
//            }
        }catch(Exception e){
            log.error(e.getMessage(), e);
        }
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/forTcp/RtuLogDealer.java
@@ -2,8 +2,8 @@
import org.apache.logging.log4j.*;
import com.dy.commu.resource.ResourceUnit;
import com.dy.commu.resource.rtuLog.RtuLogNode;
import com.dy.aceMw.resource.ResourceUnit;
import com.dy.aceMw.resource.rtuLog.RtuLogNode;
public class RtuLogDealer {
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/tasks/RtuUpTask.java
@@ -23,7 +23,7 @@
public class RtuUpTask extends CoreTask {
    
    private static Logger log = LogManager.getLogger(RtuUpTask.class.getName());
    private static final Logger log = LogManager.getLogger(RtuUpTask.class.getName());
    @Override
    public Integer excute() {
@@ -40,8 +40,8 @@
    /**
     * RTU上行数据
     * @param session
     * @param upBuf
     * @param session IO会话
     * @param upBuf 上行数据
     */
    private void upData(IoSession session, byte[] upBuf) throws Exception{
        if(upBuf == null){
@@ -63,7 +63,7 @@
            //说明刚建立网络连接,此数据应该是上线数据
            isOnLine = true ;
            String[] rtuAddrProtocolName = this.parseOnLine(session, upBuf) ;
            if(rtuAddrProtocolName != null && rtuAddrProtocolName.length == 2){
            if(rtuAddrProtocolName.length == 2){
                //解析上线数据成功,并解析出RTU地址及通信协议名称
                rtuAddr = rtuAddrProtocolName[0] ;
                protocolName = rtuAddrProtocolName[1] ;
@@ -96,8 +96,8 @@
    
    /**
     * 解析上线数据
     * @param session
     * @param upBuf
     * @param session IO会话
     * @param upBuf 上行数据
     */
    private String[] parseOnLine(IoSession session, byte[] upBuf){
        String rtuAddr = null ;
@@ -135,18 +135,20 @@
    
    /**
     * 处理上行数据
     * @param session
     * @param rtuAddr
     * @param upBuf
     * @param upHex
     * @throws Exception
     * @param session IO会话
     * @param rtuAddrAtHead 控制器地址头部
     * @param protocolName 协议名称
     * @param isOnLine 是否上线数据
     * @param upBuf 上行数据
     * @param upHex 上行数据
     * @throws Exception 异常
     */
    private void dealUpData(IoSession session, String rtuAddrAtHead, String protocolName, boolean isOnLine, byte[] upBuf, String upHex) throws Exception{
        Driver dri = ProtocolCach.getDriver(protocolName) ;
        if(dri == null){
            log.error("严重错误,未能得到协议" + protocolName + "驱动类实例!");
        }else{
            MidResult[] midRses = dri.parseData(ServerProperties.isLowPower, rtuAddrAtHead, upBuf, upHex, new DriverParserDataCallback(){
            MidResult[] midRs = dri.parseData(ServerProperties.isLowPower, rtuAddrAtHead, upBuf, upHex, new DriverParserDataCallback(){
                @Override
                public void callback(String rtuAddrAtHead, String meterNoAtHead, String code, String upHex, Boolean reportOrResponse_trueOrFalse, boolean parseFail, String rtuAddrInData, String meterNoInData) {
                    //更新终端状态
@@ -155,25 +157,25 @@
                        TcpSessionCach.changeRtuAddr(rtuAddrAtHead, rtuAddrInData, protocolName, session);
                        session.setAttribute(TcpIoSessionAttrIdIsRtuAddr.sessionArrIdKey, rtuAddrInData) ;
                    }
                    String rtuAddr = null ;
                    String rtuAddr ;
                    if(rtuAddrInData != null){
                        rtuAddr = rtuAddrInData  ;
                        rtuAddr = rtuAddrInData  ;
                    }else{
                        rtuAddr = rtuAddrAtHead ;
                    }
                    InetSocketAddress sa = (InetSocketAddress)session.getRemoteAddress() ;
                    if(isOnLine){
                        //上线了
                        RtuStatusDealer.onLine(rtuAddr, sa.getAddress().getHostAddress(), sa.getPort());
                    }
                    if(reportOrResponse_trueOrFalse != null && reportOrResponse_trueOrFalse.booleanValue()){
                    if(reportOrResponse_trueOrFalse != null && reportOrResponse_trueOrFalse){
                        RtuStatusDealer.upReport(rtuAddr, upBuf.length) ;
                    }else{
                        RtuStatusDealer.upData(rtuAddr, upBuf.length) ;
                    }
                    //记录日志
                    if(parseFail){
                        RtuLogDealer.log(rtuAddr, (isOnLine?"上线数据 ":"上行数据 ") + "" + code + ":" + upHex + "(解析失败)");
@@ -182,8 +184,8 @@
                    }
                }
            }) ;
            if(midRses != null){
                for(MidResult rs : midRses){
            if(midRs != null){
                for(MidResult rs : midRs){
                    rs.action();
                }
            }
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/java/com/dy/aceMw/server/tasks/ToRtuConstantTask.java
@@ -13,8 +13,7 @@
 * 处理RTU下行命令数据的恒久任务
 */
public class ToRtuConstantTask extends CoreTask {
    private static Logger log = LogManager.getLogger(ToRtuConstantTask.class.getName());
    private static final Logger log = LogManager.getLogger(ToRtuConstantTask.class.getName());
    /**
     * 在单线程环境中运行
@@ -56,9 +55,9 @@
    }
    /**
     * 处理缓存的下行命令节点
     * @param now
     * @param first
     * @param last
     * @param now 当前时刻
     * @param first 第一个节点
     * @param last 是后一个节点
     */
    private void doDealDownCommand(Long now, Node first, Node last){
        if(first != null){
@@ -78,8 +77,8 @@
    
    /**
     * 处理一个节点
     * @param now
     * @param node
     * @param now 现在时刻
     * @param node 节点
     */
    private void dealNode(Long now, Node node){
        TcpDownCommandObj obj = (TcpDownCommandObj)node.obj ;
pipIrr-platform/pipIrr-mw/pipIrr-mw-accept/src/main/resources/config.xml
@@ -63,8 +63,6 @@
        long_freeTimeout: 线程数空闲时长,若池中线程数量大于minThread,且有的线程空闲时长超过freeTimeout,则清除该线程
        long_busyTimeout:线程不间断工作时长(单位为秒)超时限,若为-1,不受限制 
        enableThreadPool:是否启用线程池
        enableSpringHibernate:是否启用Spring+Hibernate
        springXmlFile: Spring+Hibernate配置文件
         -->
        <support
            short_maxThread="100"
@@ -76,8 +74,6 @@
            long_freeTimeout="60"
            long_busyTimeout="-1"
            enableThreadPool="true"
            enableSpringHibernate="false"
            springXmlFile="config/spring.xml"
        />
            
        <!--