| | |
| | | * 只能是异步,命令结果通过相关的信息发布通道发布出去 |
| | | */ |
| | | public static final String outerCommand = "outerCommand" ; |
| | | |
| | | |
| | | /** |
| | | * 针对Rtu外部透传命令 |
| | | * 只能是异步,命令结果通过相关的信息发布通道发布出去 |
| | | */ |
| | | public static final String outerTransCommand = "outerTransCommand" ; |
| | | |
| | | /** |
| | | * 本命令是一个别的命令的结果(结果以命令的方式表示) |
| | | */ |
| | |
| | | */ |
| | | public abstract MidResult[] createCommand(Boolean isLowPower, Command command, Object... params); |
| | | |
| | | |
| | | |
| | | /** |
| | | * 构造下行透传数据(命令) |
| | | * @param isLowPower 是否在低功耗环境下运行 |
| | | * @param command 命令 |
| | | * @return MidResult[] |
| | | */ |
| | | public MidResult[] transparentCommand(Boolean isLowPower, Command command, Object... params){ |
| | | return null ; |
| | | } |
| | | |
| | | |
| | | } |
| | |
| | | package com.dy.common.mw.protocol.p206V1; |
| | | |
| | | import com.dy.common.mw.protocol.*; |
| | | import com.dy.common.mw.protocol.p206V1.parse.TransparentDown; |
| | | import com.dy.common.util.DateTime; |
| | | |
| | | @AnnotationDriver(enable = true, |
| | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 构造下行透传数据(命令) |
| | | * @param isLowPower 是否在低功耗环境下运行 |
| | | * @param command 命令 |
| | | * @return MidResult[] |
| | | */ |
| | | @Override |
| | | public MidResult[] transparentCommand(Boolean isLowPower, Command command, Object... params){ |
| | | this.clear(); |
| | | String RtuResultSendWebUrl = command.getRtuResultSendWebUrl() ; |
| | | if(RtuResultSendWebUrl == null || RtuResultSendWebUrl.trim().equals("")){ |
| | | return new MidResult[]{(new MidResultError(ProtocolConstantV206V1.protocolName, null, "严重错误,命令中rtu返回命令结果发向目的地web URL为空,不能构建任何命令!", null))} ; |
| | | } |
| | | String rtuAddr = command.getRtuAddr() ; |
| | | if(rtuAddr == null || rtuAddr.trim().equals("")){ |
| | | return new MidResult[]{(new MidResultError(ProtocolConstantV206V1.protocolName, null, "严重错误,命令中Rtu地址为空,不能构建任何命令!", null))} ; |
| | | } |
| | | try { |
| | | String commandCode = command.getCode() ; |
| | | |
| | | this.downCpParams.setValue( |
| | | RtuResultSendWebUrl, |
| | | ProtocolConstantV206V1.protocolName, |
| | | command.protocolVersion==null?ProtocolConstantV206V1.protocolVer:command.protocolVersion, |
| | | rtuAddr, |
| | | command.getId(), |
| | | commandCode, |
| | | command.getParam(), |
| | | command.getAttachment()); |
| | | |
| | | if(commandCode == null){ |
| | | return new MidResult[]{(new MidResultError(ProtocolConstantV206V1.protocolName, rtuAddr, "严重错误,命令中功能码为空,不能构建任何命令!", null))} ; |
| | | }else{ |
| | | return new TransparentDown().parse(isLowPower, this.downCpParams, null); |
| | | } |
| | | } catch (Exception e) { |
| | | return new MidResult[]{(new MidResultError(ProtocolConstantV206V1.protocolName, rtuAddr, "严重错误,构造下行数据出错!命令为:" + command.toString(), e))} ; |
| | | } |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V1.parse; |
| | | |
| | | import com.dy.common.mw.protocol.*; |
| | | import com.dy.common.mw.protocol.p206V1.CodeV1; |
| | | import com.dy.common.mw.protocol.p206V1.ParseParamsForDownV1; |
| | | import com.dy.common.util.ByteUtil; |
| | | import com.dy.common.util.NumUtil; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/4/30 14:58 |
| | | * @Description 透传下行命令 |
| | | */ |
| | | public class TransparentDown implements CodeParse { |
| | | @Override |
| | | public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback) throws Exception { |
| | | ParseParamsForDownV1 para = (ParseParamsForDownV1) params ; |
| | | if(para.attachment == null || para.attachment.toString().length() == 0){ |
| | | throw new Exception("透传下行命令,数据项attachment不能为空") ; |
| | | } |
| | | if(!NumUtil.isHex(para.attachment.toString())){ |
| | | throw new Exception("透传下行命令,数据项attachment不是16进制") ; |
| | | } |
| | | byte[] bs = ByteUtil.hex2Bytes(para.attachment.toString()) ; |
| | | |
| | | MidResultToRtu midRs = new MidResultToRtu() ; |
| | | midRs.rtuResultSendWebUrl = para.rtuResultSendWebUrl ;//rtu返回命令结果 发向目的地web URL |
| | | midRs.protocolName = para.protocolName ;//协议名称 |
| | | midRs.protocolVersion = para.protocolVersion; //协议版本号 |
| | | midRs.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果 |
| | | midRs.downCode = para.commandCode ;//下行命令功能码; |
| | | midRs.downCodeName = CodeV1.getCodeName(para.commandCode) ;//下行命令功能码名称; |
| | | midRs.downBuffer = bs ;//下行命令数据 |
| | | midRs.downBufHex = para.attachment.toString() ;//下行命令数据十六进制形式 |
| | | midRs.hasResponse = true ;//是否有应答 |
| | | midRs.maxSendTimes = null ;//命令最大发送次数(当收不到应答时,将重发),如果不设置,命令缓存器进行补充设置 |
| | | midRs.isCachForOffLine = false ;//RTU不在线,命令是否缓存,低功耗时为true |
| | | |
| | | if(isLowPower != null && isLowPower.booleanValue()){ |
| | | //低功耗时,尽快发送 |
| | | midRs.isQuickSend = true ; |
| | | } |
| | | |
| | | return new MidResult[]{midRs} ; |
| | | } |
| | | } |
| | |
| | | package com.dy.common.mw.protocol.p206V2; |
| | | |
| | | import com.dy.common.mw.protocol.*; |
| | | import com.dy.common.mw.protocol.p206V1.ProtocolConstantV206V1; |
| | | import com.dy.common.mw.protocol.p206V2.parse.TransparentDown; |
| | | import com.dy.common.util.DateTime; |
| | | |
| | | @AnnotationDriver(enable = true, |
| | |
| | | } |
| | | @Override |
| | | public void notify(NotifyInfo ...infos) { |
| | | notify.notify(rtuAddr, ProtocolConstantV206V1.protocolName, ProtocolConstantV206V1.protocolVer, infos); |
| | | notify.notify(rtuAddr, ProtocolConstantV206V2.protocolName, ProtocolConstantV206V2.protocolVer, infos); |
| | | } |
| | | }); |
| | | } |
| | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 构造下行透传数据(命令) |
| | | * @param isLowPower 是否在低功耗环境下运行 |
| | | * @param command 命令 |
| | | * @return MidResult[] |
| | | */ |
| | | @Override |
| | | public MidResult[] transparentCommand(Boolean isLowPower, Command command, Object... params){ |
| | | this.clear(); |
| | | String RtuResultSendWebUrl = command.getRtuResultSendWebUrl() ; |
| | | if(RtuResultSendWebUrl == null || RtuResultSendWebUrl.trim().equals("")){ |
| | | return new MidResult[]{(new MidResultError(ProtocolConstantV206V2.protocolName, null, "严重错误,命令中rtu返回命令结果发向目的地web URL为空,不能构建任何命令!", null))} ; |
| | | } |
| | | String rtuAddr = command.getRtuAddr() ; |
| | | if(rtuAddr == null || rtuAddr.trim().equals("")){ |
| | | return new MidResult[]{(new MidResultError(ProtocolConstantV206V2.protocolName, null, "严重错误,命令中Rtu地址为空,不能构建任何命令!", null))} ; |
| | | } |
| | | try { |
| | | String commandCode = command.getCode() ; |
| | | |
| | | this.downCpParams.setValue( |
| | | RtuResultSendWebUrl, |
| | | ProtocolConstantV206V2.protocolName, |
| | | command.protocolVersion==null?ProtocolConstantV206V2.protocolVer:command.protocolVersion, |
| | | rtuAddr, |
| | | command.getId(), |
| | | commandCode, |
| | | command.getParam(), |
| | | command.getAttachment()); |
| | | |
| | | if(commandCode == null){ |
| | | return new MidResult[]{(new MidResultError(ProtocolConstantV206V2.protocolName, rtuAddr, "严重错误,命令中功能码为空,不能构建任何命令!", null))} ; |
| | | }else{ |
| | | return new TransparentDown().parse(isLowPower, this.downCpParams, null); |
| | | } |
| | | } catch (Exception e) { |
| | | return new MidResult[]{(new MidResultError(ProtocolConstantV206V2.protocolName, rtuAddr, "严重错误,构造下行数据出错!命令为:" + command.toString(), e))} ; |
| | | } |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V2.parse; |
| | | |
| | | import com.dy.common.mw.protocol.*; |
| | | import com.dy.common.mw.protocol.p206V2.CodeV2; |
| | | import com.dy.common.mw.protocol.p206V2.ParseParamsForDownV2; |
| | | import com.dy.common.util.ByteUtil; |
| | | import com.dy.common.util.NumUtil; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/4/30 14:58 |
| | | * @Description 透传下行命令 |
| | | */ |
| | | public class TransparentDown implements CodeParse { |
| | | @Override |
| | | public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback) throws Exception { |
| | | ParseParamsForDownV2 para = (ParseParamsForDownV2) params ; |
| | | if(para.attachment == null || para.attachment.toString().length() == 0){ |
| | | throw new Exception("透传下行命令,数据项attachment不能为空") ; |
| | | } |
| | | if(!NumUtil.isHex(para.attachment.toString())){ |
| | | throw new Exception("透传下行命令,数据项attachment不是16进制") ; |
| | | } |
| | | byte[] bs = ByteUtil.hex2Bytes(para.attachment.toString()) ; |
| | | |
| | | MidResultToRtu midRs = new MidResultToRtu() ; |
| | | midRs.rtuResultSendWebUrl = para.rtuResultSendWebUrl ;//rtu返回命令结果 发向目的地web URL |
| | | midRs.protocolName = para.protocolName ;//协议名称 |
| | | midRs.protocolVersion = para.protocolVersion; //协议版本号 |
| | | midRs.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果 |
| | | midRs.downCode = para.commandCode ;//下行命令功能码; |
| | | midRs.downCodeName = CodeV2.getCodeName(para.commandCode) ;//下行命令功能码名称; |
| | | midRs.downBuffer = bs ;//下行命令数据 |
| | | midRs.downBufHex = para.attachment.toString() ;//下行命令数据十六进制形式 |
| | | midRs.hasResponse = true ;//是否有应答 |
| | | midRs.maxSendTimes = null ;//命令最大发送次数(当收不到应答时,将重发),如果不设置,命令缓存器进行补充设置 |
| | | midRs.isCachForOffLine = false ;//RTU不在线,命令是否缓存,低功耗时为true |
| | | |
| | | if(isLowPower != null && isLowPower.booleanValue()){ |
| | | //低功耗时,尽快发送 |
| | | midRs.isQuickSend = true ; |
| | | } |
| | | |
| | | return new MidResult[]{midRs} ; |
| | | } |
| | | } |
| | |
| | | package com.dy.common.mw.protocol.p206V202404; |
| | | |
| | | import com.dy.common.mw.channel.tcp.TcpIoSessionAttrIdIsRtuAddr; |
| | | import com.dy.common.mw.protocol.p206V1.ProtocolConstantV206V1; |
| | | import com.dy.common.mw.protocol.p206V2.ProtocolConstantV206V2; |
| | | |
| | | import com.dy.common.util.ByteUtil; |
| | | import com.dy.common.util.ByteUtilUnsigned; |
| | | import com.dy.common.util.CRC16; |
| | |
| | | * @param ioSession 会话 |
| | | */ |
| | | public void setThisProtocolArr2IoSession(IoSession ioSession){ |
| | | ioSession.setAttribute(TcpIoSessionAttrIdIsRtuAddr.sessionArrProtocolName, ProtocolConstantV206V1.protocolName) ; |
| | | ioSession.setAttribute(TcpIoSessionAttrIdIsRtuAddr.sessionArrProtocolName, ProtocolConstantV206V1.protocolVer) ; |
| | | ioSession.setAttribute(TcpIoSessionAttrIdIsRtuAddr.sessionArrProtocolName, ProtocolConstantV206V202404.protocolName) ; |
| | | ioSession.setAttribute(TcpIoSessionAttrIdIsRtuAddr.sessionArrProtocolName, ProtocolConstantV206V202404.protocolVer) ; |
| | | } |
| | | /** |
| | | * 检查头 |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | public int parseDataLen4Ug(byte[] bs)throws Exception{ |
| | | int len = ByteUtilUnsigned.bytes2Short_LE(bs, ProtocolConstantV206V2.UG_dataLenIndex_start) ; |
| | | return len - ProtocolConstantV206V2.UG_lenCmd - ProtocolConstantV206V2.UG_lenRtuAddr ; |
| | | int len = ByteUtilUnsigned.bytes2Short_LE(bs, ProtocolConstantV206V202404.UG_dataLenIndex_start) ; |
| | | return len - ProtocolConstantV206V202404.UG_lenCmd - ProtocolConstantV206V202404.UG_lenRtuAddr ; |
| | | } |
| | | |
| | | |
| | |
| | | package com.dy.common.mw.protocol.p206V202404; |
| | | |
| | | import com.dy.common.mw.protocol.*; |
| | | import com.dy.common.mw.protocol.p206V1.ProtocolConstantV206V1; |
| | | import com.dy.common.mw.protocol.p206V2.ProtocolConstantV206V2; |
| | | import com.dy.common.mw.protocol.p206V202404.parse.TransparentDown; |
| | | import com.dy.common.util.DateTime; |
| | | |
| | | @AnnotationDriver(enable = true, |
| | |
| | | */ |
| | | @Override |
| | | public void scanAnnotationCode() throws Exception{ |
| | | super.doScanAnnotationCode(this, ProtocolConstantV206V1.protocolName, scanRootPackage) ; |
| | | super.doScanAnnotationCode(this, ProtocolConstantV206V202404.protocolName, scanRootPackage) ; |
| | | } |
| | | |
| | | /** |
| | |
| | | } |
| | | @Override |
| | | public void notify(NotifyInfo ...infos) { |
| | | notify.notify(rtuAddr, ProtocolConstantV206V1.protocolName, ProtocolConstantV206V1.protocolVer, infos); |
| | | notify.notify(rtuAddr, ProtocolConstantV206V202404.protocolName, ProtocolConstantV206V202404.protocolVer, infos); |
| | | } |
| | | }); |
| | | } |
| | |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 构造下行透传数据(命令) |
| | | * @param isLowPower 是否在低功耗环境下运行 |
| | | * @param command 命令 |
| | | * @return MidResult[] |
| | | */ |
| | | @Override |
| | | public MidResult[] transparentCommand(Boolean isLowPower, Command command, Object... params){ |
| | | this.clear(); |
| | | String RtuResultSendWebUrl = command.getRtuResultSendWebUrl() ; |
| | | if(RtuResultSendWebUrl == null || RtuResultSendWebUrl.trim().equals("")){ |
| | | return new MidResult[]{(new MidResultError(ProtocolConstantV206V202404.protocolName, null, "严重错误,命令中rtu返回命令结果发向目的地web URL为空,不能构建任何命令!", null))} ; |
| | | } |
| | | String rtuAddr = command.getRtuAddr() ; |
| | | if(rtuAddr == null || rtuAddr.trim().equals("")){ |
| | | return new MidResult[]{(new MidResultError(ProtocolConstantV206V202404.protocolName, null, "严重错误,命令中Rtu地址为空,不能构建任何命令!", null))} ; |
| | | } |
| | | try { |
| | | String commandCode = command.getCode() ; |
| | | |
| | | this.downCpParams.setValue( |
| | | RtuResultSendWebUrl, |
| | | ProtocolConstantV206V202404.protocolName, |
| | | command.protocolVersion==null?ProtocolConstantV206V202404.protocolVer:command.protocolVersion, |
| | | rtuAddr, |
| | | command.getId(), |
| | | commandCode, |
| | | command.getParam(), |
| | | command.getAttachment()); |
| | | |
| | | if(commandCode == null){ |
| | | return new MidResult[]{(new MidResultError(ProtocolConstantV206V202404.protocolName, rtuAddr, "严重错误,命令中功能码为空,不能构建任何命令!", null))} ; |
| | | }else{ |
| | | return new TransparentDown().parse(isLowPower, this.downCpParams, null); |
| | | } |
| | | } catch (Exception e) { |
| | | return new MidResult[]{(new MidResultError(ProtocolConstantV206V202404.protocolName, rtuAddr, "严重错误,构造下行数据出错!命令为:" + command.toString(), e))} ; |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | |
| | | |
| | | import com.dy.common.mw.protocol.*; |
| | | import com.dy.common.mw.protocol.p206V1.DataV1; |
| | | import com.dy.common.mw.protocol.p206V202404.*; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd02Vo; |
| | | import com.dy.common.util.ByteUtil; |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | DataCd02Vo cdData = new DataCd02Vo(CodeV202404.getCodeName(dataCode)) ; |
| | | dV1.subData = cdData ; |
| | | dV202404.subData = cdData ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, ProtocolConstantV206V202404.dataIndex, 1) ; |
| | | cdData.projectNo = 0 + bs[ProtocolConstantV206V202404.dataIndex + 1]; |
| | | cdData.status = ByteUtil.bytes2Hex(bs, false, ProtocolConstantV206V202404.dataIndex + 2, 1) ; |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | DataCd10Vo cdData = new DataCd10Vo(CodeV202404.getCodeName(dataCode)) ; |
| | | dV1.subData = cdData ; |
| | | dV202404.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | DataCdXyVo cdData = new DataCdXyVo(CodeV202404.getCodeName(dataCode)) ; |
| | | dV1.subData = cdData ; |
| | | dV202404.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | DataCdXyVo cdData = new DataCdXyVo(CodeV202404.getCodeName(dataCode)) ; |
| | | dV1.subData = cdData ; |
| | | dV202404.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | DataCdXyVo cdData = new DataCdXyVo(CodeV202404.getCodeName(dataCode)) ; |
| | | dV1.subData = cdData ; |
| | | dV202404.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | DataCdXyVo cdData = new DataCdXyVo(CodeV202404.getCodeName(dataCode)) ; |
| | | dV1.subData = cdData ; |
| | | dV202404.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | DataCdXyVo cdData = new DataCdXyVo(CodeV202404.getCodeName(dataCode)) ; |
| | | dV1.subData = cdData ; |
| | | dV202404.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | DataCdXyVo cdData = new DataCdXyVo(CodeV202404.getCodeName(dataCode)) ; |
| | | dV1.subData = cdData ; |
| | | dV202404.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | DataCdXyVo cdData = new DataCdXyVo(CodeV202404.getCodeName(dataCode)) ; |
| | | dV1.subData = cdData ; |
| | | dV202404.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | DataCdXyVo cdData = new DataCdXyVo(CodeV202404.getCodeName(dataCode)) ; |
| | | dV1.subData = cdData ; |
| | | dV202404.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | DataCdXyVo cdData = new DataCdXyVo(CodeV202404.getCodeName(dataCode)) ; |
| | | dV1.subData = cdData ; |
| | | dV202404.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | DataCdXyVo cdData = new DataCdXyVo(CodeV202404.getCodeName(dataCode)) ; |
| | | dV1.subData = cdData ; |
| | | dV202404.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | DataCd50Vo cdData = new DataCd50Vo(CodeV202404.getCodeName(dataCode)) ; |
| | | dV1.subData = cdData ; |
| | | dV202404.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | String controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | |
| | | list.add(vo) ; |
| | | vo = this.doParseData(bs, index, bsLen, dataCode, controllerType, projectNo) ; |
| | | } |
| | | dV1.subData = list ; |
| | | dV202404.subData = list ; |
| | | }else{ |
| | | //无记录 |
| | | } |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | DataCd56Vo cdData = new DataCd56Vo(CodeV202404.getCodeName(dataCode)) ; |
| | | dV1.subData = cdData ; |
| | | dV202404.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | DataCd80_5BVo cdData = new DataCd80_5BVo(CodeV202404.getCodeName(dataCode)) ; |
| | | dV1.subData = cdData ; |
| | | dV202404.subData = cdData ; |
| | | |
| | | GlParse.parseCd80And5B(bs, cdData); |
| | | } |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | String controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | |
| | | list.add(vo) ; |
| | | vo = this.doParseData(bs, index, bsLen, dataCode, controllerType, projectNo) ; |
| | | } |
| | | dV1.subData = list ; |
| | | dV202404.subData = list ; |
| | | }else{ |
| | | //无记录 |
| | | } |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | String controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | |
| | | list.add(vo) ; |
| | | vo = this.doParseData(bs, index, bsLen, dataCode, controllerType, projectNo) ; |
| | | } |
| | | dV1.subData = list ; |
| | | dV202404.subData = list ; |
| | | }else{ |
| | | //无记录 |
| | | } |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | DataCd68Vo cdData = new DataCd68Vo(CodeV202404.getCodeName(dataCode)) ; |
| | | dV1.subData = cdData ; |
| | | dV202404.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | DataCd80_5BVo cdData = new DataCd80_5BVo(CodeV202404.getCodeName(dataCode)) ; |
| | | dV1.subData = cdData ; |
| | | dV202404.subData = cdData ; |
| | | |
| | | GlParse.parseCd80And5B(bs, cdData); |
| | | } |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | DataCd81Vo cdData = new DataCd81Vo(CodeV202404.getCodeName(dataCode)) ; |
| | | dV1.subData = cdData ; |
| | | dV202404.subData = cdData ; |
| | | |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | DataCd83Vo cdData = new DataCd83Vo(CodeV202404.getCodeName(dataCode)) ; |
| | | dV1.subData = cdData ; |
| | | dV202404.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | DataCd84Vo cdData = new DataCd84Vo(CodeV202404.getCodeName(dataCode)) ; |
| | | dV1.subData = cdData ; |
| | | dV202404.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | DataCd85Vo cdData = new DataCd85Vo(CodeV202404.getCodeName(dataCode)) ; |
| | | dV1.subData = cdData ; |
| | | dV202404.subData = cdData ; |
| | | |
| | | GlParse.parseCd85(bs, cdData) ; |
| | | } |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | DataCd86Vo cdData = new DataCd86Vo(CodeV202404.getCodeName(dataCode)) ; |
| | | dV1.subData = cdData ; |
| | | dV202404.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | DataCd87Vo cdData = new DataCd87Vo(CodeV202404.getCodeName(dataCode)) ; |
| | | dV1.subData = cdData ; |
| | | dV202404.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | DataCd88Vo cdData = new DataCd88Vo(CodeV202404.getCodeName(dataCode)) ; |
| | | dV1.subData = cdData ; |
| | | dV202404.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | DataCd8AVo cdData = new DataCd8AVo(CodeV202404.getCodeName(dataCode)) ; |
| | | dV1.subData = cdData ; |
| | | dV202404.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | DataCd92_A2Vo cdData = new DataCd92_A2Vo(CodeV202404.getCodeName(dataCode)) ; |
| | | dV1.subData = cdData ; |
| | | dV202404.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | DataCd93_A3Vo cdData = new DataCd93_A3Vo(CodeV202404.getCodeName(dataCode)) ; |
| | | dV1.subData = cdData ; |
| | | dV202404.subData = cdData ; |
| | | |
| | | GlParse.parseCd93A3(bs, cdData) ; |
| | | } |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | DataCdXyVo cdData = new DataCdXyVo(CodeV202404.getCodeName(dataCode)) ; |
| | | dV1.subData = cdData ; |
| | | dV202404.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | DataCdXyVo cdData = new DataCdXyVo(CodeV202404.getCodeName(dataCode)) ; |
| | | dV1.subData = cdData ; |
| | | dV202404.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | DataCdXyVo cdData = new DataCdXyVo(CodeV202404.getCodeName(dataCode)) ; |
| | | dV1.subData = cdData ; |
| | | dV202404.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | DataCd9AVo cdData = new DataCd9AVo(CodeV202404.getCodeName(dataCode)) ; |
| | | dV1.subData = cdData ; |
| | | dV202404.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | DataCdXyVo cdData = new DataCdXyVo(CodeV202404.getCodeName(dataCode)) ; |
| | | dV1.subData = cdData ; |
| | | dV202404.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataV202404 dV202404 = (DataV202404)data.getSubData() ; |
| | | DataCdC2Vo cdData = new DataCdC2Vo(CodeV202404.getCodeName(dataCode)) ; |
| | | dV1.subData = cdData ; |
| | | dV202404.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.parse; |
| | | |
| | | import com.dy.common.mw.protocol.*; |
| | | import com.dy.common.mw.protocol.p206V202404.CodeV202404; |
| | | import com.dy.common.mw.protocol.p206V202404.ParseParamsForDownV202404; |
| | | import com.dy.common.util.ByteUtil; |
| | | import com.dy.common.util.NumUtil; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/4/30 14:58 |
| | | * @Description 透传下行命令 |
| | | */ |
| | | public class TransparentDown implements CodeParse { |
| | | @Override |
| | | public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback) throws Exception { |
| | | ParseParamsForDownV202404 para = (ParseParamsForDownV202404) params ; |
| | | if(para.attachment == null || para.attachment.toString().length() == 0){ |
| | | throw new Exception("透传下行命令,数据项attachment不能为空") ; |
| | | } |
| | | if(!NumUtil.isHex(para.attachment.toString())){ |
| | | throw new Exception("透传下行命令,数据项attachment不是16进制") ; |
| | | } |
| | | byte[] bs = ByteUtil.hex2Bytes(para.attachment.toString()) ; |
| | | |
| | | MidResultToRtu midRs = new MidResultToRtu() ; |
| | | midRs.rtuResultSendWebUrl = para.rtuResultSendWebUrl ;//rtu返回命令结果 发向目的地web URL |
| | | midRs.protocolName = para.protocolName ;//协议名称 |
| | | midRs.protocolVersion = para.protocolVersion; //协议版本号 |
| | | midRs.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果 |
| | | midRs.downCode = para.commandCode ;//下行命令功能码; |
| | | midRs.downCodeName = CodeV202404.getCodeName(para.commandCode) ;//下行命令功能码名称; |
| | | midRs.downBuffer = bs ;//下行命令数据 |
| | | midRs.downBufHex = para.attachment.toString() ;//下行命令数据十六进制形式 |
| | | midRs.hasResponse = true ;//是否有应答 |
| | | midRs.maxSendTimes = null ;//命令最大发送次数(当收不到应答时,将重发),如果不设置,命令缓存器进行补充设置 |
| | | midRs.isCachForOffLine = false ;//RTU不在线,命令是否缓存,低功耗时为true |
| | | |
| | | if(isLowPower != null && isLowPower.booleanValue()){ |
| | | //低功耗时,尽快发送 |
| | | midRs.isQuickSend = true ; |
| | | } |
| | | |
| | | return new MidResult[]{midRs} ; |
| | | } |
| | | } |
| | |
| | | return true; |
| | | } |
| | | /** |
| | | * 判断是否是整数 |
| | | * 判断是否为16进制 |
| | | * |
| | | * @param str String |
| | | * @return boolean |
| | | */ |
| | | public static boolean isHex(String str) { |
| | | // 判断是否是数字 |
| | | if(str == null || str.trim().equals("")) |
| | | return false ; |
| | | if(str.length()%2 != 0) |
| | |
| | | } |
| | | |
| | | /** |
| | | * 创建外部透传命令(发给控制器) |
| | | * @param code 命令code |
| | | * @return |
| | | */ |
| | | protected Command createOuterTransparentCommand(String comId, String code) { |
| | | Command com = new Command(); |
| | | com.id = comId; |
| | | com.code = code ; |
| | | com.type = CommandType.outerTransCommand; |
| | | return com ; |
| | | } |
| | | |
| | | /** |
| | | * 创建内部 |
| | | * @param code 命令code |
| | | * @return |
New file |
| | |
| | | package com.dy.rtuMw.server.tasks; |
| | | |
| | | import com.dy.common.mw.core.CoreTask; |
| | | import com.dy.common.mw.protocol.Command; |
| | | import com.dy.common.mw.protocol.Driver; |
| | | import com.dy.common.mw.protocol.MidResult; |
| | | import com.dy.common.mw.protocol.ProtocolCache; |
| | | import com.dy.rtuMw.server.ServerProperties; |
| | | import com.dy.rtuMw.server.forTcp.TcpSessionCache; |
| | | import org.apache.logging.log4j.LogManager; |
| | | import org.apache.logging.log4j.Logger; |
| | | |
| | | /** |
| | | * 从web业务系统发向RTU的命令任务 |
| | | * @author Administrator |
| | | * |
| | | */ |
| | | public class WebDownTransparentComTask extends CoreTask { |
| | | |
| | | private static Logger log = LogManager.getLogger(WebDownTransparentComTask.class.getName()); |
| | | |
| | | @Override |
| | | public Integer execute() { |
| | | Command com = (Command)this.data ; |
| | | try { |
| | | log.info("下发远程透传命令" + com.getCode() + "的核心任务开始执行"); |
| | | this.deal(com); |
| | | } catch (Exception e) { |
| | | log.error("处理下行透传命令出错" + (e.getMessage()==null?"!":("," + e.getMessage())) ,e); |
| | | } |
| | | return null ; |
| | | } |
| | | |
| | | /** |
| | | * 处理命令 |
| | | * @param com 命令 |
| | | * @throws Exception |
| | | */ |
| | | private void deal(Command com) throws Exception{ |
| | | String rtuAddr = com.getRtuAddr() ; |
| | | //前面已经判断rtuAddr为空情况,至此其不为空 |
| | | Driver dri = null ; |
| | | Object[] objs = TcpSessionCache.getTcpProtocolNameVersion(rtuAddr) ; |
| | | if(objs == null || objs.length == 0 || objs[0] == null){ |
| | | //RTU未曾上线 |
| | | int count = ProtocolCache.driverCount() ; |
| | | if(count == 1){ |
| | | //只有一个协议 |
| | | dri = ProtocolCache.getFirstDriver() ; |
| | | } |
| | | }else{ |
| | | String protocolName = (String)objs[0]; |
| | | com.protocolVersion = (Short)objs[1]; |
| | | dri = ProtocolCache.getDriver(protocolName, com.protocolVersion) ; |
| | | } |
| | | if(dri == null){ |
| | | log.error("严重错误,未能得到RTU(" + rtuAddr + ")驱动类实例!"); |
| | | }else{ |
| | | MidResult[] actions = dri.transparentCommand(ServerProperties.isLowPower, com) ; |
| | | log.info("下发远程透传命令" + com.getCode() + "由协议驱动处理完成"); |
| | | if(actions != null){ |
| | | for(MidResult act : actions){ |
| | | act.action(); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | import com.dy.common.mw.protocol.CommandType; |
| | | import com.dy.common.webUtil.BaseResponse; |
| | | import com.dy.common.webUtil.BaseResponseUtils; |
| | | import com.dy.rtuMw.server.tasks.WebDownTransparentComTask; |
| | | import com.dy.rtuMw.server.upgrade.UpgradeUnit; |
| | | import jakarta.servlet.ServletOutputStream; |
| | | import jakarta.servlet.http.HttpServletRequest; |
| | |
| | | return BaseResponseUtils.buildError(ReturnCommand.errored("处理内部命令出错" + (e.getMessage() == null?"":("," + e.getMessage())), com.getId(), com.getCode()) ); |
| | | } |
| | | }else if(commandType.equals(CommandType.outerCommand)){ |
| | | //发向RTU的外部命令,异步处理,web端jroups成员同步得到命令处理结果,但构造命令及下发命令和命令结果接收要异步得到 |
| | | //发向RTU的外部命令 |
| | | try{ |
| | | return this.dealOuterCommand(com) ; |
| | | }catch(Exception e){ |
| | | return BaseResponseUtils.buildError(ReturnCommand.errored("处理发向RTU的外部命令出错" + (e.getMessage() == null?"":("," + e.getMessage())), com.getId(), com.getCode()) ); |
| | | } |
| | | }else if(commandType.equals(CommandType.outerTransCommand)){ |
| | | //发向RTU的外部透传命令 |
| | | try{ |
| | | return this.dealOutTransparentCommand(com) ; |
| | | }catch(Exception e){ |
| | | return BaseResponseUtils.buildError(ReturnCommand.errored("处理发向RTU的外部透传命令出错" + (e.getMessage() == null?"":("," + e.getMessage())), com.getId(), com.getCode()) ); |
| | | } |
| | | }else if(commandType.equals(CommandType.resultCommand)){ |
| | | return BaseResponseUtils.buildError(ReturnCommand.errored("出错,通信中间件不接结果类型的命令!", com.getId(), com.getCode())); |
| | |
| | | return BaseResponseUtils.buildSuccess(ReturnCommand.successed("命令已接受,即将构造并下发命令。", command.getId(), command.getCode())); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * 处理发向RTU的外部命令 |
| | | * @return 结果 |
| | | */ |
| | | private BaseResponse<Command> dealOutTransparentCommand(Command command){ |
| | | String rtuAddr = command.getRtuAddr() ; |
| | | if(rtuAddr == null || rtuAddr.trim().equals("")){ |
| | | return BaseResponseUtils.buildError(ReturnCommand.errored("出错,RTU地址为空!", command.getId(), command.getCode())) ; |
| | | } |
| | | rtuAddr = rtuAddr.trim() ; |
| | | Boolean onLine = TcpSessionCache.isConnect(rtuAddr); |
| | | if(onLine == null){ |
| | | return BaseResponseUtils.buildError(ReturnCommand.errored("出错,RTU(地址=" + rtuAddr + ")未上线!", command.getId(), command.getCode())) ; |
| | | }else if(!onLine.booleanValue()){ |
| | | if(!ServerProperties.isLowPower){ |
| | | return BaseResponseUtils.buildError(ReturnCommand.errored("出错,RTU(地址=" + rtuAddr + ")离线!", command.getId(), command.getCode())) ; |
| | | } |
| | | } |
| | | |
| | | //生成异步任务 |
| | | WebDownTransparentComTask task = new WebDownTransparentComTask() ; |
| | | task.data = command ; |
| | | try{ |
| | | log.info("构造下发远程透传命令" + command.getCode() + "的核心任务,并放入任务队列中"); |
| | | CoreUnit.getInstance().pushCoreTask(task); |
| | | }catch(Exception e){ |
| | | log.error(e.getMessage(), e); |
| | | return BaseResponseUtils.buildError(ReturnCommand.successed("透传命令处理失败" + e.getMessage(), command.getId(), command.getCode())) ; |
| | | } |
| | | |
| | | return BaseResponseUtils.buildSuccess(ReturnCommand.successed("透传命令已接受,即将构造并下发命令。", command.getId(), command.getCode())); |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.pipIrrRemote.monitor; |
| | | |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/4/30 16:08 |
| | | * @Description |
| | | */ |
| | | |
| | | @Slf4j |
| | | @Tag(name = "远程透传命令", description = "远程透传命令") |
| | | @RestController |
| | | @RequestMapping(path = "command") |
| | | @RequiredArgsConstructor |
| | | public class ComTransCtrl { |
| | | |
| | | private final ComTransSv comSv; |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.pipIrrRemote.monitor; |
| | | |
| | | import com.dy.pipIrrGlobal.daoPr.PrIntakeMapper; |
| | | import com.dy.pipIrrGlobal.rtuMw.Web2RtuMw; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.core.env.Environment; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.web.client.RestTemplate; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/4/30 16:11 |
| | | * @Description |
| | | */ |
| | | @Slf4j |
| | | @Service |
| | | public class ComTransSv extends Web2RtuMw { |
| | | |
| | | @Autowired |
| | | private PrIntakeMapper prIntakeMapper; |
| | | |
| | | @Autowired |
| | | private Environment env; |
| | | |
| | | @Autowired |
| | | private RestTemplate restTemplate; |
| | | |
| | | } |