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" /> <!--