pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_15_Down.java
@@ -62,7 +62,7 @@ if(cvo.flowNo.length() != 12){ throw new Exception("流水号必须是12位数字") ; } byte[] bs = new byte[34] ; byte[] bs = new byte[40] ; int index = 0 ; bs[index] = (byte)(Integer.parseInt(cvo.controllerType, 16)); @@ -96,9 +96,9 @@ bs[index++] = 0 ; } } if(cvo.chargeMoney != null){ String chargeMoney = "" + (Double.valueOf(cvo.chargeWater * 100)).longValue() ; byte[] bTemp = ByteUtil.string2BCD_LE(chargeMoney) ; if(cvo.chargeWater != null){ String chargeWater = "" + (Double.valueOf(cvo.chargeWater * 100)).longValue() ; byte[] bTemp = ByteUtil.string2BCD_LE(chargeWater) ; int bTempLen = bTemp.length ; int count = 0 ; for(int i = 0 ; i < bTempLen; i++){ @@ -120,6 +120,9 @@ ByteUtil.string2BCD_BE(bs, cvo.flowNo, index) ; index += 6 ; GlCreate.createDt(bs, index); index += 6 ; GlCreate.createPw(bs, index); index += 2 ; pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_55_Up.java
@@ -115,18 +115,7 @@ } index += 1 ; String ss = ByteUtil.BCD2String_BE(bs, index, index) ; index++ ; String mm = ByteUtil.BCD2String_BE(bs, index, index) ; index++ ; String HH = ByteUtil.BCD2String_BE(bs, index, index) ; index++ ; String dd = ByteUtil.BCD2String_BE(bs, index, index) ; index++ ; String MM = ByteUtil.BCD2String_BE(bs, index, index) ; index++ ; String yy = ByteUtil.BCD2String_BE(bs, index, index) ; cdData.dt = "20" + yy + "-" + MM + "-" + dd + " " + HH + ":" + mm + ":" + ss ; cdData.dt = GlParse.parseRtuDt(bs, index) ; return cdData ; }else{ pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_65_Up.java
@@ -112,26 +112,12 @@ cdData.thisWater = thisWater/100.0D; index += 4 ; String mm = ByteUtil.BCD2String_BE(bs, index, index) ; index++ ; String HH = ByteUtil.BCD2String_BE(bs, index, index) ; index++ ; String dd = ByteUtil.BCD2String_BE(bs, index, index) ; index++ ; String MM = ByteUtil.BCD2String_BE(bs, index, index) ; cdData.rtuStartDt = MM + "-" + dd + " " + HH + ":" + mm ; cdData.rtuStartDt = GlParse.parseRtuDt(bs, index) ; index++ ; mm = ByteUtil.BCD2String_BE(bs, index, index) ; index++ ; HH = ByteUtil.BCD2String_BE(bs, index, index) ; index++ ; dd = ByteUtil.BCD2String_BE(bs, index, index) ; index++ ; MM = ByteUtil.BCD2String_BE(bs, index, index) ; cdData.rtuEndDt = MM + "-" + dd + " " + HH + ":" + mm ; index += 6 ; cdData.rtuEndDt = GlParse.parseRtuDt(bs, index) ; index++ ; index += 6 ; cdData.useWaterType = bs[index]; return cdData ; pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_81_Up.java
@@ -94,6 +94,9 @@ cdData.projectNo = (int)bs[index]; index++ ; GlParse.parseRtuDt(bs, index) ; index += 6 ; GlParse.parseAlarmAndState(bs, index, cdData) ; } } pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_84_Up.java
@@ -128,6 +128,9 @@ index += 5 ; cdData.waterRemainUser = ByteUtil.BCD2Int_BE(bs, index, index + 4)/100.0D ; index += 5 ; GlParse.parseAlarmAndState(bs, index, cdData) ; } } pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_92_A2_Down.java
@@ -82,7 +82,7 @@ } byte[] bs = new byte[39] ; byte[] bs = new byte[45] ; int index = 0 ; bs[index] = (byte)(Integer.parseInt(cvo.controllerType, 16)); @@ -178,6 +178,9 @@ ByteUtil.string2BCD_BE(bs, cvo.orderNo, index) ; index += 8 ; GlCreate.createDt(bs, index); index += 6 ; GlCreate.createPw(bs, index); index += 2 ; pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_93_A3_Down.java
@@ -61,7 +61,7 @@ throw new Exception("订单号必须是16位数字") ; } byte[] bs = new byte[26] ; byte[] bs = new byte[32] ; int index = 0 ; bs[index] = (byte)(Integer.parseInt(cvo.controllerType, 16)); @@ -82,6 +82,9 @@ ByteUtil.string2BCD_BE(bs, cvo.orderNo, index) ; index += 8 ; GlCreate.createDt(bs, index); index += 6 ; GlCreate.createPw(bs, index); index += 2 ; pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_C2_Up.java
@@ -3,6 +3,7 @@ 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.DataCd02Vo; import com.dy.common.mw.protocol.p206V202404.upVos.DataCdC2Vo; import com.dy.common.util.ByteUtil; @@ -106,5 +107,12 @@ cdData.success = true ; }else{ cdData.success = false ; } } } index++ ; GlParse.parseRtuDt(bs, index); index+= 6 ; GlParse.parseAlarmAndState(bs, index, cdData); } } pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/global/GlCreate.java
@@ -93,6 +93,17 @@ Integer icCardNo2Int = Integer.parseInt(icCardNo2) ; ByteUtilUnsigned.short2Bytes_LE(bs, icCardNo2Int.shortValue(), index); } public static void createDt(byte[] bs, int index) throws Exception { bs[index] = Byte.parseByte(DateTime.ss()) ; bs[index + 1] = Byte.parseByte(DateTime.mm()) ; bs[index + 2] = Byte.parseByte(DateTime.HH()) ; bs[index + 3] = Byte.parseByte(DateTime.dd()) ; bs[index + 4] = Byte.parseByte(DateTime.MM()) ; bs[index + 5] = Byte.parseByte(DateTime.yy()) ; } public static void createPw(byte[] bs, int index) throws Exception { bs[index] = 0; bs[index + 1] = 0; pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/global/GlParse.java
@@ -1,9 +1,7 @@ package com.dy.common.mw.protocol.p206V202404.parse.global; import com.dy.common.mw.protocol.p206V202404.ProtocolConstantV206V202404; import com.dy.common.mw.protocol.p206V202404.upVos.DataCd80_5BVo; import com.dy.common.mw.protocol.p206V202404.upVos.DataCd81Vo; import com.dy.common.mw.protocol.p206V202404.upVos.DataCd93_A3_85Vo; import com.dy.common.mw.protocol.p206V202404.upVos.*; import com.dy.common.util.ByteUtil; import com.dy.common.util.ByteUtilUnsigned; import org.apache.logging.log4j.LogManager; @@ -32,7 +30,7 @@ String mm = ByteUtil.BCD2String_BE(bs, index, index) ; index++ ; String yy = ByteUtil.BCD2String_BE(bs, index, index) ; return yy + "-" + mm + "-" + dd + " " + HH + ":" + MM + ":" + ss ; return "20" + yy + "-" + mm + "-" + dd + " " + HH + ":" + MM + ":" + ss ; } /** * 分析IC卡编号 @@ -61,23 +59,23 @@ public static void parseAlarmAndState(byte[] bs, int index, DataCd80_5BVo 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) ; vo.alarmWaterRemain = (byte)(b >> 1 & 1) ; vo.alarm0WaterRemain = (byte)(b >> 2 & 1) ; vo.alarmExceedYear = (byte)(b >> 3 & 1) ; vo.alarmWaterMeterFault = (byte)(b >> 4 & 1) ; vo.alarmSteal = (byte)(b >> 5 & 1) ; vo.alarmWaterMeterBreak = (byte)(b >> 6 & 1) ; vo.alarmEleMeterFault = (byte)(b >> 7 & 1) ; 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) ; vo.alarmInnerDoor = (byte)(b >> 1 & 1) ; vo.alarmOuterDoor = (byte)(b >> 2 & 1) ; vo.alarmEleMiss = (byte)(b >> 3 & 1) ; vo.alarmEleExceed = (byte)(b >> 4 & 1) ; vo.alarmEleLowVolt = (byte)(b >> 5 & 1) ; vo.stateIcEnable = (byte)(b >> 6 & 1) ; } /** * 分析状态与报警 @@ -88,23 +86,50 @@ public static void parseAlarmAndState(byte[] bs, int index, DataCd81Vo 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) ; vo.alarmWaterRemain = (byte)(b >> 1 & 1) ; vo.alarm0WaterRemain = (byte)(b >> 2 & 1) ; vo.alarmExceedYear = (byte)(b >> 3 & 1) ; vo.alarmWaterMeterFault = (byte)(b >> 4 & 1) ; vo.alarmSteal = (byte)(b >> 5 & 1) ; vo.alarmWaterMeterBreak = (byte)(b >> 6 & 1) ; vo.alarmEleMeterFault = (byte)(b >> 7 & 1) ; 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) ; vo.alarmInnerDoor = (byte)(b >> 1 & 1) ; vo.alarmOuterDoor = (byte)(b >> 2 & 1) ; vo.alarmEleMiss = (byte)(b >> 3 & 1) ; vo.alarmEleExceed = (byte)(b >> 4 & 1) ; vo.alarmEleLowVolt = (byte)(b >> 5 & 1) ; vo.stateIcEnable = (byte)(b >> 6 & 1) ; } /** * 分析状态与报警 * @param bs * @param index * @return */ public static void parseAlarmAndState(byte[] bs, int index, DataCd84Vo vo){ byte b = bs[index] ; vo.statePump = (byte)(b & 0x1) ; vo.alarmWaterRemain = (byte)(b >> 1 & 1) ; vo.alarm0WaterRemain = (byte)(b >> 2 & 1) ; vo.alarmExceedYear = (byte)(b >> 3 & 1) ; vo.alarmWaterMeterFault = (byte)(b >> 4 & 1) ; vo.alarmSteal = (byte)(b >> 5 & 1) ; vo.alarmWaterMeterBreak = (byte)(b >> 6 & 1) ; vo.alarmEleMeterFault = (byte)(b >> 7 & 1) ; index++ ; b = bs[index] ; vo.alarm0MoneyRemain = (byte)(b & 0x1) ; vo.alarmInnerDoor = (byte)(b >> 1 & 1) ; vo.alarmOuterDoor = (byte)(b >> 2 & 1) ; vo.alarmEleMiss = (byte)(b >> 3 & 1) ; vo.alarmEleExceed = (byte)(b >> 4 & 1) ; vo.alarmEleLowVolt = (byte)(b >> 5 & 1) ; vo.stateIcEnable = (byte)(b >> 6 & 1) ; } /** * 分析状态与报警 @@ -115,23 +140,50 @@ public static void parseAlarmAndState(byte[] bs, int index, DataCd93_A3_85Vo 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) ; vo.alarmWaterRemain = (byte)(b >> 1 & 1) ; vo.alarm0WaterRemain = (byte)(b >> 2 & 1) ; vo.alarmExceedYear = (byte)(b >> 3 & 1) ; vo.alarmWaterMeterFault = (byte)(b >> 4 & 1) ; vo.alarmSteal = (byte)(b >> 5 & 1) ; vo.alarmWaterMeterBreak = (byte)(b >> 6 & 1) ; vo.alarmEleMeterFault = (byte)(b >> 7 & 1) ; 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) ; vo.alarmInnerDoor = (byte)(b >> 1 & 1) ; vo.alarmOuterDoor = (byte)(b >> 2 & 1) ; vo.alarmEleMiss = (byte)(b >> 3 & 1) ; vo.alarmEleExceed = (byte)(b >> 4 & 1) ; vo.alarmEleLowVolt = (byte)(b >> 5 & 1) ; vo.stateIcEnable = (byte)(b >> 6 & 1) ; } /** * 分析状态与报警 * @param bs * @param index * @return */ public static void parseAlarmAndState(byte[] bs, int index, DataCdC2Vo vo){ byte b = bs[index] ; vo.statePump = (byte)(b & 0x1) ; vo.alarmWaterRemain = (byte)(b >> 1 & 1) ; vo.alarm0WaterRemain = (byte)(b >> 2 & 1) ; vo.alarmExceedYear = (byte)(b >> 3 & 1) ; vo.alarmWaterMeterFault = (byte)(b >> 4 & 1) ; vo.alarmSteal = (byte)(b >> 5 & 1) ; vo.alarmWaterMeterBreak = (byte)(b >> 6 & 1) ; vo.alarmEleMeterFault = (byte)(b >> 7 & 1) ; index++ ; b = bs[index] ; vo.alarm0MoneyRemain = (byte)(b & 0x1) ; vo.alarmInnerDoor = (byte)(b >> 1 & 1) ; vo.alarmOuterDoor = (byte)(b >> 2 & 1) ; vo.alarmEleMiss = (byte)(b >> 3 & 1) ; vo.alarmEleExceed = (byte)(b >> 4 & 1) ; vo.alarmEleLowVolt = (byte)(b >> 5 & 1) ; vo.stateIcEnable = (byte)(b >> 6 & 1) ; } public static String parseTp(byte[] bs, short index){ pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/AlarmVo.java
New file @@ -0,0 +1,26 @@ package com.dy.common.mw.protocol.p206V202404.upVos; /** * @Author: liurunyu * @Date: 2024/5/13 16:01 * @Description */ public class AlarmVo { 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:不支持) } pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd65Vo.java
@@ -14,8 +14,8 @@ public Double waterRemain ;//用户剩余水量(单位0.01m3) public Double thisEle ;//本次使用电量(单位0.01度) public Double thisWater ;//本次使用水量(单位0.01立方米) public String rtuStartDt ;//本次开始时间 (分时日月) public String rtuEndDt ;//本次结束时间 (分时日月) public String rtuStartDt ;//本次开始时间 (yyyy-mm-dd HH:MM:SS) public String rtuEndDt ;//本次结束时间 (yyyy-mm-dd HH:MM:SS) public Byte useWaterType ;//用水方式(0x00:正常刷卡开泵/阀用水 0x01:平台远程开泵/阀用水 0x02:用户远程开泵/阀用水 0x03:测试卡,0x04:其它) public String toString(){ pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd80_5BVo.java
@@ -4,7 +4,7 @@ //设备终端工作上报 + 查询设备终端实时值 @Data public class DataCd80_5BVo { public class DataCd80_5BVo extends AlarmVo { public String controllerType;//控制器类型: 01:测控一体阀;57:井电控制器 public Integer projectNo ;//项目编号: @@ -46,24 +46,6 @@ CSQ值大于18:能稳定通信 */ public Integer csq ;//手机信号强度 CSQ值() 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 comName ;//命令名称 pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd81Vo.java
@@ -4,27 +4,11 @@ //设备终端随机自报 @Data public class DataCd81Vo { public class DataCd81Vo extends AlarmVo { public String controllerType;//控制器类型: 01:测控一体阀;57:井电控制器 public Integer projectNo ;//项目编号: 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 rtuDt ;//设备上报的日期时间(yyyy-mm-dd HH:MM:SS) public String toString(){ StringBuffer sb = new StringBuffer() ; @@ -35,6 +19,9 @@ sb.append(" 项目编号 : ") ; sb.append(projectNo == null?"未知":projectNo) ; sb.append("\n") ; sb.append(" 设备时钟 : ") ; sb.append(rtuDt == null?"未知":rtuDt) ; sb.append("\n") ; sb.append(" 泵状态 : ") ; sb.append(statePump == null?"未知":(statePump.byteValue()==1?"泵/阀开":(statePump.byteValue()==0?"泵/阀关":"未知"))) ; sb.append(" 剩余水量报警 : ") ; pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd83Vo.java
@@ -16,6 +16,7 @@ public Double waterUserTotalAmountDay ;// 当日用户用水量 public Double lossTotalAmountDay ;// 漏损水量 public Double batteryVolt ;//后备电池电压 public Double rtuDt ;//上报时间(yyyy-mm-dd HH) public String toString(){ StringBuffer sb = new StringBuffer() ; @@ -50,6 +51,9 @@ sb.append(" 后备电池电压 : ") ; sb.append(batteryVolt == null?"未知":batteryVolt) ; sb.append("\n") ; sb.append(" 上报时间 : ") ; sb.append(rtuDt == null?"未知":rtuDt) ; sb.append("\n") ; return sb.toString() ; } pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd84Vo.java
@@ -4,7 +4,7 @@ //刷卡开泵/阀上报 @Data public class DataCd84Vo { public class DataCd84Vo extends AlarmVo { public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器 public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器 @@ -50,6 +50,50 @@ sb.append(" 用户剩余水量 : ") ; sb.append(waterRemainUser == null?"未知":waterRemainUser) ; sb.append("\n") ; sb.append(" 泵状态 : ") ; sb.append(statePump == null?"未知":(statePump.byteValue()==1?"泵/阀开":(statePump.byteValue()==0?"泵/阀关":"未知"))) ; sb.append(" 剩余水量报警 : ") ; sb.append(alarmWaterRemain == null?"未知":(alarmWaterRemain.byteValue()==1?"小于报警上限":(alarmWaterRemain.byteValue()==0?"正常":"未知"))) ; sb.append("\n") ; sb.append(" 剩余水量为0关泵/阀 : ") ; sb.append(alarm0WaterRemain == null?"未知":(alarm0WaterRemain.byteValue()==1?"归零关泵/阀":(alarm0WaterRemain.byteValue()==0?"正常":"未知"))) ; sb.append("\n") ; sb.append(" 年度超采 : ") ; sb.append(alarmExceedYear == null?"未知":(alarmExceedYear.byteValue()==1?"报警":(alarmExceedYear.byteValue()==0?"正常":"未知"))) ; sb.append("\n") ; sb.append(" 外部流量计故障 : ") ; sb.append(alarmWaterMeterFault == null?"未知":(alarmWaterMeterFault.byteValue()==1?"报警":(alarmWaterMeterFault.byteValue()==0?"正常":"未知"))) ; sb.append("\n") ; sb.append(" 偷水 : ") ; sb.append(alarmSteal == null?"未知":(alarmSteal.byteValue()==1?"报警":(alarmSteal.byteValue()==0?"正常":"未知"))) ; sb.append("\n") ; sb.append(" 流量计损坏 : ") ; sb.append(alarmWaterMeterBreak == null?"未知":(alarmWaterMeterBreak.byteValue()==1?"报警":(alarmWaterMeterBreak.byteValue()==0?"正常":"未知"))) ; sb.append("\n") ; sb.append(" 电表故障 : ") ; sb.append(alarmEleMeterFault == null?"未知":(alarmEleMeterFault.byteValue()==1?"报警":(alarmEleMeterFault.byteValue()==0?"正常":"未知"))) ; sb.append("\n") ; sb.append(" 剩余金额为0关泵/阀 : ") ; sb.append(alarm0MoneyRemain == null?"未知":(alarm0MoneyRemain.byteValue()==1?"报警":(alarm0MoneyRemain.byteValue()==0?"正常":"未知"))) ; sb.append("\n") ; sb.append(" 控制器内门 : ") ; sb.append(alarmInnerDoor == null?"未知":(alarmInnerDoor.byteValue()==1?"报警":(alarmInnerDoor.byteValue()==0?"正常":"未知"))) ; sb.append("\n") ; sb.append(" 控制器外门 : ") ; sb.append(alarmOuterDoor == null?"未知":(alarmOuterDoor.byteValue()==1?"报警":(alarmOuterDoor.byteValue()==0?"正常":"未知"))) ; sb.append("\n") ; sb.append(" 交流缺项 : ") ; sb.append(alarmEleMiss == null?"未知":(alarmEleMiss.byteValue()==1?"报警":(alarmEleMiss.byteValue()==0?"正常":"未知"))) ; sb.append("\n") ; sb.append(" 交流过流 : ") ; sb.append(alarmEleExceed == null?"未知":(alarmEleExceed.byteValue()==1?"报警":(alarmEleExceed.byteValue()==0?"正常":"未知"))) ; sb.append("\n") ; sb.append(" 三相电欠压 : ") ; sb.append(alarmEleLowVolt == null?"未知":(alarmEleLowVolt.byteValue()==1?"报警":(alarmEleLowVolt.byteValue()==0?"正常":"未知"))) ; sb.append("\n") ; sb.append(" IC卡使能 : ") ; sb.append(stateIcEnable == null?"未知":(stateIcEnable.byteValue()==1?"支持":(stateIcEnable.byteValue()==0?"不支持":"未知"))) ; sb.append("\n") ; return sb.toString() ; } pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd93_A3_85Vo.java
@@ -4,7 +4,7 @@ //平台/APP远程关闭水泵/阀门 + 刷卡关泵/阀上报 @Data public class DataCd93_A3_85Vo { public class DataCd93_A3_85Vo extends AlarmVo { public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器 public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器 @@ -23,24 +23,6 @@ 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 comName ;//命令名称 pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCdC2Vo.java
@@ -4,13 +4,14 @@ //开关水泵/阀门成功/失败上报 @Data public class DataCdC2Vo { public class DataCdC2Vo extends AlarmVo { public String controllerType ;//控制器类型: 01:测控一体阀;57:井电控制器 public Integer projectNo ;//项目编号: public Byte opType1 ;//操作方式:0:刷卡开水泵/阀门;1:远程开水泵/阀门;2:APP开水泵/阀门 public Byte opType2 ;//开启关闭:0: 开启 -1:关闭 public Boolean success ;//执行结果(true成功, false失败) public String rutDt ;//设备时钟 public String toString(){ StringBuffer sb = new StringBuffer() ; @@ -27,6 +28,9 @@ sb.append(" 开启关闭 : ") ; sb.append(opType2 == null?"未知":(opType2.byteValue()==0?"开启水泵/阀门":(opType2.byteValue()==1?"关闭水泵/阀门":"未知"))) ; sb.append("\n") ; sb.append(" 设备时钟 : ") ; sb.append(rutDt == null?"未知":rutDt) ; sb.append("\n") ; sb.append(" 执行结果 : ") ; sb.append(success == null?"未知":(success?"成功":"失败")) ; sb.append("\n") ; pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/ByteUtilUnsigned.java
@@ -1,6 +1,5 @@ package com.dy.common.util; @SuppressWarnings("unuseed") public class ByteUtilUnsigned { /** * 大端模式《数据低位在数组高字节》 @@ -36,7 +35,7 @@ throw new Exception("int2Bytes时数组越界"); } } /** * 小端模式《数据低位在数组低字节》 @@ -167,6 +166,90 @@ throw new Exception("byte2Int时数组越界"); } } /** * 小端模式《数据低位在数组低字节》 * 与方法bytes2Int算法一样,只是把顺序反过来 * @param bs * @return */ public static long bytes2Long_LE(byte[] bs, int startIndex, int endIndex) throws Exception { boolean b = isOutOfArrLength(bs.length, endIndex); if (!b) { byte count = 0 ; long s = 0; long temp = 0 ; for(int i = startIndex ; i <= endIndex; i++){ temp = bs[i] & 0xFF ;// 数据的最低位在低字节 if(temp < 0){ temp = Byte.MAX_VALUE * 2 + 1 + temp + 1 ; } if(count > 0){ temp <<= count * 8; } count++ ; s = s | temp ; } return s; } else { throw new Exception("bytes2Long_LE时数组越界"); } } /** * 大端模式《数据低位在数组高字节》 * 无符号short类型转换成2位byte数组 * java没有无符号短整型数据,只有有符号短整数,取值范围是-32768~32767 * 若模拟无符号短整型数据,取值范围是0到65535 ,已经超出了java的有符号整数上限,所以只能用java的Int型表示无符号整数 * @value bs byte[] */ public static long bytes2Long_BE(byte[] bs, int startIndex, int endIndex) throws Exception { boolean b = isOutOfArrLength(bs.length, endIndex); if (!b) { int count = endIndex - startIndex ; long s = 0; long temp = 0 ; for(int i = startIndex ; i <= endIndex ; i++){ temp = bs[i] & 0xFF ;// 数据的最低位在低字节 if(temp < 0){ temp = Byte.MAX_VALUE * 2 + 1 + temp + 1 ; } if(count > 0){ temp <<= count * 8; } count-- ; s = s | temp ; } return s; } else { throw new Exception("bytes2Long_LE时数组越界"); } } // public static long bytes2Int_BE(byte[] bs, int from) throws Exception { // boolean b = isOutOfArrLength(bs.length, (from - 1) + 4); // if (!b) { // long s = 0; // long s0 = bs[from + 0] & 0xFF ;// 数据的最高位在低字节 // long s1 = bs[from + 1] & 0xFF ; // long s2 = bs[from + 2] & 0xFF ; // long s3 = bs[from + 3] & 0xFF ; // // // 最低位S3不变 // s0 <<= 24; // s1 <<= 16; // s2 <<= 8; // s = s0 | s1 | s2 | s3; // if(s < 0){ // //s = Integer.MAX_VALUE -s ; // s = Integer.MAX_VALUE * 2 + 1 + s + 1 ; // } // return s; // } else { // throw new Exception("byte2Int时数组越界"); // } // } /** * 大端模式《数据低位在数组高字节》 * 无符号short类型转换成2位byte数组 @@ -280,7 +363,7 @@ throw new Exception("bytes2Short时数组越界"); } } /** * 1位字节数组转换为短整型 @@ -292,7 +375,7 @@ if (bs.length - 1 < index) { throw new Exception("byte2Short(byte[] bs, int index)时数组越界"); } else { byte bv = (byte)(bs[index] & 0xff) ; byte bv = (byte)(bs[index] & 0xff) ; short s = 0 ; if(bv < 0){ s = (short)(Byte.MAX_VALUE * 2 + 1 + bv + 1) ; @@ -322,7 +405,7 @@ bs[index] = Integer.valueOf(value & 0xff).byteValue() ; } } /** * 判断所有字节是否为0xFF * @param bs 字节数组 @@ -343,7 +426,7 @@ /** * 判断数组下标是否越界 * * * @value bsLength 数组总长度 * @value toSite 数组偏移量 * @return 结果 @@ -355,27 +438,34 @@ return true; } } /* public static void main(String[] args) throws Exception{ // int d = 123456; // byte[] bs = new byte[4] ; // int2Bytes_BE(bs, d, 0) ; // System.out.println(ByteUtil.bytes2Hex(bs, false)); // long dd = bytes2Int_BE(bs, 0) ; // System.out.println(dd); // // byte[] bb = new byte[1] ; // bb[0] = (byte)255 ; // short s = byte2Byte(bb, 0); // System.out.println(s); byte[] bs = new byte[]{(byte)0x00, (byte)0x00, (byte)0x3A, (byte)0x88} ; //byte[] bs = new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff} ; boolean flag = ByteUtilUnsigned.bytesIsAll0xFF(bs, 0, 4) ; System.out.println(flag); Long s = ByteUtilUnsigned.bytes2Int_BE(bs, 0); System.out.println(s); byte[] bs = new byte[]{(byte)0x38,(byte)0x1d,(byte)0x00,(byte)0x00,(byte)0x00} ; Long lg1 = ByteUtilUnsigned.bytes2Long_LE(bs, 0, 4) ; Long lg2 = ByteUtilUnsigned.bytes2Long_BE(bs, 0, 4) ; System.out.println(lg1); System.out.println(lg2); } */ // public static void main(String[] args) throws Exception{ //// int d = 123456; //// byte[] bs = new byte[4] ; //// int2Bytes_BE(bs, d, 0) ; //// System.out.println(ByteUtil.bytes2Hex(bs, false)); //// long dd = bytes2Int_BE(bs, 0) ; //// System.out.println(dd); //// //// byte[] bb = new byte[1] ; //// bb[0] = (byte)255 ; //// short s = byte2Byte(bb, 0); //// System.out.println(s); // // byte[] bs = new byte[]{(byte)0x00, (byte)0x00, (byte)0x3A, (byte)0x88} ; // //byte[] bs = new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff} ; // boolean flag = ByteUtilUnsigned.bytesIsAll0xFF(bs, 0, 4) ; // System.out.println(flag); // Long s = ByteUtilUnsigned.bytes2Int_BE(bs, 0); // System.out.println(s); // // // } } pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V202404/TkFindComResponse.java
New file @@ -0,0 +1,32 @@ package com.dy.rtuMw.server.rtuData.p206V202404; import com.dy.common.mw.protocol.Data; import com.dy.rtuMw.server.rtuData.TaskSurpport; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; /** * @Author liurunyu * @Date 2024/5/8 14:18 * @Description 识别命令响应上报 */ public class TkFindComResponse extends TaskSurpport { private static final Logger log = LogManager.getLogger(TkFindComResponse.class.getName()) ; //类ID,一定与Tree.xml配置文件中配置一致 public static final String taskId = "TkFindComResponse" ; /** * 执行节点任务 * @param data 需要处理的数据 */ @Override public void execute(Object data) { Data d = (Data)data ; if(d.getCommandId() != null && d.getCommandId().trim().equals("")){ //无命令ID this.toNextTasks(data); } } } pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V202404/TkRtuDealCommandResponse.java
New file @@ -0,0 +1,47 @@ package com.dy.rtuMw.server.rtuData.p206V202404; import com.dy.common.mw.protocol.Data; import com.dy.common.mw.protocol.p206V1_0_0.DataV1_0_1; import com.dy.common.mw.protocol.p206V202404.DataV202404; import com.dy.rtuMw.server.rtuData.TaskSurpport; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; /** * @Author liurunyu * @Date 2024/5/8 14:18 * @Description 处理命令响应上报 */ public class TkRtuDealCommandResponse extends TaskSurpport { private static final Logger log = LogManager.getLogger(TkRtuDealCommandResponse.class.getName()) ; //类ID,一定与Tree.xml配置文件中配置一致 public static final String taskId = "TkRtuDealCommandResponse" ; /** * 执行节点任务:处理命令响应上报 * @param data 需要处理的数据 */ @Override public void execute(Object data) { Data d = (Data)data ; Object protocolData = d.getSubData() ; if(protocolData != null){ DataV202404 dV202404 = (DataV202404)protocolData ; if(dV202404 != null) { // if (dV1_0_1 != null && dV1_0_1.dataCdC0Vo != null) { // Object[] objs = this.getTaskResults(TkPreGenObjs.taskId) ; // DbSv sv = (DbSv)objs[0] ; // PrController controller = (PrController)objs[1] ; // try{ // this.saveOrUpdateLast(sv, controller, d.getRtuAddr(), dV1_0_1, dV1_0_1.dataCdC0Vo) ; // this.saveHistory(sv, controller, d.getRtuAddr(),dV1_0_1, dV1_0_1.dataCdC0Vo) ; // }catch (Exception e){ // log.error("保存控制器自报数据时发生异常", e); // } // } } } } } pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/RtuDataDealTree.xml
@@ -39,11 +39,6 @@ <!-- 识别非命令应答上行数据 --> <task id="TkFindReport" name="识别非命令应答上行数据" enable="true" class="com.dy.rtuMw.server.rtuData.p206V202404.TkFindReport"> <task id="TkDealAlarmStatus" name="控制器报警与状态数据" enable="true" class="com.dy.rtuMw.server.rtuData.p206V202404.TkDealAlarmStatus" /> <task id="TkDealAutoReport" name="控制器自报数据(整点报)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V202404.TkDealAutoReport" /> <task id="TkDealWorkReport" name="控制器阀开工作上报" enable="true" class="com.dy.rtuMw.server.rtuData.p206V202404.TkDealWorkReport" /> <task id="TkDealOpenValveReport" name="控制器开阀上报" enable="true" class="com.dy.rtuMw.server.rtuData.p206V202404.TkDealOpenValveReport" /> <task id="TkDealCloseValveReport" name="控制器关阀上报" enable="true" class="com.dy.rtuMw.server.rtuData.p206V202404.TkDealCloseValveReport" /> <task id="TkDealLoss" name="控制器漏损统计(待新协议出来后修改实现)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V202404.TkDealLoss" /> </task> <!-- 识别命令响应数据 --> <task id="TkFindComResponse" name="识别响应命令数据" enable="true" class="com.dy.rtuMw.server.rtuData.p206V202404.TkFindComResponse">