pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_3D_Up.java
@@ -2,7 +2,7 @@ import com.dy.common.mw.protocol.*; import com.dy.common.mw.protocol.p206V1_0_0.*; import com.dy.common.mw.protocol.p206V1_0_0.upVos.DataCd3CVo; import com.dy.common.mw.protocol.p206V1_0_0.upVos.DataCd3DVo; import com.dy.common.util.ByteUtilUnsigned; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -58,7 +58,7 @@ */ protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { DataV1_0_1 dV1 = (DataV1_0_1)data.getSubData() ; DataCd3CVo cdData = new DataCd3CVo() ; DataCd3DVo cdData = new DataCd3DVo() ; dV1.subData = cdData ; int priceInt = ByteUtilUnsigned.bytes2Short_LE(bs, ProtocolConstantV206V1_0_0.dataIndex) ; cdData.price = priceInt/100.0D; pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/upVos/DataCd10Vo.java
@@ -21,4 +21,13 @@ return sb.toString() ; } public String comLog(){ StringBuilder sb = new StringBuilder() ; sb.append("设置RTU地址命令回复:\n"); sb.append(" 地址:"); sb.append(newRtuAddr); sb.append("\n"); return sb.toString() ; } } pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/upVos/DataCd21Vo.java
@@ -15,7 +15,7 @@ public String toString(){ StringBuilder sb = new StringBuilder() ; sb.append(" 设置IP应答:\n"); sb.append(" 设置服务端IP和端口应答:\n"); sb.append(" IP:"); sb.append(ip); sb.append(" 端口:"); @@ -24,4 +24,15 @@ return sb.toString() ; } public String comLog(){ StringBuilder sb = new StringBuilder() ; sb.append("设置服务端IP和端口命令回复:\n"); sb.append(" IP:"); sb.append(ip); sb.append(" 端口:"); sb.append(port); sb.append("\n"); return sb.toString() ; } } pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/upVos/DataCd36Vo.java
@@ -9,7 +9,7 @@ public String toString(){ StringBuilder sb = new StringBuilder() ; sb.append(" 设置询IP地址和端口:\n"); sb.append(" 设置主信道IP和端口:\n"); sb.append(" IP地址:"); sb.append(ip); sb.append("\n"); @@ -18,4 +18,15 @@ sb.append("\n"); return sb.toString() ; } public String comLog(){ StringBuilder sb = new StringBuilder() ; sb.append("设置主信道IP和端口命令回复:\n"); sb.append(" IP:"); sb.append(ip); sb.append(" 端口:"); sb.append(port==null?"":port); sb.append("\n"); return sb.toString() ; } } pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/upVos/DataCd37And67Vo.java
@@ -1,5 +1,6 @@ package com.dy.common.mw.protocol.p206V1_0_0.upVos; import com.dy.common.mw.protocol.p206V1_0_0.CodeV1_0_1; import lombok.Data; /** @@ -21,4 +22,19 @@ return sb.toString() ; } public String comLog(String code){ StringBuilder sb = new StringBuilder() ; if(code.equals(CodeV1_0_1.cd_37)){ sb.append("设置流量采集周期命令回复:\n"); sb.append(" 秒钟:"); sb.append(second); sb.append("\n"); } else if(code.equals(CodeV1_0_1.cd_67)){ sb.append("查询流量采集周期命令回复:\n"); sb.append(" 秒钟:"); sb.append(second); sb.append("\n"); } return sb.toString() ; } } pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/upVos/DataCd38And68Vo.java
@@ -1,5 +1,6 @@ package com.dy.common.mw.protocol.p206V1_0_0.upVos; import com.dy.common.mw.protocol.p206V1_0_0.CodeV1_0_1; import lombok.Data; /** @@ -21,4 +22,20 @@ return sb.toString() ; } public String comLog(String code){ StringBuilder sb = new StringBuilder() ; if(code.equals(CodeV1_0_1.cd_38)){ sb.append("设置用户余额报警值命令回复:\n"); sb.append(" 余额:"); sb.append(remainMoneyAlarm); sb.append("\n"); } else if(code.equals(CodeV1_0_1.cd_68)){ sb.append("查询用户余额报警值命令回复:\n"); sb.append(" 余额:"); sb.append(remainMoneyAlarm); sb.append("\n"); } return sb.toString() ; } } pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/upVos/DataCd39And69Vo.java
@@ -1,5 +1,6 @@ package com.dy.common.mw.protocol.p206V1_0_0.upVos; import com.dy.common.mw.protocol.p206V1_0_0.CodeV1_0_1; import lombok.Data; /** @@ -21,4 +22,21 @@ return sb.toString() ; } public String comLog(String code){ StringBuilder sb = new StringBuilder() ; if(code.equals(CodeV1_0_1.cd_39)){ sb.append("设置电池电压报警值命令回复:\n"); sb.append(" 电压报警值:"); sb.append(batteryVoltAlarm); sb.append("\n"); } else if(code.equals(CodeV1_0_1.cd_69)){ sb.append("查询电池电压报警值命令回复:\n"); sb.append(" 电压报警值:"); sb.append(batteryVoltAlarm); sb.append("\n"); } return sb.toString() ; } } pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/upVos/DataCd3AAnd6AVo.java
@@ -1,5 +1,6 @@ package com.dy.common.mw.protocol.p206V1_0_0.upVos; import com.dy.common.mw.protocol.p206V1_0_0.CodeV1_0_1; import lombok.Data; /** @@ -21,4 +22,21 @@ return sb.toString() ; } public String comLog(String code){ StringBuilder sb = new StringBuilder() ; if(code.equals(CodeV1_0_1.cd_3A)){ sb.append("设置阀门堵转电流命令回复:\n"); sb.append(" 电流:"); sb.append(current); sb.append("\n"); } else if(code.equals(CodeV1_0_1.cd_6A)){ sb.append("查询阀门堵转电流命令回复:\n"); sb.append(" 电流:"); sb.append(current); sb.append("\n"); } return sb.toString() ; } } pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/upVos/DataCd3BAnd6BVo.java
@@ -1,5 +1,6 @@ package com.dy.common.mw.protocol.p206V1_0_0.upVos; import com.dy.common.mw.protocol.p206V1_0_0.CodeV1_0_1; import lombok.Data; /** @@ -21,4 +22,21 @@ return sb.toString() ; } public String comLog(String code){ StringBuilder sb = new StringBuilder() ; if(code.equals(CodeV1_0_1.cd_3B)){ sb.append("设置阀门超时时间命令回复:\n"); sb.append(" 秒钟:"); sb.append(second); sb.append("\n"); } else if(code.equals(CodeV1_0_1.cd_6B)){ sb.append("查询阀门超时时间命令回复:\n"); sb.append(" 秒钟:"); sb.append(second); sb.append("\n"); } return sb.toString() ; } } pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/upVos/DataCd3CAnd65Vo.java
@@ -1,5 +1,6 @@ package com.dy.common.mw.protocol.p206V1_0_0.upVos; import com.dy.common.mw.protocol.p206V1_0_0.CodeV1_0_1; import lombok.Data; /** @@ -21,4 +22,20 @@ return sb.toString() ; } public String comLog(String code){ StringBuilder sb = new StringBuilder() ; if(code.equals(CodeV1_0_1.cd_3C)){ sb.append("设置自报周期命令回复:\n"); sb.append(" 分钟:"); sb.append(minute); sb.append("\n"); } else if(code.equals(CodeV1_0_1.cd_65)){ sb.append("查询自报周期命令回复:\n"); sb.append(" 分钟:"); sb.append(minute); sb.append("\n"); } return sb.toString() ; } } pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/upVos/DataCd3CVo.java
File was deleted pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/upVos/DataCd3DVo.java
@@ -10,13 +10,24 @@ */ @Data public class DataCd3DVo { public String icCardNo ; public Double price ; public String toString(){ StringBuilder sb = new StringBuilder() ; sb.append(" 设置黑名单应答:\n"); sb.append(" 卡号:"); sb.append(icCardNo); sb.append(" 设置水价应答:\n"); sb.append(" 水价:"); sb.append(price); sb.append("\n"); return sb.toString() ; } public String comLog(){ StringBuilder sb = new StringBuilder() ; sb.append("设置水价命令回复:\n"); sb.append(" 水价:"); sb.append(price); sb.append("\n"); return sb.toString() ; pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/upVos/DataCd3EVo.java
New file @@ -0,0 +1,34 @@ package com.dy.common.mw.protocol.p206V1_0_0.upVos; import lombok.Data; /** * @Author liurunyu * @Date 2024/4/10 18:44 * @LastEditTime 2024/4/10 18:44 * @Description */ @Data public class DataCd3EVo { public String icCardNo ; public String toString(){ StringBuilder sb = new StringBuilder() ; sb.append(" 设置黑名单应答:\n"); sb.append(" 卡号:"); sb.append(icCardNo); sb.append("\n"); return sb.toString() ; } public String comLog(){ StringBuilder sb = new StringBuilder() ; sb.append("设置黑名单命令回复:\n"); sb.append(" 卡号:"); sb.append(icCardNo); sb.append("\n"); return sb.toString() ; } } pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/upVos/DataCd51Vo.java
@@ -21,4 +21,15 @@ return sb.toString() ; } public String comLog(){ StringBuilder sb = new StringBuilder() ; sb.append("查询终端时钟命令回复:\n"); sb.append(" 时钟:"); sb.append(rtuDt); sb.append("\n"); return sb.toString() ; } } pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/upVos/DataCd5EVo.java
@@ -27,4 +27,18 @@ } return sb.toString() ; } public String comLog(){ StringBuilder sb = new StringBuilder() ; sb.append(" 查询终端状态和报警状态命令回复:\n"); if(alarmVo != null){ sb.append(alarmVo.toString()); sb.append("\n"); } if(stateVo != null){ sb.append(stateVo.toString()); sb.append("\n"); } return sb.toString() ; } } pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/upVos/DataCd66Vo.java
@@ -18,4 +18,16 @@ sb.append("\n"); return sb.toString() ; } public String comLog(){ StringBuilder sb = new StringBuilder() ; sb.append("查询IP地址和端口命令回复:\n"); sb.append(" IP地址:"); sb.append(ip); sb.append("\n"); sb.append(" 端口号:"); sb.append(port==null?"":port); sb.append("\n"); return sb.toString() ; } } pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/upVos/DataCd6CVo.java
@@ -21,4 +21,13 @@ return sb.toString() ; } public String comLog(){ StringBuilder sb = new StringBuilder() ; sb.append("查询水价命令回复:\n"); sb.append(" 水价:"); sb.append(price); sb.append("\n"); return sb.toString() ; } } pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/upVos/DataCd71Vo.java
@@ -18,4 +18,14 @@ return sb.toString() ; } public String comLog(){ StringBuilder sb = new StringBuilder() ; sb.append("查询阀门状态命令回复:\n"); sb.append(" 阀门状态:"); sb.append(state==null?"":state); sb.append(stateName==null?"":("(" + stateName + ")")); sb.append("\n"); return sb.toString() ; } } pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/upVos/DataCd92Vo.java
@@ -21,4 +21,14 @@ return sb.toString() ; } public String comLog(){ StringBuilder sb = new StringBuilder() ; sb.append("强制无卡开阀命令回复:\n"); sb.append(success?"执行":"失败"); sb.append("\n"); return sb.toString() ; } } pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/upVos/DataCd93Vo.java
@@ -21,4 +21,12 @@ return sb.toString() ; } public String comLog(){ StringBuilder sb = new StringBuilder() ; sb.append("强制无卡关阀命令回复:\n"); sb.append(success?"执行":"失败"); sb.append("\n"); return sb.toString() ; } } pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/upVos/DataCd97Vo.java
@@ -25,4 +25,16 @@ return sb.toString() ; } public String comLog(){ StringBuilder sb = new StringBuilder() ; sb.append("APP远程开阀命令回复:\n"); sb.append(" 虚拟卡号:"); sb.append(cardNo); sb.append("\n"); sb.append(" 结果:"); sb.append(success?"执行":"失败"); sb.append("\n"); return sb.toString() ; } } pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/upVos/DataCd98Vo.java
@@ -25,4 +25,18 @@ return sb.toString() ; } public String comLog(){ StringBuilder sb = new StringBuilder() ; sb.append("APP远程关阀命令回复:\n"); sb.append(" 虚拟卡号:"); sb.append(cardNo); sb.append("\n"); sb.append(" 结果:"); sb.append(success?"执行":"失败"); sb.append("\n"); return sb.toString() ; } } pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/upVos/DataCd99Vo.java
@@ -25,4 +25,17 @@ return sb.toString() ; } public String comLog(){ StringBuilder sb = new StringBuilder() ; sb.append("定时关阀开阀命令回复:\n"); sb.append(" 虚拟卡号:"); sb.append(cardNo); sb.append("\n"); sb.append(" 结果:"); sb.append(success?"执行":"失败"); sb.append("\n"); return sb.toString() ; } } pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/upVos/DataCdA0Vo.java
@@ -25,4 +25,17 @@ return sb.toString() ; } public String comLog(){ StringBuilder sb = new StringBuilder() ; sb.append("定量关阀开阀命令回复:\n"); sb.append(" 虚拟卡号:"); sb.append(cardNo); sb.append("\n"); sb.append(" 结果:"); sb.append(success?"执行":"失败"); sb.append("\n"); return sb.toString() ; } } pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/Server.java
@@ -138,6 +138,21 @@ if(ServerProperties.isLowPower == null){ ServerProperties.isLowPower = false ; } String onlyDealRtus = conf.getSetAttrTxt(doc, "config.base", "onlyDealRtus", null, true, null) ; if(onlyDealRtus == null || onlyDealRtus.trim().equals("")){ ServerProperties.onlyDealRtusTest = false ; }else{ onlyDealRtus = onlyDealRtus.replaceAll(",", ",") ; onlyDealRtus = onlyDealRtus.replaceAll(" ", "") ; ServerProperties.onlyDealRtus = onlyDealRtus.split(",") ; if(ServerProperties.onlyDealRtus != null && ServerProperties.onlyDealRtus.length > 0){ ServerProperties.onlyDealRtusTest = true ; }else{ ServerProperties.onlyDealRtusTest = false ; } } //在支持多通信协议时,只有RTU上线了,才能识别出该RTU实际用的通信协议,进而用此协议解析上行数据及构造下行命令。 //如果RTU未曾上线(通信中间件启动后该RTU未曾上线),那么在向它发送下行命令时,不能判断出其采用的协议,也不能构造命令,尤其是低功耗情况下,不上线是正常现象。 // 当只有一个协议情况下,在RTU未曾上线时,也能用此协议构造命令并缓存下来,尤其适合低功耗情况。 @@ -151,7 +166,7 @@ //针对一个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.cachWaitResultTimeout = conf.getSetAttrPlusInt(doc, "config.base", "cachWaitResultTimeout", null, 10, 360, null) * 1000L ; //不在线缓存的命令最大缓存时长 ServerProperties.offLineCachTimeout = conf.getSetAttrPlusInt(doc, "config.base", "offLineCachTimeout", null, 15, 172800, null) * 1000L ; //TCP上行数据时刻缓存时长,当达到时长时,TCP上行数据时刻被清空,采用TCP上行数据时刻目的是,阻止上数据同时下发数据,因为RTU处理不过来 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/ServerProperties.java
@@ -6,6 +6,11 @@ public static String orgTag = "ym" ; //是否为低功耗 public static Boolean isLowPower = false ; //只处理指定RTU地址设备,其他设备数据丢弃,多个RTU地址用英文逗号隔开,如果配置空串(即无IMEI号),则接收全部水表数据,设置此目的是针对某个水表进行调试 public static Boolean onlyDealRtusTest = false ; public static String[] onlyDealRtus ; //在支持多通信协议时,只有RTU上线了,才能识别出该RTU实际用的通信协议,进而用此协议解析上行数据及构造下行命令。 //如果RTU未曾上线(通信中间件启动后该RTU未曾上线),那么在向它发送下行命令时,不能判断出其采用的协议,也不能构造命令,尤其是低功耗情况下,不上线是正常现象。 // 当只有一个协议情况下,在RTU未曾上线时,也能用此协议构造命令并缓存下来,尤其适合低功耗情况。 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/forTcp/MidResultActionFromRtu.java
@@ -34,6 +34,7 @@ this.nextDealRtuData(false, resFromRtu); this.nextDealRtuComResult(resFromRtu); }else{ log.error("匹配命令失败,功能码是:" + ((MidResultFromRtu) result).upCode ); this.nextDealRtuData(false, resFromRtu); //未匹配到下发的命令,命令在缓存因超时被清除了 RtuStatusDealer.commandFail2Success(resFromRtu.rtuAddr) ; pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/forTcp/MidResultActionToRtu.java
@@ -16,7 +16,7 @@ try { MidResultToRtu resToRtu = (MidResultToRtu)result ; TcpDownCommandCache.cacheCommand(resToRtu); log.info("下行命令(toRtu)" + resToRtu.downCode + "中间结果已经放入下行命令缓存中"); log.info("下行命令(toRtu,id=" + resToRtu.commandId + ")" + resToRtu.downCode + "中间数据(MidResult)已经放入下行命令缓存中"); } catch (Exception e) { log.error(e); } pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/forTcp/TcpDownCommandCache.java
@@ -62,7 +62,7 @@ obj.onceReceivedResult = true ;//标识已经收到命令结果 return res ; }else{ node = node.pre ; node = node.next ; } } pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1_0_0/TkFindComResponse.java
@@ -25,7 +25,7 @@ @Override public void execute(Object data) { Data d = (Data)data ; if(d.getCommandId() != null && d.getCommandId().trim().equals("")){ if(d.getCommandId() != null && !d.getCommandId().trim().equals("")){ //无命令ID this.toNextTasks(data); } pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1_0_0/TkRtuDealCommandResponse.java
@@ -2,10 +2,7 @@ import com.dy.common.mw.protocol.Data; import com.dy.common.mw.protocol.p206V1_0_0.DataV1_0_1; import com.dy.common.mw.protocol.p206V1_0_0.upVos.DataCd92Vo; import com.dy.common.mw.protocol.p206V1_0_0.upVos.DataCd93Vo; import com.dy.common.mw.protocol.p206V1_0_0.upVos.DataCd97Vo; import com.dy.common.mw.protocol.p206V1_0_0.upVos.DataCd98Vo; import com.dy.common.mw.protocol.p206V1_0_0.upVos.*; import com.dy.common.util.DateTime; import com.dy.pipIrrGlobal.pojoRm.RmCommandHistory; import com.dy.rtuMw.server.rtuData.TaskSurpport; @@ -43,8 +40,10 @@ try{ RmCommandHistory po = sv.getCommandLog(d.commandId) ; if(po != null){ po = this.updateCommandLogPo(po, dV1_0_1, dV1_0_1.subData) ; po = this.updateCommandLogPo(po, d.code, dV1_0_1, dV1_0_1.subData) ; sv.updateCommandLog(po); }else{ log.error("未得到命令日志(" + d.getCommandId() + ")"); } }catch (Exception e){ log.error("保存控制器自报数据时发生异常", e); @@ -53,27 +52,75 @@ } } public RmCommandHistory updateCommandLogPo(RmCommandHistory po, DataV1_0_1 dV1_0_1, Object obj) throws Exception{ public RmCommandHistory updateCommandLogPo(RmCommandHistory po, String code, DataV1_0_1 dV1_0_1, Object obj) throws Exception{ po.setResult((byte)1); po.setResultTime(DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dV1_0_1.dt)) ; if(obj instanceof DataCd97Vo){ DataCd97Vo vo = (DataCd97Vo)obj ; po.setResultTime(DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dV1_0_1.dt)) ; //po.setResultText((JSONObject) JSON.toJSON(vo)); po.setResultText(vo.toString()); po.setResultText(vo.comLog()); }else if(obj instanceof DataCd98Vo){ DataCd98Vo vo = (DataCd98Vo)obj ; po.setResultTime(DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dV1_0_1.dt)); //po.setResultText((JSONObject) JSON.toJSON(vo)); po.setResultText(vo.toString()); po.setResultText(vo.comLog()); }else if(obj instanceof DataCd92Vo){ DataCd92Vo vo = (DataCd92Vo)obj ; po.setResultTime(DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dV1_0_1.dt)) ; //po.setResultText((JSONObject) JSON.toJSON(vo)); po.setResultText(vo.toString()); po.setResultText(vo.comLog()); }else if(obj instanceof DataCd93Vo){ DataCd93Vo vo = (DataCd93Vo)obj ; po.setResultTime(DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dV1_0_1.dt)) ; //po.setResultText((JSONObject) JSON.toJSON(vo)); po.setResultText(vo.toString()); po.setResultText(vo.comLog()); }else if(obj instanceof DataCd3AAnd6AVo){ DataCd3AAnd6AVo vo = (DataCd3AAnd6AVo)obj ; po.setResultText(vo.comLog(code)); }else if(obj instanceof DataCd3BAnd6BVo){ DataCd3BAnd6BVo vo = (DataCd3BAnd6BVo)obj ; po.setResultText(vo.comLog(code)); }else if(obj instanceof DataCd3BAnd6BVo){ DataCd3CAnd65Vo vo = (DataCd3CAnd65Vo)obj ; po.setResultText(vo.comLog(code)); }else if(obj instanceof DataCd3DVo){ DataCd3DVo vo = (DataCd3DVo)obj ; po.setResultText(vo.comLog()); }else if(obj instanceof DataCd3EVo){ DataCd3EVo vo = (DataCd3EVo)obj ; po.setResultText(vo.comLog()); }else if(obj instanceof DataCd5EVo){ DataCd5EVo vo = (DataCd5EVo)obj ; po.setResultText(vo.comLog()); }else if(obj instanceof DataCd6CVo){ DataCd6CVo vo = (DataCd6CVo)obj ; po.setResultText(vo.comLog()); }else if(obj instanceof DataCd10Vo){ DataCd10Vo vo = (DataCd10Vo)obj ; po.setResultText(vo.comLog()); }else if(obj instanceof DataCd21Vo){ DataCd21Vo vo = (DataCd21Vo)obj ; po.setResultText(vo.comLog()); }else if(obj instanceof DataCd36Vo){ DataCd36Vo vo = (DataCd36Vo)obj ; po.setResultText(vo.comLog()); }else if(obj instanceof DataCd37And67Vo){ DataCd37And67Vo vo = (DataCd37And67Vo)obj ; po.setResultText(vo.comLog(code)); }else if(obj instanceof DataCd38And68Vo){ DataCd38And68Vo vo = (DataCd38And68Vo)obj ; po.setResultText(vo.comLog(code)); }else if(obj instanceof DataCd39And69Vo){ DataCd39And69Vo vo = (DataCd39And69Vo)obj ; po.setResultText(vo.comLog(code)); }else if(obj instanceof DataCd51Vo){ DataCd51Vo vo = (DataCd51Vo)obj ; po.setResultText(vo.comLog()); }else if(obj instanceof DataCd66Vo){ DataCd66Vo vo = (DataCd66Vo)obj ; po.setResultText(vo.comLog()); }else if(obj instanceof DataCd71Vo){ DataCd71Vo vo = (DataCd71Vo)obj ; po.setResultText(vo.comLog()); }else if(obj instanceof DataCd99Vo){ DataCd99Vo vo = (DataCd99Vo)obj ; po.setResultText(vo.comLog()); }else if(obj instanceof DataCdA0Vo){ DataCdA0Vo vo = (DataCdA0Vo)obj ; po.setResultText(vo.comLog()); } return po ; } pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V202404/TkFindComResponseV202404.java
@@ -24,7 +24,7 @@ @Override public void execute(Object data) { Data d = (Data)data ; if(d.getCommandId() != null && d.getCommandId().trim().equals("")){ if(d.getCommandId() != null && !d.getCommandId().trim().equals("")){ //无命令ID this.toNextTasks(data); } pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/tasks/FromRtuComResultConstantTask.java
@@ -65,38 +65,38 @@ //以下实现,采用了递归调用,当队列缓存结点很多时,会产生栈溢出异常 // //////////////////////////////////////////////// /** * 处理上行数据 */ public Integer dealRtuComResult_() { Node first = RtuComResultCache.getFirstQueueNode() ; if(first != null){ Integer count = RtuComResultCache.size() ; Node last = RtuComResultCache.getLastQueueNode() ; this.doDealRtuComResult_(first, last); return count ; } return null ; } /** * 处理缓存的上行数据节点 * @param first 第一个节点 * @param last 最后一个节点 */ private void doDealRtuComResult_(Node first, Node last){ if(last != null){ //在dealNode方法中,可能要把last从队列中移除,这时last.pre为空,所以提前把last.pre取出来 Node pre = last.pre ; dealNode(last) ; if(first != last){ doDealRtuComResult_(first, pre) ; }else{ //停止 } } } // /** // * 处理上行数据 // */ // public Integer dealRtuComResult_() { // Node first = RtuComResultCache.getFirstQueueNode() ; // if(first != null){ // Integer count = RtuComResultCache.size() ; // Node last = RtuComResultCache.getLastQueueNode() ; // this.doDealRtuComResult_(first, last); // return count ; // } // return null ; // } // // /** // * 处理缓存的上行数据节点 // * @param first 第一个节点 // * @param last 最后一个节点 // */ // private void doDealRtuComResult_(Node first, Node last){ // if(last != null){ // //在dealNode方法中,可能要把last从队列中移除,这时last.pre为空,所以提前把last.pre取出来 // Node pre = last.pre ; // dealNode(last) ; // if(first != last){ // doDealRtuComResult_(first, pre) ; // }else{ // //停止 // } // } // } // /** * 处理一个节点 * @param node 节点 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/tasks/RtuUpTask.java
@@ -78,18 +78,33 @@ } } } if(rtuAddr != null){ if(protocolName == null){ protocolName = TcpSessionCache.getTcpProtocolName(rtuAddr) ; boolean toDeal = true ; if(ServerProperties.onlyDealRtusTest){ boolean find = false ; for(String testRtu : ServerProperties.onlyDealRtus){ if(testRtu.equals(rtuAddr)){ find = true ; break ; } } if(!find){ //不在处理范围内 toDeal = false ; } } //设置收到数据时刻 TcpSessionCache.cacheUpDataTime(rtuAddr); if(protocolName != null){ //对上行数据进行处理 this.dealUpData(session, rtuAddr, protocolName, isOnLine, upBuf, upHex) ; if(toDeal){ if(protocolName == null){ protocolName = TcpSessionCache.getTcpProtocolName(rtuAddr) ; } //设置收到数据时刻 TcpSessionCache.cacheUpDataTime(rtuAddr); if(protocolName != null){ //对上行数据进行处理 this.dealUpData(session, rtuAddr, protocolName, isOnLine, upBuf, upHex) ; } } } } pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/web/comResult/CommandResultDeal.java
@@ -2,7 +2,8 @@ import com.dy.common.mw.protocol.Command; import com.dy.common.mw.protocol.Data; import lombok.extern.slf4j.Slf4j; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.*; import org.springframework.http.converter.StringHttpMessageConverter; @@ -18,10 +19,11 @@ * @LastEditTime 2023/12/21 20:28 * @Description */ @Slf4j @Component() public class CommandResultDeal { private static final Logger log = LogManager.getLogger(CommandResultDeal.class.getName()); private RestTemplate restTemplate; @Autowired pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config.xml
@@ -5,6 +5,7 @@ 基本配置 orgTag 机构tag(对应机构tag,和数据源后缀) isLowPower: 是否为低功耗 onlyDealRtus:只处理指定RTU地址设备,其他设备数据丢弃,多个RTU地址用英文逗号隔开, onlyOneProtocol:在支持多通信协议时,只有RTU上线了,才能识别出该RTU实际用的通信协议,进而用此协议解析上行数据及构造下行命令。 如果RTU未曾上线(通信中间件启动后该RTU未曾上线),那么在向它发送下行命令时,不能判断出其采用的协议,也不能构造命令,尤其是低功耗情况下,不上线是正常现象。 当只有一个协议情况下,在RTU未曾上线时,也能用此协议构造命令并缓存下来,尤其适合低功耗情况。 @@ -22,10 +23,11 @@ <base orgTag="ym" isLowPower="false" onlyOneProtocol="true" onlyDealRtus="532328059995" onlyOneProtocol="false" downComandMaxResendTimes="1" commandSendInterval="2" cachWaitResultTimeout="60" cachWaitResultTimeout="120" offLineCachTimeout="86400" lastUpDataTimeLive="500" dbDataIdSuffix="0" pipIrr-platform/pipIrr-web/pipIrr-mwTest-rtu/src/main/java/com/dy/pipIrrMwTestRtu/p206V1_0_0/RtuP206V1_0_0Ctrl.java
@@ -3,6 +3,7 @@ import com.dy.common.webUtil.BaseResponse; import com.dy.pipIrrMwTestRtu.tcpClient.upData.UpCd83Close; import com.dy.pipIrrMwTestRtu.tcpClient.upData.UpCd83Open; import com.dy.pipIrrMwTestRtu.tcpClient.upData.UpCd84; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -22,9 +23,11 @@ @GetMapping(path = "test") public BaseResponse<String> test(String com) { if(com.equals("83Open")){ this.cd83Open() ; UpCd83Open.upCd83Data(); }else if(com.equals("83Close")){ this.cd83Close() ; UpCd83Close.upCd83Data(); }else if(com.equals("84")){ UpCd84.upCd84Data(); } BaseResponse<String> rt = new BaseResponse<String>() ; rt.setCode("001") ; @@ -32,18 +35,6 @@ rt.setSuccess(true) ; return rt ; } private void cd83Open(){ UpCd83Open.upCd83Data(); } private void cd83Close(){ UpCd83Close.upCd83Data(); } } pipIrr-platform/pipIrr-web/pipIrr-mwTest-rtu/src/main/java/com/dy/pipIrrMwTestRtu/tcpClient/upData/UpCd83Close.java
@@ -2,7 +2,6 @@ import com.dy.common.mw.protocol.p206V1_0_0.parse.global.GlCreate; import com.dy.common.util.ByteUtil; import com.dy.common.util.ByteUtilUnsigned; import com.dy.pipIrrMwTestRtu.ServerProperties; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -31,13 +30,14 @@ /** * 构造心跳数据 * 构造上行数据 * * @return 字节数组 * @throws Exception 异常 */ private static byte[] createData(String rtuAddr) throws Exception { UpConstant.closeValve(); UpConstant.addValve();//调整流量 byte[] bytes = creatHead(rtuAddr, "83", (byte)0xB0); byte[] bs = new byte[1] ; pipIrr-platform/pipIrr-web/pipIrr-mwTest-rtu/src/main/java/com/dy/pipIrrMwTestRtu/tcpClient/upData/UpCd83Open.java
@@ -31,7 +31,7 @@ /** * 构造心跳数据 * 构造上行数据 * * @return 字节数组 * @throws Exception 异常 pipIrr-platform/pipIrr-web/pipIrr-mwTest-rtu/src/main/java/com/dy/pipIrrMwTestRtu/tcpClient/upData/UpCd84.java
New file @@ -0,0 +1,89 @@ package com.dy.pipIrrMwTestRtu.tcpClient.upData; import com.dy.common.mw.protocol.p206V1_0_0.parse.global.GlCreate; import com.dy.common.util.ByteUtil; import com.dy.pipIrrMwTestRtu.ServerProperties; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; /** * @Author: liurunyu * @Date: 2024/7/16 19:32 * @Description */ public class UpCd84 extends UpData { private static final Logger log = LogManager.getLogger(UpCd84.class); public static void upCd84Data() { try { if (UpData.session != null && UpData.session.isConnected()) { byte[] bs = createData(ServerProperties.rtuAddr); UpData.upSend(bs); } else { log.error("未连接通信中间件,不能发送数据"); } } catch (Exception e) { log.error("向通信中间件发送数据产生异常", e); } } /** * 构造心跳数据 * * @return 字节数组 * @throws Exception 异常 */ private static byte[] createData(String rtuAddr) throws Exception { UpConstant.addValve();//调整流量 byte[] bytes = creatHead(rtuAddr, "84", (byte)0xB0); byte[] bs = new byte[1] ; bs[0] = (byte)0x01 ;//刷卡开阀 bytes = ByteUtil.bytesMerge(bytes, bs) ; bs = new byte[1] ; bs[0] = (byte)0x01 ;//卡类型 用户卡 bytes = ByteUtil.bytesMerge(bytes, bs) ; bs = new byte[4] ;//IC卡地址 ByteUtil.hex2Bytes_LE(ServerProperties.icCardAddr, bs, 0); bytes = ByteUtil.bytesMerge(bytes, bs) ; bs = new byte[8] ;//IC卡编号 GlCreate.createIcCardNo(ServerProperties.icCardNo, bs, 0); bytes = ByteUtil.bytesMerge(bytes, bs) ; bs = new byte[4] ;//用水户余额 ByteUtil.int2BCD_LE(UpConstant.remainMoney, bs, 0); bytes = ByteUtil.bytesMerge(bytes, bs) ; bs = new byte[5] ;//累计流量 ByteUtil.int2BCD_LE(UpConstant.totalAmount, bs, 0); bytes = ByteUtil.bytesMerge(bytes, bs) ; bs = new byte[5] ;//瞬时流量 ByteUtil.int2BCD_LE(UpConstant.instantAmount, bs, 0); bytes = ByteUtil.bytesMerge(bytes, bs) ; bs = new byte[]{0x00, 0x00} ;//报警 bytes = ByteUtil.bytesMerge(bytes, bs) ; bs = new byte[]{0x00, 0x00} ;//状态 bytes = ByteUtil.bytesMerge(bytes, bs) ; bs = new byte[6] ;//控制器时钟 GlCreate.createTp(bs, 0); bytes = ByteUtil.bytesMerge(bytes, bs) ; GlCreate.createLen(bytes);//长度放字节数组中 byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾叠加字节数组中 bytes = ByteUtil.bytesMerge(bytes, bsTail) ; return bytes ; } } pipIrr-platform/pipIrr-web/pipIrr-mwTest-rtu/src/main/java/com/dy/pipIrrMwTestRtu/tcpClient/upData/UpConstant.java
@@ -13,15 +13,16 @@ private static String openValveDt ; private static String closeValveDt ; public static Integer instantAmount = 10123;//瞬时流量10.000 public static Integer totalAmount = 1234567;//实为12345.67 public static Integer remainMoney = 56789;//实为567.89 public static Integer thisAmount = 1000;//实为10.00 public static Integer thisMoney = 1000;//实为10.00 public static Integer thisAmount = 0;// public static Integer thisMoney = 0;// public static Integer thisTime = 10;//实为10 public static Integer thisPrice = 100;//实为1.00 public static Integer perAmount = thisAmount; public static Integer perMoney = thisMoney; public static Integer perAmount = 10; public static Integer perMoney = 0; public static void clearOpenValveDt(){ @@ -40,7 +41,11 @@ return closeValveDt ; } public static void closeValve(){ public static void addValve(){ perMoney = perAmount / (thisPrice / 100) ; thisAmount += perAmount ; thisMoney += perMoney ; totalAmount = totalAmount + perAmount ; remainMoney = remainMoney - perMoney ; } pipIrr-platform/pipIrr-web/pipIrr-mwTest-web/src/main/java/com/dy/pipIrrMwTestWeb/p206V1_0_0/ComSupportP206V1_0_0.java
@@ -20,8 +20,12 @@ public class ComSupportP206V1_0_0 { protected static String mwUrlTest = "http://127.0.0.1:8070/rtuMw/com/test" ; protected static String mwUrlSendCom = "http://127.0.0.1:8070/rtuMw/com/send" ; protected static String rtuAddr = "532328059995" ; // protected static String mwUrlTest = "http://8.140.179.55:8071/rtuMw/com/test" ; // protected static String mwUrlSendCom = "http://8.140.179.55:8071/rtuMw/com/send" ; // protected static String rtuAddr = "620202000066" ; protected static String rtuResultSendWebUrl = "http://127.0.0.1:65535/test/comRes/receive" ; protected static String vsIcCardNo = "61181622830147822" ;//虚拟IC卡编号(用户虚拟卡序列号)