实现王江海制定的协议实现到3.30节(功能码0x87)
| | |
| | | public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器 |
| | | public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器 |
| | | public String icCardAddr ;//IC卡地址(8位数字或字母) |
| | | public String icCardNo ;//用户卡序列号(16位数字)(6字节BCD,2字节HEX) |
| | | public String icCardNo ;//用户卡序列号(17位数字)(6字节BCD,2字节HEX) |
| | | public Double chargeMoney ;//单位:元 2位小数点(最大值 99999999.99) |
| | | public Double chargeWater ;//单位:m3 2位小数点(最大值 99999999.99) |
| | | public String flowNo ;//流水号(12位数字) |
| | |
| | | public class ComCd16Vo { |
| | | public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器 |
| | | public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器 |
| | | public Integer waterAlarm ;//剩余水量报警值,单位:m3。整数,取值范围0~65535 |
| | | public Integer moneyAlarm ;//剩余金额报警值,单位:元。整数,取值范围0~65535 |
| | | public Integer waterAlarm ;//剩余水量报警值,单位:m3。整数,取值范围0~9999 |
| | | public Integer moneyAlarm ;//剩余金额报警值,单位:元。整数,取值范围0~9999 |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.downVos; |
| | | |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | public class ComCd21Vo { |
| | | public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器 |
| | | public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器 |
| | | public Integer channel ;//IP通道号(取值范围 1、2). |
| | | public String ip ;//IP(例如 125.235.35.89) |
| | | public Integer port ;//端口号(0~65536) |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.downVos; |
| | | |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | public class ComCd22Vo { |
| | | public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器 |
| | | public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器 |
| | | public Integer maxAmountYear ;//机井年最大用水量单位:m3 整数,取值范围0~99999999 |
| | | public Double limitLevel ;//水位下限 单位:m 取值范围:0~9999.99 |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.downVos; |
| | | |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | public class ComCd23Vo { |
| | | public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器 |
| | | public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器 |
| | | public Integer channel ;//IP通道号(取值范围 1、2). |
| | | public String domain ;//域名(例如 dayuyanjiuyuan.to),最大长度42字符 |
| | | public Integer port ;//端口号(0~65536) |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.downVos; |
| | | |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | public class ComCd26Vo { |
| | | public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器 |
| | | public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器 |
| | | public Integer ipChannel ;//IP通道号 0x01:1通道 0x02:2通道. |
| | | public Integer maxAmountYear ;//设备终端年用水量 单位:m3 整数,取值范围0~99999999 |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.downVos; |
| | | |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | public class ComCd30Vo { |
| | | public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器 |
| | | public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器 |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.downVos; |
| | | |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | public class ComCd68Vo { |
| | | public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器 |
| | | public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器 |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.downVos; |
| | | |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | public class ComCd86Vo { |
| | | public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器 |
| | | public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器 |
| | | public Integer channel ;//IP通道号(取值范围 1、2). |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.downVos; |
| | | |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | public class ComCd87Vo { |
| | | public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器 |
| | | public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器 |
| | | public Integer channel ;//IP通道号(取值范围 1、2). |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.downVos; |
| | | |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | public class ComCd92_A2Vo { |
| | | public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器 |
| | | public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器 |
| | | public String icCardNo ;//用户卡序列号(17位数字)(6字节BCD,2字节HEX) |
| | | public Double waterRemain ;//用户剩余水量, 两个小数点, 单位m3, 0~99999999.99 |
| | | public Double moneyRemain ;//用户剩余金额, 两个小数点, 单位元, 0~999999.99 |
| | | public Double waterPrice ;//水量单价 单位:元, 2个小数点 |
| | | public Double elePrice ;//电量单价 单位:元, 2个小数点 |
| | | public String orderNo ;//订单号(16位数字) |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.downVos; |
| | | |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | public class ComCd93_A3Vo { |
| | | public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器 |
| | | public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器 |
| | | public String icCardNo ;//用户卡序列号(17位数字)(6字节BCD,2字节HEX) |
| | | public String orderNo ;//订单号(16位数字) |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.downVos; |
| | | |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | public class ComCd99Vo { |
| | | public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器 |
| | | public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器 |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.downVos; |
| | | |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | public class ComCd9AVo { |
| | | public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器 |
| | | public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器 |
| | | } |
| | |
| | | index += 8 ; |
| | | GlCreate.createPw(bs, index); |
| | | |
| | | index ++ ; |
| | | index += 2 ; |
| | | GlCreate.createS2D(bs, index) ; |
| | | |
| | | index += 4 ; |
| | |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | | index++ ; |
| | | cdData.projectNo = 0 + bs[index]; |
| | | cdData.projectNo = (int)bs[index]; |
| | | |
| | | index++ ; |
| | | cdData.rtuNewAddr = new CommonV202404().parseRtuAddr(bs, index) ; |
| | |
| | | index += 6 ; |
| | | GlCreate.createPw(bs, index); |
| | | |
| | | index ++ ; |
| | | index += 2 ; |
| | | GlCreate.createS2D(bs, index) ; |
| | | |
| | | index += 4 ; |
| | |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | | index++ ; |
| | | cdData.projectNo = 0 + bs[index]; |
| | | cdData.projectNo = (int)bs[index]; |
| | | |
| | | |
| | | index++ ; |
| | |
| | | if(cvo == null){ |
| | | throw new Exception("json转ComCd16Vo为null") ; |
| | | } |
| | | if(cvo.moneyAlarm < 0 || cvo.moneyAlarm > 65535){ |
| | | throw new Exception("剩余金额报警值必须是0~65535范围内的整数") ; |
| | | if(cvo.moneyAlarm < 0 || cvo.moneyAlarm > 9999){ |
| | | throw new Exception("剩余金额报警值必须是0~9999范围内的整数") ; |
| | | } |
| | | if(cvo.waterAlarm < 0 || cvo.waterAlarm > 65535){ |
| | | throw new Exception("剩余水量报警值必须是0~65535范围内的整数") ; |
| | | if(cvo.waterAlarm < 0 || cvo.waterAlarm > 9999){ |
| | | throw new Exception("剩余水量报警值必须是0~9999范围内的整数") ; |
| | | } |
| | | |
| | | |
| | | byte[] bs = new byte[13] ; |
| | | int index = 0 ; |
| | |
| | | index ++ ; |
| | | bs[index] = cvo.projectNo.byteValue() ; |
| | | |
| | | index ++ ; |
| | | ByteUtilUnsigned.short2Bytes_BE(bs, cvo.waterAlarm, index); |
| | | |
| | | index ++ ; |
| | | ByteUtilUnsigned.short2Bytes_BE(bs, cvo.moneyAlarm, index); |
| | | String strTemp = "" + cvo.waterAlarm ; |
| | | byte[] bTemp = ByteUtil.string2BCD_LE(strTemp) ; |
| | | int bTempLen = bTemp.length ; |
| | | int count = 0 ; |
| | | for(int i = 0 ; i < bTempLen; i++){ |
| | | bs[index++] = bTemp[i] ; |
| | | count ++ ; |
| | | if(count >= 2){ |
| | | break ; |
| | | } |
| | | } |
| | | for(; count < 2; count++){ |
| | | bs[index++] = 0 ; |
| | | } |
| | | |
| | | index += 4 ; |
| | | strTemp = "" + cvo.moneyAlarm ; |
| | | bTemp = ByteUtil.string2BCD_LE(strTemp) ; |
| | | bTempLen = bTemp.length ; |
| | | count = 0 ; |
| | | for(int i = 0 ; i < bTempLen; i++){ |
| | | bs[index++] = bTemp[i] ; |
| | | count ++ ; |
| | | if(count >= 2){ |
| | | break ; |
| | | } |
| | | } |
| | | for(; count < 2; count++){ |
| | | bs[index++] = 0 ; |
| | | } |
| | | |
| | | index ++ ; |
| | | GlCreate.createPw(bs, index); |
| | | |
| | | index ++ ; |
| | | index += 2 ; |
| | | GlCreate.createS2D(bs, index) ; |
| | | |
| | | index += 4 ; |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.parse; |
| | | |
| | | import com.dy.common.mw.protocol.*; |
| | | import com.dy.common.mw.protocol.p206V202404.*; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd16Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd99Vo; |
| | | import com.dy.common.util.ByteUtil; |
| | | import org.apache.logging.log4j.LogManager; |
| | | import org.apache.logging.log4j.Logger; |
| | | |
| | | @AnnotationCodeUp(ifAny={ |
| | | CodeV202404.cd_16 |
| | | }) |
| | | @SuppressWarnings("unused") |
| | | public class Cd_16_Up implements CodeParse{ |
| | | |
| | | private static final Logger log = LogManager.getLogger(Cd_16_Up.class); |
| | | |
| | | /** |
| | | * 分析上行数据 |
| | | */ |
| | | @Override |
| | | public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback)throws Exception { |
| | | ParseParamsForUpV202404 para = (ParseParamsForUpV202404)params ; |
| | | int bsLen = new CommonV202404().parseDataLen(para.upBuffer) ; |
| | | if(bsLen > 0){ |
| | | this.doParse(para.upBuffer, |
| | | bsLen, |
| | | para.upCode, |
| | | para.data) ; |
| | | } |
| | | log.info("分析上行数据<" + CodeV202404.getCodeName(para.upCode) + " RTU地址=" + para.rtuAddr + ">:\n" + para.data.toString()); |
| | | |
| | | MidResultFromRtu midRs = new MidResultFromRtu() ; |
| | | midRs.protocolName = para.protocolName ;//协议名称 |
| | | midRs.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | midRs.upCode = para.upCode ;//上行数据中的功能码 |
| | | midRs.upHex = para.upHex ;//上行数据十六进制形式 |
| | | midRs.upBuffer = para.upBuffer ;//上行数据字节数组 |
| | | midRs.data = para.data ;//解析后的数据 |
| | | |
| | | midRs.reportOrResponse_trueOrFalse = false ; |
| | | |
| | | callback.callback(midRs.reportOrResponse_trueOrFalse); |
| | | return new MidResult[]{midRs} ; |
| | | } |
| | | /** |
| | | * 执行分析 |
| | | * @param bs 字节数组 |
| | | * @param bsLen 字节长度(总包长,包括包头和包尾) |
| | | * @param dataCode 功能码 |
| | | * @param data 数据 |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataCd16Vo cdData = new DataCd16Vo() ; |
| | | dV1.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | | index++ ; |
| | | cdData.projectNo = (int)bs[index]; |
| | | |
| | | index++ ; |
| | | byte result = bs[index]; |
| | | if(result == 1){ |
| | | cdData.success = true ; |
| | | }else{ |
| | | cdData.success = false ; |
| | | } |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.parse; |
| | | |
| | | import com.alibaba.fastjson2.JSON; |
| | | 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.mw.protocol.p206V202404.downVos.ComCd21Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.parse.global.GlCreate; |
| | | import com.dy.common.util.ByteUtil; |
| | | |
| | | import java.nio.charset.StandardCharsets; |
| | | |
| | | @AnnotationCodeDown(ifAny={ |
| | | CodeV202404.cd_21 |
| | | }) |
| | | public class Cd_21_Down implements CodeParse { |
| | | |
| | | @Override |
| | | public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback) throws Exception { |
| | | ParseParamsForDownV202404 para = (ParseParamsForDownV202404) params ; |
| | | byte[] bs = this.doParse(para) ; |
| | | |
| | | MidResultToRtu midRs = new MidResultToRtu() ; |
| | | midRs.protocolName = para.protocolName ;//协议名称 |
| | | midRs.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果 |
| | | midRs.downCode = para.commandCode ;//下行命令功能码; |
| | | midRs.downBuffer = bs ;//下行命令数据 |
| | | midRs.downBufHex = ByteUtil.bytes2Hex(bs, true) ;//下行命令数据十六进制形式 |
| | | midRs.hasResponse = true ;//是否有应答 |
| | | midRs.maxSendTimes = null ;//命令最大发送次数(当收不到应答时,将重发),如果不设置,命令缓存器进行补充设置 |
| | | midRs.isCachForOffLine = false ;//RTU不在线,命令是否缓存,低功耗时为true |
| | | |
| | | midRs.isSendFirst = false ;//命令应答,首先发送,防止RTU重新上报 |
| | | if(isLowPower != null && isLowPower.booleanValue()){ |
| | | //低功耗时,尽快发送 |
| | | midRs.isQuickSend = true ; |
| | | } |
| | | |
| | | return new MidResult[]{midRs} ; |
| | | } |
| | | /** |
| | | * 构造下行数据 |
| | | * @param para 参数 |
| | | * @return 字节数组 |
| | | * @throws Exception 异常 |
| | | */ |
| | | public byte[] doParse(ParseParamsForDownV202404 para) throws Exception { |
| | | byte[] bytes = GlCreate.createStart2Cd(para.rtuAddr, para.commandCode); |
| | | if(para.param != null){ |
| | | String json = (String)para.param; |
| | | ComCd21Vo cvo = JSON.parseObject(json, ComCd21Vo.class) ; |
| | | if(cvo == null){ |
| | | throw new Exception("json转ComCd21Vo为null") ; |
| | | } |
| | | if(cvo.channel == null){ |
| | | throw new Exception("IP通道号不能为空") ; |
| | | } |
| | | if(cvo.channel != 1 && cvo.channel != 2){ |
| | | throw new Exception("IP通道号只能是1或2") ; |
| | | } |
| | | if(cvo.ip == null || cvo.ip.equals("")){ |
| | | throw new Exception("IP不能为空") ; |
| | | } |
| | | if(cvo.ip.length() > 15){ |
| | | throw new Exception("IP最大长度是15个字符") ; |
| | | } |
| | | if(cvo.port < 0 || cvo.port > 65535){ |
| | | throw new Exception("端口号必须是0~65535范围内的整数") ; |
| | | } |
| | | |
| | | byte[] ipBs = cvo.ip.getBytes(StandardCharsets.UTF_8) ; |
| | | byte[] portBs = ("" + cvo.port).getBytes(StandardCharsets.UTF_8) ; |
| | | |
| | | byte[] bs = new byte[4] ; |
| | | int index = 0 ; |
| | | bs[index] = (byte)(Integer.parseInt(cvo.controllerType, 16)); |
| | | |
| | | index ++ ; |
| | | bs[index] = cvo.projectNo.byteValue() ; |
| | | |
| | | index ++ ; |
| | | bs[index] = cvo.channel.byteValue() ; |
| | | |
| | | index ++ ; |
| | | bs[index] = (byte)((ipBs.length << 4) + portBs.length) ; |
| | | |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | bytes = ByteUtil.bytesMerge(bytes, ipBs) ; |
| | | bytes = ByteUtil.bytesMerge(bytes, portBs) ; |
| | | |
| | | |
| | | byte[] bs1 = new byte[7] ; |
| | | index ++ ; |
| | | GlCreate.createPw(bs1, index); |
| | | |
| | | index += 2 ; |
| | | GlCreate.createS2D(bs1, index) ; |
| | | |
| | | index += 4 ; |
| | | bs1[index] = 0 ; //时延 |
| | | bytes = ByteUtil.bytesMerge(bytes, bs1) ; |
| | | |
| | | }else{ |
| | | throw new Exception("下行命令参数据为null") ; |
| | | } |
| | | GlCreate.createLen(bytes);//长度放字节数组中 |
| | | |
| | | byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾 |
| | | |
| | | bytes = ByteUtil.bytesMerge(bytes, bsTail) ; |
| | | |
| | | return bytes ; |
| | | } |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.parse; |
| | | |
| | | import com.dy.common.mw.protocol.*; |
| | | import com.dy.common.mw.protocol.p206V202404.*; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd21Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd22Vo; |
| | | import com.dy.common.util.ByteUtil; |
| | | import org.apache.logging.log4j.LogManager; |
| | | import org.apache.logging.log4j.Logger; |
| | | |
| | | @AnnotationCodeUp(ifAny={ |
| | | CodeV202404.cd_21 |
| | | }) |
| | | @SuppressWarnings("unused") |
| | | public class Cd_21_Up implements CodeParse{ |
| | | |
| | | private static final Logger log = LogManager.getLogger(Cd_21_Up.class); |
| | | |
| | | /** |
| | | * 分析上行数据 |
| | | */ |
| | | @Override |
| | | public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback)throws Exception { |
| | | ParseParamsForUpV202404 para = (ParseParamsForUpV202404)params ; |
| | | int bsLen = new CommonV202404().parseDataLen(para.upBuffer) ; |
| | | if(bsLen > 0){ |
| | | this.doParse(para.upBuffer, |
| | | bsLen, |
| | | para.upCode, |
| | | para.data) ; |
| | | } |
| | | log.info("分析上行数据<" + CodeV202404.getCodeName(para.upCode) + " RTU地址=" + para.rtuAddr + ">:\n" + para.data.toString()); |
| | | |
| | | MidResultFromRtu midRs = new MidResultFromRtu() ; |
| | | midRs.protocolName = para.protocolName ;//协议名称 |
| | | midRs.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | midRs.upCode = para.upCode ;//上行数据中的功能码 |
| | | midRs.upHex = para.upHex ;//上行数据十六进制形式 |
| | | midRs.upBuffer = para.upBuffer ;//上行数据字节数组 |
| | | midRs.data = para.data ;//解析后的数据 |
| | | |
| | | midRs.reportOrResponse_trueOrFalse = false ; |
| | | |
| | | callback.callback(midRs.reportOrResponse_trueOrFalse); |
| | | return new MidResult[]{midRs} ; |
| | | } |
| | | /** |
| | | * 执行分析 |
| | | * @param bs 字节数组 |
| | | * @param bsLen 字节长度(总包长,包括包头和包尾) |
| | | * @param dataCode 功能码 |
| | | * @param data 数据 |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataCd21Vo cdData = new DataCd21Vo() ; |
| | | dV1.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | | index++ ; |
| | | cdData.projectNo = (int)bs[index]; |
| | | |
| | | index++ ; |
| | | byte result = bs[index]; |
| | | if(result == 1){ |
| | | cdData.success = true ; |
| | | }else{ |
| | | cdData.success = false ; |
| | | } |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.parse; |
| | | |
| | | import com.alibaba.fastjson2.JSON; |
| | | 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.mw.protocol.p206V202404.downVos.ComCd16Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.downVos.ComCd22Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.parse.global.GlCreate; |
| | | import com.dy.common.util.ByteUtil; |
| | | import com.dy.common.util.ByteUtilUnsigned; |
| | | |
| | | @AnnotationCodeDown(ifAny={ |
| | | CodeV202404.cd_22 |
| | | }) |
| | | public class Cd_22_Down implements CodeParse { |
| | | |
| | | @Override |
| | | public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback) throws Exception { |
| | | ParseParamsForDownV202404 para = (ParseParamsForDownV202404) params ; |
| | | byte[] bs = this.doParse(para) ; |
| | | |
| | | MidResultToRtu midRs = new MidResultToRtu() ; |
| | | midRs.protocolName = para.protocolName ;//协议名称 |
| | | midRs.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果 |
| | | midRs.downCode = para.commandCode ;//下行命令功能码; |
| | | midRs.downBuffer = bs ;//下行命令数据 |
| | | midRs.downBufHex = ByteUtil.bytes2Hex(bs, true) ;//下行命令数据十六进制形式 |
| | | midRs.hasResponse = true ;//是否有应答 |
| | | midRs.maxSendTimes = null ;//命令最大发送次数(当收不到应答时,将重发),如果不设置,命令缓存器进行补充设置 |
| | | midRs.isCachForOffLine = false ;//RTU不在线,命令是否缓存,低功耗时为true |
| | | |
| | | midRs.isSendFirst = false ;//命令应答,首先发送,防止RTU重新上报 |
| | | if(isLowPower != null && isLowPower.booleanValue()){ |
| | | //低功耗时,尽快发送 |
| | | midRs.isQuickSend = true ; |
| | | } |
| | | |
| | | return new MidResult[]{midRs} ; |
| | | } |
| | | /** |
| | | * 构造下行数据 |
| | | * @param para 参数 |
| | | * @return 字节数组 |
| | | * @throws Exception 异常 |
| | | */ |
| | | public byte[] doParse(ParseParamsForDownV202404 para) throws Exception { |
| | | byte[] bytes = GlCreate.createStart2Cd(para.rtuAddr, para.commandCode); |
| | | if(para.param != null){ |
| | | String json = (String)para.param; |
| | | ComCd22Vo cvo = JSON.parseObject(json, ComCd22Vo.class) ; |
| | | if(cvo == null){ |
| | | throw new Exception("json转ComCd22Vo为null") ; |
| | | } |
| | | if(cvo.maxAmountYear < 0 || cvo.maxAmountYear > 99999999){ |
| | | throw new Exception("机井年最大用水量必须是0~99999999范围内的整数") ; |
| | | } |
| | | if(cvo.limitLevel < 0 || cvo.limitLevel > 9999.99){ |
| | | throw new Exception("水位下限值必须是0~9999.99范围内的整数") ; |
| | | } |
| | | |
| | | byte[] bs = new byte[17] ; |
| | | int index = 0 ; |
| | | bs[index] = (byte)(Integer.parseInt(cvo.controllerType, 16)); |
| | | |
| | | index ++ ; |
| | | bs[index] = cvo.projectNo.byteValue() ; |
| | | |
| | | index ++ ; |
| | | String strTemp = "" + cvo.maxAmountYear ; |
| | | byte[] bTemp = ByteUtil.string2BCD_LE(strTemp) ; |
| | | int bTempLen = bTemp.length ; |
| | | int count = 0 ; |
| | | for(int i = 0 ; i < bTempLen; i++){ |
| | | bs[index++] = bTemp[i] ; |
| | | count ++ ; |
| | | if(count >= 4){ |
| | | break ; |
| | | } |
| | | } |
| | | for(; count < 4; count++){ |
| | | bs[index++] = 0 ; |
| | | } |
| | | |
| | | index += 4 ; |
| | | strTemp = "" + (Double.valueOf(cvo.limitLevel * 100)).longValue() ; |
| | | bTemp = ByteUtil.string2BCD_LE(strTemp) ; |
| | | bTempLen = bTemp.length ; |
| | | count = 0 ; |
| | | for(int i = 0 ; i < bTempLen; i++){ |
| | | bs[index++] = bTemp[i] ; |
| | | count ++ ; |
| | | if(count >= 3){ |
| | | break ; |
| | | } |
| | | } |
| | | for(; count < 3; count++){ |
| | | bs[index++] = 0 ; |
| | | } |
| | | |
| | | index ++ ; |
| | | GlCreate.createPw(bs, index); |
| | | |
| | | index += 2 ; |
| | | GlCreate.createS2D(bs, index) ; |
| | | |
| | | index += 4 ; |
| | | bs[index] = 0 ; //时延 |
| | | |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | }else{ |
| | | throw new Exception("下行命令参数据为null") ; |
| | | } |
| | | GlCreate.createLen(bytes);//长度放字节数组中 |
| | | |
| | | byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾 |
| | | |
| | | bytes = ByteUtil.bytesMerge(bytes, bsTail) ; |
| | | |
| | | return bytes ; |
| | | } |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.parse; |
| | | |
| | | import com.dy.common.mw.protocol.*; |
| | | import com.dy.common.mw.protocol.p206V202404.*; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd16Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd22Vo; |
| | | import com.dy.common.util.ByteUtil; |
| | | import org.apache.logging.log4j.LogManager; |
| | | import org.apache.logging.log4j.Logger; |
| | | |
| | | @AnnotationCodeUp(ifAny={ |
| | | CodeV202404.cd_22 |
| | | }) |
| | | @SuppressWarnings("unused") |
| | | public class Cd_22_Up implements CodeParse{ |
| | | |
| | | private static final Logger log = LogManager.getLogger(Cd_22_Up.class); |
| | | |
| | | /** |
| | | * 分析上行数据 |
| | | */ |
| | | @Override |
| | | public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback)throws Exception { |
| | | ParseParamsForUpV202404 para = (ParseParamsForUpV202404)params ; |
| | | int bsLen = new CommonV202404().parseDataLen(para.upBuffer) ; |
| | | if(bsLen > 0){ |
| | | this.doParse(para.upBuffer, |
| | | bsLen, |
| | | para.upCode, |
| | | para.data) ; |
| | | } |
| | | log.info("分析上行数据<" + CodeV202404.getCodeName(para.upCode) + " RTU地址=" + para.rtuAddr + ">:\n" + para.data.toString()); |
| | | |
| | | MidResultFromRtu midRs = new MidResultFromRtu() ; |
| | | midRs.protocolName = para.protocolName ;//协议名称 |
| | | midRs.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | midRs.upCode = para.upCode ;//上行数据中的功能码 |
| | | midRs.upHex = para.upHex ;//上行数据十六进制形式 |
| | | midRs.upBuffer = para.upBuffer ;//上行数据字节数组 |
| | | midRs.data = para.data ;//解析后的数据 |
| | | |
| | | midRs.reportOrResponse_trueOrFalse = false ; |
| | | |
| | | callback.callback(midRs.reportOrResponse_trueOrFalse); |
| | | return new MidResult[]{midRs} ; |
| | | } |
| | | /** |
| | | * 执行分析 |
| | | * @param bs 字节数组 |
| | | * @param bsLen 字节长度(总包长,包括包头和包尾) |
| | | * @param dataCode 功能码 |
| | | * @param data 数据 |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataCd22Vo cdData = new DataCd22Vo() ; |
| | | dV1.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | | index++ ; |
| | | cdData.projectNo = (int)bs[index]; |
| | | |
| | | index++ ; |
| | | byte result = bs[index]; |
| | | if(result == 1){ |
| | | cdData.success = true ; |
| | | }else{ |
| | | cdData.success = false ; |
| | | } |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.parse; |
| | | |
| | | import com.alibaba.fastjson2.JSON; |
| | | 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.mw.protocol.p206V202404.downVos.ComCd21Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.downVos.ComCd23Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.parse.global.GlCreate; |
| | | import com.dy.common.util.ByteUtil; |
| | | |
| | | import java.nio.charset.StandardCharsets; |
| | | |
| | | @AnnotationCodeDown(ifAny={ |
| | | CodeV202404.cd_23 |
| | | }) |
| | | public class Cd_23_Down implements CodeParse { |
| | | |
| | | @Override |
| | | public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback) throws Exception { |
| | | ParseParamsForDownV202404 para = (ParseParamsForDownV202404) params ; |
| | | byte[] bs = this.doParse(para) ; |
| | | |
| | | MidResultToRtu midRs = new MidResultToRtu() ; |
| | | midRs.protocolName = para.protocolName ;//协议名称 |
| | | midRs.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果 |
| | | midRs.downCode = para.commandCode ;//下行命令功能码; |
| | | midRs.downBuffer = bs ;//下行命令数据 |
| | | midRs.downBufHex = ByteUtil.bytes2Hex(bs, true) ;//下行命令数据十六进制形式 |
| | | midRs.hasResponse = true ;//是否有应答 |
| | | midRs.maxSendTimes = null ;//命令最大发送次数(当收不到应答时,将重发),如果不设置,命令缓存器进行补充设置 |
| | | midRs.isCachForOffLine = false ;//RTU不在线,命令是否缓存,低功耗时为true |
| | | |
| | | midRs.isSendFirst = false ;//命令应答,首先发送,防止RTU重新上报 |
| | | if(isLowPower != null && isLowPower.booleanValue()){ |
| | | //低功耗时,尽快发送 |
| | | midRs.isQuickSend = true ; |
| | | } |
| | | |
| | | return new MidResult[]{midRs} ; |
| | | } |
| | | /** |
| | | * 构造下行数据 |
| | | * @param para 参数 |
| | | * @return 字节数组 |
| | | * @throws Exception 异常 |
| | | */ |
| | | public byte[] doParse(ParseParamsForDownV202404 para) throws Exception { |
| | | byte[] bytes = GlCreate.createStart2Cd(para.rtuAddr, para.commandCode); |
| | | if(para.param != null){ |
| | | String json = (String)para.param; |
| | | ComCd23Vo cvo = JSON.parseObject(json, ComCd23Vo.class) ; |
| | | if(cvo == null){ |
| | | throw new Exception("json转ComCd21Vo为null") ; |
| | | } |
| | | if(cvo.channel == null){ |
| | | throw new Exception("IP通道号不能为空") ; |
| | | } |
| | | if(cvo.channel != 1 && cvo.channel != 2){ |
| | | throw new Exception("IP通道号只能是1或2") ; |
| | | } |
| | | if(cvo.domain == null || cvo.domain.equals("")){ |
| | | throw new Exception("域名不能为空") ; |
| | | } |
| | | if(cvo.domain.length() > 42){ |
| | | throw new Exception("域名最大长度是42个字符") ; |
| | | } |
| | | if(cvo.port < 0 || cvo.port > 65535){ |
| | | throw new Exception("端口号必须是0~65535范围内的整数") ; |
| | | } |
| | | |
| | | byte[] domainBs = cvo.domain.getBytes(StandardCharsets.UTF_8) ; |
| | | byte[] portBs = ("" + cvo.port).getBytes(StandardCharsets.UTF_8) ; |
| | | |
| | | byte[] bs = new byte[5] ; |
| | | int index = 0 ; |
| | | bs[index] = (byte)(Integer.parseInt(cvo.controllerType, 16)); |
| | | |
| | | index ++ ; |
| | | bs[index] = cvo.projectNo.byteValue() ; |
| | | |
| | | index ++ ; |
| | | bs[index] = cvo.channel.byteValue() ; |
| | | |
| | | index ++ ; |
| | | bs[index] = (byte)(domainBs.length) ; |
| | | |
| | | index ++ ; |
| | | bs[index] = (byte)(portBs.length) ; |
| | | |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | bytes = ByteUtil.bytesMerge(bytes, domainBs) ; |
| | | bytes = ByteUtil.bytesMerge(bytes, portBs) ; |
| | | |
| | | |
| | | byte[] bs1 = new byte[7] ; |
| | | index ++ ; |
| | | GlCreate.createPw(bs1, index); |
| | | |
| | | index += 2 ; |
| | | GlCreate.createS2D(bs1, index) ; |
| | | |
| | | index += 4 ; |
| | | bs1[index] = 0 ; //时延 |
| | | bytes = ByteUtil.bytesMerge(bytes, bs1) ; |
| | | |
| | | }else{ |
| | | throw new Exception("下行命令参数据为null") ; |
| | | } |
| | | GlCreate.createLen(bytes);//长度放字节数组中 |
| | | |
| | | byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾 |
| | | |
| | | bytes = ByteUtil.bytesMerge(bytes, bsTail) ; |
| | | |
| | | return bytes ; |
| | | } |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.parse; |
| | | |
| | | import com.dy.common.mw.protocol.*; |
| | | import com.dy.common.mw.protocol.p206V202404.*; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd21Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd23Vo; |
| | | import com.dy.common.util.ByteUtil; |
| | | import org.apache.logging.log4j.LogManager; |
| | | import org.apache.logging.log4j.Logger; |
| | | |
| | | @AnnotationCodeUp(ifAny={ |
| | | CodeV202404.cd_23 |
| | | }) |
| | | @SuppressWarnings("unused") |
| | | public class Cd_23_Up implements CodeParse{ |
| | | |
| | | private static final Logger log = LogManager.getLogger(Cd_23_Up.class); |
| | | |
| | | /** |
| | | * 分析上行数据 |
| | | */ |
| | | @Override |
| | | public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback)throws Exception { |
| | | ParseParamsForUpV202404 para = (ParseParamsForUpV202404)params ; |
| | | int bsLen = new CommonV202404().parseDataLen(para.upBuffer) ; |
| | | if(bsLen > 0){ |
| | | this.doParse(para.upBuffer, |
| | | bsLen, |
| | | para.upCode, |
| | | para.data) ; |
| | | } |
| | | log.info("分析上行数据<" + CodeV202404.getCodeName(para.upCode) + " RTU地址=" + para.rtuAddr + ">:\n" + para.data.toString()); |
| | | |
| | | MidResultFromRtu midRs = new MidResultFromRtu() ; |
| | | midRs.protocolName = para.protocolName ;//协议名称 |
| | | midRs.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | midRs.upCode = para.upCode ;//上行数据中的功能码 |
| | | midRs.upHex = para.upHex ;//上行数据十六进制形式 |
| | | midRs.upBuffer = para.upBuffer ;//上行数据字节数组 |
| | | midRs.data = para.data ;//解析后的数据 |
| | | |
| | | midRs.reportOrResponse_trueOrFalse = false ; |
| | | |
| | | callback.callback(midRs.reportOrResponse_trueOrFalse); |
| | | return new MidResult[]{midRs} ; |
| | | } |
| | | /** |
| | | * 执行分析 |
| | | * @param bs 字节数组 |
| | | * @param bsLen 字节长度(总包长,包括包头和包尾) |
| | | * @param dataCode 功能码 |
| | | * @param data 数据 |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataCd23Vo cdData = new DataCd23Vo() ; |
| | | dV1.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | | index++ ; |
| | | cdData.projectNo = (int)bs[index]; |
| | | |
| | | index++ ; |
| | | byte result = bs[index]; |
| | | if(result == 1){ |
| | | cdData.success = true ; |
| | | }else{ |
| | | cdData.success = false ; |
| | | } |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.parse; |
| | | |
| | | import com.alibaba.fastjson2.JSON; |
| | | 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.mw.protocol.p206V202404.downVos.ComCd22Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.downVos.ComCd26Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.parse.global.GlCreate; |
| | | import com.dy.common.util.ByteUtil; |
| | | |
| | | @AnnotationCodeDown(ifAny={ |
| | | CodeV202404.cd_26 |
| | | }) |
| | | public class Cd_26_Down implements CodeParse { |
| | | |
| | | @Override |
| | | public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback) throws Exception { |
| | | ParseParamsForDownV202404 para = (ParseParamsForDownV202404) params ; |
| | | byte[] bs = this.doParse(para) ; |
| | | |
| | | MidResultToRtu midRs = new MidResultToRtu() ; |
| | | midRs.protocolName = para.protocolName ;//协议名称 |
| | | midRs.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果 |
| | | midRs.downCode = para.commandCode ;//下行命令功能码; |
| | | midRs.downBuffer = bs ;//下行命令数据 |
| | | midRs.downBufHex = ByteUtil.bytes2Hex(bs, true) ;//下行命令数据十六进制形式 |
| | | midRs.hasResponse = true ;//是否有应答 |
| | | midRs.maxSendTimes = null ;//命令最大发送次数(当收不到应答时,将重发),如果不设置,命令缓存器进行补充设置 |
| | | midRs.isCachForOffLine = false ;//RTU不在线,命令是否缓存,低功耗时为true |
| | | |
| | | midRs.isSendFirst = false ;//命令应答,首先发送,防止RTU重新上报 |
| | | if(isLowPower != null && isLowPower.booleanValue()){ |
| | | //低功耗时,尽快发送 |
| | | midRs.isQuickSend = true ; |
| | | } |
| | | |
| | | return new MidResult[]{midRs} ; |
| | | } |
| | | /** |
| | | * 构造下行数据 |
| | | * @param para 参数 |
| | | * @return 字节数组 |
| | | * @throws Exception 异常 |
| | | */ |
| | | public byte[] doParse(ParseParamsForDownV202404 para) throws Exception { |
| | | byte[] bytes = GlCreate.createStart2Cd(para.rtuAddr, para.commandCode); |
| | | if(para.param != null){ |
| | | String json = (String)para.param; |
| | | ComCd26Vo cvo = JSON.parseObject(json, ComCd26Vo.class) ; |
| | | if(cvo == null){ |
| | | throw new Exception("json转ComCd22Vo为null") ; |
| | | } |
| | | if(cvo.ipChannel != 1 && cvo.ipChannel !=2){ |
| | | throw new Exception("IP通道号只能是1或2") ; |
| | | } |
| | | |
| | | if(cvo.maxAmountYear < 0 || cvo.maxAmountYear > 99999999){ |
| | | throw new Exception("设备终端年用水量必须是0~99999999范围内的整数") ; |
| | | } |
| | | |
| | | byte[] bs = new byte[15] ; |
| | | int index = 0 ; |
| | | bs[index] = (byte)(Integer.parseInt(cvo.controllerType, 16)); |
| | | |
| | | index ++ ; |
| | | bs[index] = cvo.projectNo.byteValue() ; |
| | | |
| | | index ++ ; |
| | | bs[index] = cvo.ipChannel.byteValue() ; |
| | | |
| | | index ++ ; |
| | | String strTemp = "" + cvo.maxAmountYear ; |
| | | byte[] bTemp = ByteUtil.string2BCD_LE(strTemp) ; |
| | | int bTempLen = bTemp.length ; |
| | | int count = 0 ; |
| | | for(int i = 0 ; i < bTempLen; i++){ |
| | | bs[index++] = bTemp[i] ; |
| | | count ++ ; |
| | | if(count >= 4){ |
| | | break ; |
| | | } |
| | | } |
| | | for(; count < 4; count++){ |
| | | bs[index++] = 0 ; |
| | | } |
| | | |
| | | index ++ ; |
| | | GlCreate.createPw(bs, index); |
| | | |
| | | index += 2 ; |
| | | GlCreate.createS2D(bs, index) ; |
| | | |
| | | index += 4 ; |
| | | bs[index] = 0 ; //时延 |
| | | |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | }else{ |
| | | throw new Exception("下行命令参数据为null") ; |
| | | } |
| | | GlCreate.createLen(bytes);//长度放字节数组中 |
| | | |
| | | byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾 |
| | | |
| | | bytes = ByteUtil.bytesMerge(bytes, bsTail) ; |
| | | |
| | | return bytes ; |
| | | } |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.parse; |
| | | |
| | | import com.dy.common.mw.protocol.*; |
| | | import com.dy.common.mw.protocol.p206V202404.*; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd22Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd26Vo; |
| | | import com.dy.common.util.ByteUtil; |
| | | import org.apache.logging.log4j.LogManager; |
| | | import org.apache.logging.log4j.Logger; |
| | | |
| | | @AnnotationCodeUp(ifAny={ |
| | | CodeV202404.cd_26 |
| | | }) |
| | | @SuppressWarnings("unused") |
| | | public class Cd_26_Up implements CodeParse{ |
| | | |
| | | private static final Logger log = LogManager.getLogger(Cd_26_Up.class); |
| | | |
| | | /** |
| | | * 分析上行数据 |
| | | */ |
| | | @Override |
| | | public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback)throws Exception { |
| | | ParseParamsForUpV202404 para = (ParseParamsForUpV202404)params ; |
| | | int bsLen = new CommonV202404().parseDataLen(para.upBuffer) ; |
| | | if(bsLen > 0){ |
| | | this.doParse(para.upBuffer, |
| | | bsLen, |
| | | para.upCode, |
| | | para.data) ; |
| | | } |
| | | log.info("分析上行数据<" + CodeV202404.getCodeName(para.upCode) + " RTU地址=" + para.rtuAddr + ">:\n" + para.data.toString()); |
| | | |
| | | MidResultFromRtu midRs = new MidResultFromRtu() ; |
| | | midRs.protocolName = para.protocolName ;//协议名称 |
| | | midRs.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | midRs.upCode = para.upCode ;//上行数据中的功能码 |
| | | midRs.upHex = para.upHex ;//上行数据十六进制形式 |
| | | midRs.upBuffer = para.upBuffer ;//上行数据字节数组 |
| | | midRs.data = para.data ;//解析后的数据 |
| | | |
| | | midRs.reportOrResponse_trueOrFalse = false ; |
| | | |
| | | callback.callback(midRs.reportOrResponse_trueOrFalse); |
| | | return new MidResult[]{midRs} ; |
| | | } |
| | | /** |
| | | * 执行分析 |
| | | * @param bs 字节数组 |
| | | * @param bsLen 字节长度(总包长,包括包头和包尾) |
| | | * @param dataCode 功能码 |
| | | * @param data 数据 |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataCd26Vo cdData = new DataCd26Vo() ; |
| | | dV1.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | | index++ ; |
| | | cdData.projectNo = (int)bs[index]; |
| | | |
| | | index++ ; |
| | | byte result = bs[index]; |
| | | if(result == 1){ |
| | | cdData.success = true ; |
| | | }else{ |
| | | cdData.success = false ; |
| | | } |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.parse; |
| | | |
| | | import com.alibaba.fastjson2.JSON; |
| | | 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.mw.protocol.p206V202404.downVos.ComCd22Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.downVos.ComCd30Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.parse.global.GlCreate; |
| | | import com.dy.common.util.ByteUtil; |
| | | |
| | | @AnnotationCodeDown(ifAny={ |
| | | CodeV202404.cd_16 |
| | | }) |
| | | public class Cd_30_Down implements CodeParse { |
| | | |
| | | @Override |
| | | public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback) throws Exception { |
| | | ParseParamsForDownV202404 para = (ParseParamsForDownV202404) params ; |
| | | byte[] bs = this.doParse(para) ; |
| | | |
| | | MidResultToRtu midRs = new MidResultToRtu() ; |
| | | midRs.protocolName = para.protocolName ;//协议名称 |
| | | midRs.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果 |
| | | midRs.downCode = para.commandCode ;//下行命令功能码; |
| | | midRs.downBuffer = bs ;//下行命令数据 |
| | | midRs.downBufHex = ByteUtil.bytes2Hex(bs, true) ;//下行命令数据十六进制形式 |
| | | midRs.hasResponse = true ;//是否有应答 |
| | | midRs.maxSendTimes = null ;//命令最大发送次数(当收不到应答时,将重发),如果不设置,命令缓存器进行补充设置 |
| | | midRs.isCachForOffLine = false ;//RTU不在线,命令是否缓存,低功耗时为true |
| | | |
| | | midRs.isSendFirst = false ;//命令应答,首先发送,防止RTU重新上报 |
| | | if(isLowPower != null && isLowPower.booleanValue()){ |
| | | //低功耗时,尽快发送 |
| | | midRs.isQuickSend = true ; |
| | | } |
| | | |
| | | return new MidResult[]{midRs} ; |
| | | } |
| | | /** |
| | | * 构造下行数据 |
| | | * @param para 参数 |
| | | * @return 字节数组 |
| | | * @throws Exception 异常 |
| | | */ |
| | | public byte[] doParse(ParseParamsForDownV202404 para) throws Exception { |
| | | byte[] bytes = GlCreate.createStart2Cd(para.rtuAddr, para.commandCode); |
| | | if(para.param != null){ |
| | | String json = (String)para.param; |
| | | ComCd30Vo cvo = JSON.parseObject(json, ComCd30Vo.class) ; |
| | | if(cvo == null){ |
| | | throw new Exception("json转ComCd30Vo为null") ; |
| | | } |
| | | byte[] bs = new byte[9] ; |
| | | int index = 0 ; |
| | | bs[index] = (byte)(Integer.parseInt(cvo.controllerType, 16)); |
| | | |
| | | index ++ ; |
| | | bs[index] = cvo.projectNo.byteValue() ; |
| | | |
| | | index ++ ; |
| | | GlCreate.createPw(bs, index); |
| | | |
| | | index += 2 ; |
| | | GlCreate.createS2D(bs, index) ; |
| | | |
| | | index += 4 ; |
| | | bs[index] = 0 ; //时延 |
| | | |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | }else{ |
| | | throw new Exception("下行命令参数据为null") ; |
| | | } |
| | | GlCreate.createLen(bytes);//长度放字节数组中 |
| | | |
| | | byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾 |
| | | |
| | | bytes = ByteUtil.bytesMerge(bytes, bsTail) ; |
| | | |
| | | return bytes ; |
| | | } |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.parse; |
| | | |
| | | import com.dy.common.mw.protocol.*; |
| | | import com.dy.common.mw.protocol.p206V202404.*; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd22Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd30Vo; |
| | | import com.dy.common.util.ByteUtil; |
| | | import org.apache.logging.log4j.LogManager; |
| | | import org.apache.logging.log4j.Logger; |
| | | |
| | | @AnnotationCodeUp(ifAny={ |
| | | CodeV202404.cd_30 |
| | | }) |
| | | @SuppressWarnings("unused") |
| | | public class Cd_30_Up implements CodeParse{ |
| | | |
| | | private static final Logger log = LogManager.getLogger(Cd_30_Up.class); |
| | | |
| | | /** |
| | | * 分析上行数据 |
| | | */ |
| | | @Override |
| | | public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback)throws Exception { |
| | | ParseParamsForUpV202404 para = (ParseParamsForUpV202404)params ; |
| | | int bsLen = new CommonV202404().parseDataLen(para.upBuffer) ; |
| | | if(bsLen > 0){ |
| | | this.doParse(para.upBuffer, |
| | | bsLen, |
| | | para.upCode, |
| | | para.data) ; |
| | | } |
| | | log.info("分析上行数据<" + CodeV202404.getCodeName(para.upCode) + " RTU地址=" + para.rtuAddr + ">:\n" + para.data.toString()); |
| | | |
| | | MidResultFromRtu midRs = new MidResultFromRtu() ; |
| | | midRs.protocolName = para.protocolName ;//协议名称 |
| | | midRs.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | midRs.upCode = para.upCode ;//上行数据中的功能码 |
| | | midRs.upHex = para.upHex ;//上行数据十六进制形式 |
| | | midRs.upBuffer = para.upBuffer ;//上行数据字节数组 |
| | | midRs.data = para.data ;//解析后的数据 |
| | | |
| | | midRs.reportOrResponse_trueOrFalse = false ; |
| | | |
| | | callback.callback(midRs.reportOrResponse_trueOrFalse); |
| | | return new MidResult[]{midRs} ; |
| | | } |
| | | /** |
| | | * 执行分析 |
| | | * @param bs 字节数组 |
| | | * @param bsLen 字节长度(总包长,包括包头和包尾) |
| | | * @param dataCode 功能码 |
| | | * @param data 数据 |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataCd30Vo cdData = new DataCd30Vo() ; |
| | | dV1.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | | index++ ; |
| | | cdData.projectNo = (int)bs[index]; |
| | | |
| | | index++ ; |
| | | byte result = bs[index]; |
| | | if(result == 1){ |
| | | cdData.success = true ; |
| | | }else{ |
| | | cdData.success = false ; |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | | index++ ; |
| | | cdData.projectNo = 0 + bs[index]; |
| | | cdData.projectNo = (int)bs[index]; |
| | | |
| | | index++ ; |
| | | cdData.rtuAddr = new CommonV202404().parseRtuAddr(bs, index) ; |
| | |
| | | String controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | | index++ ; |
| | | Integer projectNo = 0 + bs[index]; |
| | | Integer projectNo = (int)bs[index]; |
| | | |
| | | index++ ; |
| | | byte hasRecord = bs[index]; |
| | |
| | | List<DataCd55Vo> list = new ArrayList<>() ; |
| | | DataCd55Vo vo = this.doParseData(bs, index, bsLen, controllerType, projectNo) ; |
| | | while(vo != null){ |
| | | index += 39 ; |
| | | index += 35 ; |
| | | list.add(vo) ; |
| | | vo = this.doParseData(bs, index, bsLen, controllerType, projectNo) ; |
| | | } |
| | |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | | index++ ; |
| | | cdData.projectNo = 0 + bs[index]; |
| | | cdData.projectNo = (int)bs[index]; |
| | | |
| | | index++ ; |
| | | cdData.waterAlarm = ByteUtilUnsigned.bytes2Short_BE(bs, index) ; |
| | | cdData.waterAlarm = ByteUtil.BCD2Int_LE(bs, index, index + 1) ; |
| | | |
| | | index += 2 ; |
| | | cdData.moneyAlarm = ByteUtilUnsigned.bytes2Short_BE(bs, index) ; |
| | | cdData.moneyAlarm = ByteUtil.BCD2Int_LE(bs, index, index + 1) ; |
| | | |
| | | } |
| | | } |
| | |
| | | String controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | | index++ ; |
| | | Integer projectNo = 0 + bs[index]; |
| | | Integer projectNo = (int)bs[index]; |
| | | |
| | | index++ ; |
| | | byte hasRecord = bs[index]; |
| | |
| | | List<DataCd5CVo> list = new ArrayList<>() ; |
| | | DataCd5CVo vo = this.doParseData(bs, index, bsLen, controllerType, projectNo) ; |
| | | while(vo != null){ |
| | | index += 39 ; |
| | | index += 16 ; |
| | | list.add(vo) ; |
| | | vo = this.doParseData(bs, index, bsLen, controllerType, projectNo) ; |
| | | } |
| | |
| | | String controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | | index++ ; |
| | | Integer projectNo = 0 + bs[index]; |
| | | Integer projectNo = (int)bs[index]; |
| | | |
| | | index++ ; |
| | | byte hasRecord = bs[index]; |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.parse; |
| | | |
| | | import com.alibaba.fastjson2.JSON; |
| | | 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.mw.protocol.p206V202404.downVos.ComCd56Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.downVos.ComCd68Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.parse.global.GlCreate; |
| | | import com.dy.common.util.ByteUtil; |
| | | |
| | | @AnnotationCodeDown(ifAny={ |
| | | CodeV202404.cd_68 |
| | | }) |
| | | public class Cd_68_Down implements CodeParse { |
| | | |
| | | @Override |
| | | public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback) throws Exception { |
| | | ParseParamsForDownV202404 para = (ParseParamsForDownV202404) params ; |
| | | byte[] bs = this.doParse(para) ; |
| | | |
| | | MidResultToRtu midRs = new MidResultToRtu() ; |
| | | midRs.protocolName = para.protocolName ;//协议名称 |
| | | midRs.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果 |
| | | midRs.downCode = para.commandCode ;//下行命令功能码; |
| | | midRs.downBuffer = bs ;//下行命令数据 |
| | | midRs.downBufHex = ByteUtil.bytes2Hex(bs, true) ;//下行命令数据十六进制形式 |
| | | midRs.hasResponse = true ;//是否有应答 |
| | | midRs.maxSendTimes = null ;//命令最大发送次数(当收不到应答时,将重发),如果不设置,命令缓存器进行补充设置 |
| | | midRs.isCachForOffLine = false ;//RTU不在线,命令是否缓存,低功耗时为true |
| | | |
| | | midRs.isSendFirst = false ;//命令应答,首先发送,防止RTU重新上报 |
| | | if(isLowPower != null && isLowPower.booleanValue()){ |
| | | //低功耗时,尽快发送 |
| | | midRs.isQuickSend = true ; |
| | | } |
| | | |
| | | return new MidResult[]{midRs} ; |
| | | } |
| | | /** |
| | | * 构造下行数据 |
| | | * @param para 参数 |
| | | * @return 字节数组 |
| | | * @throws Exception 异常 |
| | | */ |
| | | public byte[] doParse(ParseParamsForDownV202404 para) throws Exception { |
| | | byte[] bytes = GlCreate.createStart2Cd(para.rtuAddr, para.commandCode); |
| | | if(para.param != null){ |
| | | String json = (String)para.param; |
| | | ComCd68Vo cvo = JSON.parseObject(json, ComCd68Vo.class) ; |
| | | if(cvo == null){ |
| | | throw new Exception("json转ComCd68Vo为null") ; |
| | | } |
| | | byte[] bs = new byte[2] ; |
| | | int index = 0 ; |
| | | bs[index] = (byte)(Integer.parseInt(cvo.controllerType, 16)); |
| | | |
| | | index ++ ; |
| | | bs[index] = cvo.projectNo.byteValue() ; |
| | | |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | }else{ |
| | | throw new Exception("下行命令参数据为null") ; |
| | | } |
| | | GlCreate.createLen(bytes);//长度放字节数组中 |
| | | |
| | | byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾 |
| | | |
| | | bytes = ByteUtil.bytesMerge(bytes, bsTail) ; |
| | | |
| | | return bytes ; |
| | | } |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.parse; |
| | | |
| | | |
| | | import com.dy.common.mw.protocol.*; |
| | | import com.dy.common.mw.protocol.p206V202404.*; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd68Vo; |
| | | import com.dy.common.util.ByteUtil; |
| | | import com.dy.common.util.ByteUtilUnsigned; |
| | | import org.apache.logging.log4j.LogManager; |
| | | import org.apache.logging.log4j.Logger; |
| | | |
| | | @AnnotationCodeUp(ifAny={ |
| | | CodeV202404.cd_68 |
| | | }) |
| | | @SuppressWarnings("unused") |
| | | public class Cd_68_Up implements CodeParse{ |
| | | |
| | | private static final Logger log = LogManager.getLogger(Cd_68_Up.class); |
| | | |
| | | /** |
| | | * 分析上行数据 |
| | | */ |
| | | @Override |
| | | public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback)throws Exception { |
| | | ParseParamsForUpV202404 para = (ParseParamsForUpV202404)params ; |
| | | int bsLen = new CommonV202404().parseDataLen(para.upBuffer) ; |
| | | if(bsLen > 0){ |
| | | this.doParse(para.upBuffer, |
| | | bsLen, |
| | | para.upCode, |
| | | para.data) ; |
| | | } |
| | | log.info("分析上行数据<" + CodeV202404.getCodeName(para.upCode) + " RTU地址=" + para.rtuAddr + ">:\n" + para.data.toString()); |
| | | |
| | | MidResultFromRtu midRs = new MidResultFromRtu() ; |
| | | midRs.protocolName = para.protocolName ;//协议名称 |
| | | midRs.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | midRs.upCode = para.upCode ;//上行数据中的功能码 |
| | | midRs.upHex = para.upHex ;//上行数据十六进制形式 |
| | | midRs.upBuffer = para.upBuffer ;//上行数据字节数组 |
| | | midRs.data = para.data ;//解析后的数据 |
| | | |
| | | midRs.reportOrResponse_trueOrFalse = false ;//主动上报 |
| | | |
| | | callback.callback(midRs.reportOrResponse_trueOrFalse); |
| | | return new MidResult[]{midRs} ; |
| | | } |
| | | /** |
| | | * 执行分析 |
| | | * @param bs 字节数组 |
| | | * @param bsLen 字节长度(总包长,包括包头和包尾) |
| | | * @param dataCode 功能码 |
| | | * @param data 数据 |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataCd68Vo cdData = new DataCd68Vo() ; |
| | | dV1.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | | index++ ; |
| | | cdData.projectNo = (int)bs[index]; |
| | | |
| | | index++ ; |
| | | cdData.maxAmountYear = ByteUtil.BCD2Int_LE(bs, index, index + 3) ; |
| | | |
| | | index += 4 ; |
| | | cdData.limitLevel = ByteUtil.BCD2Int_LE(bs, index, index + 2)/100.0D ; |
| | | } |
| | | } |
| | |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | | index++ ; |
| | | cdData.projectNo = 0 + bs[index]; |
| | | cdData.projectNo = (int)bs[index]; |
| | | |
| | | index++ ; |
| | | GlParse.parseAlarmAndState(bs, index, cdData) ; |
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.mw.protocol.p206V202404.parse.global.GlCreate; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd02Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd83Vo; |
| | | import com.dy.common.util.ByteUtil; |
| | | |
| | | @AnnotationCodeDown(ifAny={ |
| | | CodeV202404.cd_83 |
| | | }) |
| | | public class Cd_83_Down implements CodeParse { |
| | | |
| | | //private static Logger log = LogManager.getLogger(Cd_02_Down.class); |
| | | |
| | | @Override |
| | | public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback) throws Exception { |
| | | ParseParamsForDownV202404 para = (ParseParamsForDownV202404) params ; |
| | | byte[] bs = this.doParse(para) ; |
| | | |
| | | MidResultToRtu midRs = new MidResultToRtu() ; |
| | | midRs.protocolName = para.protocolName ;//协议名称 |
| | | midRs.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果 |
| | | midRs.downCode = para.commandCode ;//下行命令功能码; |
| | | midRs.downBuffer = bs ;//下行命令数据 |
| | | midRs.downBufHex = ByteUtil.bytes2Hex(bs, true) ;//下行命令数据十六进制形式 |
| | | midRs.hasResponse = false ;//是否有应答 |
| | | midRs.maxSendTimes = 1 ;//命令最大发送次数(当收不到应答时,将重发),如果不设置,命令缓存器进行补充设置 |
| | | midRs.isCachForOffLine = false ;//RTU不在线,命令是否缓存,低功耗时为true |
| | | |
| | | midRs.isSendFirst = true ;//命令应答,首先发送,防止RTU重新上报 |
| | | if(isLowPower != null && isLowPower.booleanValue()){ |
| | | //低功耗时,尽快发送 |
| | | midRs.isQuickSend = true ; |
| | | } |
| | | |
| | | return new MidResult[]{midRs} ; |
| | | } |
| | | /** |
| | | * 构造下行数据 |
| | | * @param para 参数 |
| | | * @return 字节数组 |
| | | * @throws Exception 异常 |
| | | */ |
| | | public byte[] doParse(ParseParamsForDownV202404 para) throws Exception { |
| | | byte[] bytes = GlCreate.createStart2Cd(para.rtuAddr, para.commandCode); |
| | | if(para.param != null){ |
| | | DataCd83Vo cdData = (DataCd83Vo)para.param ; |
| | | byte[] bs = new byte[3] ; |
| | | bs[0] = (byte)(Integer.parseInt(cdData.controllerType, 16)); |
| | | bs[1] = cdData.projectNo.byteValue() ; |
| | | bs[2] = 0x01 ; |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | }else{ |
| | | throw new Exception("下行命令参数据为null") ; |
| | | } |
| | | GlCreate.createLen(bytes);//长度放字节数组中 |
| | | |
| | | byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾 |
| | | |
| | | bytes = ByteUtil.bytesMerge(bytes, bsTail) ; |
| | | |
| | | return bytes ; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.parse; |
| | | |
| | | |
| | | import com.dy.common.mw.protocol.*; |
| | | import com.dy.common.mw.protocol.p206V202404.*; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd83Vo; |
| | | import com.dy.common.util.ByteUtil; |
| | | import org.apache.logging.log4j.LogManager; |
| | | import org.apache.logging.log4j.Logger; |
| | | |
| | | @AnnotationCodeUp(ifAny={ |
| | | CodeV202404.cd_83 |
| | | }) |
| | | @SuppressWarnings("unused") |
| | | public class Cd_83_Up implements CodeParse{ |
| | | |
| | | private static final Logger log = LogManager.getLogger(Cd_83_Up.class); |
| | | |
| | | /** |
| | | * 分析上行数据 |
| | | */ |
| | | @Override |
| | | public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback)throws Exception { |
| | | ParseParamsForUpV202404 para = (ParseParamsForUpV202404)params ; |
| | | int bsLen = new CommonV202404().parseDataLen(para.upBuffer) ; |
| | | if(bsLen > 0){ |
| | | this.doParse(para.upBuffer, |
| | | bsLen, |
| | | para.upCode, |
| | | para.data) ; |
| | | } |
| | | log.info("分析上行数据<" + CodeV202404.getCodeName(para.upCode) + " RTU地址=" + para.rtuAddr + ">:\n" + para.data.toString()); |
| | | |
| | | MidResultFromRtu midRs = new MidResultFromRtu() ; |
| | | midRs.protocolName = para.protocolName ;//协议名称 |
| | | midRs.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | midRs.upCode = para.upCode ;//上行数据中的功能码 |
| | | midRs.upHex = para.upHex ;//上行数据十六进制形式 |
| | | midRs.upBuffer = para.upBuffer ;//上行数据字节数组 |
| | | midRs.data = para.data ;//解析后的数据 |
| | | |
| | | midRs.reportOrResponse_trueOrFalse = true ; |
| | | |
| | | String confirmComCode = para.upCode ; |
| | | ParseParamsForDownV202404 downCpParams = new ParseParamsForDownV202404() ; |
| | | downCpParams.setValue( |
| | | null, |
| | | ProtocolConstantV206V202404.protocolName, |
| | | para.rtuAddr, |
| | | Command.defaultId, |
| | | confirmComCode, |
| | | para.data.subData==null?null:(((DataV202404)para.data.subData).subData), |
| | | null); |
| | | //构造应答 |
| | | byte[] data = new Cd_83_Down().doParse(downCpParams) ; |
| | | |
| | | MidResultToRtu confirmCommand = new MidResultToRtu() ; |
| | | confirmCommand.protocolName = para.protocolName ;//协议名称 |
| | | confirmCommand.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | confirmCommand.commandId = Command.defaultId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果 |
| | | confirmCommand.downCode = confirmComCode ;//下行命令功能码; |
| | | confirmCommand.downBuffer = data ;//下行命令数据 |
| | | confirmCommand.downBufHex = ByteUtil.bytes2Hex(data, true) ;//下行命令数据十六进制形式 |
| | | confirmCommand.hasResponse = false ;//是否有应答 |
| | | confirmCommand.maxSendTimes = 1 ;//命令最大发送次数(当收不到应答时,将重发2次),如果不设置,命令缓存器进行补充设置 |
| | | confirmCommand.isCachForOffLine = false ;//RTU不在线,命令是否缓存 |
| | | |
| | | confirmCommand.isSendFirst = true ;//确认命令,优先发送 |
| | | if(isLowPower != null && isLowPower.booleanValue()){ |
| | | //低功耗时,尽快发送 |
| | | confirmCommand.isQuickSend = true ; |
| | | } |
| | | callback.callback(midRs.reportOrResponse_trueOrFalse); |
| | | return new MidResult[]{midRs, confirmCommand} ; |
| | | } |
| | | /** |
| | | * 执行分析 |
| | | * @param bs 字节数组 |
| | | * @param bsLen 字节长度(总包长,包括包头和包尾) |
| | | * @param dataCode 功能码 |
| | | * @param data 数据 |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataCd83Vo cdData = new DataCd83Vo() ; |
| | | dV1.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | | index++ ; |
| | | cdData.projectNo = (int)bs[index]; |
| | | |
| | | index ++ ; |
| | | cdData.waterTotalAmountYear = ByteUtil.BCD2Int_BE(bs, index, index + 4)/100.0D ; |
| | | |
| | | index += 5 ; |
| | | cdData.waterTotalAmountMeter = ByteUtil.BCD2Int_BE(bs, index, index + 4)/100.0D ; |
| | | |
| | | index += 5 ; |
| | | cdData.eleTotalAmountYear = ByteUtil.BCD2Int_BE(bs, index, index + 4)/100.0D ; |
| | | |
| | | index += 5 ; |
| | | cdData.eleTotalAmountMeter = ByteUtil.BCD2Int_BE(bs, index, index + 4)/100.0D ; |
| | | |
| | | index += 5 ; |
| | | cdData.waterTotalAmountDay = ByteUtil.BCD2Int_BE(bs, index, index + 3)/100.0D ; |
| | | |
| | | index += 4 ; |
| | | cdData.waterUserTotalAmountDay = ByteUtil.BCD2Int_BE(bs, index, index + 3)/100.0D ; |
| | | |
| | | index += 4 ; |
| | | cdData.lossTotalAmountDay = ByteUtil.BCD2Int_BE(bs, index, index + 3)/100.0D ; |
| | | |
| | | index += 4 ; |
| | | cdData.batteryVolt = ByteUtil.BCD2Int_BE(bs, index, index + 1)/100.0D ; |
| | | |
| | | } |
| | | |
| | | } |
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.mw.protocol.p206V202404.parse.global.GlCreate; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd83Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd84Vo; |
| | | import com.dy.common.util.ByteUtil; |
| | | |
| | | @AnnotationCodeDown(ifAny={ |
| | | CodeV202404.cd_84 |
| | | }) |
| | | public class Cd_84_Down implements CodeParse { |
| | | |
| | | //private static Logger log = LogManager.getLogger(Cd_02_Down.class); |
| | | |
| | | @Override |
| | | public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback) throws Exception { |
| | | ParseParamsForDownV202404 para = (ParseParamsForDownV202404) params ; |
| | | byte[] bs = this.doParse(para) ; |
| | | |
| | | MidResultToRtu midRs = new MidResultToRtu() ; |
| | | midRs.protocolName = para.protocolName ;//协议名称 |
| | | midRs.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果 |
| | | midRs.downCode = para.commandCode ;//下行命令功能码; |
| | | midRs.downBuffer = bs ;//下行命令数据 |
| | | midRs.downBufHex = ByteUtil.bytes2Hex(bs, true) ;//下行命令数据十六进制形式 |
| | | midRs.hasResponse = false ;//是否有应答 |
| | | midRs.maxSendTimes = 1 ;//命令最大发送次数(当收不到应答时,将重发),如果不设置,命令缓存器进行补充设置 |
| | | midRs.isCachForOffLine = false ;//RTU不在线,命令是否缓存,低功耗时为true |
| | | |
| | | midRs.isSendFirst = true ;//命令应答,首先发送,防止RTU重新上报 |
| | | if(isLowPower != null && isLowPower.booleanValue()){ |
| | | //低功耗时,尽快发送 |
| | | midRs.isQuickSend = true ; |
| | | } |
| | | |
| | | return new MidResult[]{midRs} ; |
| | | } |
| | | /** |
| | | * 构造下行数据 |
| | | * @param para 参数 |
| | | * @return 字节数组 |
| | | * @throws Exception 异常 |
| | | */ |
| | | public byte[] doParse(ParseParamsForDownV202404 para) throws Exception { |
| | | byte[] bytes = GlCreate.createStart2Cd(para.rtuAddr, para.commandCode); |
| | | if(para.param != null){ |
| | | DataCd84Vo cdData = (DataCd84Vo)para.param ; |
| | | byte[] bs = new byte[2] ; |
| | | bs[0] = (byte)(Integer.parseInt(cdData.controllerType, 16)); |
| | | bs[1] = cdData.projectNo.byteValue() ; |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | }else{ |
| | | throw new Exception("下行命令参数据为null") ; |
| | | } |
| | | GlCreate.createLen(bytes);//长度放字节数组中 |
| | | |
| | | byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾 |
| | | |
| | | bytes = ByteUtil.bytesMerge(bytes, bsTail) ; |
| | | |
| | | return bytes ; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.parse; |
| | | |
| | | |
| | | import com.dy.common.mw.protocol.*; |
| | | import com.dy.common.mw.protocol.p206V202404.*; |
| | | import com.dy.common.mw.protocol.p206V202404.parse.global.GlParse; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd83Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd84Vo; |
| | | import com.dy.common.util.ByteUtil; |
| | | import org.apache.logging.log4j.LogManager; |
| | | import org.apache.logging.log4j.Logger; |
| | | |
| | | @AnnotationCodeUp(ifAny={ |
| | | CodeV202404.cd_84 |
| | | }) |
| | | @SuppressWarnings("unused") |
| | | public class Cd_84_Up implements CodeParse{ |
| | | |
| | | private static final Logger log = LogManager.getLogger(Cd_84_Up.class); |
| | | |
| | | /** |
| | | * 分析上行数据 |
| | | */ |
| | | @Override |
| | | public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback)throws Exception { |
| | | ParseParamsForUpV202404 para = (ParseParamsForUpV202404)params ; |
| | | int bsLen = new CommonV202404().parseDataLen(para.upBuffer) ; |
| | | if(bsLen > 0){ |
| | | this.doParse(para.upBuffer, |
| | | bsLen, |
| | | para.upCode, |
| | | para.data) ; |
| | | } |
| | | log.info("分析上行数据<" + CodeV202404.getCodeName(para.upCode) + " RTU地址=" + para.rtuAddr + ">:\n" + para.data.toString()); |
| | | |
| | | MidResultFromRtu midRs = new MidResultFromRtu() ; |
| | | midRs.protocolName = para.protocolName ;//协议名称 |
| | | midRs.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | midRs.upCode = para.upCode ;//上行数据中的功能码 |
| | | midRs.upHex = para.upHex ;//上行数据十六进制形式 |
| | | midRs.upBuffer = para.upBuffer ;//上行数据字节数组 |
| | | midRs.data = para.data ;//解析后的数据 |
| | | |
| | | midRs.reportOrResponse_trueOrFalse = true ; |
| | | |
| | | String confirmComCode = para.upCode ; |
| | | ParseParamsForDownV202404 downCpParams = new ParseParamsForDownV202404() ; |
| | | downCpParams.setValue( |
| | | null, |
| | | ProtocolConstantV206V202404.protocolName, |
| | | para.rtuAddr, |
| | | Command.defaultId, |
| | | confirmComCode, |
| | | para.data.subData==null?null:(((DataV202404)para.data.subData).subData), |
| | | null); |
| | | //构造应答 |
| | | byte[] data = new Cd_84_Down().doParse(downCpParams) ; |
| | | |
| | | MidResultToRtu confirmCommand = new MidResultToRtu() ; |
| | | confirmCommand.protocolName = para.protocolName ;//协议名称 |
| | | confirmCommand.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | confirmCommand.commandId = Command.defaultId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果 |
| | | confirmCommand.downCode = confirmComCode ;//下行命令功能码; |
| | | confirmCommand.downBuffer = data ;//下行命令数据 |
| | | confirmCommand.downBufHex = ByteUtil.bytes2Hex(data, true) ;//下行命令数据十六进制形式 |
| | | confirmCommand.hasResponse = false ;//是否有应答 |
| | | confirmCommand.maxSendTimes = 1 ;//命令最大发送次数(当收不到应答时,将重发2次),如果不设置,命令缓存器进行补充设置 |
| | | confirmCommand.isCachForOffLine = false ;//RTU不在线,命令是否缓存 |
| | | |
| | | confirmCommand.isSendFirst = true ;//确认命令,优先发送 |
| | | if(isLowPower != null && isLowPower.booleanValue()){ |
| | | //低功耗时,尽快发送 |
| | | confirmCommand.isQuickSend = true ; |
| | | } |
| | | callback.callback(midRs.reportOrResponse_trueOrFalse); |
| | | return new MidResult[]{midRs, confirmCommand} ; |
| | | } |
| | | /** |
| | | * 执行分析 |
| | | * @param bs 字节数组 |
| | | * @param bsLen 字节长度(总包长,包括包头和包尾) |
| | | * @param dataCode 功能码 |
| | | * @param data 数据 |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataCd84Vo cdData = new DataCd84Vo() ; |
| | | dV1.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | | index++ ; |
| | | cdData.projectNo = (int)bs[index]; |
| | | |
| | | index ++ ;//水泵/阀 0xf0:阀门 0x00:水泵 |
| | | |
| | | index ++ ;//当前用水方式 1个HEX 0x00:正常刷卡开泵/阀用水 |
| | | |
| | | index++ ; |
| | | cdData.icCardAddr = ByteUtil.bytes2Hex(bs, false, index, 4) ; |
| | | |
| | | index += 8 ; |
| | | cdData.icCardNo = GlParse.parseIcCardNo(bs, index, 6, 2) ; |
| | | |
| | | index += 8 ; |
| | | cdData.orderNo = ByteUtil.BCD2String_BE(bs, index, index + 7) ; |
| | | |
| | | index ++ ; |
| | | String mm = ByteUtil.BCD2String_LE(bs, index, index) ; |
| | | index ++ ; |
| | | String HH = ByteUtil.BCD2String_LE(bs, index, index) ; |
| | | index ++ ; |
| | | String dd = ByteUtil.BCD2String_LE(bs, index, index) ; |
| | | index ++ ; |
| | | String MM = ByteUtil.BCD2String_LE(bs, index, index) ; |
| | | cdData.opDt = MM + "月" + dd + "日" + HH + "时" + mm + "分" ; |
| | | |
| | | index ++ ; |
| | | cdData.waterTotalAmount = ByteUtil.BCD2Int_BE(bs, index, index + 4)/100.0D ; |
| | | |
| | | index += 5 ; |
| | | cdData.eleTotalAmount = ByteUtil.BCD2Int_BE(bs, index, index + 4)/100.0D ; |
| | | |
| | | index += 5 ; |
| | | cdData.moneyRemainUser = ByteUtil.BCD2Int_BE(bs, index, index + 4)/100.0D ; |
| | | |
| | | index += 5 ; |
| | | cdData.waterRemainUser = ByteUtil.BCD2Int_BE(bs, index, index + 4)/100.0D ; |
| | | |
| | | } |
| | | |
| | | } |
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.mw.protocol.p206V202404.parse.global.GlCreate; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd84Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd85Vo; |
| | | import com.dy.common.util.ByteUtil; |
| | | |
| | | @AnnotationCodeDown(ifAny={ |
| | | CodeV202404.cd_85 |
| | | }) |
| | | public class Cd_85_Down implements CodeParse { |
| | | |
| | | //private static Logger log = LogManager.getLogger(Cd_02_Down.class); |
| | | |
| | | @Override |
| | | public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback) throws Exception { |
| | | ParseParamsForDownV202404 para = (ParseParamsForDownV202404) params ; |
| | | byte[] bs = this.doParse(para) ; |
| | | |
| | | MidResultToRtu midRs = new MidResultToRtu() ; |
| | | midRs.protocolName = para.protocolName ;//协议名称 |
| | | midRs.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果 |
| | | midRs.downCode = para.commandCode ;//下行命令功能码; |
| | | midRs.downBuffer = bs ;//下行命令数据 |
| | | midRs.downBufHex = ByteUtil.bytes2Hex(bs, true) ;//下行命令数据十六进制形式 |
| | | midRs.hasResponse = false ;//是否有应答 |
| | | midRs.maxSendTimes = 1 ;//命令最大发送次数(当收不到应答时,将重发),如果不设置,命令缓存器进行补充设置 |
| | | midRs.isCachForOffLine = false ;//RTU不在线,命令是否缓存,低功耗时为true |
| | | |
| | | midRs.isSendFirst = true ;//命令应答,首先发送,防止RTU重新上报 |
| | | if(isLowPower != null && isLowPower.booleanValue()){ |
| | | //低功耗时,尽快发送 |
| | | midRs.isQuickSend = true ; |
| | | } |
| | | |
| | | return new MidResult[]{midRs} ; |
| | | } |
| | | /** |
| | | * 构造下行数据 |
| | | * @param para 参数 |
| | | * @return 字节数组 |
| | | * @throws Exception 异常 |
| | | */ |
| | | public byte[] doParse(ParseParamsForDownV202404 para) throws Exception { |
| | | byte[] bytes = GlCreate.createStart2Cd(para.rtuAddr, para.commandCode); |
| | | if(para.param != null){ |
| | | DataCd85Vo cdData = (DataCd85Vo)para.param ; |
| | | byte[] bs = new byte[2] ; |
| | | bs[0] = (byte)(Integer.parseInt(cdData.controllerType, 16)); |
| | | bs[1] = cdData.projectNo.byteValue() ; |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | }else{ |
| | | throw new Exception("下行命令参数据为null") ; |
| | | } |
| | | GlCreate.createLen(bytes);//长度放字节数组中 |
| | | |
| | | byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾 |
| | | |
| | | bytes = ByteUtil.bytesMerge(bytes, bsTail) ; |
| | | |
| | | return bytes ; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.parse; |
| | | |
| | | |
| | | import com.dy.common.mw.protocol.*; |
| | | import com.dy.common.mw.protocol.p206V202404.*; |
| | | import com.dy.common.mw.protocol.p206V202404.parse.global.GlParse; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd85Vo; |
| | | import com.dy.common.util.ByteUtil; |
| | | import org.apache.logging.log4j.LogManager; |
| | | import org.apache.logging.log4j.Logger; |
| | | |
| | | @AnnotationCodeUp(ifAny={ |
| | | CodeV202404.cd_85 |
| | | }) |
| | | @SuppressWarnings("unused") |
| | | public class Cd_85_Up implements CodeParse{ |
| | | |
| | | private static final Logger log = LogManager.getLogger(Cd_85_Up.class); |
| | | |
| | | /** |
| | | * 分析上行数据 |
| | | */ |
| | | @Override |
| | | public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback)throws Exception { |
| | | ParseParamsForUpV202404 para = (ParseParamsForUpV202404)params ; |
| | | int bsLen = new CommonV202404().parseDataLen(para.upBuffer) ; |
| | | if(bsLen > 0){ |
| | | this.doParse(para.upBuffer, |
| | | bsLen, |
| | | para.upCode, |
| | | para.data) ; |
| | | } |
| | | log.info("分析上行数据<" + CodeV202404.getCodeName(para.upCode) + " RTU地址=" + para.rtuAddr + ">:\n" + para.data.toString()); |
| | | |
| | | MidResultFromRtu midRs = new MidResultFromRtu() ; |
| | | midRs.protocolName = para.protocolName ;//协议名称 |
| | | midRs.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | midRs.upCode = para.upCode ;//上行数据中的功能码 |
| | | midRs.upHex = para.upHex ;//上行数据十六进制形式 |
| | | midRs.upBuffer = para.upBuffer ;//上行数据字节数组 |
| | | midRs.data = para.data ;//解析后的数据 |
| | | |
| | | midRs.reportOrResponse_trueOrFalse = true ; |
| | | |
| | | String confirmComCode = para.upCode ; |
| | | ParseParamsForDownV202404 downCpParams = new ParseParamsForDownV202404() ; |
| | | downCpParams.setValue( |
| | | null, |
| | | ProtocolConstantV206V202404.protocolName, |
| | | para.rtuAddr, |
| | | Command.defaultId, |
| | | confirmComCode, |
| | | para.data.subData==null?null:(((DataV202404)para.data.subData).subData), |
| | | null); |
| | | //构造应答 |
| | | byte[] data = new Cd_85_Down().doParse(downCpParams) ; |
| | | |
| | | MidResultToRtu confirmCommand = new MidResultToRtu() ; |
| | | confirmCommand.protocolName = para.protocolName ;//协议名称 |
| | | confirmCommand.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | confirmCommand.commandId = Command.defaultId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果 |
| | | confirmCommand.downCode = confirmComCode ;//下行命令功能码; |
| | | confirmCommand.downBuffer = data ;//下行命令数据 |
| | | confirmCommand.downBufHex = ByteUtil.bytes2Hex(data, true) ;//下行命令数据十六进制形式 |
| | | confirmCommand.hasResponse = false ;//是否有应答 |
| | | confirmCommand.maxSendTimes = 1 ;//命令最大发送次数(当收不到应答时,将重发2次),如果不设置,命令缓存器进行补充设置 |
| | | confirmCommand.isCachForOffLine = false ;//RTU不在线,命令是否缓存 |
| | | |
| | | confirmCommand.isSendFirst = true ;//确认命令,优先发送 |
| | | if(isLowPower != null && isLowPower.booleanValue()){ |
| | | //低功耗时,尽快发送 |
| | | confirmCommand.isQuickSend = true ; |
| | | } |
| | | callback.callback(midRs.reportOrResponse_trueOrFalse); |
| | | return new MidResult[]{midRs, confirmCommand} ; |
| | | } |
| | | /** |
| | | * 执行分析 |
| | | * @param bs 字节数组 |
| | | * @param bsLen 字节长度(总包长,包括包头和包尾) |
| | | * @param dataCode 功能码 |
| | | * @param data 数据 |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataCd85Vo cdData = new DataCd85Vo() ; |
| | | dV1.subData = cdData ; |
| | | |
| | | GlParse.parseCd93A3And85(bs, cdData) ; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.parse; |
| | | |
| | | import com.alibaba.fastjson2.JSON; |
| | | 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.mw.protocol.p206V202404.downVos.ComCd21Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.downVos.ComCd86Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.parse.global.GlCreate; |
| | | import com.dy.common.util.ByteUtil; |
| | | |
| | | @AnnotationCodeDown(ifAny={ |
| | | CodeV202404.cd_86 |
| | | }) |
| | | public class Cd_86_Down implements CodeParse { |
| | | |
| | | @Override |
| | | public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback) throws Exception { |
| | | ParseParamsForDownV202404 para = (ParseParamsForDownV202404) params ; |
| | | byte[] bs = this.doParse(para) ; |
| | | |
| | | MidResultToRtu midRs = new MidResultToRtu() ; |
| | | midRs.protocolName = para.protocolName ;//协议名称 |
| | | midRs.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果 |
| | | midRs.downCode = para.commandCode ;//下行命令功能码; |
| | | midRs.downBuffer = bs ;//下行命令数据 |
| | | midRs.downBufHex = ByteUtil.bytes2Hex(bs, true) ;//下行命令数据十六进制形式 |
| | | midRs.hasResponse = true ;//是否有应答 |
| | | midRs.maxSendTimes = null ;//命令最大发送次数(当收不到应答时,将重发),如果不设置,命令缓存器进行补充设置 |
| | | midRs.isCachForOffLine = false ;//RTU不在线,命令是否缓存,低功耗时为true |
| | | |
| | | midRs.isSendFirst = false ;//命令应答,首先发送,防止RTU重新上报 |
| | | if(isLowPower != null && isLowPower.booleanValue()){ |
| | | //低功耗时,尽快发送 |
| | | midRs.isQuickSend = true ; |
| | | } |
| | | |
| | | return new MidResult[]{midRs} ; |
| | | } |
| | | /** |
| | | * 构造下行数据 |
| | | * @param para 参数 |
| | | * @return 字节数组 |
| | | * @throws Exception 异常 |
| | | */ |
| | | public byte[] doParse(ParseParamsForDownV202404 para) throws Exception { |
| | | byte[] bytes = GlCreate.createStart2Cd(para.rtuAddr, para.commandCode); |
| | | if(para.param != null){ |
| | | String json = (String)para.param; |
| | | ComCd86Vo cvo = JSON.parseObject(json, ComCd86Vo.class) ; |
| | | if(cvo == null){ |
| | | throw new Exception("json转ComCd21Vo为null") ; |
| | | } |
| | | if(cvo.channel == null){ |
| | | throw new Exception("IP通道号不能为空") ; |
| | | } |
| | | if(cvo.channel != 1 && cvo.channel != 2){ |
| | | throw new Exception("IP通道号只能是1或2") ; |
| | | } |
| | | |
| | | byte[] bs = new byte[3] ; |
| | | int index = 0 ; |
| | | bs[index] = (byte)(Integer.parseInt(cvo.controllerType, 16)); |
| | | |
| | | index ++ ; |
| | | bs[index] = cvo.projectNo.byteValue() ; |
| | | |
| | | index ++ ; |
| | | bs[index] = cvo.channel.byteValue() ; |
| | | |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | }else{ |
| | | throw new Exception("下行命令参数据为null") ; |
| | | } |
| | | GlCreate.createLen(bytes);//长度放字节数组中 |
| | | |
| | | byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾 |
| | | |
| | | bytes = ByteUtil.bytesMerge(bytes, bsTail) ; |
| | | |
| | | return bytes ; |
| | | } |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.parse; |
| | | |
| | | import com.dy.common.mw.protocol.*; |
| | | import com.dy.common.mw.protocol.p206V202404.*; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd21Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd86Vo; |
| | | import com.dy.common.util.ByteUtil; |
| | | import com.dy.common.util.ByteUtilUnsigned; |
| | | import org.apache.logging.log4j.LogManager; |
| | | import org.apache.logging.log4j.Logger; |
| | | |
| | | @AnnotationCodeUp(ifAny={ |
| | | CodeV202404.cd_86 |
| | | }) |
| | | @SuppressWarnings("unused") |
| | | public class Cd_86_Up implements CodeParse{ |
| | | |
| | | private static final Logger log = LogManager.getLogger(Cd_86_Up.class); |
| | | |
| | | /** |
| | | * 分析上行数据 |
| | | */ |
| | | @Override |
| | | public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback)throws Exception { |
| | | ParseParamsForUpV202404 para = (ParseParamsForUpV202404)params ; |
| | | int bsLen = new CommonV202404().parseDataLen(para.upBuffer) ; |
| | | if(bsLen > 0){ |
| | | this.doParse(para.upBuffer, |
| | | bsLen, |
| | | para.upCode, |
| | | para.data) ; |
| | | } |
| | | log.info("分析上行数据<" + CodeV202404.getCodeName(para.upCode) + " RTU地址=" + para.rtuAddr + ">:\n" + para.data.toString()); |
| | | |
| | | MidResultFromRtu midRs = new MidResultFromRtu() ; |
| | | midRs.protocolName = para.protocolName ;//协议名称 |
| | | midRs.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | midRs.upCode = para.upCode ;//上行数据中的功能码 |
| | | midRs.upHex = para.upHex ;//上行数据十六进制形式 |
| | | midRs.upBuffer = para.upBuffer ;//上行数据字节数组 |
| | | midRs.data = para.data ;//解析后的数据 |
| | | |
| | | midRs.reportOrResponse_trueOrFalse = false ; |
| | | |
| | | callback.callback(midRs.reportOrResponse_trueOrFalse); |
| | | return new MidResult[]{midRs} ; |
| | | } |
| | | /** |
| | | * 执行分析 |
| | | * @param bs 字节数组 |
| | | * @param bsLen 字节长度(总包长,包括包头和包尾) |
| | | * @param dataCode 功能码 |
| | | * @param data 数据 |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataCd86Vo cdData = new DataCd86Vo() ; |
| | | dV1.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | | index++ ; |
| | | cdData.projectNo = (int)bs[index]; |
| | | |
| | | index++ ; |
| | | cdData.channel = (int)bs[index]; |
| | | |
| | | index++ ; |
| | | short totalLen = ByteUtilUnsigned.byte2Byte(bs, index) ; |
| | | int ipLen = (totalLen & 0xF0) >> 4 ; |
| | | int portLen = totalLen & 0x0F ; |
| | | |
| | | index++ ; |
| | | cdData.ip = ByteUtil.bytes2String_BE(bs, index, index + ipLen - 1) ; |
| | | |
| | | index += ipLen ; |
| | | cdData.port = Integer.parseInt(ByteUtil.bytes2String_BE(bs, index, index + portLen - 1)) ; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.parse; |
| | | |
| | | import com.alibaba.fastjson2.JSON; |
| | | 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.mw.protocol.p206V202404.downVos.ComCd87Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.parse.global.GlCreate; |
| | | import com.dy.common.util.ByteUtil; |
| | | |
| | | @AnnotationCodeDown(ifAny={ |
| | | CodeV202404.cd_87 |
| | | }) |
| | | public class Cd_87_Down implements CodeParse { |
| | | |
| | | @Override |
| | | public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback) throws Exception { |
| | | ParseParamsForDownV202404 para = (ParseParamsForDownV202404) params ; |
| | | byte[] bs = this.doParse(para) ; |
| | | |
| | | MidResultToRtu midRs = new MidResultToRtu() ; |
| | | midRs.protocolName = para.protocolName ;//协议名称 |
| | | midRs.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果 |
| | | midRs.downCode = para.commandCode ;//下行命令功能码; |
| | | midRs.downBuffer = bs ;//下行命令数据 |
| | | midRs.downBufHex = ByteUtil.bytes2Hex(bs, true) ;//下行命令数据十六进制形式 |
| | | midRs.hasResponse = true ;//是否有应答 |
| | | midRs.maxSendTimes = null ;//命令最大发送次数(当收不到应答时,将重发),如果不设置,命令缓存器进行补充设置 |
| | | midRs.isCachForOffLine = false ;//RTU不在线,命令是否缓存,低功耗时为true |
| | | |
| | | midRs.isSendFirst = false ;//命令应答,首先发送,防止RTU重新上报 |
| | | if(isLowPower != null && isLowPower.booleanValue()){ |
| | | //低功耗时,尽快发送 |
| | | midRs.isQuickSend = true ; |
| | | } |
| | | |
| | | return new MidResult[]{midRs} ; |
| | | } |
| | | /** |
| | | * 构造下行数据 |
| | | * @param para 参数 |
| | | * @return 字节数组 |
| | | * @throws Exception 异常 |
| | | */ |
| | | public byte[] doParse(ParseParamsForDownV202404 para) throws Exception { |
| | | byte[] bytes = GlCreate.createStart2Cd(para.rtuAddr, para.commandCode); |
| | | if(para.param != null){ |
| | | String json = (String)para.param; |
| | | ComCd87Vo cvo = JSON.parseObject(json, ComCd87Vo.class) ; |
| | | if(cvo == null){ |
| | | throw new Exception("json转ComCd21Vo为null") ; |
| | | } |
| | | if(cvo.channel == null){ |
| | | throw new Exception("IP通道号不能为空") ; |
| | | } |
| | | if(cvo.channel != 1 && cvo.channel != 2){ |
| | | throw new Exception("IP通道号只能是1或2") ; |
| | | } |
| | | |
| | | byte[] bs = new byte[3] ; |
| | | int index = 0 ; |
| | | bs[index] = (byte)(Integer.parseInt(cvo.controllerType, 16)); |
| | | |
| | | index ++ ; |
| | | bs[index] = cvo.projectNo.byteValue() ; |
| | | |
| | | index ++ ; |
| | | bs[index] = cvo.channel.byteValue() ; |
| | | |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | }else{ |
| | | throw new Exception("下行命令参数据为null") ; |
| | | } |
| | | GlCreate.createLen(bytes);//长度放字节数组中 |
| | | |
| | | byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾 |
| | | |
| | | bytes = ByteUtil.bytesMerge(bytes, bsTail) ; |
| | | |
| | | return bytes ; |
| | | } |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.parse; |
| | | |
| | | import com.dy.common.mw.protocol.*; |
| | | import com.dy.common.mw.protocol.p206V202404.*; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd86Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd87Vo; |
| | | import com.dy.common.util.ByteUtil; |
| | | import com.dy.common.util.ByteUtilUnsigned; |
| | | import org.apache.logging.log4j.LogManager; |
| | | import org.apache.logging.log4j.Logger; |
| | | |
| | | @AnnotationCodeUp(ifAny={ |
| | | CodeV202404.cd_87 |
| | | }) |
| | | @SuppressWarnings("unused") |
| | | public class Cd_87_Up implements CodeParse{ |
| | | |
| | | private static final Logger log = LogManager.getLogger(Cd_87_Up.class); |
| | | |
| | | /** |
| | | * 分析上行数据 |
| | | */ |
| | | @Override |
| | | public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback)throws Exception { |
| | | ParseParamsForUpV202404 para = (ParseParamsForUpV202404)params ; |
| | | int bsLen = new CommonV202404().parseDataLen(para.upBuffer) ; |
| | | if(bsLen > 0){ |
| | | this.doParse(para.upBuffer, |
| | | bsLen, |
| | | para.upCode, |
| | | para.data) ; |
| | | } |
| | | log.info("分析上行数据<" + CodeV202404.getCodeName(para.upCode) + " RTU地址=" + para.rtuAddr + ">:\n" + para.data.toString()); |
| | | |
| | | MidResultFromRtu midRs = new MidResultFromRtu() ; |
| | | midRs.protocolName = para.protocolName ;//协议名称 |
| | | midRs.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | midRs.upCode = para.upCode ;//上行数据中的功能码 |
| | | midRs.upHex = para.upHex ;//上行数据十六进制形式 |
| | | midRs.upBuffer = para.upBuffer ;//上行数据字节数组 |
| | | midRs.data = para.data ;//解析后的数据 |
| | | |
| | | midRs.reportOrResponse_trueOrFalse = false ; |
| | | |
| | | callback.callback(midRs.reportOrResponse_trueOrFalse); |
| | | return new MidResult[]{midRs} ; |
| | | } |
| | | /** |
| | | * 执行分析 |
| | | * @param bs 字节数组 |
| | | * @param bsLen 字节长度(总包长,包括包头和包尾) |
| | | * @param dataCode 功能码 |
| | | * @param data 数据 |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataCd87Vo cdData = new DataCd87Vo() ; |
| | | dV1.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | | index++ ; |
| | | cdData.projectNo = (int)bs[index]; |
| | | |
| | | index++ ; |
| | | cdData.channel = (int)bs[index]; |
| | | |
| | | index++ ; |
| | | short domainLen = ByteUtilUnsigned.byte2Byte(bs, index) ; |
| | | |
| | | index++ ; |
| | | short portLen = ByteUtilUnsigned.byte2Byte(bs, index) ; |
| | | |
| | | index++ ; |
| | | cdData.domain = ByteUtil.bytes2String_BE(bs, index, index + domainLen - 1) ; |
| | | |
| | | index += domainLen ; |
| | | cdData.port = Integer.parseInt(ByteUtil.bytes2String_BE(bs, index, index + portLen - 1)) ; |
| | | } |
| | | |
| | | } |
| | |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | | index++ ; |
| | | cdData.projectNo = 0 + bs[index]; |
| | | cdData.projectNo = (int)bs[index]; |
| | | |
| | | index++ ; |
| | | int lng = ByteUtil.BCD2Int_BE(bs, index, index + 4) ; |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.parse; |
| | | |
| | | import com.alibaba.fastjson2.JSON; |
| | | 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.mw.protocol.p206V202404.downVos.ComCd22Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.downVos.ComCd92_A2Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.parse.global.GlCreate; |
| | | import com.dy.common.util.ByteUtil; |
| | | import com.dy.common.util.NumUtil; |
| | | |
| | | @AnnotationCodeDown(ifAny={ |
| | | CodeV202404.cd_92, |
| | | CodeV202404.cd_A2 |
| | | }) |
| | | public class Cd_92_A2_Down implements CodeParse { |
| | | |
| | | @Override |
| | | public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback) throws Exception { |
| | | ParseParamsForDownV202404 para = (ParseParamsForDownV202404) params ; |
| | | byte[] bs = this.doParse(para) ; |
| | | |
| | | MidResultToRtu midRs = new MidResultToRtu() ; |
| | | midRs.protocolName = para.protocolName ;//协议名称 |
| | | midRs.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果 |
| | | midRs.downCode = para.commandCode ;//下行命令功能码; |
| | | midRs.downBuffer = bs ;//下行命令数据 |
| | | midRs.downBufHex = ByteUtil.bytes2Hex(bs, true) ;//下行命令数据十六进制形式 |
| | | midRs.hasResponse = true ;//是否有应答 |
| | | midRs.maxSendTimes = null ;//命令最大发送次数(当收不到应答时,将重发),如果不设置,命令缓存器进行补充设置 |
| | | midRs.isCachForOffLine = false ;//RTU不在线,命令是否缓存,低功耗时为true |
| | | |
| | | midRs.isSendFirst = false ;//命令应答,首先发送,防止RTU重新上报 |
| | | if(isLowPower != null && isLowPower.booleanValue()){ |
| | | //低功耗时,尽快发送 |
| | | midRs.isQuickSend = true ; |
| | | } |
| | | |
| | | return new MidResult[]{midRs} ; |
| | | } |
| | | /** |
| | | * 构造下行数据 |
| | | * @param para 参数 |
| | | * @return 字节数组 |
| | | * @throws Exception 异常 |
| | | */ |
| | | public byte[] doParse(ParseParamsForDownV202404 para) throws Exception { |
| | | byte[] bytes = GlCreate.createStart2Cd(para.rtuAddr, para.commandCode); |
| | | if(para.param != null){ |
| | | String json = (String)para.param; |
| | | ComCd92_A2Vo cvo = JSON.parseObject(json, ComCd92_A2Vo.class) ; |
| | | if(cvo == null){ |
| | | throw new Exception("json转ComCd92_A2Vo为null") ; |
| | | } |
| | | if(cvo.waterRemain != null){ |
| | | if(cvo.waterRemain < 0 || cvo.waterRemain > 99999999.99){ |
| | | throw new Exception("用户剩余水量必须是0~99999999.99范围内的数据") ; |
| | | } |
| | | } |
| | | if(cvo.moneyRemain != null){ |
| | | if(cvo.moneyRemain < 0 || cvo.moneyRemain > 999999.99){ |
| | | throw new Exception("用户剩余金额必须是0~999999.99范围内的数据") ; |
| | | } |
| | | } |
| | | if(cvo.waterPrice != null){ |
| | | if(cvo.waterPrice < 0 || cvo.waterPrice > 99.99){ |
| | | throw new Exception("水量单价必须是0~99.99范围内的数据") ; |
| | | } |
| | | } |
| | | if(cvo.elePrice != null){ |
| | | if(cvo.elePrice < 0 || cvo.elePrice > 99.99){ |
| | | throw new Exception("电量单价必须是0~99.99范围内的数据") ; |
| | | } |
| | | } |
| | | if(!NumUtil.isPlusIntNumber(cvo.orderNo)){ |
| | | throw new Exception("订单号必须是16位数字") ; |
| | | } |
| | | if(cvo.orderNo.length() != 12){ |
| | | throw new Exception("订单号必须是16位数字") ; |
| | | } |
| | | |
| | | |
| | | byte[] bs = new byte[39] ; |
| | | int index = 0 ; |
| | | bs[index] = (byte)(Integer.parseInt(cvo.controllerType, 16)); |
| | | |
| | | index ++ ; |
| | | bs[index] = cvo.projectNo.byteValue() ; |
| | | |
| | | index ++ ; |
| | | if(cvo.controllerType.equals("01")){ |
| | | bs[index] = (byte)0xF0 ; |
| | | }else{ |
| | | bs[index] = (byte)0x00 ; |
| | | } |
| | | |
| | | index ++ ; |
| | | GlCreate.createIcCardNo(cvo.icCardNo, bs, index); |
| | | |
| | | index += 8 ; |
| | | if(cvo.waterRemain != null){ |
| | | cvo.waterRemain = 0.0 ; |
| | | } |
| | | String strTemp = "" + Double.valueOf(cvo.waterRemain * 100).intValue() ; |
| | | byte[] bTemp = ByteUtil.string2BCD_LE(strTemp) ; |
| | | int bTempLen = bTemp.length ; |
| | | int count = 0 ; |
| | | for(int i = 0 ; i < bTempLen; i++){ |
| | | bs[index++] = bTemp[i] ; |
| | | count ++ ; |
| | | if(count >= 4){ |
| | | break ; |
| | | } |
| | | } |
| | | for(; count < 4; count++){ |
| | | bs[index++] = 0 ; |
| | | } |
| | | |
| | | if(cvo.moneyRemain != null){ |
| | | cvo.moneyRemain = 0.0 ; |
| | | } |
| | | strTemp = "" + (Double.valueOf(cvo.moneyRemain * 100)).intValue() ; |
| | | bTemp = ByteUtil.string2BCD_LE(strTemp) ; |
| | | bTempLen = bTemp.length ; |
| | | count = 0 ; |
| | | for(int i = 0 ; i < bTempLen; i++){ |
| | | bs[index++] = bTemp[i] ; |
| | | count ++ ; |
| | | if(count >= 4){ |
| | | break ; |
| | | } |
| | | } |
| | | for(; count < 4; count++){ |
| | | bs[index++] = 0 ; |
| | | } |
| | | |
| | | |
| | | if(cvo.waterPrice != null){ |
| | | cvo.waterPrice = 0.0 ; |
| | | } |
| | | strTemp = "" + (Double.valueOf(cvo.waterPrice * 100)).intValue() ; |
| | | bTemp = ByteUtil.string2BCD_LE(strTemp) ; |
| | | bTempLen = bTemp.length ; |
| | | count = 0 ; |
| | | for(int i = 0 ; i < bTempLen; i++){ |
| | | bs[index++] = bTemp[i] ; |
| | | count ++ ; |
| | | if(count >= 2){ |
| | | break ; |
| | | } |
| | | } |
| | | for(; count < 2; count++){ |
| | | bs[index++] = 0 ; |
| | | } |
| | | |
| | | |
| | | if(cvo.elePrice != null){ |
| | | cvo.elePrice = 0.0 ; |
| | | } |
| | | strTemp = "" + (Double.valueOf(cvo.elePrice * 100)).intValue() ; |
| | | bTemp = ByteUtil.string2BCD_LE(strTemp) ; |
| | | bTempLen = bTemp.length ; |
| | | count = 0 ; |
| | | for(int i = 0 ; i < bTempLen; i++){ |
| | | bs[index++] = bTemp[i] ; |
| | | count ++ ; |
| | | if(count >= 2){ |
| | | break ; |
| | | } |
| | | } |
| | | for(; count < 2; count++){ |
| | | bs[index++] = 0 ; |
| | | } |
| | | |
| | | |
| | | ByteUtil.string2BCD_BE(bs, cvo.orderNo, index) ; |
| | | |
| | | index += 8 ; |
| | | GlCreate.createPw(bs, index); |
| | | |
| | | index += 2 ; |
| | | GlCreate.createS2D(bs, index) ; |
| | | |
| | | index += 4 ; |
| | | bs[index] = 0 ; //时延 |
| | | |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | }else{ |
| | | throw new Exception("下行命令参数据为null") ; |
| | | } |
| | | GlCreate.createLen(bytes);//长度放字节数组中 |
| | | |
| | | byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾 |
| | | |
| | | bytes = ByteUtil.bytesMerge(bytes, bsTail) ; |
| | | |
| | | return bytes ; |
| | | } |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.parse; |
| | | |
| | | |
| | | import com.dy.common.mw.protocol.*; |
| | | import com.dy.common.mw.protocol.p206V202404.*; |
| | | import com.dy.common.mw.protocol.p206V202404.downVos.ComCd92_A2Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.parse.global.GlParse; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd92_A2Vo; |
| | | import com.dy.common.util.ByteUtil; |
| | | import org.apache.logging.log4j.LogManager; |
| | | import org.apache.logging.log4j.Logger; |
| | | |
| | | @AnnotationCodeUp(ifAny={ |
| | | CodeV202404.cd_92, |
| | | CodeV202404.cd_A2 |
| | | }) |
| | | @SuppressWarnings("unused") |
| | | public class Cd_92_A2_Up implements CodeParse{ |
| | | |
| | | private static final Logger log = LogManager.getLogger(Cd_92_A2_Up.class); |
| | | |
| | | /** |
| | | * 分析上行数据 |
| | | */ |
| | | @Override |
| | | public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback)throws Exception { |
| | | ParseParamsForUpV202404 para = (ParseParamsForUpV202404)params ; |
| | | int bsLen = new CommonV202404().parseDataLen(para.upBuffer) ; |
| | | if(bsLen > 0){ |
| | | this.doParse(para.upBuffer, |
| | | bsLen, |
| | | para.upCode, |
| | | para.data) ; |
| | | } |
| | | log.info("分析上行数据<" + CodeV202404.getCodeName(para.upCode) + " RTU地址=" + para.rtuAddr + ">:\n" + para.data.toString()); |
| | | |
| | | MidResultFromRtu midRs = new MidResultFromRtu() ; |
| | | midRs.protocolName = para.protocolName ;//协议名称 |
| | | midRs.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | midRs.upCode = para.upCode ;//上行数据中的功能码 |
| | | midRs.upHex = para.upHex ;//上行数据十六进制形式 |
| | | midRs.upBuffer = para.upBuffer ;//上行数据字节数组 |
| | | midRs.data = para.data ;//解析后的数据 |
| | | |
| | | midRs.reportOrResponse_trueOrFalse = false ; |
| | | |
| | | callback.callback(midRs.reportOrResponse_trueOrFalse); |
| | | return new MidResult[]{midRs} ; |
| | | } |
| | | /** |
| | | * 执行分析 |
| | | * @param bs 字节数组 |
| | | * @param bsLen 字节长度(总包长,包括包头和包尾) |
| | | * @param dataCode 功能码 |
| | | * @param data 数据 |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataCd92_A2Vo cdData = new DataCd92_A2Vo() ; |
| | | dV1.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | | index++ ; |
| | | cdData.projectNo = (int)bs[index]; |
| | | |
| | | index++ ; |
| | | cdData.icCardNo = GlParse.parseIcCardNo(bs, index, 6, 2) ; |
| | | |
| | | index += 8 ; |
| | | cdData.orderNo = ByteUtil.BCD2String_BE(bs, index, index + 7) ; |
| | | |
| | | index += 8 ; |
| | | cdData.opType = bs[index]; |
| | | |
| | | index ++ ; |
| | | cdData.opResult = bs[index]; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.parse; |
| | | |
| | | import com.alibaba.fastjson2.JSON; |
| | | 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.mw.protocol.p206V202404.downVos.ComCd92_A2Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.downVos.ComCd93_A3Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.parse.global.GlCreate; |
| | | import com.dy.common.util.ByteUtil; |
| | | import com.dy.common.util.NumUtil; |
| | | |
| | | @AnnotationCodeDown(ifAny={ |
| | | CodeV202404.cd_93, |
| | | CodeV202404.cd_A3 |
| | | }) |
| | | public class Cd_93_A3_Down implements CodeParse { |
| | | |
| | | @Override |
| | | public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback) throws Exception { |
| | | ParseParamsForDownV202404 para = (ParseParamsForDownV202404) params ; |
| | | byte[] bs = this.doParse(para) ; |
| | | |
| | | MidResultToRtu midRs = new MidResultToRtu() ; |
| | | midRs.protocolName = para.protocolName ;//协议名称 |
| | | midRs.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果 |
| | | midRs.downCode = para.commandCode ;//下行命令功能码; |
| | | midRs.downBuffer = bs ;//下行命令数据 |
| | | midRs.downBufHex = ByteUtil.bytes2Hex(bs, true) ;//下行命令数据十六进制形式 |
| | | midRs.hasResponse = true ;//是否有应答 |
| | | midRs.maxSendTimes = null ;//命令最大发送次数(当收不到应答时,将重发),如果不设置,命令缓存器进行补充设置 |
| | | midRs.isCachForOffLine = false ;//RTU不在线,命令是否缓存,低功耗时为true |
| | | |
| | | midRs.isSendFirst = false ;//命令应答,首先发送,防止RTU重新上报 |
| | | if(isLowPower != null && isLowPower.booleanValue()){ |
| | | //低功耗时,尽快发送 |
| | | midRs.isQuickSend = true ; |
| | | } |
| | | |
| | | return new MidResult[]{midRs} ; |
| | | } |
| | | /** |
| | | * 构造下行数据 |
| | | * @param para 参数 |
| | | * @return 字节数组 |
| | | * @throws Exception 异常 |
| | | */ |
| | | public byte[] doParse(ParseParamsForDownV202404 para) throws Exception { |
| | | byte[] bytes = GlCreate.createStart2Cd(para.rtuAddr, para.commandCode); |
| | | if(para.param != null){ |
| | | String json = (String)para.param; |
| | | ComCd93_A3Vo cvo = JSON.parseObject(json, ComCd93_A3Vo.class) ; |
| | | if(cvo == null){ |
| | | throw new Exception("json转ComCd93_A3Vo为null") ; |
| | | } |
| | | if(!NumUtil.isPlusIntNumber(cvo.orderNo)){ |
| | | throw new Exception("订单号必须是16位数字") ; |
| | | } |
| | | if(cvo.orderNo.length() != 12){ |
| | | throw new Exception("订单号必须是16位数字") ; |
| | | } |
| | | |
| | | byte[] bs = new byte[26] ; |
| | | int index = 0 ; |
| | | bs[index] = (byte)(Integer.parseInt(cvo.controllerType, 16)); |
| | | |
| | | index ++ ; |
| | | bs[index] = cvo.projectNo.byteValue() ; |
| | | |
| | | index ++ ; |
| | | if(cvo.controllerType.equals("01")){ |
| | | bs[index] = (byte)0xF0 ; |
| | | }else{ |
| | | bs[index] = (byte)0x00 ; |
| | | } |
| | | |
| | | index ++ ; |
| | | GlCreate.createIcCardNo(cvo.icCardNo, bs, index); |
| | | |
| | | index += 8 ; |
| | | ByteUtil.string2BCD_BE(bs, cvo.orderNo, index) ; |
| | | |
| | | index += 8 ; |
| | | GlCreate.createPw(bs, index); |
| | | |
| | | index += 2 ; |
| | | GlCreate.createS2D(bs, index) ; |
| | | |
| | | index += 4 ; |
| | | bs[index] = 0 ; //时延 |
| | | |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | }else{ |
| | | throw new Exception("下行命令参数据为null") ; |
| | | } |
| | | GlCreate.createLen(bytes);//长度放字节数组中 |
| | | |
| | | byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾 |
| | | |
| | | bytes = ByteUtil.bytesMerge(bytes, bsTail) ; |
| | | |
| | | return bytes ; |
| | | } |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.parse; |
| | | |
| | | |
| | | import com.dy.common.mw.protocol.*; |
| | | import com.dy.common.mw.protocol.p206V202404.*; |
| | | import com.dy.common.mw.protocol.p206V202404.parse.global.GlParse; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd93_A3Vo; |
| | | import org.apache.logging.log4j.LogManager; |
| | | import org.apache.logging.log4j.Logger; |
| | | |
| | | @AnnotationCodeUp(ifAny={ |
| | | CodeV202404.cd_93, |
| | | CodeV202404.cd_A3 |
| | | }) |
| | | @SuppressWarnings("unused") |
| | | public class Cd_93_A3_Up implements CodeParse{ |
| | | |
| | | private static final Logger log = LogManager.getLogger(Cd_93_A3_Up.class); |
| | | |
| | | /** |
| | | * 分析上行数据 |
| | | */ |
| | | @Override |
| | | public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback)throws Exception { |
| | | ParseParamsForUpV202404 para = (ParseParamsForUpV202404)params ; |
| | | int bsLen = new CommonV202404().parseDataLen(para.upBuffer) ; |
| | | if(bsLen > 0){ |
| | | this.doParse(para.upBuffer, |
| | | bsLen, |
| | | para.upCode, |
| | | para.data) ; |
| | | } |
| | | log.info("分析上行数据<" + CodeV202404.getCodeName(para.upCode) + " RTU地址=" + para.rtuAddr + ">:\n" + para.data.toString()); |
| | | |
| | | MidResultFromRtu midRs = new MidResultFromRtu() ; |
| | | midRs.protocolName = para.protocolName ;//协议名称 |
| | | midRs.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | midRs.upCode = para.upCode ;//上行数据中的功能码 |
| | | midRs.upHex = para.upHex ;//上行数据十六进制形式 |
| | | midRs.upBuffer = para.upBuffer ;//上行数据字节数组 |
| | | midRs.data = para.data ;//解析后的数据 |
| | | |
| | | midRs.reportOrResponse_trueOrFalse = false ; |
| | | |
| | | callback.callback(midRs.reportOrResponse_trueOrFalse); |
| | | return new MidResult[]{midRs} ; |
| | | } |
| | | /** |
| | | * 执行分析 |
| | | * @param bs 字节数组 |
| | | * @param bsLen 字节长度(总包长,包括包头和包尾) |
| | | * @param dataCode 功能码 |
| | | * @param data 数据 |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataCd93_A3Vo cdData = new DataCd93_A3Vo() ; |
| | | dV1.subData = cdData ; |
| | | |
| | | GlParse.parseCd93A3And85(bs, cdData) ; |
| | | } |
| | | |
| | | } |
| | |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | | index++ ; |
| | | cdData.projectNo = 0 + bs[index]; |
| | | cdData.projectNo = (int)bs[index]; |
| | | |
| | | index++ ; |
| | | byte result = bs[index]; |
| | |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | | index++ ; |
| | | cdData.projectNo = 0 + bs[index]; |
| | | cdData.projectNo = (int)bs[index]; |
| | | |
| | | index++ ; |
| | | byte result = bs[index]; |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.parse; |
| | | |
| | | import com.alibaba.fastjson2.JSON; |
| | | 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.mw.protocol.p206V202404.downVos.ComCd99Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.parse.global.GlCreate; |
| | | import com.dy.common.util.ByteUtil; |
| | | |
| | | @AnnotationCodeDown(ifAny={ |
| | | CodeV202404.cd_99 |
| | | }) |
| | | public class Cd_99_Down implements CodeParse { |
| | | |
| | | @Override |
| | | public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback) throws Exception { |
| | | ParseParamsForDownV202404 para = (ParseParamsForDownV202404) params ; |
| | | byte[] bs = this.doParse(para) ; |
| | | |
| | | MidResultToRtu midRs = new MidResultToRtu() ; |
| | | midRs.protocolName = para.protocolName ;//协议名称 |
| | | midRs.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果 |
| | | midRs.downCode = para.commandCode ;//下行命令功能码; |
| | | midRs.downBuffer = bs ;//下行命令数据 |
| | | midRs.downBufHex = ByteUtil.bytes2Hex(bs, true) ;//下行命令数据十六进制形式 |
| | | midRs.hasResponse = true ;//是否有应答 |
| | | midRs.maxSendTimes = null ;//命令最大发送次数(当收不到应答时,将重发),如果不设置,命令缓存器进行补充设置 |
| | | midRs.isCachForOffLine = false ;//RTU不在线,命令是否缓存,低功耗时为true |
| | | |
| | | midRs.isSendFirst = false ;//命令应答,首先发送,防止RTU重新上报 |
| | | if(isLowPower != null && isLowPower.booleanValue()){ |
| | | //低功耗时,尽快发送 |
| | | midRs.isQuickSend = true ; |
| | | } |
| | | |
| | | return new MidResult[]{midRs} ; |
| | | } |
| | | /** |
| | | * 构造下行数据 |
| | | * @param para 参数 |
| | | * @return 字节数组 |
| | | * @throws Exception 异常 |
| | | */ |
| | | public byte[] doParse(ParseParamsForDownV202404 para) throws Exception { |
| | | byte[] bytes = GlCreate.createStart2Cd(para.rtuAddr, para.commandCode); |
| | | if(para.param != null){ |
| | | String json = (String)para.param; |
| | | ComCd99Vo cvo = JSON.parseObject(json, ComCd99Vo.class) ; |
| | | if(cvo == null){ |
| | | throw new Exception("json转ComCd99Vo为null") ; |
| | | } |
| | | byte[] bs = new byte[2] ; |
| | | int index = 0 ; |
| | | bs[index] = (byte)(Integer.parseInt(cvo.controllerType, 16)); |
| | | |
| | | index ++ ; |
| | | bs[index] = cvo.projectNo.byteValue() ; |
| | | |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | }else{ |
| | | throw new Exception("下行命令参数据为null") ; |
| | | } |
| | | GlCreate.createLen(bytes);//长度放字节数组中 |
| | | |
| | | byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾 |
| | | |
| | | bytes = ByteUtil.bytesMerge(bytes, bsTail) ; |
| | | |
| | | return bytes ; |
| | | } |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.parse; |
| | | |
| | | import com.dy.common.mw.protocol.*; |
| | | import com.dy.common.mw.protocol.p206V202404.*; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd99Vo; |
| | | import com.dy.common.util.ByteUtil; |
| | | import org.apache.logging.log4j.LogManager; |
| | | import org.apache.logging.log4j.Logger; |
| | | |
| | | @AnnotationCodeUp(ifAny={ |
| | | CodeV202404.cd_99 |
| | | }) |
| | | @SuppressWarnings("unused") |
| | | public class Cd_99_Up implements CodeParse{ |
| | | |
| | | private static final Logger log = LogManager.getLogger(Cd_99_Up.class); |
| | | |
| | | /** |
| | | * 分析上行数据 |
| | | */ |
| | | @Override |
| | | public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback)throws Exception { |
| | | ParseParamsForUpV202404 para = (ParseParamsForUpV202404)params ; |
| | | int bsLen = new CommonV202404().parseDataLen(para.upBuffer) ; |
| | | if(bsLen > 0){ |
| | | this.doParse(para.upBuffer, |
| | | bsLen, |
| | | para.upCode, |
| | | para.data) ; |
| | | } |
| | | log.info("分析上行数据<" + CodeV202404.getCodeName(para.upCode) + " RTU地址=" + para.rtuAddr + ">:\n" + para.data.toString()); |
| | | |
| | | MidResultFromRtu midRs = new MidResultFromRtu() ; |
| | | midRs.protocolName = para.protocolName ;//协议名称 |
| | | midRs.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | midRs.upCode = para.upCode ;//上行数据中的功能码 |
| | | midRs.upHex = para.upHex ;//上行数据十六进制形式 |
| | | midRs.upBuffer = para.upBuffer ;//上行数据字节数组 |
| | | midRs.data = para.data ;//解析后的数据 |
| | | |
| | | midRs.reportOrResponse_trueOrFalse = false ; |
| | | |
| | | callback.callback(midRs.reportOrResponse_trueOrFalse); |
| | | return new MidResult[]{midRs} ; |
| | | } |
| | | /** |
| | | * 执行分析 |
| | | * @param bs 字节数组 |
| | | * @param bsLen 字节长度(总包长,包括包头和包尾) |
| | | * @param dataCode 功能码 |
| | | * @param data 数据 |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataCd99Vo cdData = new DataCd99Vo() ; |
| | | dV1.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | | index++ ; |
| | | cdData.projectNo = (int)bs[index]; |
| | | |
| | | index++ ; |
| | | byte result = bs[index]; |
| | | if(result == 1){ |
| | | cdData.success = true ; |
| | | }else{ |
| | | cdData.success = false ; |
| | | } |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.parse; |
| | | |
| | | import com.alibaba.fastjson2.JSON; |
| | | 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.mw.protocol.p206V202404.downVos.ComCd99Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.downVos.ComCd9AVo; |
| | | import com.dy.common.mw.protocol.p206V202404.parse.global.GlCreate; |
| | | import com.dy.common.util.ByteUtil; |
| | | |
| | | @AnnotationCodeDown(ifAny={ |
| | | CodeV202404.cd_9A |
| | | }) |
| | | public class Cd_9A_Down implements CodeParse { |
| | | |
| | | @Override |
| | | public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback) throws Exception { |
| | | ParseParamsForDownV202404 para = (ParseParamsForDownV202404) params ; |
| | | byte[] bs = this.doParse(para) ; |
| | | |
| | | MidResultToRtu midRs = new MidResultToRtu() ; |
| | | midRs.protocolName = para.protocolName ;//协议名称 |
| | | midRs.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果 |
| | | midRs.downCode = para.commandCode ;//下行命令功能码; |
| | | midRs.downBuffer = bs ;//下行命令数据 |
| | | midRs.downBufHex = ByteUtil.bytes2Hex(bs, true) ;//下行命令数据十六进制形式 |
| | | midRs.hasResponse = true ;//是否有应答 |
| | | midRs.maxSendTimes = null ;//命令最大发送次数(当收不到应答时,将重发),如果不设置,命令缓存器进行补充设置 |
| | | midRs.isCachForOffLine = false ;//RTU不在线,命令是否缓存,低功耗时为true |
| | | |
| | | midRs.isSendFirst = false ;//命令应答,首先发送,防止RTU重新上报 |
| | | if(isLowPower != null && isLowPower.booleanValue()){ |
| | | //低功耗时,尽快发送 |
| | | midRs.isQuickSend = true ; |
| | | } |
| | | |
| | | return new MidResult[]{midRs} ; |
| | | } |
| | | /** |
| | | * 构造下行数据 |
| | | * @param para 参数 |
| | | * @return 字节数组 |
| | | * @throws Exception 异常 |
| | | */ |
| | | public byte[] doParse(ParseParamsForDownV202404 para) throws Exception { |
| | | byte[] bytes = GlCreate.createStart2Cd(para.rtuAddr, para.commandCode); |
| | | if(para.param != null){ |
| | | String json = (String)para.param; |
| | | ComCd9AVo cvo = JSON.parseObject(json, ComCd9AVo.class) ; |
| | | if(cvo == null){ |
| | | throw new Exception("json转ComCd99Vo为null") ; |
| | | } |
| | | byte[] bs = new byte[2] ; |
| | | int index = 0 ; |
| | | bs[index] = (byte)(Integer.parseInt(cvo.controllerType, 16)); |
| | | |
| | | index ++ ; |
| | | bs[index] = cvo.projectNo.byteValue() ; |
| | | |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | }else{ |
| | | throw new Exception("下行命令参数据为null") ; |
| | | } |
| | | GlCreate.createLen(bytes);//长度放字节数组中 |
| | | |
| | | byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾 |
| | | |
| | | bytes = ByteUtil.bytesMerge(bytes, bsTail) ; |
| | | |
| | | return bytes ; |
| | | } |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.parse; |
| | | |
| | | import com.dy.common.mw.protocol.*; |
| | | import com.dy.common.mw.protocol.p206V202404.*; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd99Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd9AVo; |
| | | import com.dy.common.util.ByteUtil; |
| | | import org.apache.logging.log4j.LogManager; |
| | | import org.apache.logging.log4j.Logger; |
| | | |
| | | @AnnotationCodeUp(ifAny={ |
| | | CodeV202404.cd_9A |
| | | }) |
| | | @SuppressWarnings("unused") |
| | | public class Cd_9A_Up implements CodeParse{ |
| | | |
| | | private static final Logger log = LogManager.getLogger(Cd_9A_Up.class); |
| | | |
| | | /** |
| | | * 分析上行数据 |
| | | */ |
| | | @Override |
| | | public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback)throws Exception { |
| | | ParseParamsForUpV202404 para = (ParseParamsForUpV202404)params ; |
| | | int bsLen = new CommonV202404().parseDataLen(para.upBuffer) ; |
| | | if(bsLen > 0){ |
| | | this.doParse(para.upBuffer, |
| | | bsLen, |
| | | para.upCode, |
| | | para.data) ; |
| | | } |
| | | log.info("分析上行数据<" + CodeV202404.getCodeName(para.upCode) + " RTU地址=" + para.rtuAddr + ">:\n" + para.data.toString()); |
| | | |
| | | MidResultFromRtu midRs = new MidResultFromRtu() ; |
| | | midRs.protocolName = para.protocolName ;//协议名称 |
| | | midRs.rtuAddr = para.rtuAddr ;//Rtu地址 |
| | | midRs.upCode = para.upCode ;//上行数据中的功能码 |
| | | midRs.upHex = para.upHex ;//上行数据十六进制形式 |
| | | midRs.upBuffer = para.upBuffer ;//上行数据字节数组 |
| | | midRs.data = para.data ;//解析后的数据 |
| | | |
| | | midRs.reportOrResponse_trueOrFalse = false ; |
| | | |
| | | callback.callback(midRs.reportOrResponse_trueOrFalse); |
| | | return new MidResult[]{midRs} ; |
| | | } |
| | | /** |
| | | * 执行分析 |
| | | * @param bs 字节数组 |
| | | * @param bsLen 字节长度(总包长,包括包头和包尾) |
| | | * @param dataCode 功能码 |
| | | * @param data 数据 |
| | | * @throws Exception 异常 |
| | | */ |
| | | protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { |
| | | DataV202404 dV1 = (DataV202404)data.getSubData() ; |
| | | DataCd9AVo cdData = new DataCd9AVo() ; |
| | | dV1.subData = cdData ; |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | | index++ ; |
| | | cdData.projectNo = (int)bs[index]; |
| | | |
| | | index++ ; |
| | | byte result = bs[index]; |
| | | if(result == 1){ |
| | | cdData.success = true ; |
| | | }else{ |
| | | cdData.success = false ; |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | import com.dy.common.mw.protocol.p206V202404.ProtocolConstantV206V202404; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd80Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd81Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd93_A3Vo; |
| | | import com.dy.common.util.ByteUtil; |
| | | import com.dy.common.util.ByteUtilUnsigned; |
| | | import org.apache.logging.log4j.LogManager; |
| | |
| | | vo.alarmEleLowVolt = (byte)(b & 0x20) ; |
| | | vo.stateIcEnable = (byte)(b & 0x40) ; |
| | | } |
| | | /** |
| | | * 分析状态与报警 |
| | | * @param bs |
| | | * @param index |
| | | * @return |
| | | */ |
| | | public static void parseAlarmAndState(byte[] bs, int index, DataCd93_A3Vo vo){ |
| | | byte b = bs[index] ; |
| | | vo.statePump = (byte)(b & 0x1) ; |
| | | vo.alarmWaterRemain = (byte)(b & 0x2) ; |
| | | vo.alarm0WaterRemain = (byte)(b & 0x4) ; |
| | | vo.alarmExceedYear = (byte)(b & 0x8) ; |
| | | vo.alarmWaterMeterFault = (byte)(b & 0x10) ; |
| | | vo.alarmSteal = (byte)(b & 0x20) ; |
| | | vo.alarmWaterMeterBreak = (byte)(b & 0x40) ; |
| | | vo.alarmEleMeterFault = (byte)(b & 0x80) ; |
| | | |
| | | index++ ; |
| | | b = bs[index] ; |
| | | vo.alarm0MoneyRemain = (byte)(b & 0x1) ; |
| | | vo.alarmInnerDoor = (byte)(b & 0x2) ; |
| | | vo.alarmOuterDoor = (byte)(b & 0x4) ; |
| | | vo.alarmEleMiss = (byte)(b & 0x8) ; |
| | | vo.alarmEleExceed = (byte)(b & 0x10) ; |
| | | vo.alarmEleLowVolt = (byte)(b & 0x20) ; |
| | | vo.stateIcEnable = (byte)(b & 0x40) ; |
| | | } |
| | | |
| | | public static String parseTp(byte[] bs, short index){ |
| | | String dt = "" ; |
| | |
| | | * @throws Exception |
| | | */ |
| | | public static void parseCd80And5B(byte[] bs, DataCd80Vo cdData) throws Exception{ |
| | | |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | | index++ ; |
| | | cdData.projectNo = 0 + bs[index]; |
| | | cdData.projectNo = (int)bs[index]; |
| | | |
| | | index++ ; |
| | | cdData.useWaterType = bs[index]; |
| | |
| | | cdData.csq = ByteUtil.BCD2Int_BE(bs, index, index) ; |
| | | |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 分析功能93、A3和85数据 |
| | | * @param bs |
| | | * @param cdData |
| | | * @throws Exception |
| | | */ |
| | | public static void parseCd93A3And85(byte[] bs, DataCd93_A3Vo cdData) throws Exception { |
| | | int index = ProtocolConstantV206V202404.dataIndex ; |
| | | cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; |
| | | |
| | | index++ ; |
| | | cdData.projectNo = (int)bs[index]; |
| | | |
| | | index ++ ; |
| | | cdData.opResult = bs[index]; |
| | | |
| | | index ++ ; |
| | | cdData.opType = bs[index]; |
| | | |
| | | index++ ; |
| | | cdData.icCardAddr = ByteUtil.bytes2Hex(bs, false, index, 4) ; |
| | | |
| | | index += 8 ; |
| | | cdData.icCardNo = GlParse.parseIcCardNo(bs, index, 6, 2) ; |
| | | |
| | | index += 8 ; |
| | | cdData.orderNo = ByteUtil.BCD2String_BE(bs, index, index + 7) ; |
| | | |
| | | index ++ ; |
| | | String mm = ByteUtil.BCD2String_LE(bs, index, index) ; |
| | | index ++ ; |
| | | String HH = ByteUtil.BCD2String_LE(bs, index, index) ; |
| | | index ++ ; |
| | | String dd = ByteUtil.BCD2String_LE(bs, index, index) ; |
| | | index ++ ; |
| | | String MM = ByteUtil.BCD2String_LE(bs, index, index) ; |
| | | cdData.startDt = MM + "月" + dd + "日" + HH + "时" + mm + "分" ; |
| | | |
| | | index ++ ; |
| | | mm = ByteUtil.BCD2String_LE(bs, index, index) ; |
| | | index ++ ; |
| | | HH = ByteUtil.BCD2String_LE(bs, index, index) ; |
| | | index ++ ; |
| | | dd = ByteUtil.BCD2String_LE(bs, index, index) ; |
| | | index ++ ; |
| | | MM = ByteUtil.BCD2String_LE(bs, index, index) ; |
| | | cdData.endDt = MM + "月" + dd + "日" + HH + "时" + mm + "分" ; |
| | | |
| | | index ++ ; |
| | | cdData.waterTotalAmount = ByteUtil.BCD2Int_BE(bs, index, index + 4)/100.0D ; |
| | | |
| | | index += 5 ; |
| | | cdData.eleTotalAmount = ByteUtil.BCD2Int_BE(bs, index, index + 4)/100.0D ; |
| | | |
| | | index += 5 ; |
| | | cdData.moneyRemain = ByteUtil.BCD2Int_BE(bs, index, index + 4)/100.0D ; |
| | | |
| | | index += 5 ; |
| | | cdData.waterRemain = ByteUtil.BCD2Int_BE(bs, index, index + 4)/100.0D ; |
| | | |
| | | index += 5 ; |
| | | cdData.thisEle = ByteUtil.BCD2Int_BE(bs, index, index + 3)/100.0D ; |
| | | |
| | | index += 4 ; |
| | | cdData.thisWater = ByteUtil.BCD2Int_BE(bs, index, index + 3)/100.0D ; |
| | | |
| | | index += 4 ; |
| | | cdData.thisMoney = ByteUtil.BCD2Int_BE(bs, index, index + 3)/100.0D ; |
| | | |
| | | index += 4 ; |
| | | cdData.thisDuration = ByteUtil.BCD2Int_BE(bs, index, index + 1) ; |
| | | |
| | | index += 2 ; |
| | | GlParse.parseAlarmAndState(bs, index, cdData) ; |
| | | } |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.upVos; |
| | | |
| | | import lombok.Data; |
| | | |
| | | //设置设备终端剩余水量和剩余金额报警值 |
| | | @Data |
| | | public class DataCd16Vo { |
| | | |
| | | public String controllerType;//控制器类型: 01:测控一体阀;57:井电控制器 |
| | | public Integer projectNo ;//项目编号: |
| | | public Boolean success ;//命令结果(true成功, false失败) |
| | | |
| | | public String toString(){ |
| | | StringBuffer sb = new StringBuffer() ; |
| | | sb.append(" 设置设备终端剩余水量和剩余金额报警值 : \n") ; |
| | | sb.append(" 控制器类型 : ") ; |
| | | sb.append(controllerType == null?"未知":(controllerType.equals("01")?"测控一体阀":(controllerType.equals("57")?"井电控制器":"未知"))) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 项目编号 : ") ; |
| | | sb.append(projectNo == null?"未知":projectNo) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 命令结果 : ") ; |
| | | sb.append(success == null?"未知":(success?"成功":"失败")) ; |
| | | sb.append("\n") ; |
| | | |
| | | return sb.toString() ; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.upVos; |
| | | |
| | | import lombok.Data; |
| | | |
| | | //设置IP地址 |
| | | @Data |
| | | public class DataCd21Vo { |
| | | |
| | | public String controllerType;//控制器类型: 01:测控一体阀;57:井电控制器 |
| | | public Integer projectNo ;//项目编号: |
| | | public Boolean success ;//命令结果(true成功, false失败) |
| | | |
| | | public String toString(){ |
| | | StringBuffer sb = new StringBuffer() ; |
| | | sb.append(" 设置IP地址 : \n") ; |
| | | sb.append(" 控制器类型 : ") ; |
| | | sb.append(controllerType == null?"未知":(controllerType.equals("01")?"测控一体阀":(controllerType.equals("57")?"井电控制器":"未知"))) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 项目编号 : ") ; |
| | | sb.append(projectNo == null?"未知":projectNo) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 命令结果 : ") ; |
| | | sb.append(success == null?"未知":(success?"成功":"失败")) ; |
| | | sb.append("\n") ; |
| | | |
| | | return sb.toString() ; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.upVos; |
| | | |
| | | import lombok.Data; |
| | | |
| | | //设置机井年最大开采量和水位下限 |
| | | @Data |
| | | public class DataCd22Vo { |
| | | |
| | | public String controllerType;//控制器类型: 01:测控一体阀;57:井电控制器 |
| | | public Integer projectNo ;//项目编号: |
| | | public Boolean success ;//命令结果(true成功, false失败) |
| | | |
| | | public String toString(){ |
| | | StringBuffer sb = new StringBuffer() ; |
| | | sb.append(" 设置机井年最大开采量和水位下限 : \n") ; |
| | | sb.append(" 控制器类型 : ") ; |
| | | sb.append(controllerType == null?"未知":(controllerType.equals("01")?"测控一体阀":(controllerType.equals("57")?"井电控制器":"未知"))) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 项目编号 : ") ; |
| | | sb.append(projectNo == null?"未知":projectNo) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 命令结果 : ") ; |
| | | sb.append(success == null?"未知":(success?"成功":"失败")) ; |
| | | sb.append("\n") ; |
| | | |
| | | return sb.toString() ; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.upVos; |
| | | |
| | | import lombok.Data; |
| | | |
| | | //设置域名 |
| | | @Data |
| | | public class DataCd23Vo { |
| | | |
| | | public String controllerType;//控制器类型: 01:测控一体阀;57:井电控制器 |
| | | public Integer projectNo ;//项目编号: |
| | | public Boolean success ;//命令结果(true成功, false失败) |
| | | |
| | | public String toString(){ |
| | | StringBuffer sb = new StringBuffer() ; |
| | | sb.append(" 设置域名 : \n") ; |
| | | sb.append(" 控制器类型 : ") ; |
| | | sb.append(controllerType == null?"未知":(controllerType.equals("01")?"测控一体阀":(controllerType.equals("57")?"井电控制器":"未知"))) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 项目编号 : ") ; |
| | | sb.append(projectNo == null?"未知":projectNo) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 命令结果 : ") ; |
| | | sb.append(success == null?"未知":(success?"成功":"失败")) ; |
| | | sb.append("\n") ; |
| | | |
| | | return sb.toString() ; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.upVos; |
| | | |
| | | import lombok.Data; |
| | | |
| | | //设置设备终端年用水量 |
| | | @Data |
| | | public class DataCd26Vo { |
| | | |
| | | public String controllerType;//控制器类型: 01:测控一体阀;57:井电控制器 |
| | | public Integer projectNo ;//项目编号: |
| | | public Boolean success ;//命令结果(true成功, false失败) |
| | | |
| | | public String toString(){ |
| | | StringBuffer sb = new StringBuffer() ; |
| | | sb.append(" 设置设备终端年用水量 : \n") ; |
| | | sb.append(" 控制器类型 : ") ; |
| | | sb.append(controllerType == null?"未知":(controllerType.equals("01")?"测控一体阀":(controllerType.equals("57")?"井电控制器":"未知"))) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 项目编号 : ") ; |
| | | sb.append(projectNo == null?"未知":projectNo) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 命令结果 : ") ; |
| | | sb.append(success == null?"未知":(success?"成功":"失败")) ; |
| | | sb.append("\n") ; |
| | | |
| | | return sb.toString() ; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.upVos; |
| | | |
| | | import lombok.Data; |
| | | |
| | | //设置设备终端用水有效 |
| | | @Data |
| | | public class DataCd30Vo { |
| | | |
| | | public String controllerType;//控制器类型: 01:测控一体阀;57:井电控制器 |
| | | public Integer projectNo ;//项目编号: |
| | | public Boolean success ;//命令结果(true成功, false失败) |
| | | |
| | | public String toString(){ |
| | | StringBuffer sb = new StringBuffer() ; |
| | | sb.append(" 设置设备终端用水有效 : \n") ; |
| | | sb.append(" 控制器类型 : ") ; |
| | | sb.append(controllerType == null?"未知":(controllerType.equals("01")?"测控一体阀":(controllerType.equals("57")?"井电控制器":"未知"))) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 项目编号 : ") ; |
| | | sb.append(projectNo == null?"未知":projectNo) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 命令结果 : ") ; |
| | | sb.append(success == null?"未知":(success?"成功":"失败")) ; |
| | | sb.append("\n") ; |
| | | |
| | | return sb.toString() ; |
| | | } |
| | | |
| | | } |
| | |
| | | sb.append(" 剩余水量报警值 : ") ; |
| | | sb.append(moneyAlarm == null?"未知":moneyAlarm) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 剩余水量报警值 : ") ; |
| | | sb.append(waterAlarm == null?"未知":waterAlarm) ; |
| | | sb.append("\n") ; |
| | | return sb.toString() ; |
| | | } |
| | | |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.upVos; |
| | | |
| | | import lombok.Data; |
| | | |
| | | //查询机井年最大开采量和水位下限 |
| | | @Data |
| | | public class DataCd68Vo { |
| | | |
| | | public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器 |
| | | public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器 |
| | | public Integer maxAmountYear ;//机井年最大用水量 单位:m3 整数,取值范围0~99999999 |
| | | public Double limitLevel ;//水位下限 单位:m 取值范围:0~9999.99 |
| | | |
| | | |
| | | public String toString(){ |
| | | StringBuffer sb = new StringBuffer() ; |
| | | sb.append(" 查询机井年最大开采量和水位下限 : \n") ; |
| | | sb.append(" 控制器类型 : ") ; |
| | | sb.append(controllerType == null?"未知":(controllerType.equals("01")?"测控一体阀":(controllerType.equals("57")?"井电控制器":"未知"))) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 项目编号 : ") ; |
| | | sb.append(projectNo == null?"未知":projectNo) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 机井年最大用水量 : ") ; |
| | | sb.append(maxAmountYear == null?"未知":maxAmountYear) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 水位下限 : ") ; |
| | | sb.append(limitLevel == null?"未知":limitLevel) ; |
| | | sb.append("\n") ; |
| | | return sb.toString() ; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.upVos; |
| | | |
| | | import lombok.Data; |
| | | |
| | | //机井定点上报, 每天12点上报数据 |
| | | @Data |
| | | public class DataCd83Vo { |
| | | |
| | | public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器 |
| | | public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器 |
| | | public Double waterTotalAmountYear ;//本年累计流量 |
| | | public Double waterTotalAmountMeter ;//水表累计流量 |
| | | public Double eleTotalAmountYear ;//本年累计电量 |
| | | public Double eleTotalAmountMeter ;//电表累计电量 |
| | | public Double waterTotalAmountDay ;//当日水表净流量 |
| | | public Double waterUserTotalAmountDay ;// 当日用户用水量 |
| | | public Double lossTotalAmountDay ;// 漏损水量 |
| | | public Double batteryVolt ;//后备电池电压 |
| | | |
| | | public String toString(){ |
| | | StringBuffer sb = new StringBuffer() ; |
| | | sb.append(" 机井定点上报(每天12点上报) : \n") ; |
| | | sb.append(" 控制器类型 : ") ; |
| | | sb.append(controllerType == null?"未知":(controllerType.equals("01")?"测控一体阀":(controllerType.equals("57")?"井电控制器":"未知"))) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 项目编号 : ") ; |
| | | sb.append(projectNo == null?"未知":projectNo) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 本年累计流量 : ") ; |
| | | sb.append(waterTotalAmountYear == null?"未知":waterTotalAmountYear) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 水表累计流量 : ") ; |
| | | sb.append(waterTotalAmountMeter == null?"未知":waterTotalAmountMeter) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 本年累计电量 : ") ; |
| | | sb.append(eleTotalAmountYear == null?"未知":eleTotalAmountYear) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 电表累计电量 : ") ; |
| | | sb.append(eleTotalAmountMeter == null?"未知":eleTotalAmountMeter) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 当日水表净流量 : ") ; |
| | | sb.append(waterTotalAmountDay == null?"未知":waterTotalAmountDay) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 当日用户用水量 : ") ; |
| | | sb.append(waterUserTotalAmountDay == null?"未知":waterUserTotalAmountDay) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 漏损水量 : ") ; |
| | | sb.append(lossTotalAmountDay == null?"未知":lossTotalAmountDay) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 后备电池电压 : ") ; |
| | | sb.append(batteryVolt == null?"未知":batteryVolt) ; |
| | | sb.append("\n") ; |
| | | return sb.toString() ; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.upVos; |
| | | |
| | | import lombok.Data; |
| | | |
| | | //刷卡开泵/阀上报 |
| | | @Data |
| | | public class DataCd84Vo { |
| | | |
| | | public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器 |
| | | public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器 |
| | | public String icCardAddr ;//IC卡地址(远程关闭时为0) |
| | | public String icCardNo ;//IC卡编号(17位数字) |
| | | public String orderNo ;//订单号(16位数字) |
| | | public String opDt ;//开泵/阀时间(分时日月) |
| | | public Double waterTotalAmount ;//水表累计水量,单位0.01立方米 |
| | | public Double eleTotalAmount ;//电表累计电量,单位0.01度 |
| | | public Double moneyRemainUser ;//用户剩余金额, 单位0.01元 |
| | | public Double waterRemainUser ;//用户剩余水量, 单位0.01m3 |
| | | |
| | | public String toString(){ |
| | | StringBuffer sb = new StringBuffer() ; |
| | | sb.append(" 机井定点上报(每天12点上报) : \n") ; |
| | | sb.append(" 控制器类型 : ") ; |
| | | sb.append(controllerType == null?"未知":(controllerType.equals("01")?"测控一体阀":(controllerType.equals("57")?"井电控制器":"未知"))) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 项目编号 : ") ; |
| | | sb.append(projectNo == null?"未知":projectNo) ; |
| | | sb.append("\n") ; |
| | | sb.append(" IC卡地址 : ") ; |
| | | sb.append(icCardAddr == null?"未知":icCardAddr) ; |
| | | sb.append("\n") ; |
| | | sb.append(" IC卡编号 : ") ; |
| | | sb.append(icCardNo == null?"未知":icCardNo) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 订单号 : ") ; |
| | | sb.append(orderNo == null?"未知":orderNo) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 开泵/阀时间 : ") ; |
| | | sb.append(opDt == null?"未知":opDt) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 水表累计水量 : ") ; |
| | | sb.append(waterTotalAmount == null?"未知":waterTotalAmount) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 电表累计电量 : ") ; |
| | | sb.append(eleTotalAmount == null?"未知":eleTotalAmount) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 用户剩余金额 : ") ; |
| | | sb.append(moneyRemainUser == null?"未知":moneyRemainUser) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 用户剩余水量 : ") ; |
| | | sb.append(waterRemainUser == null?"未知":waterRemainUser) ; |
| | | sb.append("\n") ; |
| | | return sb.toString() ; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.upVos; |
| | | |
| | | public class DataCd85Vo extends DataCd93_A3Vo{ |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.upVos; |
| | | |
| | | import lombok.Data; |
| | | |
| | | //查询控制器IP地址 |
| | | @Data |
| | | public class DataCd86Vo { |
| | | |
| | | public String controllerType;//控制器类型: 01:测控一体阀;57:井电控制器 |
| | | public Integer projectNo ;//项目编号: |
| | | public Integer channel ;//IP通道号 |
| | | public String ip ;//IP |
| | | public Integer port ;//端口号 |
| | | |
| | | public String toString(){ |
| | | StringBuffer sb = new StringBuffer() ; |
| | | sb.append(" 查询控制器IP地址 : \n") ; |
| | | sb.append(" 控制器类型 : ") ; |
| | | sb.append(controllerType == null?"未知":(controllerType.equals("01")?"测控一体阀":(controllerType.equals("57")?"井电控制器":"未知"))) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 项目编号 : ") ; |
| | | sb.append(projectNo == null?"未知":projectNo) ; |
| | | sb.append("\n") ; |
| | | sb.append(" IP通道号 : ") ; |
| | | sb.append(channel == null?"未知":channel) ; |
| | | sb.append("\n") ; |
| | | sb.append(" ip : ") ; |
| | | sb.append(ip == null?"未知":ip) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 端口号 : ") ; |
| | | sb.append(port == null?"未知":port) ; |
| | | sb.append("\n") ; |
| | | |
| | | return sb.toString() ; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.upVos; |
| | | |
| | | import lombok.Data; |
| | | |
| | | //查询控制器域名 |
| | | @Data |
| | | public class DataCd87Vo { |
| | | |
| | | public String controllerType;//控制器类型: 01:测控一体阀;57:井电控制器 |
| | | public Integer projectNo ;//项目编号: |
| | | public Integer channel ;//IP通道号 |
| | | public String domain ;//域名 |
| | | public Integer port ;//端口号 |
| | | |
| | | public String toString(){ |
| | | StringBuffer sb = new StringBuffer() ; |
| | | sb.append(" 查询控制器域名 : \n") ; |
| | | sb.append(" 控制器类型 : ") ; |
| | | sb.append(controllerType == null?"未知":(controllerType.equals("01")?"测控一体阀":(controllerType.equals("57")?"井电控制器":"未知"))) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 项目编号 : ") ; |
| | | sb.append(projectNo == null?"未知":projectNo) ; |
| | | sb.append("\n") ; |
| | | sb.append(" IP通道号 : ") ; |
| | | sb.append(channel == null?"未知":channel) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 域名 : ") ; |
| | | sb.append(domain == null?"未知":domain) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 端口号 : ") ; |
| | | sb.append(port == null?"未知":port) ; |
| | | sb.append("\n") ; |
| | | |
| | | return sb.toString() ; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.upVos; |
| | | |
| | | import lombok.Data; |
| | | |
| | | //平台/APP远程关闭水泵/阀门 |
| | | @Data |
| | | public class DataCd92_A2Vo { |
| | | |
| | | public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器 |
| | | public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器 |
| | | public String icCardNo ;//IC卡编号(17位数字) |
| | | public String orderNo ;//订单号(16位数字) |
| | | public Byte opType ;//开阀类型: 01:平台开泵/阀 02:用户开泵/阀 |
| | | public Byte opResult ;//开启泵/阀结果: 0x00:成功 0x81:失败 |
| | | |
| | | public String toString(){ |
| | | StringBuffer sb = new StringBuffer() ; |
| | | sb.append(" 平台/APP远程关闭水泵/阀门 : \n") ; |
| | | sb.append(" 控制器类型 : ") ; |
| | | sb.append(controllerType == null?"未知":(controllerType.equals("01")?"测控一体阀":(controllerType.equals("57")?"井电控制器":"未知"))) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 项目编号 : ") ; |
| | | sb.append(projectNo == null?"未知":projectNo) ; |
| | | sb.append("\n") ; |
| | | sb.append(" IC卡编号 : ") ; |
| | | sb.append(icCardNo == null?"未知":icCardNo) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 订单号 : ") ; |
| | | sb.append(orderNo == null?"未知":orderNo) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 开启泵/阀类型 : ") ; |
| | | sb.append(opType == null?"未知":(opType.byteValue() == 0x01 ? "平台":"用户")) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 开启泵/阀结果 : ") ; |
| | | sb.append(opResult == null?"未知":(opResult.byteValue() == 0x00 ? "成功":"失败")) ; |
| | | sb.append("\n") ; |
| | | return sb.toString() ; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.upVos; |
| | | |
| | | import lombok.Data; |
| | | |
| | | //平台/APP远程关闭水泵/阀门 |
| | | @Data |
| | | public class DataCd93_A3Vo { |
| | | |
| | | public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器 |
| | | public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器 |
| | | public Byte opResult ;//关泵/阀结果: 0x00:成功 0x81:失败 |
| | | public Byte opType ;//关泵/阀方式: 0x00:刷卡闭 0x01:平台关 0x02:APP关 0x03:非法卡关 0x04:水表异常关 0x05:电表异常关 0x06:剩余水量不足关 0x07:剩余金额不足关 0x08:开泵/阀后管道没有流量关 0x09:掉电再上电。 |
| | | public String icCardAddr ;//IC卡地址(远程关闭时为0) |
| | | public String icCardNo ;//IC卡编号(17位数字) |
| | | public String orderNo ;//订单号(16位数字) |
| | | public String startDt ;//开始时间(分时日月) |
| | | public String endDt ;//结束时间(分时日月) |
| | | public Double waterTotalAmount ;//水表累计流量 |
| | | public Double eleTotalAmount ;//电表累计电量 |
| | | public Double moneyRemain ;//用户剩余金额,单位0.01元 |
| | | public Double waterRemain ;//用户剩余水量,保留 默认 00 00 00 00 00 |
| | | public Double thisEle ;//本次使用电量, 单位0.01度 |
| | | public Double thisWater ;//本次使用水量, 单位0.01立方米 |
| | | public Double thisMoney ;//本次使用金额, 单位0.01元 |
| | | public Integer thisDuration;//本次使用时间长, 单位:分钟 |
| | | |
| | | |
| | | public Byte statePump ; //泵/阀状态 (1:开泵/阀;0:关泵/阀) |
| | | public Byte alarmWaterRemain ; //剩余水量报警 (1:小于报警上限报警 0:正常) |
| | | public Byte alarm0WaterRemain ; //剩余水量为0关泵/阀 (1:剩余水量为0关泵 0:正常) |
| | | public Byte alarmExceedYear ; //年度超采报警 (1:年用水量大于限制水量报警 0:正常) |
| | | public Byte alarmWaterMeterFault ; //外部流量计故障 (1:流量计故障报警 0:正常) |
| | | public Byte alarmSteal ; //偷水报警 (1:绕开控制器用水报警 0:正常) |
| | | public Byte alarmWaterMeterBreak ; //流量计损坏报警 (1:正常通讯但瞬时为0报警 0:正常) |
| | | public Byte alarmEleMeterFault ; //电表故障报警 (1:和电表通讯断或数据不正常 0:正常) |
| | | public Byte alarm0MoneyRemain ; //剩余金额为0关泵/阀 (1:剩余金额为0报警 0:正常) |
| | | public Byte alarmInnerDoor ; //控制器内门报警 (1:内门打开报警 0:正常) |
| | | public Byte alarmOuterDoor ; //控制器外门报警 (1:外门打开报警 0:正常) |
| | | public Byte alarmEleMiss ; //交流缺项报警 (1:三相缺项报警 0:正常) |
| | | public Byte alarmEleExceed ; //交流过流报警 (1:交流过流报警 0:正常) |
| | | public Byte alarmEleLowVolt ; //三相电欠压报警 (1:欠压报警 0:正常) |
| | | public Byte stateIcEnable ; //IC卡使能 (1、IC有刷卡支持 0:不支持) |
| | | |
| | | public String toString(){ |
| | | StringBuffer sb = new StringBuffer() ; |
| | | sb.append(" 平台/APP远程关闭水泵/阀门 : \n") ; |
| | | sb.append(" 控制器类型 : ") ; |
| | | sb.append(controllerType == null?"未知":(controllerType.equals("01")?"测控一体阀":(controllerType.equals("57")?"井电控制器":"未知"))) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 项目编号 : ") ; |
| | | sb.append(projectNo == null?"未知":projectNo) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 关泵/阀类型 : ") ; |
| | | sb.append(opType == null?"未知":(opType.byteValue() == 0x00 ? "刷卡":(opType.byteValue() == 0x01 ? "平台":(opType.byteValue() == 0x02 ? "APP":(opType.byteValue() == 0x03 ? "非法卡":(opType.byteValue() == 0x04 ? "水表异常":(opType.byteValue() == 0x05 ? "电表异常":(opType.byteValue() == 0x06 ? "剩余水量不足":(opType.byteValue() == 0x07 ? "剩余金额不足":(opType.byteValue() == 0x08 ? "无流量":(opType.byteValue() == 0x09 ? "掉电再上电":"未知"))))))))))) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 关启泵/阀结果 : ") ; |
| | | sb.append(opResult == null?"未知":(opResult.byteValue() == 0x00 ? "成功":"失败")) ; |
| | | sb.append("\n") ; |
| | | sb.append(" IC卡地址 : ") ; |
| | | sb.append(icCardAddr == null?"未知":icCardAddr) ; |
| | | sb.append("\n") ; |
| | | sb.append(" IC卡编号 : ") ; |
| | | sb.append(icCardNo == null?"未知":icCardNo) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 订单号 : ") ; |
| | | sb.append(orderNo == null?"未知":orderNo) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 开始时间 : ") ; |
| | | sb.append(startDt == null?"未知":startDt) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 结束时间 : ") ; |
| | | sb.append(endDt == null?"未知":endDt) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 水表累计流量 : ") ; |
| | | sb.append(waterTotalAmount == null?"未知":waterTotalAmount) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 电表累计电量 : ") ; |
| | | sb.append(eleTotalAmount == null?"未知":eleTotalAmount) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 用户剩余金额 : ") ; |
| | | sb.append(moneyRemain == null?"未知":moneyRemain) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 用户剩余水量 : ") ; |
| | | sb.append(waterRemain == null?"未知":waterRemain) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 本次使用电量 : ") ; |
| | | sb.append(thisEle == null?"未知":thisEle) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 本次使用水量 : ") ; |
| | | sb.append(thisWater == null?"未知":thisWater) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 本次使用金额 : ") ; |
| | | sb.append(thisMoney == null?"未知":thisMoney) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 本次使用时间长 : ") ; |
| | | sb.append(thisDuration == null?"未知": thisDuration) ; |
| | | sb.append("\n") ; |
| | | return sb.toString() ; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.upVos; |
| | | |
| | | import lombok.Data; |
| | | |
| | | //清空设备终端日记录 |
| | | @Data |
| | | public class DataCd99Vo { |
| | | |
| | | public String controllerType;//控制器类型: 01:测控一体阀;57:井电控制器 |
| | | public Integer projectNo ;//项目编号: |
| | | public Boolean success ;//命令结果(true成功, false失败) |
| | | |
| | | public String toString(){ |
| | | StringBuffer sb = new StringBuffer() ; |
| | | sb.append(" 清空设备终端日记录 : \n") ; |
| | | sb.append(" 控制器类型 : ") ; |
| | | sb.append(controllerType == null?"未知":(controllerType.equals("01")?"测控一体阀":(controllerType.equals("57")?"井电控制器":"未知"))) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 项目编号 : ") ; |
| | | sb.append(projectNo == null?"未知":projectNo) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 命令结果 : ") ; |
| | | sb.append(success == null?"未知":(success?"成功":"失败")) ; |
| | | sb.append("\n") ; |
| | | |
| | | return sb.toString() ; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.common.mw.protocol.p206V202404.upVos; |
| | | |
| | | import lombok.Data; |
| | | |
| | | //清空设备终端日记录 |
| | | @Data |
| | | public class DataCd9AVo { |
| | | |
| | | public String controllerType;//控制器类型: 01:测控一体阀;57:井电控制器 |
| | | public Integer projectNo ;//项目编号: |
| | | public Boolean success ;//命令结果(true成功, false失败) |
| | | |
| | | public String toString(){ |
| | | StringBuffer sb = new StringBuffer() ; |
| | | sb.append(" 清空设备终端日记录 : \n") ; |
| | | sb.append(" 控制器类型 : ") ; |
| | | sb.append(controllerType == null?"未知":(controllerType.equals("01")?"测控一体阀":(controllerType.equals("57")?"井电控制器":"未知"))) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 项目编号 : ") ; |
| | | sb.append(projectNo == null?"未知":projectNo) ; |
| | | sb.append("\n") ; |
| | | sb.append(" 命令结果 : ") ; |
| | | sb.append(success == null?"未知":(success?"成功":"失败")) ; |
| | | sb.append("\n") ; |
| | | |
| | | return sb.toString() ; |
| | | } |
| | | |
| | | } |