diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 8f90fd9..49d5afa 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -42,9 +42,20 @@ byte[] frameBytes = getFrameStringFromData(dataMap); log.info("HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); - BirmmBaseFrame birmmFrame = defaultService.dataParse(frameBytes); + BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); if (birmmFrame != null) { log.info("HEX字节消息解析成功:{}", birmmFrame); + + // 处理业务数据 + birmmFrame.doParseBizTag(); + + // 保存日志 + + // 保存业务数据 + + // 创建回复消息 +// String replyFrame = protocol + birmmFrame.reply(); } // 返回给电信AEP平台 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 8f90fd9..49d5afa 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -42,9 +42,20 @@ byte[] frameBytes = getFrameStringFromData(dataMap); log.info("HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); - BirmmBaseFrame birmmFrame = defaultService.dataParse(frameBytes); + BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); if (birmmFrame != null) { log.info("HEX字节消息解析成功:{}", birmmFrame); + + // 处理业务数据 + birmmFrame.doParseBizTag(); + + // 保存日志 + + // 保存业务数据 + + // 创建回复消息 +// String replyFrame = protocol + birmmFrame.reply(); } // 返回给电信AEP平台 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java index ae6706a..6a14f09 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java @@ -1,7 +1,10 @@ package com.casic.missiles.frame; import lombok.Data; + +import java.time.LocalDateTime; import java.util.List; +import java.util.Map; @Data public class BirmmBaseFrame { @@ -33,8 +36,16 @@ // 业务字段List String tagListString; - List tagList; +// List tagList; + Map tagList; // CRC String crc; + + LocalDateTime logTime; + + public void doParseBizTag() {} + + public void reply() {} + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 8f90fd9..49d5afa 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -42,9 +42,20 @@ byte[] frameBytes = getFrameStringFromData(dataMap); log.info("HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); - BirmmBaseFrame birmmFrame = defaultService.dataParse(frameBytes); + BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); if (birmmFrame != null) { log.info("HEX字节消息解析成功:{}", birmmFrame); + + // 处理业务数据 + birmmFrame.doParseBizTag(); + + // 保存日志 + + // 保存业务数据 + + // 创建回复消息 +// String replyFrame = protocol + birmmFrame.reply(); } // 返回给电信AEP平台 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java index ae6706a..6a14f09 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java @@ -1,7 +1,10 @@ package com.casic.missiles.frame; import lombok.Data; + +import java.time.LocalDateTime; import java.util.List; +import java.util.Map; @Data public class BirmmBaseFrame { @@ -33,8 +36,16 @@ // 业务字段List String tagListString; - List tagList; +// List tagList; + Map tagList; // CRC String crc; + + LocalDateTime logTime; + + public void doParseBizTag() {} + + public void reply() {} + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java index b1fd65c..b246fb9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java @@ -1,9 +1,27 @@ package com.casic.missiles.frame; +import com.casic.missiles.enums.BirmmDeviceTypeEnums; +import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; + public class BirmmFrameBuilderFactory { - public static BirmmBaseFrame createBirmmFrame(String pduType) { + public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); + if (type != null) { + switch (type) { + case METHANE: + return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + + case WELL: + return null; + + default: + return null; + } + + } return null; } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 8f90fd9..49d5afa 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -42,9 +42,20 @@ byte[] frameBytes = getFrameStringFromData(dataMap); log.info("HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); - BirmmBaseFrame birmmFrame = defaultService.dataParse(frameBytes); + BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); if (birmmFrame != null) { log.info("HEX字节消息解析成功:{}", birmmFrame); + + // 处理业务数据 + birmmFrame.doParseBizTag(); + + // 保存日志 + + // 保存业务数据 + + // 创建回复消息 +// String replyFrame = protocol + birmmFrame.reply(); } // 返回给电信AEP平台 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java index ae6706a..6a14f09 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java @@ -1,7 +1,10 @@ package com.casic.missiles.frame; import lombok.Data; + +import java.time.LocalDateTime; import java.util.List; +import java.util.Map; @Data public class BirmmBaseFrame { @@ -33,8 +36,16 @@ // 业务字段List String tagListString; - List tagList; +// List tagList; + Map tagList; // CRC String crc; + + LocalDateTime logTime; + + public void doParseBizTag() {} + + public void reply() {} + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java index b1fd65c..b246fb9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java @@ -1,9 +1,27 @@ package com.casic.missiles.frame; +import com.casic.missiles.enums.BirmmDeviceTypeEnums; +import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; + public class BirmmFrameBuilderFactory { - public static BirmmBaseFrame createBirmmFrame(String pduType) { + public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); + if (type != null) { + switch (type) { + case METHANE: + return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + + case WELL: + return null; + + default: + return null; + } + + } return null; } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java index 86db0a3..86c936b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java @@ -39,9 +39,17 @@ case LOWER_LIMIT_TAG: return new LowerLimitTag(); - case UPPER_LIMIMT_TAG: + case UPPER_LIMIT_TAG: return new UpperLimitTag(); + case SENSOR_STATE_1_TAG: + case SENSOR_STATE_2_TAG: + case SENSOR_STATE_3_TAG: + case SENSOR_STATE_4_TAG: + case SENSOR_STATE_5_TAG: + // 传感器状态 需要根据设备类型单独处理 + return new SensorStateTag(); + case CELL_TAG: return new CellTag(); @@ -61,6 +69,11 @@ return null; } } + + // 业务上传报表 + if (oid.startsWith("C")) { + return new UploadTag(); + } return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 8f90fd9..49d5afa 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -42,9 +42,20 @@ byte[] frameBytes = getFrameStringFromData(dataMap); log.info("HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); - BirmmBaseFrame birmmFrame = defaultService.dataParse(frameBytes); + BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); if (birmmFrame != null) { log.info("HEX字节消息解析成功:{}", birmmFrame); + + // 处理业务数据 + birmmFrame.doParseBizTag(); + + // 保存日志 + + // 保存业务数据 + + // 创建回复消息 +// String replyFrame = protocol + birmmFrame.reply(); } // 返回给电信AEP平台 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java index ae6706a..6a14f09 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java @@ -1,7 +1,10 @@ package com.casic.missiles.frame; import lombok.Data; + +import java.time.LocalDateTime; import java.util.List; +import java.util.Map; @Data public class BirmmBaseFrame { @@ -33,8 +36,16 @@ // 业务字段List String tagListString; - List tagList; +// List tagList; + Map tagList; // CRC String crc; + + LocalDateTime logTime; + + public void doParseBizTag() {} + + public void reply() {} + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java index b1fd65c..b246fb9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java @@ -1,9 +1,27 @@ package com.casic.missiles.frame; +import com.casic.missiles.enums.BirmmDeviceTypeEnums; +import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; + public class BirmmFrameBuilderFactory { - public static BirmmBaseFrame createBirmmFrame(String pduType) { + public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); + if (type != null) { + switch (type) { + case METHANE: + return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + + case WELL: + return null; + + default: + return null; + } + + } return null; } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java index 86db0a3..86c936b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java @@ -39,9 +39,17 @@ case LOWER_LIMIT_TAG: return new LowerLimitTag(); - case UPPER_LIMIMT_TAG: + case UPPER_LIMIT_TAG: return new UpperLimitTag(); + case SENSOR_STATE_1_TAG: + case SENSOR_STATE_2_TAG: + case SENSOR_STATE_3_TAG: + case SENSOR_STATE_4_TAG: + case SENSOR_STATE_5_TAG: + // 传感器状态 需要根据设备类型单独处理 + return new SensorStateTag(); + case CELL_TAG: return new CellTag(); @@ -61,6 +69,11 @@ return null; } } + + // 业务上传报表 + if (oid.startsWith("C")) { + return new UploadTag(); + } return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java new file mode 100644 index 0000000..304d7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java @@ -0,0 +1,7 @@ +package com.casic.missiles.frame.commanTag; + +import com.casic.missiles.frame.BirmmBaseTag; + +public class SensorStateTag extends BirmmBaseTag { + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 8f90fd9..49d5afa 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -42,9 +42,20 @@ byte[] frameBytes = getFrameStringFromData(dataMap); log.info("HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); - BirmmBaseFrame birmmFrame = defaultService.dataParse(frameBytes); + BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); if (birmmFrame != null) { log.info("HEX字节消息解析成功:{}", birmmFrame); + + // 处理业务数据 + birmmFrame.doParseBizTag(); + + // 保存日志 + + // 保存业务数据 + + // 创建回复消息 +// String replyFrame = protocol + birmmFrame.reply(); } // 返回给电信AEP平台 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java index ae6706a..6a14f09 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java @@ -1,7 +1,10 @@ package com.casic.missiles.frame; import lombok.Data; + +import java.time.LocalDateTime; import java.util.List; +import java.util.Map; @Data public class BirmmBaseFrame { @@ -33,8 +36,16 @@ // 业务字段List String tagListString; - List tagList; +// List tagList; + Map tagList; // CRC String crc; + + LocalDateTime logTime; + + public void doParseBizTag() {} + + public void reply() {} + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java index b1fd65c..b246fb9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java @@ -1,9 +1,27 @@ package com.casic.missiles.frame; +import com.casic.missiles.enums.BirmmDeviceTypeEnums; +import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; + public class BirmmFrameBuilderFactory { - public static BirmmBaseFrame createBirmmFrame(String pduType) { + public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); + if (type != null) { + switch (type) { + case METHANE: + return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + + case WELL: + return null; + + default: + return null; + } + + } return null; } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java index 86db0a3..86c936b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java @@ -39,9 +39,17 @@ case LOWER_LIMIT_TAG: return new LowerLimitTag(); - case UPPER_LIMIMT_TAG: + case UPPER_LIMIT_TAG: return new UpperLimitTag(); + case SENSOR_STATE_1_TAG: + case SENSOR_STATE_2_TAG: + case SENSOR_STATE_3_TAG: + case SENSOR_STATE_4_TAG: + case SENSOR_STATE_5_TAG: + // 传感器状态 需要根据设备类型单独处理 + return new SensorStateTag(); + case CELL_TAG: return new CellTag(); @@ -61,6 +69,11 @@ return null; } } + + // 业务上传报表 + if (oid.startsWith("C")) { + return new UploadTag(); + } return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java new file mode 100644 index 0000000..304d7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java @@ -0,0 +1,7 @@ +package com.casic.missiles.frame.commanTag; + +import com.casic.missiles.frame.BirmmBaseTag; + +public class SensorStateTag extends BirmmBaseTag { + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java new file mode 100644 index 0000000..da4073b --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java @@ -0,0 +1,47 @@ +package com.casic.missiles.frame.commanTag; + +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@EqualsAndHashCode(callSuper = true) +@Data +public class UploadTag extends BirmmBaseTag { + + private int bizType; + private int interval; + private int startMin; + private LocalDateTime startTime; + + @Override + public String toString() { + return super.toString(); + } + + public void checkOid() { + long oidValue = Long.parseLong(getOid(), 16); + bizType = (int) (((oidValue >> 24) & 0x0F) | ((oidValue >> 18) & 0x30)); + interval = (int) ((oidValue >> 11) & 0x7FF); + startMin = (int) (oidValue & 0x7FF); + + int hour = startMin / 60; + int minute = startMin % 60; + + startTime = LocalDateTime.of(2000, 1, 1, hour, minute, 0); + } + + public void setStartDate(String dateStr) { + LocalDate date = LocalDate.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd")); + setStartDate(date); + } + + public void setStartDate(LocalDate date) { + startTime = startTime.withYear(date.getYear()); + startTime = startTime.withMonth(date.getMonthValue()); + startTime = startTime.withDayOfMonth(date.getDayOfMonth()); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 8f90fd9..49d5afa 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -42,9 +42,20 @@ byte[] frameBytes = getFrameStringFromData(dataMap); log.info("HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); - BirmmBaseFrame birmmFrame = defaultService.dataParse(frameBytes); + BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); if (birmmFrame != null) { log.info("HEX字节消息解析成功:{}", birmmFrame); + + // 处理业务数据 + birmmFrame.doParseBizTag(); + + // 保存日志 + + // 保存业务数据 + + // 创建回复消息 +// String replyFrame = protocol + birmmFrame.reply(); } // 返回给电信AEP平台 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java index ae6706a..6a14f09 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java @@ -1,7 +1,10 @@ package com.casic.missiles.frame; import lombok.Data; + +import java.time.LocalDateTime; import java.util.List; +import java.util.Map; @Data public class BirmmBaseFrame { @@ -33,8 +36,16 @@ // 业务字段List String tagListString; - List tagList; +// List tagList; + Map tagList; // CRC String crc; + + LocalDateTime logTime; + + public void doParseBizTag() {} + + public void reply() {} + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java index b1fd65c..b246fb9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java @@ -1,9 +1,27 @@ package com.casic.missiles.frame; +import com.casic.missiles.enums.BirmmDeviceTypeEnums; +import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; + public class BirmmFrameBuilderFactory { - public static BirmmBaseFrame createBirmmFrame(String pduType) { + public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); + if (type != null) { + switch (type) { + case METHANE: + return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + + case WELL: + return null; + + default: + return null; + } + + } return null; } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java index 86db0a3..86c936b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java @@ -39,9 +39,17 @@ case LOWER_LIMIT_TAG: return new LowerLimitTag(); - case UPPER_LIMIMT_TAG: + case UPPER_LIMIT_TAG: return new UpperLimitTag(); + case SENSOR_STATE_1_TAG: + case SENSOR_STATE_2_TAG: + case SENSOR_STATE_3_TAG: + case SENSOR_STATE_4_TAG: + case SENSOR_STATE_5_TAG: + // 传感器状态 需要根据设备类型单独处理 + return new SensorStateTag(); + case CELL_TAG: return new CellTag(); @@ -61,6 +69,11 @@ return null; } } + + // 业务上传报表 + if (oid.startsWith("C")) { + return new UploadTag(); + } return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java new file mode 100644 index 0000000..304d7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java @@ -0,0 +1,7 @@ +package com.casic.missiles.frame.commanTag; + +import com.casic.missiles.frame.BirmmBaseTag; + +public class SensorStateTag extends BirmmBaseTag { + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java new file mode 100644 index 0000000..da4073b --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java @@ -0,0 +1,47 @@ +package com.casic.missiles.frame.commanTag; + +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@EqualsAndHashCode(callSuper = true) +@Data +public class UploadTag extends BirmmBaseTag { + + private int bizType; + private int interval; + private int startMin; + private LocalDateTime startTime; + + @Override + public String toString() { + return super.toString(); + } + + public void checkOid() { + long oidValue = Long.parseLong(getOid(), 16); + bizType = (int) (((oidValue >> 24) & 0x0F) | ((oidValue >> 18) & 0x30)); + interval = (int) ((oidValue >> 11) & 0x7FF); + startMin = (int) (oidValue & 0x7FF); + + int hour = startMin / 60; + int minute = startMin % 60; + + startTime = LocalDateTime.of(2000, 1, 1, hour, minute, 0); + } + + public void setStartDate(String dateStr) { + LocalDate date = LocalDate.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd")); + setStartDate(date); + } + + public void setStartDate(LocalDate date) { + startTime = startTime.withYear(date.getYear()); + startTime = startTime.withMonth(date.getMonthValue()); + startTime = startTime.withDayOfMonth(date.getDayOfMonth()); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java new file mode 100644 index 0000000..43f75af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java @@ -0,0 +1,19 @@ +package com.casic.missiles.frame.methane; + +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class MethaneBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) + "][" + value + "][" + bizType + "]"; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 8f90fd9..49d5afa 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -42,9 +42,20 @@ byte[] frameBytes = getFrameStringFromData(dataMap); log.info("HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); - BirmmBaseFrame birmmFrame = defaultService.dataParse(frameBytes); + BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); if (birmmFrame != null) { log.info("HEX字节消息解析成功:{}", birmmFrame); + + // 处理业务数据 + birmmFrame.doParseBizTag(); + + // 保存日志 + + // 保存业务数据 + + // 创建回复消息 +// String replyFrame = protocol + birmmFrame.reply(); } // 返回给电信AEP平台 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java index ae6706a..6a14f09 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java @@ -1,7 +1,10 @@ package com.casic.missiles.frame; import lombok.Data; + +import java.time.LocalDateTime; import java.util.List; +import java.util.Map; @Data public class BirmmBaseFrame { @@ -33,8 +36,16 @@ // 业务字段List String tagListString; - List tagList; +// List tagList; + Map tagList; // CRC String crc; + + LocalDateTime logTime; + + public void doParseBizTag() {} + + public void reply() {} + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java index b1fd65c..b246fb9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java @@ -1,9 +1,27 @@ package com.casic.missiles.frame; +import com.casic.missiles.enums.BirmmDeviceTypeEnums; +import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; + public class BirmmFrameBuilderFactory { - public static BirmmBaseFrame createBirmmFrame(String pduType) { + public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); + if (type != null) { + switch (type) { + case METHANE: + return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + + case WELL: + return null; + + default: + return null; + } + + } return null; } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java index 86db0a3..86c936b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java @@ -39,9 +39,17 @@ case LOWER_LIMIT_TAG: return new LowerLimitTag(); - case UPPER_LIMIMT_TAG: + case UPPER_LIMIT_TAG: return new UpperLimitTag(); + case SENSOR_STATE_1_TAG: + case SENSOR_STATE_2_TAG: + case SENSOR_STATE_3_TAG: + case SENSOR_STATE_4_TAG: + case SENSOR_STATE_5_TAG: + // 传感器状态 需要根据设备类型单独处理 + return new SensorStateTag(); + case CELL_TAG: return new CellTag(); @@ -61,6 +69,11 @@ return null; } } + + // 业务上传报表 + if (oid.startsWith("C")) { + return new UploadTag(); + } return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java new file mode 100644 index 0000000..304d7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java @@ -0,0 +1,7 @@ +package com.casic.missiles.frame.commanTag; + +import com.casic.missiles.frame.BirmmBaseTag; + +public class SensorStateTag extends BirmmBaseTag { + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java new file mode 100644 index 0000000..da4073b --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java @@ -0,0 +1,47 @@ +package com.casic.missiles.frame.commanTag; + +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@EqualsAndHashCode(callSuper = true) +@Data +public class UploadTag extends BirmmBaseTag { + + private int bizType; + private int interval; + private int startMin; + private LocalDateTime startTime; + + @Override + public String toString() { + return super.toString(); + } + + public void checkOid() { + long oidValue = Long.parseLong(getOid(), 16); + bizType = (int) (((oidValue >> 24) & 0x0F) | ((oidValue >> 18) & 0x30)); + interval = (int) ((oidValue >> 11) & 0x7FF); + startMin = (int) (oidValue & 0x7FF); + + int hour = startMin / 60; + int minute = startMin % 60; + + startTime = LocalDateTime.of(2000, 1, 1, hour, minute, 0); + } + + public void setStartDate(String dateStr) { + LocalDate date = LocalDate.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd")); + setStartDate(date); + } + + public void setStartDate(LocalDate date) { + startTime = startTime.withYear(date.getYear()); + startTime = startTime.withMonth(date.getMonthValue()); + startTime = startTime.withDayOfMonth(date.getDayOfMonth()); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java new file mode 100644 index 0000000..43f75af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java @@ -0,0 +1,19 @@ +package com.casic.missiles.frame.methane; + +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class MethaneBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) + "][" + value + "][" + bizType + "]"; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java new file mode 100644 index 0000000..76cfe45 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java @@ -0,0 +1,28 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; + +public class MethaneFrameBuilderFactory { + + public static BirmmBaseFrame createMethaneFrameByOperation(String operaType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); + if (operation != null) { + switch (operation) { + case UP_TRAP_REQUEST: + return new MethaneTrapRequestFrame(); + + case UP_ONLINE_REQUEST: + return new MethaneOnlineRequestFrame(); + + case UP_SET_RESPONSE: + return new MethaneSetResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 8f90fd9..49d5afa 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -42,9 +42,20 @@ byte[] frameBytes = getFrameStringFromData(dataMap); log.info("HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); - BirmmBaseFrame birmmFrame = defaultService.dataParse(frameBytes); + BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); if (birmmFrame != null) { log.info("HEX字节消息解析成功:{}", birmmFrame); + + // 处理业务数据 + birmmFrame.doParseBizTag(); + + // 保存日志 + + // 保存业务数据 + + // 创建回复消息 +// String replyFrame = protocol + birmmFrame.reply(); } // 返回给电信AEP平台 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java index ae6706a..6a14f09 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java @@ -1,7 +1,10 @@ package com.casic.missiles.frame; import lombok.Data; + +import java.time.LocalDateTime; import java.util.List; +import java.util.Map; @Data public class BirmmBaseFrame { @@ -33,8 +36,16 @@ // 业务字段List String tagListString; - List tagList; +// List tagList; + Map tagList; // CRC String crc; + + LocalDateTime logTime; + + public void doParseBizTag() {} + + public void reply() {} + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java index b1fd65c..b246fb9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java @@ -1,9 +1,27 @@ package com.casic.missiles.frame; +import com.casic.missiles.enums.BirmmDeviceTypeEnums; +import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; + public class BirmmFrameBuilderFactory { - public static BirmmBaseFrame createBirmmFrame(String pduType) { + public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); + if (type != null) { + switch (type) { + case METHANE: + return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + + case WELL: + return null; + + default: + return null; + } + + } return null; } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java index 86db0a3..86c936b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java @@ -39,9 +39,17 @@ case LOWER_LIMIT_TAG: return new LowerLimitTag(); - case UPPER_LIMIMT_TAG: + case UPPER_LIMIT_TAG: return new UpperLimitTag(); + case SENSOR_STATE_1_TAG: + case SENSOR_STATE_2_TAG: + case SENSOR_STATE_3_TAG: + case SENSOR_STATE_4_TAG: + case SENSOR_STATE_5_TAG: + // 传感器状态 需要根据设备类型单独处理 + return new SensorStateTag(); + case CELL_TAG: return new CellTag(); @@ -61,6 +69,11 @@ return null; } } + + // 业务上传报表 + if (oid.startsWith("C")) { + return new UploadTag(); + } return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java new file mode 100644 index 0000000..304d7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java @@ -0,0 +1,7 @@ +package com.casic.missiles.frame.commanTag; + +import com.casic.missiles.frame.BirmmBaseTag; + +public class SensorStateTag extends BirmmBaseTag { + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java new file mode 100644 index 0000000..da4073b --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java @@ -0,0 +1,47 @@ +package com.casic.missiles.frame.commanTag; + +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@EqualsAndHashCode(callSuper = true) +@Data +public class UploadTag extends BirmmBaseTag { + + private int bizType; + private int interval; + private int startMin; + private LocalDateTime startTime; + + @Override + public String toString() { + return super.toString(); + } + + public void checkOid() { + long oidValue = Long.parseLong(getOid(), 16); + bizType = (int) (((oidValue >> 24) & 0x0F) | ((oidValue >> 18) & 0x30)); + interval = (int) ((oidValue >> 11) & 0x7FF); + startMin = (int) (oidValue & 0x7FF); + + int hour = startMin / 60; + int minute = startMin % 60; + + startTime = LocalDateTime.of(2000, 1, 1, hour, minute, 0); + } + + public void setStartDate(String dateStr) { + LocalDate date = LocalDate.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd")); + setStartDate(date); + } + + public void setStartDate(LocalDate date) { + startTime = startTime.withYear(date.getYear()); + startTime = startTime.withMonth(date.getMonthValue()); + startTime = startTime.withDayOfMonth(date.getDayOfMonth()); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java new file mode 100644 index 0000000..43f75af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java @@ -0,0 +1,19 @@ +package com.casic.missiles.frame.methane; + +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class MethaneBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) + "][" + value + "][" + bizType + "]"; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java new file mode 100644 index 0000000..76cfe45 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java @@ -0,0 +1,28 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; + +public class MethaneFrameBuilderFactory { + + public static BirmmBaseFrame createMethaneFrameByOperation(String operaType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); + if (operation != null) { + switch (operation) { + case UP_TRAP_REQUEST: + return new MethaneTrapRequestFrame(); + + case UP_ONLINE_REQUEST: + return new MethaneOnlineRequestFrame(); + + case UP_SET_RESPONSE: + return new MethaneSetResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 47fd65b..deeb421 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,4 +1,6 @@ package com.casic.missiles.frame.methane; -public class MethaneSetResponseFrame { +import com.casic.missiles.frame.BirmmBaseFrame; + +public class MethaneSetResponseFrame extends BirmmBaseFrame { } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 8f90fd9..49d5afa 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -42,9 +42,20 @@ byte[] frameBytes = getFrameStringFromData(dataMap); log.info("HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); - BirmmBaseFrame birmmFrame = defaultService.dataParse(frameBytes); + BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); if (birmmFrame != null) { log.info("HEX字节消息解析成功:{}", birmmFrame); + + // 处理业务数据 + birmmFrame.doParseBizTag(); + + // 保存日志 + + // 保存业务数据 + + // 创建回复消息 +// String replyFrame = protocol + birmmFrame.reply(); } // 返回给电信AEP平台 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java index ae6706a..6a14f09 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java @@ -1,7 +1,10 @@ package com.casic.missiles.frame; import lombok.Data; + +import java.time.LocalDateTime; import java.util.List; +import java.util.Map; @Data public class BirmmBaseFrame { @@ -33,8 +36,16 @@ // 业务字段List String tagListString; - List tagList; +// List tagList; + Map tagList; // CRC String crc; + + LocalDateTime logTime; + + public void doParseBizTag() {} + + public void reply() {} + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java index b1fd65c..b246fb9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java @@ -1,9 +1,27 @@ package com.casic.missiles.frame; +import com.casic.missiles.enums.BirmmDeviceTypeEnums; +import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; + public class BirmmFrameBuilderFactory { - public static BirmmBaseFrame createBirmmFrame(String pduType) { + public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); + if (type != null) { + switch (type) { + case METHANE: + return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + + case WELL: + return null; + + default: + return null; + } + + } return null; } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java index 86db0a3..86c936b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java @@ -39,9 +39,17 @@ case LOWER_LIMIT_TAG: return new LowerLimitTag(); - case UPPER_LIMIMT_TAG: + case UPPER_LIMIT_TAG: return new UpperLimitTag(); + case SENSOR_STATE_1_TAG: + case SENSOR_STATE_2_TAG: + case SENSOR_STATE_3_TAG: + case SENSOR_STATE_4_TAG: + case SENSOR_STATE_5_TAG: + // 传感器状态 需要根据设备类型单独处理 + return new SensorStateTag(); + case CELL_TAG: return new CellTag(); @@ -61,6 +69,11 @@ return null; } } + + // 业务上传报表 + if (oid.startsWith("C")) { + return new UploadTag(); + } return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java new file mode 100644 index 0000000..304d7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java @@ -0,0 +1,7 @@ +package com.casic.missiles.frame.commanTag; + +import com.casic.missiles.frame.BirmmBaseTag; + +public class SensorStateTag extends BirmmBaseTag { + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java new file mode 100644 index 0000000..da4073b --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java @@ -0,0 +1,47 @@ +package com.casic.missiles.frame.commanTag; + +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@EqualsAndHashCode(callSuper = true) +@Data +public class UploadTag extends BirmmBaseTag { + + private int bizType; + private int interval; + private int startMin; + private LocalDateTime startTime; + + @Override + public String toString() { + return super.toString(); + } + + public void checkOid() { + long oidValue = Long.parseLong(getOid(), 16); + bizType = (int) (((oidValue >> 24) & 0x0F) | ((oidValue >> 18) & 0x30)); + interval = (int) ((oidValue >> 11) & 0x7FF); + startMin = (int) (oidValue & 0x7FF); + + int hour = startMin / 60; + int minute = startMin % 60; + + startTime = LocalDateTime.of(2000, 1, 1, hour, minute, 0); + } + + public void setStartDate(String dateStr) { + LocalDate date = LocalDate.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd")); + setStartDate(date); + } + + public void setStartDate(LocalDate date) { + startTime = startTime.withYear(date.getYear()); + startTime = startTime.withMonth(date.getMonthValue()); + startTime = startTime.withDayOfMonth(date.getDayOfMonth()); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java new file mode 100644 index 0000000..43f75af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java @@ -0,0 +1,19 @@ +package com.casic.missiles.frame.methane; + +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class MethaneBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) + "][" + value + "][" + bizType + "]"; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java new file mode 100644 index 0000000..76cfe45 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java @@ -0,0 +1,28 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; + +public class MethaneFrameBuilderFactory { + + public static BirmmBaseFrame createMethaneFrameByOperation(String operaType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); + if (operation != null) { + switch (operation) { + case UP_TRAP_REQUEST: + return new MethaneTrapRequestFrame(); + + case UP_ONLINE_REQUEST: + return new MethaneOnlineRequestFrame(); + + case UP_SET_RESPONSE: + return new MethaneSetResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 47fd65b..deeb421 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,4 +1,6 @@ package com.casic.missiles.frame.methane; -public class MethaneSetResponseFrame { +import com.casic.missiles.frame.BirmmBaseFrame; + +public class MethaneSetResponseFrame extends BirmmBaseFrame { } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java index 1f4d831..34a4cd9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java @@ -1,6 +1,69 @@ package com.casic.missiles.frame.methane; +import com.casic.missiles.enums.BirmmTagAttributeEnums; import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.commanTag.DateTag; +import com.casic.missiles.frame.commanTag.SensorStateTag; +import com.casic.missiles.frame.commanTag.UploadTag; +import com.casic.missiles.util.BytesUtil; +import lombok.extern.slf4j.Slf4j; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Slf4j public class MethaneTrapRequestFrame extends BirmmBaseFrame { + + private List bizDataList; + + @Override + public String toString() { + return ""; + } + + @Override + public void doParseBizTag() { + if (getTagList().containsKey(UploadTag.class.getSimpleName())) { + handleUploadTag(); + } + + if (getTagList().containsKey(SensorStateTag.class.getSimpleName())) { + handleSensorStateTag(); + } + } + + private void handleUploadTag() { + UploadTag uploadTag = (UploadTag) getTagList().get(UploadTag.class.getSimpleName()); + uploadTag.checkOid(); + + // 找到DateTag 取出其中的日期 + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()); + uploadTag.setStartDate(dateTag.getDate()); + + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + bizDataList = new ArrayList<>(); + for (int i = 0; i < count; i++) { + MethaneBizData bizData = new MethaneBizData(); + + bizData.setBizType(uploadTag.getBizType()); + bizData.setUptime(start); + String hexReversStr = BytesUtil.reverseHexString(uploadTag.getValueStr().substring(i * 4 * 2, (i + 1) * 4 * 2)); + bizData.setValue(BytesUtil.hexStringToFloat(hexReversStr)); + + bizDataList.add(bizData); + + // 加上时间间隔 + start = start.plusMinutes(uploadTag.getInterval()); + } + } + + private void handleSensorStateTag() { + SensorStateTag sensorStateTag = (SensorStateTag) getTagList().get(SensorStateTag.class.getSimpleName()); + if (sensorStateTag.getOid().equals(BirmmTagAttributeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 8f90fd9..49d5afa 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -42,9 +42,20 @@ byte[] frameBytes = getFrameStringFromData(dataMap); log.info("HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); - BirmmBaseFrame birmmFrame = defaultService.dataParse(frameBytes); + BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); if (birmmFrame != null) { log.info("HEX字节消息解析成功:{}", birmmFrame); + + // 处理业务数据 + birmmFrame.doParseBizTag(); + + // 保存日志 + + // 保存业务数据 + + // 创建回复消息 +// String replyFrame = protocol + birmmFrame.reply(); } // 返回给电信AEP平台 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java index ae6706a..6a14f09 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java @@ -1,7 +1,10 @@ package com.casic.missiles.frame; import lombok.Data; + +import java.time.LocalDateTime; import java.util.List; +import java.util.Map; @Data public class BirmmBaseFrame { @@ -33,8 +36,16 @@ // 业务字段List String tagListString; - List tagList; +// List tagList; + Map tagList; // CRC String crc; + + LocalDateTime logTime; + + public void doParseBizTag() {} + + public void reply() {} + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java index b1fd65c..b246fb9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java @@ -1,9 +1,27 @@ package com.casic.missiles.frame; +import com.casic.missiles.enums.BirmmDeviceTypeEnums; +import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; + public class BirmmFrameBuilderFactory { - public static BirmmBaseFrame createBirmmFrame(String pduType) { + public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); + if (type != null) { + switch (type) { + case METHANE: + return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + + case WELL: + return null; + + default: + return null; + } + + } return null; } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java index 86db0a3..86c936b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java @@ -39,9 +39,17 @@ case LOWER_LIMIT_TAG: return new LowerLimitTag(); - case UPPER_LIMIMT_TAG: + case UPPER_LIMIT_TAG: return new UpperLimitTag(); + case SENSOR_STATE_1_TAG: + case SENSOR_STATE_2_TAG: + case SENSOR_STATE_3_TAG: + case SENSOR_STATE_4_TAG: + case SENSOR_STATE_5_TAG: + // 传感器状态 需要根据设备类型单独处理 + return new SensorStateTag(); + case CELL_TAG: return new CellTag(); @@ -61,6 +69,11 @@ return null; } } + + // 业务上传报表 + if (oid.startsWith("C")) { + return new UploadTag(); + } return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java new file mode 100644 index 0000000..304d7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java @@ -0,0 +1,7 @@ +package com.casic.missiles.frame.commanTag; + +import com.casic.missiles.frame.BirmmBaseTag; + +public class SensorStateTag extends BirmmBaseTag { + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java new file mode 100644 index 0000000..da4073b --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java @@ -0,0 +1,47 @@ +package com.casic.missiles.frame.commanTag; + +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@EqualsAndHashCode(callSuper = true) +@Data +public class UploadTag extends BirmmBaseTag { + + private int bizType; + private int interval; + private int startMin; + private LocalDateTime startTime; + + @Override + public String toString() { + return super.toString(); + } + + public void checkOid() { + long oidValue = Long.parseLong(getOid(), 16); + bizType = (int) (((oidValue >> 24) & 0x0F) | ((oidValue >> 18) & 0x30)); + interval = (int) ((oidValue >> 11) & 0x7FF); + startMin = (int) (oidValue & 0x7FF); + + int hour = startMin / 60; + int minute = startMin % 60; + + startTime = LocalDateTime.of(2000, 1, 1, hour, minute, 0); + } + + public void setStartDate(String dateStr) { + LocalDate date = LocalDate.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd")); + setStartDate(date); + } + + public void setStartDate(LocalDate date) { + startTime = startTime.withYear(date.getYear()); + startTime = startTime.withMonth(date.getMonthValue()); + startTime = startTime.withDayOfMonth(date.getDayOfMonth()); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java new file mode 100644 index 0000000..43f75af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java @@ -0,0 +1,19 @@ +package com.casic.missiles.frame.methane; + +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class MethaneBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) + "][" + value + "][" + bizType + "]"; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java new file mode 100644 index 0000000..76cfe45 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java @@ -0,0 +1,28 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; + +public class MethaneFrameBuilderFactory { + + public static BirmmBaseFrame createMethaneFrameByOperation(String operaType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); + if (operation != null) { + switch (operation) { + case UP_TRAP_REQUEST: + return new MethaneTrapRequestFrame(); + + case UP_ONLINE_REQUEST: + return new MethaneOnlineRequestFrame(); + + case UP_SET_RESPONSE: + return new MethaneSetResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 47fd65b..deeb421 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,4 +1,6 @@ package com.casic.missiles.frame.methane; -public class MethaneSetResponseFrame { +import com.casic.missiles.frame.BirmmBaseFrame; + +public class MethaneSetResponseFrame extends BirmmBaseFrame { } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java index 1f4d831..34a4cd9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java @@ -1,6 +1,69 @@ package com.casic.missiles.frame.methane; +import com.casic.missiles.enums.BirmmTagAttributeEnums; import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.commanTag.DateTag; +import com.casic.missiles.frame.commanTag.SensorStateTag; +import com.casic.missiles.frame.commanTag.UploadTag; +import com.casic.missiles.util.BytesUtil; +import lombok.extern.slf4j.Slf4j; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Slf4j public class MethaneTrapRequestFrame extends BirmmBaseFrame { + + private List bizDataList; + + @Override + public String toString() { + return ""; + } + + @Override + public void doParseBizTag() { + if (getTagList().containsKey(UploadTag.class.getSimpleName())) { + handleUploadTag(); + } + + if (getTagList().containsKey(SensorStateTag.class.getSimpleName())) { + handleSensorStateTag(); + } + } + + private void handleUploadTag() { + UploadTag uploadTag = (UploadTag) getTagList().get(UploadTag.class.getSimpleName()); + uploadTag.checkOid(); + + // 找到DateTag 取出其中的日期 + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()); + uploadTag.setStartDate(dateTag.getDate()); + + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + bizDataList = new ArrayList<>(); + for (int i = 0; i < count; i++) { + MethaneBizData bizData = new MethaneBizData(); + + bizData.setBizType(uploadTag.getBizType()); + bizData.setUptime(start); + String hexReversStr = BytesUtil.reverseHexString(uploadTag.getValueStr().substring(i * 4 * 2, (i + 1) * 4 * 2)); + bizData.setValue(BytesUtil.hexStringToFloat(hexReversStr)); + + bizDataList.add(bizData); + + // 加上时间间隔 + start = start.plusMinutes(uploadTag.getInterval()); + } + } + + private void handleSensorStateTag() { + SensorStateTag sensorStateTag = (SensorStateTag) getTagList().get(SensorStateTag.class.getSimpleName()); + if (sensorStateTag.getOid().equals(BirmmTagAttributeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java index d29e372..a7daf4d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java @@ -3,6 +3,7 @@ import com.casic.missiles.frame.BirmmBaseTag; import java.util.List; +import java.util.Map; /** * BIRMM系列设备 @@ -27,11 +28,14 @@ String getDestinationAddr(byte[] frameBytes); String getPDUType(byte[] frameBytes); + byte[] getPDUTypeBytes(byte[] frameBytes); + String getDeviceType(byte[] pduTypeBytes); + String getOperaType(byte[] pduTypeBytes); String getSequence(byte[] frameBytes); String getTagListString(byte[] frameBytes); - List getTagList(byte[] tagBytes); + Map getTagList(byte[] tagBytes); String getCRC(byte[] frameBytes); String getToBeVerifiedCRCBytes(byte[] frameBytes); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 8f90fd9..49d5afa 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -42,9 +42,20 @@ byte[] frameBytes = getFrameStringFromData(dataMap); log.info("HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); - BirmmBaseFrame birmmFrame = defaultService.dataParse(frameBytes); + BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); if (birmmFrame != null) { log.info("HEX字节消息解析成功:{}", birmmFrame); + + // 处理业务数据 + birmmFrame.doParseBizTag(); + + // 保存日志 + + // 保存业务数据 + + // 创建回复消息 +// String replyFrame = protocol + birmmFrame.reply(); } // 返回给电信AEP平台 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java index ae6706a..6a14f09 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java @@ -1,7 +1,10 @@ package com.casic.missiles.frame; import lombok.Data; + +import java.time.LocalDateTime; import java.util.List; +import java.util.Map; @Data public class BirmmBaseFrame { @@ -33,8 +36,16 @@ // 业务字段List String tagListString; - List tagList; +// List tagList; + Map tagList; // CRC String crc; + + LocalDateTime logTime; + + public void doParseBizTag() {} + + public void reply() {} + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java index b1fd65c..b246fb9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java @@ -1,9 +1,27 @@ package com.casic.missiles.frame; +import com.casic.missiles.enums.BirmmDeviceTypeEnums; +import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; + public class BirmmFrameBuilderFactory { - public static BirmmBaseFrame createBirmmFrame(String pduType) { + public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); + if (type != null) { + switch (type) { + case METHANE: + return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + + case WELL: + return null; + + default: + return null; + } + + } return null; } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java index 86db0a3..86c936b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java @@ -39,9 +39,17 @@ case LOWER_LIMIT_TAG: return new LowerLimitTag(); - case UPPER_LIMIMT_TAG: + case UPPER_LIMIT_TAG: return new UpperLimitTag(); + case SENSOR_STATE_1_TAG: + case SENSOR_STATE_2_TAG: + case SENSOR_STATE_3_TAG: + case SENSOR_STATE_4_TAG: + case SENSOR_STATE_5_TAG: + // 传感器状态 需要根据设备类型单独处理 + return new SensorStateTag(); + case CELL_TAG: return new CellTag(); @@ -61,6 +69,11 @@ return null; } } + + // 业务上传报表 + if (oid.startsWith("C")) { + return new UploadTag(); + } return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java new file mode 100644 index 0000000..304d7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java @@ -0,0 +1,7 @@ +package com.casic.missiles.frame.commanTag; + +import com.casic.missiles.frame.BirmmBaseTag; + +public class SensorStateTag extends BirmmBaseTag { + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java new file mode 100644 index 0000000..da4073b --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java @@ -0,0 +1,47 @@ +package com.casic.missiles.frame.commanTag; + +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@EqualsAndHashCode(callSuper = true) +@Data +public class UploadTag extends BirmmBaseTag { + + private int bizType; + private int interval; + private int startMin; + private LocalDateTime startTime; + + @Override + public String toString() { + return super.toString(); + } + + public void checkOid() { + long oidValue = Long.parseLong(getOid(), 16); + bizType = (int) (((oidValue >> 24) & 0x0F) | ((oidValue >> 18) & 0x30)); + interval = (int) ((oidValue >> 11) & 0x7FF); + startMin = (int) (oidValue & 0x7FF); + + int hour = startMin / 60; + int minute = startMin % 60; + + startTime = LocalDateTime.of(2000, 1, 1, hour, minute, 0); + } + + public void setStartDate(String dateStr) { + LocalDate date = LocalDate.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd")); + setStartDate(date); + } + + public void setStartDate(LocalDate date) { + startTime = startTime.withYear(date.getYear()); + startTime = startTime.withMonth(date.getMonthValue()); + startTime = startTime.withDayOfMonth(date.getDayOfMonth()); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java new file mode 100644 index 0000000..43f75af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java @@ -0,0 +1,19 @@ +package com.casic.missiles.frame.methane; + +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class MethaneBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) + "][" + value + "][" + bizType + "]"; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java new file mode 100644 index 0000000..76cfe45 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java @@ -0,0 +1,28 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; + +public class MethaneFrameBuilderFactory { + + public static BirmmBaseFrame createMethaneFrameByOperation(String operaType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); + if (operation != null) { + switch (operation) { + case UP_TRAP_REQUEST: + return new MethaneTrapRequestFrame(); + + case UP_ONLINE_REQUEST: + return new MethaneOnlineRequestFrame(); + + case UP_SET_RESPONSE: + return new MethaneSetResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 47fd65b..deeb421 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,4 +1,6 @@ package com.casic.missiles.frame.methane; -public class MethaneSetResponseFrame { +import com.casic.missiles.frame.BirmmBaseFrame; + +public class MethaneSetResponseFrame extends BirmmBaseFrame { } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java index 1f4d831..34a4cd9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java @@ -1,6 +1,69 @@ package com.casic.missiles.frame.methane; +import com.casic.missiles.enums.BirmmTagAttributeEnums; import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.commanTag.DateTag; +import com.casic.missiles.frame.commanTag.SensorStateTag; +import com.casic.missiles.frame.commanTag.UploadTag; +import com.casic.missiles.util.BytesUtil; +import lombok.extern.slf4j.Slf4j; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Slf4j public class MethaneTrapRequestFrame extends BirmmBaseFrame { + + private List bizDataList; + + @Override + public String toString() { + return ""; + } + + @Override + public void doParseBizTag() { + if (getTagList().containsKey(UploadTag.class.getSimpleName())) { + handleUploadTag(); + } + + if (getTagList().containsKey(SensorStateTag.class.getSimpleName())) { + handleSensorStateTag(); + } + } + + private void handleUploadTag() { + UploadTag uploadTag = (UploadTag) getTagList().get(UploadTag.class.getSimpleName()); + uploadTag.checkOid(); + + // 找到DateTag 取出其中的日期 + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()); + uploadTag.setStartDate(dateTag.getDate()); + + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + bizDataList = new ArrayList<>(); + for (int i = 0; i < count; i++) { + MethaneBizData bizData = new MethaneBizData(); + + bizData.setBizType(uploadTag.getBizType()); + bizData.setUptime(start); + String hexReversStr = BytesUtil.reverseHexString(uploadTag.getValueStr().substring(i * 4 * 2, (i + 1) * 4 * 2)); + bizData.setValue(BytesUtil.hexStringToFloat(hexReversStr)); + + bizDataList.add(bizData); + + // 加上时间间隔 + start = start.plusMinutes(uploadTag.getInterval()); + } + } + + private void handleSensorStateTag() { + SensorStateTag sensorStateTag = (SensorStateTag) getTagList().get(SensorStateTag.class.getSimpleName()); + if (sensorStateTag.getOid().equals(BirmmTagAttributeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java index d29e372..a7daf4d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java @@ -3,6 +3,7 @@ import com.casic.missiles.frame.BirmmBaseTag; import java.util.List; +import java.util.Map; /** * BIRMM系列设备 @@ -27,11 +28,14 @@ String getDestinationAddr(byte[] frameBytes); String getPDUType(byte[] frameBytes); + byte[] getPDUTypeBytes(byte[] frameBytes); + String getDeviceType(byte[] pduTypeBytes); + String getOperaType(byte[] pduTypeBytes); String getSequence(byte[] frameBytes); String getTagListString(byte[] frameBytes); - List getTagList(byte[] tagBytes); + Map getTagList(byte[] tagBytes); String getCRC(byte[] frameBytes); String getToBeVerifiedCRCBytes(byte[] frameBytes); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java index d3e7391..1abff43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java @@ -9,8 +9,8 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; -import java.util.ArrayList; -import java.util.List; +import java.util.HashMap; +import java.util.Map; @Component @Slf4j @@ -87,6 +87,23 @@ } @Override + public byte[] getPDUTypeBytes(byte[] frameBytes) { + byte[] bytes = new byte[BirmmFrameAttributeEnums.PDU_TYPE.getLength()]; + System.arraycopy(frameBytes, BirmmFrameAttributeEnums.PDU_TYPE.getOffset(), bytes, 0, BirmmFrameAttributeEnums.PDU_TYPE.getLength()); + return bytes; + } + + @Override + public String getDeviceType(byte[] pduTypeBytes) { + return String.valueOf(pduTypeBytes[1] & 0x7F); + } + + @Override + public String getOperaType(byte[] pduTypeBytes) { + return String.valueOf(pduTypeBytes[0]); // bit15 - bit8 一个字节表示操作类型 + } + + @Override public String getSequence(byte[] frameBytes) { return BytesUtil.extractHexString(frameBytes, BirmmFrameAttributeEnums.SEQ.getOffset(), BirmmFrameAttributeEnums.SEQ.getLength()); // byte[16] 表示序号 } @@ -98,12 +115,12 @@ } @Override - public List getTagList(byte[] tagBytes) { + public Map getTagList(byte[] tagBytes) { // 必须包含OID和长度 4 + 2 if (tagBytes.length < 6) { return null; } - List tagList = new ArrayList<>(); + Map tagList = new HashMap<>(); int idx = 0; while (idx + 6 < tagBytes.length) { String oid = BytesUtil.extractHexString(tagBytes, idx, 4); @@ -118,7 +135,7 @@ log.debug("解析Tag:{}", tagBase); - tagList.add(tagBase); + tagList.put(tagBase.getClass().getSimpleName() ,tagBase); } } idx += tagLen; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 8f90fd9..49d5afa 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -42,9 +42,20 @@ byte[] frameBytes = getFrameStringFromData(dataMap); log.info("HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); - BirmmBaseFrame birmmFrame = defaultService.dataParse(frameBytes); + BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); if (birmmFrame != null) { log.info("HEX字节消息解析成功:{}", birmmFrame); + + // 处理业务数据 + birmmFrame.doParseBizTag(); + + // 保存日志 + + // 保存业务数据 + + // 创建回复消息 +// String replyFrame = protocol + birmmFrame.reply(); } // 返回给电信AEP平台 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java index ae6706a..6a14f09 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java @@ -1,7 +1,10 @@ package com.casic.missiles.frame; import lombok.Data; + +import java.time.LocalDateTime; import java.util.List; +import java.util.Map; @Data public class BirmmBaseFrame { @@ -33,8 +36,16 @@ // 业务字段List String tagListString; - List tagList; +// List tagList; + Map tagList; // CRC String crc; + + LocalDateTime logTime; + + public void doParseBizTag() {} + + public void reply() {} + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java index b1fd65c..b246fb9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java @@ -1,9 +1,27 @@ package com.casic.missiles.frame; +import com.casic.missiles.enums.BirmmDeviceTypeEnums; +import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; + public class BirmmFrameBuilderFactory { - public static BirmmBaseFrame createBirmmFrame(String pduType) { + public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); + if (type != null) { + switch (type) { + case METHANE: + return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + + case WELL: + return null; + + default: + return null; + } + + } return null; } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java index 86db0a3..86c936b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java @@ -39,9 +39,17 @@ case LOWER_LIMIT_TAG: return new LowerLimitTag(); - case UPPER_LIMIMT_TAG: + case UPPER_LIMIT_TAG: return new UpperLimitTag(); + case SENSOR_STATE_1_TAG: + case SENSOR_STATE_2_TAG: + case SENSOR_STATE_3_TAG: + case SENSOR_STATE_4_TAG: + case SENSOR_STATE_5_TAG: + // 传感器状态 需要根据设备类型单独处理 + return new SensorStateTag(); + case CELL_TAG: return new CellTag(); @@ -61,6 +69,11 @@ return null; } } + + // 业务上传报表 + if (oid.startsWith("C")) { + return new UploadTag(); + } return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java new file mode 100644 index 0000000..304d7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java @@ -0,0 +1,7 @@ +package com.casic.missiles.frame.commanTag; + +import com.casic.missiles.frame.BirmmBaseTag; + +public class SensorStateTag extends BirmmBaseTag { + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java new file mode 100644 index 0000000..da4073b --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java @@ -0,0 +1,47 @@ +package com.casic.missiles.frame.commanTag; + +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@EqualsAndHashCode(callSuper = true) +@Data +public class UploadTag extends BirmmBaseTag { + + private int bizType; + private int interval; + private int startMin; + private LocalDateTime startTime; + + @Override + public String toString() { + return super.toString(); + } + + public void checkOid() { + long oidValue = Long.parseLong(getOid(), 16); + bizType = (int) (((oidValue >> 24) & 0x0F) | ((oidValue >> 18) & 0x30)); + interval = (int) ((oidValue >> 11) & 0x7FF); + startMin = (int) (oidValue & 0x7FF); + + int hour = startMin / 60; + int minute = startMin % 60; + + startTime = LocalDateTime.of(2000, 1, 1, hour, minute, 0); + } + + public void setStartDate(String dateStr) { + LocalDate date = LocalDate.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd")); + setStartDate(date); + } + + public void setStartDate(LocalDate date) { + startTime = startTime.withYear(date.getYear()); + startTime = startTime.withMonth(date.getMonthValue()); + startTime = startTime.withDayOfMonth(date.getDayOfMonth()); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java new file mode 100644 index 0000000..43f75af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java @@ -0,0 +1,19 @@ +package com.casic.missiles.frame.methane; + +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class MethaneBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) + "][" + value + "][" + bizType + "]"; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java new file mode 100644 index 0000000..76cfe45 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java @@ -0,0 +1,28 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; + +public class MethaneFrameBuilderFactory { + + public static BirmmBaseFrame createMethaneFrameByOperation(String operaType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); + if (operation != null) { + switch (operation) { + case UP_TRAP_REQUEST: + return new MethaneTrapRequestFrame(); + + case UP_ONLINE_REQUEST: + return new MethaneOnlineRequestFrame(); + + case UP_SET_RESPONSE: + return new MethaneSetResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 47fd65b..deeb421 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,4 +1,6 @@ package com.casic.missiles.frame.methane; -public class MethaneSetResponseFrame { +import com.casic.missiles.frame.BirmmBaseFrame; + +public class MethaneSetResponseFrame extends BirmmBaseFrame { } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java index 1f4d831..34a4cd9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java @@ -1,6 +1,69 @@ package com.casic.missiles.frame.methane; +import com.casic.missiles.enums.BirmmTagAttributeEnums; import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.commanTag.DateTag; +import com.casic.missiles.frame.commanTag.SensorStateTag; +import com.casic.missiles.frame.commanTag.UploadTag; +import com.casic.missiles.util.BytesUtil; +import lombok.extern.slf4j.Slf4j; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Slf4j public class MethaneTrapRequestFrame extends BirmmBaseFrame { + + private List bizDataList; + + @Override + public String toString() { + return ""; + } + + @Override + public void doParseBizTag() { + if (getTagList().containsKey(UploadTag.class.getSimpleName())) { + handleUploadTag(); + } + + if (getTagList().containsKey(SensorStateTag.class.getSimpleName())) { + handleSensorStateTag(); + } + } + + private void handleUploadTag() { + UploadTag uploadTag = (UploadTag) getTagList().get(UploadTag.class.getSimpleName()); + uploadTag.checkOid(); + + // 找到DateTag 取出其中的日期 + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()); + uploadTag.setStartDate(dateTag.getDate()); + + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + bizDataList = new ArrayList<>(); + for (int i = 0; i < count; i++) { + MethaneBizData bizData = new MethaneBizData(); + + bizData.setBizType(uploadTag.getBizType()); + bizData.setUptime(start); + String hexReversStr = BytesUtil.reverseHexString(uploadTag.getValueStr().substring(i * 4 * 2, (i + 1) * 4 * 2)); + bizData.setValue(BytesUtil.hexStringToFloat(hexReversStr)); + + bizDataList.add(bizData); + + // 加上时间间隔 + start = start.plusMinutes(uploadTag.getInterval()); + } + } + + private void handleSensorStateTag() { + SensorStateTag sensorStateTag = (SensorStateTag) getTagList().get(SensorStateTag.class.getSimpleName()); + if (sensorStateTag.getOid().equals(BirmmTagAttributeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java index d29e372..a7daf4d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java @@ -3,6 +3,7 @@ import com.casic.missiles.frame.BirmmBaseTag; import java.util.List; +import java.util.Map; /** * BIRMM系列设备 @@ -27,11 +28,14 @@ String getDestinationAddr(byte[] frameBytes); String getPDUType(byte[] frameBytes); + byte[] getPDUTypeBytes(byte[] frameBytes); + String getDeviceType(byte[] pduTypeBytes); + String getOperaType(byte[] pduTypeBytes); String getSequence(byte[] frameBytes); String getTagListString(byte[] frameBytes); - List getTagList(byte[] tagBytes); + Map getTagList(byte[] tagBytes); String getCRC(byte[] frameBytes); String getToBeVerifiedCRCBytes(byte[] frameBytes); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java index d3e7391..1abff43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java @@ -9,8 +9,8 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; -import java.util.ArrayList; -import java.util.List; +import java.util.HashMap; +import java.util.Map; @Component @Slf4j @@ -87,6 +87,23 @@ } @Override + public byte[] getPDUTypeBytes(byte[] frameBytes) { + byte[] bytes = new byte[BirmmFrameAttributeEnums.PDU_TYPE.getLength()]; + System.arraycopy(frameBytes, BirmmFrameAttributeEnums.PDU_TYPE.getOffset(), bytes, 0, BirmmFrameAttributeEnums.PDU_TYPE.getLength()); + return bytes; + } + + @Override + public String getDeviceType(byte[] pduTypeBytes) { + return String.valueOf(pduTypeBytes[1] & 0x7F); + } + + @Override + public String getOperaType(byte[] pduTypeBytes) { + return String.valueOf(pduTypeBytes[0]); // bit15 - bit8 一个字节表示操作类型 + } + + @Override public String getSequence(byte[] frameBytes) { return BytesUtil.extractHexString(frameBytes, BirmmFrameAttributeEnums.SEQ.getOffset(), BirmmFrameAttributeEnums.SEQ.getLength()); // byte[16] 表示序号 } @@ -98,12 +115,12 @@ } @Override - public List getTagList(byte[] tagBytes) { + public Map getTagList(byte[] tagBytes) { // 必须包含OID和长度 4 + 2 if (tagBytes.length < 6) { return null; } - List tagList = new ArrayList<>(); + Map tagList = new HashMap<>(); int idx = 0; while (idx + 6 < tagBytes.length) { String oid = BytesUtil.extractHexString(tagBytes, idx, 4); @@ -118,7 +135,7 @@ log.debug("解析Tag:{}", tagBase); - tagList.add(tagBase); + tagList.put(tagBase.getClass().getSimpleName() ,tagBase); } } idx += tagLen; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java index fda0518..b452bc0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java @@ -11,7 +11,9 @@ import org.apache.tomcat.util.buf.HexUtils; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; import java.util.List; +import java.util.Map; import javax.annotation.Resource; @Service @@ -22,7 +24,7 @@ BirmmProtocolParser protocol; @Override - public BirmmBaseFrame dataParse(byte[] frame) { + public BirmmBaseFrame doFrameParse(byte[] frame) { boolean frameValid = protocol.preCheckFrame(frame); if (frameValid) { // 解析长度 @@ -39,6 +41,9 @@ // 解析得到PDUType String pduType = protocol.getPDUType(frame); + byte[] pduTypeBytes = protocol.getPDUTypeBytes(frame); + String deviceType = protocol.getDeviceType(pduTypeBytes); + String operaType = protocol.getOperaType(pduTypeBytes); // 解析序号 String seq = protocol.getSequence(frame); @@ -56,10 +61,16 @@ log.info("业务字段:{}", plainTagListStr); // 获得业务字段tagList - List tagList = protocol.getTagList(plainBytes); + Map tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(pduType); + BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + if (birmmFrame != null) { + birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 + birmmFrame.setTagList(tagList); + + return birmmFrame; + } } return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 8f90fd9..49d5afa 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -42,9 +42,20 @@ byte[] frameBytes = getFrameStringFromData(dataMap); log.info("HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); - BirmmBaseFrame birmmFrame = defaultService.dataParse(frameBytes); + BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); if (birmmFrame != null) { log.info("HEX字节消息解析成功:{}", birmmFrame); + + // 处理业务数据 + birmmFrame.doParseBizTag(); + + // 保存日志 + + // 保存业务数据 + + // 创建回复消息 +// String replyFrame = protocol + birmmFrame.reply(); } // 返回给电信AEP平台 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java index ae6706a..6a14f09 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java @@ -1,7 +1,10 @@ package com.casic.missiles.frame; import lombok.Data; + +import java.time.LocalDateTime; import java.util.List; +import java.util.Map; @Data public class BirmmBaseFrame { @@ -33,8 +36,16 @@ // 业务字段List String tagListString; - List tagList; +// List tagList; + Map tagList; // CRC String crc; + + LocalDateTime logTime; + + public void doParseBizTag() {} + + public void reply() {} + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java index b1fd65c..b246fb9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java @@ -1,9 +1,27 @@ package com.casic.missiles.frame; +import com.casic.missiles.enums.BirmmDeviceTypeEnums; +import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; + public class BirmmFrameBuilderFactory { - public static BirmmBaseFrame createBirmmFrame(String pduType) { + public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); + if (type != null) { + switch (type) { + case METHANE: + return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + + case WELL: + return null; + + default: + return null; + } + + } return null; } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java index 86db0a3..86c936b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java @@ -39,9 +39,17 @@ case LOWER_LIMIT_TAG: return new LowerLimitTag(); - case UPPER_LIMIMT_TAG: + case UPPER_LIMIT_TAG: return new UpperLimitTag(); + case SENSOR_STATE_1_TAG: + case SENSOR_STATE_2_TAG: + case SENSOR_STATE_3_TAG: + case SENSOR_STATE_4_TAG: + case SENSOR_STATE_5_TAG: + // 传感器状态 需要根据设备类型单独处理 + return new SensorStateTag(); + case CELL_TAG: return new CellTag(); @@ -61,6 +69,11 @@ return null; } } + + // 业务上传报表 + if (oid.startsWith("C")) { + return new UploadTag(); + } return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java new file mode 100644 index 0000000..304d7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java @@ -0,0 +1,7 @@ +package com.casic.missiles.frame.commanTag; + +import com.casic.missiles.frame.BirmmBaseTag; + +public class SensorStateTag extends BirmmBaseTag { + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java new file mode 100644 index 0000000..da4073b --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java @@ -0,0 +1,47 @@ +package com.casic.missiles.frame.commanTag; + +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@EqualsAndHashCode(callSuper = true) +@Data +public class UploadTag extends BirmmBaseTag { + + private int bizType; + private int interval; + private int startMin; + private LocalDateTime startTime; + + @Override + public String toString() { + return super.toString(); + } + + public void checkOid() { + long oidValue = Long.parseLong(getOid(), 16); + bizType = (int) (((oidValue >> 24) & 0x0F) | ((oidValue >> 18) & 0x30)); + interval = (int) ((oidValue >> 11) & 0x7FF); + startMin = (int) (oidValue & 0x7FF); + + int hour = startMin / 60; + int minute = startMin % 60; + + startTime = LocalDateTime.of(2000, 1, 1, hour, minute, 0); + } + + public void setStartDate(String dateStr) { + LocalDate date = LocalDate.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd")); + setStartDate(date); + } + + public void setStartDate(LocalDate date) { + startTime = startTime.withYear(date.getYear()); + startTime = startTime.withMonth(date.getMonthValue()); + startTime = startTime.withDayOfMonth(date.getDayOfMonth()); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java new file mode 100644 index 0000000..43f75af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java @@ -0,0 +1,19 @@ +package com.casic.missiles.frame.methane; + +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class MethaneBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) + "][" + value + "][" + bizType + "]"; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java new file mode 100644 index 0000000..76cfe45 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java @@ -0,0 +1,28 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; + +public class MethaneFrameBuilderFactory { + + public static BirmmBaseFrame createMethaneFrameByOperation(String operaType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); + if (operation != null) { + switch (operation) { + case UP_TRAP_REQUEST: + return new MethaneTrapRequestFrame(); + + case UP_ONLINE_REQUEST: + return new MethaneOnlineRequestFrame(); + + case UP_SET_RESPONSE: + return new MethaneSetResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 47fd65b..deeb421 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,4 +1,6 @@ package com.casic.missiles.frame.methane; -public class MethaneSetResponseFrame { +import com.casic.missiles.frame.BirmmBaseFrame; + +public class MethaneSetResponseFrame extends BirmmBaseFrame { } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java index 1f4d831..34a4cd9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java @@ -1,6 +1,69 @@ package com.casic.missiles.frame.methane; +import com.casic.missiles.enums.BirmmTagAttributeEnums; import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.commanTag.DateTag; +import com.casic.missiles.frame.commanTag.SensorStateTag; +import com.casic.missiles.frame.commanTag.UploadTag; +import com.casic.missiles.util.BytesUtil; +import lombok.extern.slf4j.Slf4j; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Slf4j public class MethaneTrapRequestFrame extends BirmmBaseFrame { + + private List bizDataList; + + @Override + public String toString() { + return ""; + } + + @Override + public void doParseBizTag() { + if (getTagList().containsKey(UploadTag.class.getSimpleName())) { + handleUploadTag(); + } + + if (getTagList().containsKey(SensorStateTag.class.getSimpleName())) { + handleSensorStateTag(); + } + } + + private void handleUploadTag() { + UploadTag uploadTag = (UploadTag) getTagList().get(UploadTag.class.getSimpleName()); + uploadTag.checkOid(); + + // 找到DateTag 取出其中的日期 + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()); + uploadTag.setStartDate(dateTag.getDate()); + + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + bizDataList = new ArrayList<>(); + for (int i = 0; i < count; i++) { + MethaneBizData bizData = new MethaneBizData(); + + bizData.setBizType(uploadTag.getBizType()); + bizData.setUptime(start); + String hexReversStr = BytesUtil.reverseHexString(uploadTag.getValueStr().substring(i * 4 * 2, (i + 1) * 4 * 2)); + bizData.setValue(BytesUtil.hexStringToFloat(hexReversStr)); + + bizDataList.add(bizData); + + // 加上时间间隔 + start = start.plusMinutes(uploadTag.getInterval()); + } + } + + private void handleSensorStateTag() { + SensorStateTag sensorStateTag = (SensorStateTag) getTagList().get(SensorStateTag.class.getSimpleName()); + if (sensorStateTag.getOid().equals(BirmmTagAttributeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java index d29e372..a7daf4d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java @@ -3,6 +3,7 @@ import com.casic.missiles.frame.BirmmBaseTag; import java.util.List; +import java.util.Map; /** * BIRMM系列设备 @@ -27,11 +28,14 @@ String getDestinationAddr(byte[] frameBytes); String getPDUType(byte[] frameBytes); + byte[] getPDUTypeBytes(byte[] frameBytes); + String getDeviceType(byte[] pduTypeBytes); + String getOperaType(byte[] pduTypeBytes); String getSequence(byte[] frameBytes); String getTagListString(byte[] frameBytes); - List getTagList(byte[] tagBytes); + Map getTagList(byte[] tagBytes); String getCRC(byte[] frameBytes); String getToBeVerifiedCRCBytes(byte[] frameBytes); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java index d3e7391..1abff43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java @@ -9,8 +9,8 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; -import java.util.ArrayList; -import java.util.List; +import java.util.HashMap; +import java.util.Map; @Component @Slf4j @@ -87,6 +87,23 @@ } @Override + public byte[] getPDUTypeBytes(byte[] frameBytes) { + byte[] bytes = new byte[BirmmFrameAttributeEnums.PDU_TYPE.getLength()]; + System.arraycopy(frameBytes, BirmmFrameAttributeEnums.PDU_TYPE.getOffset(), bytes, 0, BirmmFrameAttributeEnums.PDU_TYPE.getLength()); + return bytes; + } + + @Override + public String getDeviceType(byte[] pduTypeBytes) { + return String.valueOf(pduTypeBytes[1] & 0x7F); + } + + @Override + public String getOperaType(byte[] pduTypeBytes) { + return String.valueOf(pduTypeBytes[0]); // bit15 - bit8 一个字节表示操作类型 + } + + @Override public String getSequence(byte[] frameBytes) { return BytesUtil.extractHexString(frameBytes, BirmmFrameAttributeEnums.SEQ.getOffset(), BirmmFrameAttributeEnums.SEQ.getLength()); // byte[16] 表示序号 } @@ -98,12 +115,12 @@ } @Override - public List getTagList(byte[] tagBytes) { + public Map getTagList(byte[] tagBytes) { // 必须包含OID和长度 4 + 2 if (tagBytes.length < 6) { return null; } - List tagList = new ArrayList<>(); + Map tagList = new HashMap<>(); int idx = 0; while (idx + 6 < tagBytes.length) { String oid = BytesUtil.extractHexString(tagBytes, idx, 4); @@ -118,7 +135,7 @@ log.debug("解析Tag:{}", tagBase); - tagList.add(tagBase); + tagList.put(tagBase.getClass().getSimpleName() ,tagBase); } } idx += tagLen; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java index fda0518..b452bc0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java @@ -11,7 +11,9 @@ import org.apache.tomcat.util.buf.HexUtils; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; import java.util.List; +import java.util.Map; import javax.annotation.Resource; @Service @@ -22,7 +24,7 @@ BirmmProtocolParser protocol; @Override - public BirmmBaseFrame dataParse(byte[] frame) { + public BirmmBaseFrame doFrameParse(byte[] frame) { boolean frameValid = protocol.preCheckFrame(frame); if (frameValid) { // 解析长度 @@ -39,6 +41,9 @@ // 解析得到PDUType String pduType = protocol.getPDUType(frame); + byte[] pduTypeBytes = protocol.getPDUTypeBytes(frame); + String deviceType = protocol.getDeviceType(pduTypeBytes); + String operaType = protocol.getOperaType(pduTypeBytes); // 解析序号 String seq = protocol.getSequence(frame); @@ -56,10 +61,16 @@ log.info("业务字段:{}", plainTagListStr); // 获得业务字段tagList - List tagList = protocol.getTagList(plainBytes); + Map tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(pduType); + BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + if (birmmFrame != null) { + birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 + birmmFrame.setTagList(tagList); + + return birmmFrame; + } } return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index 5e27b33..93cc332 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -4,5 +4,10 @@ public interface IGeneralService { - BirmmBaseFrame dataParse(byte[] frame); + /** + * 协议框架解析 + * @param frame + * @return + */ + BirmmBaseFrame doFrameParse(byte[] frame); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 8f90fd9..49d5afa 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -42,9 +42,20 @@ byte[] frameBytes = getFrameStringFromData(dataMap); log.info("HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); - BirmmBaseFrame birmmFrame = defaultService.dataParse(frameBytes); + BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); if (birmmFrame != null) { log.info("HEX字节消息解析成功:{}", birmmFrame); + + // 处理业务数据 + birmmFrame.doParseBizTag(); + + // 保存日志 + + // 保存业务数据 + + // 创建回复消息 +// String replyFrame = protocol + birmmFrame.reply(); } // 返回给电信AEP平台 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java index ae6706a..6a14f09 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java @@ -1,7 +1,10 @@ package com.casic.missiles.frame; import lombok.Data; + +import java.time.LocalDateTime; import java.util.List; +import java.util.Map; @Data public class BirmmBaseFrame { @@ -33,8 +36,16 @@ // 业务字段List String tagListString; - List tagList; +// List tagList; + Map tagList; // CRC String crc; + + LocalDateTime logTime; + + public void doParseBizTag() {} + + public void reply() {} + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java index b1fd65c..b246fb9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java @@ -1,9 +1,27 @@ package com.casic.missiles.frame; +import com.casic.missiles.enums.BirmmDeviceTypeEnums; +import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; + public class BirmmFrameBuilderFactory { - public static BirmmBaseFrame createBirmmFrame(String pduType) { + public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); + if (type != null) { + switch (type) { + case METHANE: + return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + + case WELL: + return null; + + default: + return null; + } + + } return null; } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java index 86db0a3..86c936b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java @@ -39,9 +39,17 @@ case LOWER_LIMIT_TAG: return new LowerLimitTag(); - case UPPER_LIMIMT_TAG: + case UPPER_LIMIT_TAG: return new UpperLimitTag(); + case SENSOR_STATE_1_TAG: + case SENSOR_STATE_2_TAG: + case SENSOR_STATE_3_TAG: + case SENSOR_STATE_4_TAG: + case SENSOR_STATE_5_TAG: + // 传感器状态 需要根据设备类型单独处理 + return new SensorStateTag(); + case CELL_TAG: return new CellTag(); @@ -61,6 +69,11 @@ return null; } } + + // 业务上传报表 + if (oid.startsWith("C")) { + return new UploadTag(); + } return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java new file mode 100644 index 0000000..304d7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java @@ -0,0 +1,7 @@ +package com.casic.missiles.frame.commanTag; + +import com.casic.missiles.frame.BirmmBaseTag; + +public class SensorStateTag extends BirmmBaseTag { + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java new file mode 100644 index 0000000..da4073b --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java @@ -0,0 +1,47 @@ +package com.casic.missiles.frame.commanTag; + +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@EqualsAndHashCode(callSuper = true) +@Data +public class UploadTag extends BirmmBaseTag { + + private int bizType; + private int interval; + private int startMin; + private LocalDateTime startTime; + + @Override + public String toString() { + return super.toString(); + } + + public void checkOid() { + long oidValue = Long.parseLong(getOid(), 16); + bizType = (int) (((oidValue >> 24) & 0x0F) | ((oidValue >> 18) & 0x30)); + interval = (int) ((oidValue >> 11) & 0x7FF); + startMin = (int) (oidValue & 0x7FF); + + int hour = startMin / 60; + int minute = startMin % 60; + + startTime = LocalDateTime.of(2000, 1, 1, hour, minute, 0); + } + + public void setStartDate(String dateStr) { + LocalDate date = LocalDate.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd")); + setStartDate(date); + } + + public void setStartDate(LocalDate date) { + startTime = startTime.withYear(date.getYear()); + startTime = startTime.withMonth(date.getMonthValue()); + startTime = startTime.withDayOfMonth(date.getDayOfMonth()); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java new file mode 100644 index 0000000..43f75af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java @@ -0,0 +1,19 @@ +package com.casic.missiles.frame.methane; + +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class MethaneBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) + "][" + value + "][" + bizType + "]"; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java new file mode 100644 index 0000000..76cfe45 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java @@ -0,0 +1,28 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; + +public class MethaneFrameBuilderFactory { + + public static BirmmBaseFrame createMethaneFrameByOperation(String operaType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); + if (operation != null) { + switch (operation) { + case UP_TRAP_REQUEST: + return new MethaneTrapRequestFrame(); + + case UP_ONLINE_REQUEST: + return new MethaneOnlineRequestFrame(); + + case UP_SET_RESPONSE: + return new MethaneSetResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 47fd65b..deeb421 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,4 +1,6 @@ package com.casic.missiles.frame.methane; -public class MethaneSetResponseFrame { +import com.casic.missiles.frame.BirmmBaseFrame; + +public class MethaneSetResponseFrame extends BirmmBaseFrame { } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java index 1f4d831..34a4cd9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java @@ -1,6 +1,69 @@ package com.casic.missiles.frame.methane; +import com.casic.missiles.enums.BirmmTagAttributeEnums; import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.commanTag.DateTag; +import com.casic.missiles.frame.commanTag.SensorStateTag; +import com.casic.missiles.frame.commanTag.UploadTag; +import com.casic.missiles.util.BytesUtil; +import lombok.extern.slf4j.Slf4j; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Slf4j public class MethaneTrapRequestFrame extends BirmmBaseFrame { + + private List bizDataList; + + @Override + public String toString() { + return ""; + } + + @Override + public void doParseBizTag() { + if (getTagList().containsKey(UploadTag.class.getSimpleName())) { + handleUploadTag(); + } + + if (getTagList().containsKey(SensorStateTag.class.getSimpleName())) { + handleSensorStateTag(); + } + } + + private void handleUploadTag() { + UploadTag uploadTag = (UploadTag) getTagList().get(UploadTag.class.getSimpleName()); + uploadTag.checkOid(); + + // 找到DateTag 取出其中的日期 + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()); + uploadTag.setStartDate(dateTag.getDate()); + + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + bizDataList = new ArrayList<>(); + for (int i = 0; i < count; i++) { + MethaneBizData bizData = new MethaneBizData(); + + bizData.setBizType(uploadTag.getBizType()); + bizData.setUptime(start); + String hexReversStr = BytesUtil.reverseHexString(uploadTag.getValueStr().substring(i * 4 * 2, (i + 1) * 4 * 2)); + bizData.setValue(BytesUtil.hexStringToFloat(hexReversStr)); + + bizDataList.add(bizData); + + // 加上时间间隔 + start = start.plusMinutes(uploadTag.getInterval()); + } + } + + private void handleSensorStateTag() { + SensorStateTag sensorStateTag = (SensorStateTag) getTagList().get(SensorStateTag.class.getSimpleName()); + if (sensorStateTag.getOid().equals(BirmmTagAttributeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java index d29e372..a7daf4d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java @@ -3,6 +3,7 @@ import com.casic.missiles.frame.BirmmBaseTag; import java.util.List; +import java.util.Map; /** * BIRMM系列设备 @@ -27,11 +28,14 @@ String getDestinationAddr(byte[] frameBytes); String getPDUType(byte[] frameBytes); + byte[] getPDUTypeBytes(byte[] frameBytes); + String getDeviceType(byte[] pduTypeBytes); + String getOperaType(byte[] pduTypeBytes); String getSequence(byte[] frameBytes); String getTagListString(byte[] frameBytes); - List getTagList(byte[] tagBytes); + Map getTagList(byte[] tagBytes); String getCRC(byte[] frameBytes); String getToBeVerifiedCRCBytes(byte[] frameBytes); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java index d3e7391..1abff43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java @@ -9,8 +9,8 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; -import java.util.ArrayList; -import java.util.List; +import java.util.HashMap; +import java.util.Map; @Component @Slf4j @@ -87,6 +87,23 @@ } @Override + public byte[] getPDUTypeBytes(byte[] frameBytes) { + byte[] bytes = new byte[BirmmFrameAttributeEnums.PDU_TYPE.getLength()]; + System.arraycopy(frameBytes, BirmmFrameAttributeEnums.PDU_TYPE.getOffset(), bytes, 0, BirmmFrameAttributeEnums.PDU_TYPE.getLength()); + return bytes; + } + + @Override + public String getDeviceType(byte[] pduTypeBytes) { + return String.valueOf(pduTypeBytes[1] & 0x7F); + } + + @Override + public String getOperaType(byte[] pduTypeBytes) { + return String.valueOf(pduTypeBytes[0]); // bit15 - bit8 一个字节表示操作类型 + } + + @Override public String getSequence(byte[] frameBytes) { return BytesUtil.extractHexString(frameBytes, BirmmFrameAttributeEnums.SEQ.getOffset(), BirmmFrameAttributeEnums.SEQ.getLength()); // byte[16] 表示序号 } @@ -98,12 +115,12 @@ } @Override - public List getTagList(byte[] tagBytes) { + public Map getTagList(byte[] tagBytes) { // 必须包含OID和长度 4 + 2 if (tagBytes.length < 6) { return null; } - List tagList = new ArrayList<>(); + Map tagList = new HashMap<>(); int idx = 0; while (idx + 6 < tagBytes.length) { String oid = BytesUtil.extractHexString(tagBytes, idx, 4); @@ -118,7 +135,7 @@ log.debug("解析Tag:{}", tagBase); - tagList.add(tagBase); + tagList.put(tagBase.getClass().getSimpleName() ,tagBase); } } idx += tagLen; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java index fda0518..b452bc0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java @@ -11,7 +11,9 @@ import org.apache.tomcat.util.buf.HexUtils; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; import java.util.List; +import java.util.Map; import javax.annotation.Resource; @Service @@ -22,7 +24,7 @@ BirmmProtocolParser protocol; @Override - public BirmmBaseFrame dataParse(byte[] frame) { + public BirmmBaseFrame doFrameParse(byte[] frame) { boolean frameValid = protocol.preCheckFrame(frame); if (frameValid) { // 解析长度 @@ -39,6 +41,9 @@ // 解析得到PDUType String pduType = protocol.getPDUType(frame); + byte[] pduTypeBytes = protocol.getPDUTypeBytes(frame); + String deviceType = protocol.getDeviceType(pduTypeBytes); + String operaType = protocol.getOperaType(pduTypeBytes); // 解析序号 String seq = protocol.getSequence(frame); @@ -56,10 +61,16 @@ log.info("业务字段:{}", plainTagListStr); // 获得业务字段tagList - List tagList = protocol.getTagList(plainBytes); + Map tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(pduType); + BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + if (birmmFrame != null) { + birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 + birmmFrame.setTagList(tagList); + + return birmmFrame; + } } return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index 5e27b33..93cc332 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -4,5 +4,10 @@ public interface IGeneralService { - BirmmBaseFrame dataParse(byte[] frame); + /** + * 协议框架解析 + * @param frame + * @return + */ + BirmmBaseFrame doFrameParse(byte[] frame); } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmDeviceTypeEnums.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmDeviceTypeEnums.java new file mode 100644 index 0000000..e1eac2d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmDeviceTypeEnums.java @@ -0,0 +1,43 @@ +package com.casic.missiles.enums; + +import lombok.Getter; + +import java.util.stream.Stream; + +/** + * 帧结构属性枚举 + */ +@Getter +public enum BirmmDeviceTypeEnums { + METHANE("4", "BIRMM-RTU100N", "31"), + WELL("6", "BIRMM-WELL100N", "41"), + LIQUID_GAS("25", "", "32"), + METHANE_BIZ("32", "", "33"), + DEFAULT("", "", ""); + + + /** + * 名称 + */ + private final String value; + + /** + * 描述 + */ + private final String description; + + /** + * 设备编号的前缀 + */ + final String devPrefix; + + BirmmDeviceTypeEnums(String value, String description, String devPrefix) { + this.value = value; + this.description = description; + this.devPrefix = devPrefix; + } + + public static BirmmDeviceTypeEnums toType(String value) { + return Stream.of(BirmmDeviceTypeEnums.values()).filter(p -> p.value.equalsIgnoreCase(value)).findAny().orElse(null); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 8f90fd9..49d5afa 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -42,9 +42,20 @@ byte[] frameBytes = getFrameStringFromData(dataMap); log.info("HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); - BirmmBaseFrame birmmFrame = defaultService.dataParse(frameBytes); + BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); if (birmmFrame != null) { log.info("HEX字节消息解析成功:{}", birmmFrame); + + // 处理业务数据 + birmmFrame.doParseBizTag(); + + // 保存日志 + + // 保存业务数据 + + // 创建回复消息 +// String replyFrame = protocol + birmmFrame.reply(); } // 返回给电信AEP平台 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java index ae6706a..6a14f09 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java @@ -1,7 +1,10 @@ package com.casic.missiles.frame; import lombok.Data; + +import java.time.LocalDateTime; import java.util.List; +import java.util.Map; @Data public class BirmmBaseFrame { @@ -33,8 +36,16 @@ // 业务字段List String tagListString; - List tagList; +// List tagList; + Map tagList; // CRC String crc; + + LocalDateTime logTime; + + public void doParseBizTag() {} + + public void reply() {} + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java index b1fd65c..b246fb9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java @@ -1,9 +1,27 @@ package com.casic.missiles.frame; +import com.casic.missiles.enums.BirmmDeviceTypeEnums; +import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; + public class BirmmFrameBuilderFactory { - public static BirmmBaseFrame createBirmmFrame(String pduType) { + public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); + if (type != null) { + switch (type) { + case METHANE: + return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + + case WELL: + return null; + + default: + return null; + } + + } return null; } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java index 86db0a3..86c936b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java @@ -39,9 +39,17 @@ case LOWER_LIMIT_TAG: return new LowerLimitTag(); - case UPPER_LIMIMT_TAG: + case UPPER_LIMIT_TAG: return new UpperLimitTag(); + case SENSOR_STATE_1_TAG: + case SENSOR_STATE_2_TAG: + case SENSOR_STATE_3_TAG: + case SENSOR_STATE_4_TAG: + case SENSOR_STATE_5_TAG: + // 传感器状态 需要根据设备类型单独处理 + return new SensorStateTag(); + case CELL_TAG: return new CellTag(); @@ -61,6 +69,11 @@ return null; } } + + // 业务上传报表 + if (oid.startsWith("C")) { + return new UploadTag(); + } return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java new file mode 100644 index 0000000..304d7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java @@ -0,0 +1,7 @@ +package com.casic.missiles.frame.commanTag; + +import com.casic.missiles.frame.BirmmBaseTag; + +public class SensorStateTag extends BirmmBaseTag { + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java new file mode 100644 index 0000000..da4073b --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java @@ -0,0 +1,47 @@ +package com.casic.missiles.frame.commanTag; + +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@EqualsAndHashCode(callSuper = true) +@Data +public class UploadTag extends BirmmBaseTag { + + private int bizType; + private int interval; + private int startMin; + private LocalDateTime startTime; + + @Override + public String toString() { + return super.toString(); + } + + public void checkOid() { + long oidValue = Long.parseLong(getOid(), 16); + bizType = (int) (((oidValue >> 24) & 0x0F) | ((oidValue >> 18) & 0x30)); + interval = (int) ((oidValue >> 11) & 0x7FF); + startMin = (int) (oidValue & 0x7FF); + + int hour = startMin / 60; + int minute = startMin % 60; + + startTime = LocalDateTime.of(2000, 1, 1, hour, minute, 0); + } + + public void setStartDate(String dateStr) { + LocalDate date = LocalDate.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd")); + setStartDate(date); + } + + public void setStartDate(LocalDate date) { + startTime = startTime.withYear(date.getYear()); + startTime = startTime.withMonth(date.getMonthValue()); + startTime = startTime.withDayOfMonth(date.getDayOfMonth()); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java new file mode 100644 index 0000000..43f75af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java @@ -0,0 +1,19 @@ +package com.casic.missiles.frame.methane; + +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class MethaneBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) + "][" + value + "][" + bizType + "]"; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java new file mode 100644 index 0000000..76cfe45 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java @@ -0,0 +1,28 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; + +public class MethaneFrameBuilderFactory { + + public static BirmmBaseFrame createMethaneFrameByOperation(String operaType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); + if (operation != null) { + switch (operation) { + case UP_TRAP_REQUEST: + return new MethaneTrapRequestFrame(); + + case UP_ONLINE_REQUEST: + return new MethaneOnlineRequestFrame(); + + case UP_SET_RESPONSE: + return new MethaneSetResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 47fd65b..deeb421 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,4 +1,6 @@ package com.casic.missiles.frame.methane; -public class MethaneSetResponseFrame { +import com.casic.missiles.frame.BirmmBaseFrame; + +public class MethaneSetResponseFrame extends BirmmBaseFrame { } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java index 1f4d831..34a4cd9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java @@ -1,6 +1,69 @@ package com.casic.missiles.frame.methane; +import com.casic.missiles.enums.BirmmTagAttributeEnums; import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.commanTag.DateTag; +import com.casic.missiles.frame.commanTag.SensorStateTag; +import com.casic.missiles.frame.commanTag.UploadTag; +import com.casic.missiles.util.BytesUtil; +import lombok.extern.slf4j.Slf4j; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Slf4j public class MethaneTrapRequestFrame extends BirmmBaseFrame { + + private List bizDataList; + + @Override + public String toString() { + return ""; + } + + @Override + public void doParseBizTag() { + if (getTagList().containsKey(UploadTag.class.getSimpleName())) { + handleUploadTag(); + } + + if (getTagList().containsKey(SensorStateTag.class.getSimpleName())) { + handleSensorStateTag(); + } + } + + private void handleUploadTag() { + UploadTag uploadTag = (UploadTag) getTagList().get(UploadTag.class.getSimpleName()); + uploadTag.checkOid(); + + // 找到DateTag 取出其中的日期 + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()); + uploadTag.setStartDate(dateTag.getDate()); + + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + bizDataList = new ArrayList<>(); + for (int i = 0; i < count; i++) { + MethaneBizData bizData = new MethaneBizData(); + + bizData.setBizType(uploadTag.getBizType()); + bizData.setUptime(start); + String hexReversStr = BytesUtil.reverseHexString(uploadTag.getValueStr().substring(i * 4 * 2, (i + 1) * 4 * 2)); + bizData.setValue(BytesUtil.hexStringToFloat(hexReversStr)); + + bizDataList.add(bizData); + + // 加上时间间隔 + start = start.plusMinutes(uploadTag.getInterval()); + } + } + + private void handleSensorStateTag() { + SensorStateTag sensorStateTag = (SensorStateTag) getTagList().get(SensorStateTag.class.getSimpleName()); + if (sensorStateTag.getOid().equals(BirmmTagAttributeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java index d29e372..a7daf4d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java @@ -3,6 +3,7 @@ import com.casic.missiles.frame.BirmmBaseTag; import java.util.List; +import java.util.Map; /** * BIRMM系列设备 @@ -27,11 +28,14 @@ String getDestinationAddr(byte[] frameBytes); String getPDUType(byte[] frameBytes); + byte[] getPDUTypeBytes(byte[] frameBytes); + String getDeviceType(byte[] pduTypeBytes); + String getOperaType(byte[] pduTypeBytes); String getSequence(byte[] frameBytes); String getTagListString(byte[] frameBytes); - List getTagList(byte[] tagBytes); + Map getTagList(byte[] tagBytes); String getCRC(byte[] frameBytes); String getToBeVerifiedCRCBytes(byte[] frameBytes); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java index d3e7391..1abff43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java @@ -9,8 +9,8 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; -import java.util.ArrayList; -import java.util.List; +import java.util.HashMap; +import java.util.Map; @Component @Slf4j @@ -87,6 +87,23 @@ } @Override + public byte[] getPDUTypeBytes(byte[] frameBytes) { + byte[] bytes = new byte[BirmmFrameAttributeEnums.PDU_TYPE.getLength()]; + System.arraycopy(frameBytes, BirmmFrameAttributeEnums.PDU_TYPE.getOffset(), bytes, 0, BirmmFrameAttributeEnums.PDU_TYPE.getLength()); + return bytes; + } + + @Override + public String getDeviceType(byte[] pduTypeBytes) { + return String.valueOf(pduTypeBytes[1] & 0x7F); + } + + @Override + public String getOperaType(byte[] pduTypeBytes) { + return String.valueOf(pduTypeBytes[0]); // bit15 - bit8 一个字节表示操作类型 + } + + @Override public String getSequence(byte[] frameBytes) { return BytesUtil.extractHexString(frameBytes, BirmmFrameAttributeEnums.SEQ.getOffset(), BirmmFrameAttributeEnums.SEQ.getLength()); // byte[16] 表示序号 } @@ -98,12 +115,12 @@ } @Override - public List getTagList(byte[] tagBytes) { + public Map getTagList(byte[] tagBytes) { // 必须包含OID和长度 4 + 2 if (tagBytes.length < 6) { return null; } - List tagList = new ArrayList<>(); + Map tagList = new HashMap<>(); int idx = 0; while (idx + 6 < tagBytes.length) { String oid = BytesUtil.extractHexString(tagBytes, idx, 4); @@ -118,7 +135,7 @@ log.debug("解析Tag:{}", tagBase); - tagList.add(tagBase); + tagList.put(tagBase.getClass().getSimpleName() ,tagBase); } } idx += tagLen; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java index fda0518..b452bc0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java @@ -11,7 +11,9 @@ import org.apache.tomcat.util.buf.HexUtils; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; import java.util.List; +import java.util.Map; import javax.annotation.Resource; @Service @@ -22,7 +24,7 @@ BirmmProtocolParser protocol; @Override - public BirmmBaseFrame dataParse(byte[] frame) { + public BirmmBaseFrame doFrameParse(byte[] frame) { boolean frameValid = protocol.preCheckFrame(frame); if (frameValid) { // 解析长度 @@ -39,6 +41,9 @@ // 解析得到PDUType String pduType = protocol.getPDUType(frame); + byte[] pduTypeBytes = protocol.getPDUTypeBytes(frame); + String deviceType = protocol.getDeviceType(pduTypeBytes); + String operaType = protocol.getOperaType(pduTypeBytes); // 解析序号 String seq = protocol.getSequence(frame); @@ -56,10 +61,16 @@ log.info("业务字段:{}", plainTagListStr); // 获得业务字段tagList - List tagList = protocol.getTagList(plainBytes); + Map tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(pduType); + BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + if (birmmFrame != null) { + birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 + birmmFrame.setTagList(tagList); + + return birmmFrame; + } } return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index 5e27b33..93cc332 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -4,5 +4,10 @@ public interface IGeneralService { - BirmmBaseFrame dataParse(byte[] frame); + /** + * 协议框架解析 + * @param frame + * @return + */ + BirmmBaseFrame doFrameParse(byte[] frame); } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmDeviceTypeEnums.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmDeviceTypeEnums.java new file mode 100644 index 0000000..e1eac2d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmDeviceTypeEnums.java @@ -0,0 +1,43 @@ +package com.casic.missiles.enums; + +import lombok.Getter; + +import java.util.stream.Stream; + +/** + * 帧结构属性枚举 + */ +@Getter +public enum BirmmDeviceTypeEnums { + METHANE("4", "BIRMM-RTU100N", "31"), + WELL("6", "BIRMM-WELL100N", "41"), + LIQUID_GAS("25", "", "32"), + METHANE_BIZ("32", "", "33"), + DEFAULT("", "", ""); + + + /** + * 名称 + */ + private final String value; + + /** + * 描述 + */ + private final String description; + + /** + * 设备编号的前缀 + */ + final String devPrefix; + + BirmmDeviceTypeEnums(String value, String description, String devPrefix) { + this.value = value; + this.description = description; + this.devPrefix = devPrefix; + } + + public static BirmmDeviceTypeEnums toType(String value) { + return Stream.of(BirmmDeviceTypeEnums.values()).filter(p -> p.value.equalsIgnoreCase(value)).findAny().orElse(null); + } +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmOperationTypeEnums.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmOperationTypeEnums.java new file mode 100644 index 0000000..7bca266 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmOperationTypeEnums.java @@ -0,0 +1,44 @@ +package com.casic.missiles.enums; + +import lombok.Getter; + +import java.util.stream.Stream; + +/** + * 帧结构属性枚举 + */ +@Getter +public enum BirmmOperationTypeEnums { + DOWN_GET_REQUEST("1", "GetRequest"), + UP_GET_RESPONSE("2", "GetResponse"), + DOWN_SET_REQUEST("3", "SetRequest"), + UP_TRAP_REQUEST("4", "TrapRequest"), + DOWN_TRAP_RESPONSE("5", "TrapResponse"), + UP_ONLINE_REQUEST("6", "OnlineRequest"), + DOWN_ONLINE_RESPONSE("7", "OnlineResponse"), + UP_STARTUP_REQUEST("8", "StartupRequest"), + DOWN_STARTUP_RESPONSE("9", "StartupResponse"), + DOWN_WAKEUP_REQUEST("10", "WakeupRequest"), + UP_WAKEUP_RESPONSE("11", "WakeupResponse"), + UP_SET_RESPONSE("12", "SetResponse"); + + + /** + * 名称 + */ + private final String value; + + /** + * 描述 + */ + private final String description; + + BirmmOperationTypeEnums(String value, String description) { + this.value = value; + this.description = description; + } + + public static BirmmOperationTypeEnums toType(String value) { + return Stream.of(BirmmOperationTypeEnums.values()).filter(p -> p.value.equalsIgnoreCase(value)).findAny().orElse(null); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 8f90fd9..49d5afa 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -42,9 +42,20 @@ byte[] frameBytes = getFrameStringFromData(dataMap); log.info("HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); - BirmmBaseFrame birmmFrame = defaultService.dataParse(frameBytes); + BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); if (birmmFrame != null) { log.info("HEX字节消息解析成功:{}", birmmFrame); + + // 处理业务数据 + birmmFrame.doParseBizTag(); + + // 保存日志 + + // 保存业务数据 + + // 创建回复消息 +// String replyFrame = protocol + birmmFrame.reply(); } // 返回给电信AEP平台 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java index ae6706a..6a14f09 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java @@ -1,7 +1,10 @@ package com.casic.missiles.frame; import lombok.Data; + +import java.time.LocalDateTime; import java.util.List; +import java.util.Map; @Data public class BirmmBaseFrame { @@ -33,8 +36,16 @@ // 业务字段List String tagListString; - List tagList; +// List tagList; + Map tagList; // CRC String crc; + + LocalDateTime logTime; + + public void doParseBizTag() {} + + public void reply() {} + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java index b1fd65c..b246fb9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java @@ -1,9 +1,27 @@ package com.casic.missiles.frame; +import com.casic.missiles.enums.BirmmDeviceTypeEnums; +import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; + public class BirmmFrameBuilderFactory { - public static BirmmBaseFrame createBirmmFrame(String pduType) { + public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); + if (type != null) { + switch (type) { + case METHANE: + return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + + case WELL: + return null; + + default: + return null; + } + + } return null; } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java index 86db0a3..86c936b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java @@ -39,9 +39,17 @@ case LOWER_LIMIT_TAG: return new LowerLimitTag(); - case UPPER_LIMIMT_TAG: + case UPPER_LIMIT_TAG: return new UpperLimitTag(); + case SENSOR_STATE_1_TAG: + case SENSOR_STATE_2_TAG: + case SENSOR_STATE_3_TAG: + case SENSOR_STATE_4_TAG: + case SENSOR_STATE_5_TAG: + // 传感器状态 需要根据设备类型单独处理 + return new SensorStateTag(); + case CELL_TAG: return new CellTag(); @@ -61,6 +69,11 @@ return null; } } + + // 业务上传报表 + if (oid.startsWith("C")) { + return new UploadTag(); + } return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java new file mode 100644 index 0000000..304d7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java @@ -0,0 +1,7 @@ +package com.casic.missiles.frame.commanTag; + +import com.casic.missiles.frame.BirmmBaseTag; + +public class SensorStateTag extends BirmmBaseTag { + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java new file mode 100644 index 0000000..da4073b --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java @@ -0,0 +1,47 @@ +package com.casic.missiles.frame.commanTag; + +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@EqualsAndHashCode(callSuper = true) +@Data +public class UploadTag extends BirmmBaseTag { + + private int bizType; + private int interval; + private int startMin; + private LocalDateTime startTime; + + @Override + public String toString() { + return super.toString(); + } + + public void checkOid() { + long oidValue = Long.parseLong(getOid(), 16); + bizType = (int) (((oidValue >> 24) & 0x0F) | ((oidValue >> 18) & 0x30)); + interval = (int) ((oidValue >> 11) & 0x7FF); + startMin = (int) (oidValue & 0x7FF); + + int hour = startMin / 60; + int minute = startMin % 60; + + startTime = LocalDateTime.of(2000, 1, 1, hour, minute, 0); + } + + public void setStartDate(String dateStr) { + LocalDate date = LocalDate.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd")); + setStartDate(date); + } + + public void setStartDate(LocalDate date) { + startTime = startTime.withYear(date.getYear()); + startTime = startTime.withMonth(date.getMonthValue()); + startTime = startTime.withDayOfMonth(date.getDayOfMonth()); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java new file mode 100644 index 0000000..43f75af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java @@ -0,0 +1,19 @@ +package com.casic.missiles.frame.methane; + +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class MethaneBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) + "][" + value + "][" + bizType + "]"; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java new file mode 100644 index 0000000..76cfe45 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java @@ -0,0 +1,28 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; + +public class MethaneFrameBuilderFactory { + + public static BirmmBaseFrame createMethaneFrameByOperation(String operaType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); + if (operation != null) { + switch (operation) { + case UP_TRAP_REQUEST: + return new MethaneTrapRequestFrame(); + + case UP_ONLINE_REQUEST: + return new MethaneOnlineRequestFrame(); + + case UP_SET_RESPONSE: + return new MethaneSetResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 47fd65b..deeb421 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,4 +1,6 @@ package com.casic.missiles.frame.methane; -public class MethaneSetResponseFrame { +import com.casic.missiles.frame.BirmmBaseFrame; + +public class MethaneSetResponseFrame extends BirmmBaseFrame { } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java index 1f4d831..34a4cd9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java @@ -1,6 +1,69 @@ package com.casic.missiles.frame.methane; +import com.casic.missiles.enums.BirmmTagAttributeEnums; import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.commanTag.DateTag; +import com.casic.missiles.frame.commanTag.SensorStateTag; +import com.casic.missiles.frame.commanTag.UploadTag; +import com.casic.missiles.util.BytesUtil; +import lombok.extern.slf4j.Slf4j; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Slf4j public class MethaneTrapRequestFrame extends BirmmBaseFrame { + + private List bizDataList; + + @Override + public String toString() { + return ""; + } + + @Override + public void doParseBizTag() { + if (getTagList().containsKey(UploadTag.class.getSimpleName())) { + handleUploadTag(); + } + + if (getTagList().containsKey(SensorStateTag.class.getSimpleName())) { + handleSensorStateTag(); + } + } + + private void handleUploadTag() { + UploadTag uploadTag = (UploadTag) getTagList().get(UploadTag.class.getSimpleName()); + uploadTag.checkOid(); + + // 找到DateTag 取出其中的日期 + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()); + uploadTag.setStartDate(dateTag.getDate()); + + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + bizDataList = new ArrayList<>(); + for (int i = 0; i < count; i++) { + MethaneBizData bizData = new MethaneBizData(); + + bizData.setBizType(uploadTag.getBizType()); + bizData.setUptime(start); + String hexReversStr = BytesUtil.reverseHexString(uploadTag.getValueStr().substring(i * 4 * 2, (i + 1) * 4 * 2)); + bizData.setValue(BytesUtil.hexStringToFloat(hexReversStr)); + + bizDataList.add(bizData); + + // 加上时间间隔 + start = start.plusMinutes(uploadTag.getInterval()); + } + } + + private void handleSensorStateTag() { + SensorStateTag sensorStateTag = (SensorStateTag) getTagList().get(SensorStateTag.class.getSimpleName()); + if (sensorStateTag.getOid().equals(BirmmTagAttributeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java index d29e372..a7daf4d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java @@ -3,6 +3,7 @@ import com.casic.missiles.frame.BirmmBaseTag; import java.util.List; +import java.util.Map; /** * BIRMM系列设备 @@ -27,11 +28,14 @@ String getDestinationAddr(byte[] frameBytes); String getPDUType(byte[] frameBytes); + byte[] getPDUTypeBytes(byte[] frameBytes); + String getDeviceType(byte[] pduTypeBytes); + String getOperaType(byte[] pduTypeBytes); String getSequence(byte[] frameBytes); String getTagListString(byte[] frameBytes); - List getTagList(byte[] tagBytes); + Map getTagList(byte[] tagBytes); String getCRC(byte[] frameBytes); String getToBeVerifiedCRCBytes(byte[] frameBytes); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java index d3e7391..1abff43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java @@ -9,8 +9,8 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; -import java.util.ArrayList; -import java.util.List; +import java.util.HashMap; +import java.util.Map; @Component @Slf4j @@ -87,6 +87,23 @@ } @Override + public byte[] getPDUTypeBytes(byte[] frameBytes) { + byte[] bytes = new byte[BirmmFrameAttributeEnums.PDU_TYPE.getLength()]; + System.arraycopy(frameBytes, BirmmFrameAttributeEnums.PDU_TYPE.getOffset(), bytes, 0, BirmmFrameAttributeEnums.PDU_TYPE.getLength()); + return bytes; + } + + @Override + public String getDeviceType(byte[] pduTypeBytes) { + return String.valueOf(pduTypeBytes[1] & 0x7F); + } + + @Override + public String getOperaType(byte[] pduTypeBytes) { + return String.valueOf(pduTypeBytes[0]); // bit15 - bit8 一个字节表示操作类型 + } + + @Override public String getSequence(byte[] frameBytes) { return BytesUtil.extractHexString(frameBytes, BirmmFrameAttributeEnums.SEQ.getOffset(), BirmmFrameAttributeEnums.SEQ.getLength()); // byte[16] 表示序号 } @@ -98,12 +115,12 @@ } @Override - public List getTagList(byte[] tagBytes) { + public Map getTagList(byte[] tagBytes) { // 必须包含OID和长度 4 + 2 if (tagBytes.length < 6) { return null; } - List tagList = new ArrayList<>(); + Map tagList = new HashMap<>(); int idx = 0; while (idx + 6 < tagBytes.length) { String oid = BytesUtil.extractHexString(tagBytes, idx, 4); @@ -118,7 +135,7 @@ log.debug("解析Tag:{}", tagBase); - tagList.add(tagBase); + tagList.put(tagBase.getClass().getSimpleName() ,tagBase); } } idx += tagLen; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java index fda0518..b452bc0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java @@ -11,7 +11,9 @@ import org.apache.tomcat.util.buf.HexUtils; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; import java.util.List; +import java.util.Map; import javax.annotation.Resource; @Service @@ -22,7 +24,7 @@ BirmmProtocolParser protocol; @Override - public BirmmBaseFrame dataParse(byte[] frame) { + public BirmmBaseFrame doFrameParse(byte[] frame) { boolean frameValid = protocol.preCheckFrame(frame); if (frameValid) { // 解析长度 @@ -39,6 +41,9 @@ // 解析得到PDUType String pduType = protocol.getPDUType(frame); + byte[] pduTypeBytes = protocol.getPDUTypeBytes(frame); + String deviceType = protocol.getDeviceType(pduTypeBytes); + String operaType = protocol.getOperaType(pduTypeBytes); // 解析序号 String seq = protocol.getSequence(frame); @@ -56,10 +61,16 @@ log.info("业务字段:{}", plainTagListStr); // 获得业务字段tagList - List tagList = protocol.getTagList(plainBytes); + Map tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(pduType); + BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + if (birmmFrame != null) { + birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 + birmmFrame.setTagList(tagList); + + return birmmFrame; + } } return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index 5e27b33..93cc332 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -4,5 +4,10 @@ public interface IGeneralService { - BirmmBaseFrame dataParse(byte[] frame); + /** + * 协议框架解析 + * @param frame + * @return + */ + BirmmBaseFrame doFrameParse(byte[] frame); } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmDeviceTypeEnums.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmDeviceTypeEnums.java new file mode 100644 index 0000000..e1eac2d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmDeviceTypeEnums.java @@ -0,0 +1,43 @@ +package com.casic.missiles.enums; + +import lombok.Getter; + +import java.util.stream.Stream; + +/** + * 帧结构属性枚举 + */ +@Getter +public enum BirmmDeviceTypeEnums { + METHANE("4", "BIRMM-RTU100N", "31"), + WELL("6", "BIRMM-WELL100N", "41"), + LIQUID_GAS("25", "", "32"), + METHANE_BIZ("32", "", "33"), + DEFAULT("", "", ""); + + + /** + * 名称 + */ + private final String value; + + /** + * 描述 + */ + private final String description; + + /** + * 设备编号的前缀 + */ + final String devPrefix; + + BirmmDeviceTypeEnums(String value, String description, String devPrefix) { + this.value = value; + this.description = description; + this.devPrefix = devPrefix; + } + + public static BirmmDeviceTypeEnums toType(String value) { + return Stream.of(BirmmDeviceTypeEnums.values()).filter(p -> p.value.equalsIgnoreCase(value)).findAny().orElse(null); + } +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmOperationTypeEnums.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmOperationTypeEnums.java new file mode 100644 index 0000000..7bca266 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmOperationTypeEnums.java @@ -0,0 +1,44 @@ +package com.casic.missiles.enums; + +import lombok.Getter; + +import java.util.stream.Stream; + +/** + * 帧结构属性枚举 + */ +@Getter +public enum BirmmOperationTypeEnums { + DOWN_GET_REQUEST("1", "GetRequest"), + UP_GET_RESPONSE("2", "GetResponse"), + DOWN_SET_REQUEST("3", "SetRequest"), + UP_TRAP_REQUEST("4", "TrapRequest"), + DOWN_TRAP_RESPONSE("5", "TrapResponse"), + UP_ONLINE_REQUEST("6", "OnlineRequest"), + DOWN_ONLINE_RESPONSE("7", "OnlineResponse"), + UP_STARTUP_REQUEST("8", "StartupRequest"), + DOWN_STARTUP_RESPONSE("9", "StartupResponse"), + DOWN_WAKEUP_REQUEST("10", "WakeupRequest"), + UP_WAKEUP_RESPONSE("11", "WakeupResponse"), + UP_SET_RESPONSE("12", "SetResponse"); + + + /** + * 名称 + */ + private final String value; + + /** + * 描述 + */ + private final String description; + + BirmmOperationTypeEnums(String value, String description) { + this.value = value; + this.description = description; + } + + public static BirmmOperationTypeEnums toType(String value) { + return Stream.of(BirmmOperationTypeEnums.values()).filter(p -> p.value.equalsIgnoreCase(value)).findAny().orElse(null); + } +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmTagAttributeEnums.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmTagAttributeEnums.java index 911cbe0..abc6e56 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmTagAttributeEnums.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmTagAttributeEnums.java @@ -19,8 +19,12 @@ COLLECT_INTERVAL_TAG("10000105", 2), COLLECT_COUNT_TAG("10000106", 2), LOWER_LIMIT_TAG("10000900", 4), - UPPER_LIMIMT_TAG("10000901", 4), - + UPPER_LIMIT_TAG("10000901", 4), + SENSOR_STATE_1_TAG("60000009", 1), + SENSOR_STATE_2_TAG("6000000A", 1), + SENSOR_STATE_3_TAG("6000000B", 1), + SENSOR_STATE_4_TAG("6000000C", 1), + SENSOR_STATE_5_TAG("6000000D", 1), CELL_TAG("60000020", 1), SOFTWARE_VERSION_TAG("60000500", -1), PCI_TAG("60000511", 2), diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 8f90fd9..49d5afa 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -42,9 +42,20 @@ byte[] frameBytes = getFrameStringFromData(dataMap); log.info("HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); - BirmmBaseFrame birmmFrame = defaultService.dataParse(frameBytes); + BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); if (birmmFrame != null) { log.info("HEX字节消息解析成功:{}", birmmFrame); + + // 处理业务数据 + birmmFrame.doParseBizTag(); + + // 保存日志 + + // 保存业务数据 + + // 创建回复消息 +// String replyFrame = protocol + birmmFrame.reply(); } // 返回给电信AEP平台 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java index ae6706a..6a14f09 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmBaseFrame.java @@ -1,7 +1,10 @@ package com.casic.missiles.frame; import lombok.Data; + +import java.time.LocalDateTime; import java.util.List; +import java.util.Map; @Data public class BirmmBaseFrame { @@ -33,8 +36,16 @@ // 业务字段List String tagListString; - List tagList; +// List tagList; + Map tagList; // CRC String crc; + + LocalDateTime logTime; + + public void doParseBizTag() {} + + public void reply() {} + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java index b1fd65c..b246fb9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java @@ -1,9 +1,27 @@ package com.casic.missiles.frame; +import com.casic.missiles.enums.BirmmDeviceTypeEnums; +import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; + public class BirmmFrameBuilderFactory { - public static BirmmBaseFrame createBirmmFrame(String pduType) { + public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); + if (type != null) { + switch (type) { + case METHANE: + return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + + case WELL: + return null; + + default: + return null; + } + + } return null; } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java index 86db0a3..86c936b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/BirmmTagBuilderFactory.java @@ -39,9 +39,17 @@ case LOWER_LIMIT_TAG: return new LowerLimitTag(); - case UPPER_LIMIMT_TAG: + case UPPER_LIMIT_TAG: return new UpperLimitTag(); + case SENSOR_STATE_1_TAG: + case SENSOR_STATE_2_TAG: + case SENSOR_STATE_3_TAG: + case SENSOR_STATE_4_TAG: + case SENSOR_STATE_5_TAG: + // 传感器状态 需要根据设备类型单独处理 + return new SensorStateTag(); + case CELL_TAG: return new CellTag(); @@ -61,6 +69,11 @@ return null; } } + + // 业务上传报表 + if (oid.startsWith("C")) { + return new UploadTag(); + } return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java new file mode 100644 index 0000000..304d7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/SensorStateTag.java @@ -0,0 +1,7 @@ +package com.casic.missiles.frame.commanTag; + +import com.casic.missiles.frame.BirmmBaseTag; + +public class SensorStateTag extends BirmmBaseTag { + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java new file mode 100644 index 0000000..da4073b --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/commanTag/UploadTag.java @@ -0,0 +1,47 @@ +package com.casic.missiles.frame.commanTag; + +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@EqualsAndHashCode(callSuper = true) +@Data +public class UploadTag extends BirmmBaseTag { + + private int bizType; + private int interval; + private int startMin; + private LocalDateTime startTime; + + @Override + public String toString() { + return super.toString(); + } + + public void checkOid() { + long oidValue = Long.parseLong(getOid(), 16); + bizType = (int) (((oidValue >> 24) & 0x0F) | ((oidValue >> 18) & 0x30)); + interval = (int) ((oidValue >> 11) & 0x7FF); + startMin = (int) (oidValue & 0x7FF); + + int hour = startMin / 60; + int minute = startMin % 60; + + startTime = LocalDateTime.of(2000, 1, 1, hour, minute, 0); + } + + public void setStartDate(String dateStr) { + LocalDate date = LocalDate.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd")); + setStartDate(date); + } + + public void setStartDate(LocalDate date) { + startTime = startTime.withYear(date.getYear()); + startTime = startTime.withMonth(date.getMonthValue()); + startTime = startTime.withDayOfMonth(date.getDayOfMonth()); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java new file mode 100644 index 0000000..43f75af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneBizData.java @@ -0,0 +1,19 @@ +package com.casic.missiles.frame.methane; + +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class MethaneBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) + "][" + value + "][" + bizType + "]"; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java new file mode 100644 index 0000000..76cfe45 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java @@ -0,0 +1,28 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; + +public class MethaneFrameBuilderFactory { + + public static BirmmBaseFrame createMethaneFrameByOperation(String operaType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); + if (operation != null) { + switch (operation) { + case UP_TRAP_REQUEST: + return new MethaneTrapRequestFrame(); + + case UP_ONLINE_REQUEST: + return new MethaneOnlineRequestFrame(); + + case UP_SET_RESPONSE: + return new MethaneSetResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 47fd65b..deeb421 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,4 +1,6 @@ package com.casic.missiles.frame.methane; -public class MethaneSetResponseFrame { +import com.casic.missiles.frame.BirmmBaseFrame; + +public class MethaneSetResponseFrame extends BirmmBaseFrame { } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java index 1f4d831..34a4cd9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java @@ -1,6 +1,69 @@ package com.casic.missiles.frame.methane; +import com.casic.missiles.enums.BirmmTagAttributeEnums; import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.commanTag.DateTag; +import com.casic.missiles.frame.commanTag.SensorStateTag; +import com.casic.missiles.frame.commanTag.UploadTag; +import com.casic.missiles.util.BytesUtil; +import lombok.extern.slf4j.Slf4j; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Slf4j public class MethaneTrapRequestFrame extends BirmmBaseFrame { + + private List bizDataList; + + @Override + public String toString() { + return ""; + } + + @Override + public void doParseBizTag() { + if (getTagList().containsKey(UploadTag.class.getSimpleName())) { + handleUploadTag(); + } + + if (getTagList().containsKey(SensorStateTag.class.getSimpleName())) { + handleSensorStateTag(); + } + } + + private void handleUploadTag() { + UploadTag uploadTag = (UploadTag) getTagList().get(UploadTag.class.getSimpleName()); + uploadTag.checkOid(); + + // 找到DateTag 取出其中的日期 + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()); + uploadTag.setStartDate(dateTag.getDate()); + + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + bizDataList = new ArrayList<>(); + for (int i = 0; i < count; i++) { + MethaneBizData bizData = new MethaneBizData(); + + bizData.setBizType(uploadTag.getBizType()); + bizData.setUptime(start); + String hexReversStr = BytesUtil.reverseHexString(uploadTag.getValueStr().substring(i * 4 * 2, (i + 1) * 4 * 2)); + bizData.setValue(BytesUtil.hexStringToFloat(hexReversStr)); + + bizDataList.add(bizData); + + // 加上时间间隔 + start = start.plusMinutes(uploadTag.getInterval()); + } + } + + private void handleSensorStateTag() { + SensorStateTag sensorStateTag = (SensorStateTag) getTagList().get(SensorStateTag.class.getSimpleName()); + if (sensorStateTag.getOid().equals(BirmmTagAttributeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java index d29e372..a7daf4d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmProtocolParser.java @@ -3,6 +3,7 @@ import com.casic.missiles.frame.BirmmBaseTag; import java.util.List; +import java.util.Map; /** * BIRMM系列设备 @@ -27,11 +28,14 @@ String getDestinationAddr(byte[] frameBytes); String getPDUType(byte[] frameBytes); + byte[] getPDUTypeBytes(byte[] frameBytes); + String getDeviceType(byte[] pduTypeBytes); + String getOperaType(byte[] pduTypeBytes); String getSequence(byte[] frameBytes); String getTagListString(byte[] frameBytes); - List getTagList(byte[] tagBytes); + Map getTagList(byte[] tagBytes); String getCRC(byte[] frameBytes); String getToBeVerifiedCRCBytes(byte[] frameBytes); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java index d3e7391..1abff43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/impl/BirmmProtocolParserImpl.java @@ -9,8 +9,8 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; -import java.util.ArrayList; -import java.util.List; +import java.util.HashMap; +import java.util.Map; @Component @Slf4j @@ -87,6 +87,23 @@ } @Override + public byte[] getPDUTypeBytes(byte[] frameBytes) { + byte[] bytes = new byte[BirmmFrameAttributeEnums.PDU_TYPE.getLength()]; + System.arraycopy(frameBytes, BirmmFrameAttributeEnums.PDU_TYPE.getOffset(), bytes, 0, BirmmFrameAttributeEnums.PDU_TYPE.getLength()); + return bytes; + } + + @Override + public String getDeviceType(byte[] pduTypeBytes) { + return String.valueOf(pduTypeBytes[1] & 0x7F); + } + + @Override + public String getOperaType(byte[] pduTypeBytes) { + return String.valueOf(pduTypeBytes[0]); // bit15 - bit8 一个字节表示操作类型 + } + + @Override public String getSequence(byte[] frameBytes) { return BytesUtil.extractHexString(frameBytes, BirmmFrameAttributeEnums.SEQ.getOffset(), BirmmFrameAttributeEnums.SEQ.getLength()); // byte[16] 表示序号 } @@ -98,12 +115,12 @@ } @Override - public List getTagList(byte[] tagBytes) { + public Map getTagList(byte[] tagBytes) { // 必须包含OID和长度 4 + 2 if (tagBytes.length < 6) { return null; } - List tagList = new ArrayList<>(); + Map tagList = new HashMap<>(); int idx = 0; while (idx + 6 < tagBytes.length) { String oid = BytesUtil.extractHexString(tagBytes, idx, 4); @@ -118,7 +135,7 @@ log.debug("解析Tag:{}", tagBase); - tagList.add(tagBase); + tagList.put(tagBase.getClass().getSimpleName() ,tagBase); } } idx += tagLen; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java index fda0518..b452bc0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java @@ -11,7 +11,9 @@ import org.apache.tomcat.util.buf.HexUtils; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; import java.util.List; +import java.util.Map; import javax.annotation.Resource; @Service @@ -22,7 +24,7 @@ BirmmProtocolParser protocol; @Override - public BirmmBaseFrame dataParse(byte[] frame) { + public BirmmBaseFrame doFrameParse(byte[] frame) { boolean frameValid = protocol.preCheckFrame(frame); if (frameValid) { // 解析长度 @@ -39,6 +41,9 @@ // 解析得到PDUType String pduType = protocol.getPDUType(frame); + byte[] pduTypeBytes = protocol.getPDUTypeBytes(frame); + String deviceType = protocol.getDeviceType(pduTypeBytes); + String operaType = protocol.getOperaType(pduTypeBytes); // 解析序号 String seq = protocol.getSequence(frame); @@ -56,10 +61,16 @@ log.info("业务字段:{}", plainTagListStr); // 获得业务字段tagList - List tagList = protocol.getTagList(plainBytes); + Map tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(pduType); + BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + if (birmmFrame != null) { + birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 + birmmFrame.setTagList(tagList); + + return birmmFrame; + } } return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index 5e27b33..93cc332 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -4,5 +4,10 @@ public interface IGeneralService { - BirmmBaseFrame dataParse(byte[] frame); + /** + * 协议框架解析 + * @param frame + * @return + */ + BirmmBaseFrame doFrameParse(byte[] frame); } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmDeviceTypeEnums.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmDeviceTypeEnums.java new file mode 100644 index 0000000..e1eac2d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmDeviceTypeEnums.java @@ -0,0 +1,43 @@ +package com.casic.missiles.enums; + +import lombok.Getter; + +import java.util.stream.Stream; + +/** + * 帧结构属性枚举 + */ +@Getter +public enum BirmmDeviceTypeEnums { + METHANE("4", "BIRMM-RTU100N", "31"), + WELL("6", "BIRMM-WELL100N", "41"), + LIQUID_GAS("25", "", "32"), + METHANE_BIZ("32", "", "33"), + DEFAULT("", "", ""); + + + /** + * 名称 + */ + private final String value; + + /** + * 描述 + */ + private final String description; + + /** + * 设备编号的前缀 + */ + final String devPrefix; + + BirmmDeviceTypeEnums(String value, String description, String devPrefix) { + this.value = value; + this.description = description; + this.devPrefix = devPrefix; + } + + public static BirmmDeviceTypeEnums toType(String value) { + return Stream.of(BirmmDeviceTypeEnums.values()).filter(p -> p.value.equalsIgnoreCase(value)).findAny().orElse(null); + } +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmOperationTypeEnums.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmOperationTypeEnums.java new file mode 100644 index 0000000..7bca266 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmOperationTypeEnums.java @@ -0,0 +1,44 @@ +package com.casic.missiles.enums; + +import lombok.Getter; + +import java.util.stream.Stream; + +/** + * 帧结构属性枚举 + */ +@Getter +public enum BirmmOperationTypeEnums { + DOWN_GET_REQUEST("1", "GetRequest"), + UP_GET_RESPONSE("2", "GetResponse"), + DOWN_SET_REQUEST("3", "SetRequest"), + UP_TRAP_REQUEST("4", "TrapRequest"), + DOWN_TRAP_RESPONSE("5", "TrapResponse"), + UP_ONLINE_REQUEST("6", "OnlineRequest"), + DOWN_ONLINE_RESPONSE("7", "OnlineResponse"), + UP_STARTUP_REQUEST("8", "StartupRequest"), + DOWN_STARTUP_RESPONSE("9", "StartupResponse"), + DOWN_WAKEUP_REQUEST("10", "WakeupRequest"), + UP_WAKEUP_RESPONSE("11", "WakeupResponse"), + UP_SET_RESPONSE("12", "SetResponse"); + + + /** + * 名称 + */ + private final String value; + + /** + * 描述 + */ + private final String description; + + BirmmOperationTypeEnums(String value, String description) { + this.value = value; + this.description = description; + } + + public static BirmmOperationTypeEnums toType(String value) { + return Stream.of(BirmmOperationTypeEnums.values()).filter(p -> p.value.equalsIgnoreCase(value)).findAny().orElse(null); + } +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmTagAttributeEnums.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmTagAttributeEnums.java index 911cbe0..abc6e56 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmTagAttributeEnums.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmTagAttributeEnums.java @@ -19,8 +19,12 @@ COLLECT_INTERVAL_TAG("10000105", 2), COLLECT_COUNT_TAG("10000106", 2), LOWER_LIMIT_TAG("10000900", 4), - UPPER_LIMIMT_TAG("10000901", 4), - + UPPER_LIMIT_TAG("10000901", 4), + SENSOR_STATE_1_TAG("60000009", 1), + SENSOR_STATE_2_TAG("6000000A", 1), + SENSOR_STATE_3_TAG("6000000B", 1), + SENSOR_STATE_4_TAG("6000000C", 1), + SENSOR_STATE_5_TAG("6000000D", 1), CELL_TAG("60000020", 1), SOFTWARE_VERSION_TAG("60000500", -1), PCI_TAG("60000511", 2), diff --git a/sensorhub-support/src/main/java/com/casic/missiles/util/BytesUtil.java b/sensorhub-support/src/main/java/com/casic/missiles/util/BytesUtil.java index 588b15b..6d49305 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/util/BytesUtil.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/util/BytesUtil.java @@ -35,6 +35,10 @@ return hexStringToSInt(HexUtils.fromHexString(str)); } + public static float hexStringToFloat(String str) { + return Float.intBitsToFloat(Integer.parseInt(str, 16)); + } + public static byte[] hexStringToBytes(String str) { if (str.length() % 2 == 1) { str = "0" + str;