diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 70596b6..3ac4de7 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -69,7 +69,7 @@ enable: true sensorhub: config: - port: 7091 + port: 22009 bean: "functionCallback" url: "http://127.0.0.1:7093/push/test" fileUrl: D:\casic\file\ diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 70596b6..3ac4de7 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -69,7 +69,7 @@ enable: true sensorhub: config: - port: 7091 + port: 22009 bean: "functionCallback" url: "http://127.0.0.1:7093/push/test" fileUrl: D:\casic\file\ diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 8dcc497..da561cd 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -49,6 +49,12 @@ + cn.hutool + hutool-all + 5.7.16 + + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 70596b6..3ac4de7 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -69,7 +69,7 @@ enable: true sensorhub: config: - port: 7091 + port: 22009 bean: "functionCallback" url: "http://127.0.0.1:7093/push/test" fileUrl: D:\casic\file\ diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 8dcc497..da561cd 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -49,6 +49,12 @@ + cn.hutool + hutool-all + 5.7.16 + + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} 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 32dfdf3..140ee01 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 @@ -1,6 +1,10 @@ package com.casic.missiles.controller; +import cn.hutool.Hutool; import cn.hutool.core.lang.generator.UUIDGenerator; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.model.DeviceBizData; @@ -76,6 +80,12 @@ frameLog.setLogtime(birmmFrame.getLogTime()); frameLogService.save(frameLog); + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + // 保存业务数据 if (birmmFrame.isBizDataFrame()) { List bizDataList = birmmFrame.convertToBizDataList(); @@ -105,13 +115,15 @@ if (dataMap.containsKey("profile")) { hasProfile = (Boolean) dataMap.get("profile"); } - aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); + aepCmdService.setDeviceId((String) dataMap.get("deviceId")); aepCmdService.setProductId((String) dataMap.get("productId")); if (hasProfile) { + aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); retCode = aepCmdService.handleSendCommandWithProfile(replyMessage); } else { - retCode = aepCmdService.handleSendCommand(replyMessage); + aepCmdService.setMasterApiKey("ee2f4011f0a04f28b1572967891b57d5"); + retCode = aepCmdService.handleSendCommand(replyMessage, 2); // 2=16进制 } if (retCode == 0) { diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 70596b6..3ac4de7 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -69,7 +69,7 @@ enable: true sensorhub: config: - port: 7091 + port: 22009 bean: "functionCallback" url: "http://127.0.0.1:7093/push/test" fileUrl: D:\casic\file\ diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 8dcc497..da561cd 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -49,6 +49,12 @@ + cn.hutool + hutool-all + 5.7.16 + + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} 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 32dfdf3..140ee01 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 @@ -1,6 +1,10 @@ package com.casic.missiles.controller; +import cn.hutool.Hutool; import cn.hutool.core.lang.generator.UUIDGenerator; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.model.DeviceBizData; @@ -76,6 +80,12 @@ frameLog.setLogtime(birmmFrame.getLogTime()); frameLogService.save(frameLog); + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + // 保存业务数据 if (birmmFrame.isBizDataFrame()) { List bizDataList = birmmFrame.convertToBizDataList(); @@ -105,13 +115,15 @@ if (dataMap.containsKey("profile")) { hasProfile = (Boolean) dataMap.get("profile"); } - aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); + aepCmdService.setDeviceId((String) dataMap.get("deviceId")); aepCmdService.setProductId((String) dataMap.get("productId")); if (hasProfile) { + aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); retCode = aepCmdService.handleSendCommandWithProfile(replyMessage); } else { - retCode = aepCmdService.handleSendCommand(replyMessage); + aepCmdService.setMasterApiKey("ee2f4011f0a04f28b1572967891b57d5"); + retCode = aepCmdService.handleSendCommand(replyMessage, 2); // 2=16进制 } if (retCode == 0) { 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 f934d86..e22284a 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 @@ -48,7 +48,7 @@ // 业务字段List String tagListString; - Map tagList; + Map> tagList; // CRC String crc; @@ -83,7 +83,9 @@ DateTimeTag dateTimeTag = new DateTimeTag(); dateTimeTag.setDateTime(LocalDateTime.now()); - tagList.put(DateTimeTag.class.getSimpleName(), dateTimeTag); + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); } } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 70596b6..3ac4de7 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -69,7 +69,7 @@ enable: true sensorhub: config: - port: 7091 + port: 22009 bean: "functionCallback" url: "http://127.0.0.1:7093/push/test" fileUrl: D:\casic\file\ diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 8dcc497..da561cd 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -49,6 +49,12 @@ + cn.hutool + hutool-all + 5.7.16 + + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} 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 32dfdf3..140ee01 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 @@ -1,6 +1,10 @@ package com.casic.missiles.controller; +import cn.hutool.Hutool; import cn.hutool.core.lang.generator.UUIDGenerator; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.model.DeviceBizData; @@ -76,6 +80,12 @@ frameLog.setLogtime(birmmFrame.getLogTime()); frameLogService.save(frameLog); + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + // 保存业务数据 if (birmmFrame.isBizDataFrame()) { List bizDataList = birmmFrame.convertToBizDataList(); @@ -105,13 +115,15 @@ if (dataMap.containsKey("profile")) { hasProfile = (Boolean) dataMap.get("profile"); } - aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); + aepCmdService.setDeviceId((String) dataMap.get("deviceId")); aepCmdService.setProductId((String) dataMap.get("productId")); if (hasProfile) { + aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); retCode = aepCmdService.handleSendCommandWithProfile(replyMessage); } else { - retCode = aepCmdService.handleSendCommand(replyMessage); + aepCmdService.setMasterApiKey("ee2f4011f0a04f28b1572967891b57d5"); + retCode = aepCmdService.handleSendCommand(replyMessage, 2); // 2=16进制 } if (retCode == 0) { 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 f934d86..e22284a 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 @@ -48,7 +48,7 @@ // 业务字段List String tagListString; - Map tagList; + Map> tagList; // CRC String crc; @@ -83,7 +83,9 @@ DateTimeTag dateTimeTag = new DateTimeTag(); dateTimeTag.setDateTime(LocalDateTime.now()); - tagList.put(DateTimeTag.class.getSimpleName(), dateTimeTag); + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); } } 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 ef031b8..772092d 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 @@ -2,6 +2,7 @@ import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; +import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; public class BirmmFrameBuilderFactory { @@ -12,6 +13,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); + case WELL: return null; @@ -31,6 +35,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); + case WELL: return null; diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 70596b6..3ac4de7 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -69,7 +69,7 @@ enable: true sensorhub: config: - port: 7091 + port: 22009 bean: "functionCallback" url: "http://127.0.0.1:7093/push/test" fileUrl: D:\casic\file\ diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 8dcc497..da561cd 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -49,6 +49,12 @@ + cn.hutool + hutool-all + 5.7.16 + + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} 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 32dfdf3..140ee01 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 @@ -1,6 +1,10 @@ package com.casic.missiles.controller; +import cn.hutool.Hutool; import cn.hutool.core.lang.generator.UUIDGenerator; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.model.DeviceBizData; @@ -76,6 +80,12 @@ frameLog.setLogtime(birmmFrame.getLogTime()); frameLogService.save(frameLog); + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + // 保存业务数据 if (birmmFrame.isBizDataFrame()) { List bizDataList = birmmFrame.convertToBizDataList(); @@ -105,13 +115,15 @@ if (dataMap.containsKey("profile")) { hasProfile = (Boolean) dataMap.get("profile"); } - aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); + aepCmdService.setDeviceId((String) dataMap.get("deviceId")); aepCmdService.setProductId((String) dataMap.get("productId")); if (hasProfile) { + aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); retCode = aepCmdService.handleSendCommandWithProfile(replyMessage); } else { - retCode = aepCmdService.handleSendCommand(replyMessage); + aepCmdService.setMasterApiKey("ee2f4011f0a04f28b1572967891b57d5"); + retCode = aepCmdService.handleSendCommand(replyMessage, 2); // 2=16进制 } if (retCode == 0) { 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 f934d86..e22284a 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 @@ -48,7 +48,7 @@ // 业务字段List String tagListString; - Map tagList; + Map> tagList; // CRC String crc; @@ -83,7 +83,9 @@ DateTimeTag dateTimeTag = new DateTimeTag(); dateTimeTag.setDateTime(LocalDateTime.now()); - tagList.put(DateTimeTag.class.getSimpleName(), dateTimeTag); + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); } } 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 ef031b8..772092d 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 @@ -2,6 +2,7 @@ import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; +import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; public class BirmmFrameBuilderFactory { @@ -12,6 +13,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); + case WELL: return null; @@ -31,6 +35,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); + case WELL: return null; 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 index 71023ee..3617ae7 100644 --- 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 @@ -9,6 +9,9 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + case UP_TRAP_REQUEST: return new MethaneTrapRequestFrame(); @@ -30,6 +33,10 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE return new MethaneTrapResponseFrame(); diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 70596b6..3ac4de7 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -69,7 +69,7 @@ enable: true sensorhub: config: - port: 7091 + port: 22009 bean: "functionCallback" url: "http://127.0.0.1:7093/push/test" fileUrl: D:\casic\file\ diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 8dcc497..da561cd 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -49,6 +49,12 @@ + cn.hutool + hutool-all + 5.7.16 + + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} 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 32dfdf3..140ee01 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 @@ -1,6 +1,10 @@ package com.casic.missiles.controller; +import cn.hutool.Hutool; import cn.hutool.core.lang.generator.UUIDGenerator; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.model.DeviceBizData; @@ -76,6 +80,12 @@ frameLog.setLogtime(birmmFrame.getLogTime()); frameLogService.save(frameLog); + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + // 保存业务数据 if (birmmFrame.isBizDataFrame()) { List bizDataList = birmmFrame.convertToBizDataList(); @@ -105,13 +115,15 @@ if (dataMap.containsKey("profile")) { hasProfile = (Boolean) dataMap.get("profile"); } - aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); + aepCmdService.setDeviceId((String) dataMap.get("deviceId")); aepCmdService.setProductId((String) dataMap.get("productId")); if (hasProfile) { + aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); retCode = aepCmdService.handleSendCommandWithProfile(replyMessage); } else { - retCode = aepCmdService.handleSendCommand(replyMessage); + aepCmdService.setMasterApiKey("ee2f4011f0a04f28b1572967891b57d5"); + retCode = aepCmdService.handleSendCommand(replyMessage, 2); // 2=16进制 } if (retCode == 0) { 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 f934d86..e22284a 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 @@ -48,7 +48,7 @@ // 业务字段List String tagListString; - Map tagList; + Map> tagList; // CRC String crc; @@ -83,7 +83,9 @@ DateTimeTag dateTimeTag = new DateTimeTag(); dateTimeTag.setDateTime(LocalDateTime.now()); - tagList.put(DateTimeTag.class.getSimpleName(), dateTimeTag); + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); } } 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 ef031b8..772092d 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 @@ -2,6 +2,7 @@ import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; +import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; public class BirmmFrameBuilderFactory { @@ -12,6 +13,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); + case WELL: return null; @@ -31,6 +35,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); + case WELL: return null; 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 index 71023ee..3617ae7 100644 --- 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 @@ -9,6 +9,9 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + case UP_TRAP_REQUEST: return new MethaneTrapRequestFrame(); @@ -30,6 +33,10 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE return new MethaneTrapResponseFrame(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java new file mode 100644 index 0000000..a1fd8bc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java @@ -0,0 +1,43 @@ +package com.casic.missiles.frame.methane; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; +import com.casic.missiles.frame.tag.ota.RequestSizeTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; + +import java.time.format.DateTimeFormatter; + +public class MethaneGetRequestFrame extends BirmmBaseFrame { + + private final String DEV_TYPE = "Methane"; + private final String MESSAGE_TYPE = "GetRequest"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); + body.put("reqSize", tag.getRequestSize()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); + body.put("reqOffset", tag.getRequestOffset()); + } + + json.put("mBody", body); + + return json; + } +} diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 70596b6..3ac4de7 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -69,7 +69,7 @@ enable: true sensorhub: config: - port: 7091 + port: 22009 bean: "functionCallback" url: "http://127.0.0.1:7093/push/test" fileUrl: D:\casic\file\ diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 8dcc497..da561cd 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -49,6 +49,12 @@ + cn.hutool + hutool-all + 5.7.16 + + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} 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 32dfdf3..140ee01 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 @@ -1,6 +1,10 @@ package com.casic.missiles.controller; +import cn.hutool.Hutool; import cn.hutool.core.lang.generator.UUIDGenerator; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.model.DeviceBizData; @@ -76,6 +80,12 @@ frameLog.setLogtime(birmmFrame.getLogTime()); frameLogService.save(frameLog); + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + // 保存业务数据 if (birmmFrame.isBizDataFrame()) { List bizDataList = birmmFrame.convertToBizDataList(); @@ -105,13 +115,15 @@ if (dataMap.containsKey("profile")) { hasProfile = (Boolean) dataMap.get("profile"); } - aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); + aepCmdService.setDeviceId((String) dataMap.get("deviceId")); aepCmdService.setProductId((String) dataMap.get("productId")); if (hasProfile) { + aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); retCode = aepCmdService.handleSendCommandWithProfile(replyMessage); } else { - retCode = aepCmdService.handleSendCommand(replyMessage); + aepCmdService.setMasterApiKey("ee2f4011f0a04f28b1572967891b57d5"); + retCode = aepCmdService.handleSendCommand(replyMessage, 2); // 2=16进制 } if (retCode == 0) { 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 f934d86..e22284a 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 @@ -48,7 +48,7 @@ // 业务字段List String tagListString; - Map tagList; + Map> tagList; // CRC String crc; @@ -83,7 +83,9 @@ DateTimeTag dateTimeTag = new DateTimeTag(); dateTimeTag.setDateTime(LocalDateTime.now()); - tagList.put(DateTimeTag.class.getSimpleName(), dateTimeTag); + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); } } 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 ef031b8..772092d 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 @@ -2,6 +2,7 @@ import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; +import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; public class BirmmFrameBuilderFactory { @@ -12,6 +13,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); + case WELL: return null; @@ -31,6 +35,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); + case WELL: return null; 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 index 71023ee..3617ae7 100644 --- 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 @@ -9,6 +9,9 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + case UP_TRAP_REQUEST: return new MethaneTrapRequestFrame(); @@ -30,6 +33,10 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE return new MethaneTrapResponseFrame(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java new file mode 100644 index 0000000..a1fd8bc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java @@ -0,0 +1,43 @@ +package com.casic.missiles.frame.methane; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; +import com.casic.missiles.frame.tag.ota.RequestSizeTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; + +import java.time.format.DateTimeFormatter; + +public class MethaneGetRequestFrame extends BirmmBaseFrame { + + private final String DEV_TYPE = "Methane"; + private final String MESSAGE_TYPE = "GetRequest"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); + body.put("reqSize", tag.getRequestSize()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); + body.put("reqOffset", tag.getRequestOffset()); + } + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java new file mode 100644 index 0000000..5f49fe7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.ota.PackageDataTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MethaneGetResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.UP_GET_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } + + @Override + public void replyBizTag() { + // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) + // TODO-LIST + + Map> tagList = new HashMap<>(); + + RequestOffsetTag offsetTag = new RequestOffsetTag(); + offsetTag.setRequestOffset(0); + List offsetTags = new ArrayList<>(); + offsetTags.add(offsetTag); + tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); + + PackageDataTag dataTag = new PackageDataTag(); + dataTag.setData(new byte[] {0}); + List dataTags = new ArrayList<>(); + dataTags.add(dataTag); + tagList.put(PackageDataTag.class.getSimpleName(), dataTags); + + super.setTagList(tagList); + } +} diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 70596b6..3ac4de7 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -69,7 +69,7 @@ enable: true sensorhub: config: - port: 7091 + port: 22009 bean: "functionCallback" url: "http://127.0.0.1:7093/push/test" fileUrl: D:\casic\file\ diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 8dcc497..da561cd 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -49,6 +49,12 @@ + cn.hutool + hutool-all + 5.7.16 + + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} 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 32dfdf3..140ee01 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 @@ -1,6 +1,10 @@ package com.casic.missiles.controller; +import cn.hutool.Hutool; import cn.hutool.core.lang.generator.UUIDGenerator; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.model.DeviceBizData; @@ -76,6 +80,12 @@ frameLog.setLogtime(birmmFrame.getLogTime()); frameLogService.save(frameLog); + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + // 保存业务数据 if (birmmFrame.isBizDataFrame()) { List bizDataList = birmmFrame.convertToBizDataList(); @@ -105,13 +115,15 @@ if (dataMap.containsKey("profile")) { hasProfile = (Boolean) dataMap.get("profile"); } - aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); + aepCmdService.setDeviceId((String) dataMap.get("deviceId")); aepCmdService.setProductId((String) dataMap.get("productId")); if (hasProfile) { + aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); retCode = aepCmdService.handleSendCommandWithProfile(replyMessage); } else { - retCode = aepCmdService.handleSendCommand(replyMessage); + aepCmdService.setMasterApiKey("ee2f4011f0a04f28b1572967891b57d5"); + retCode = aepCmdService.handleSendCommand(replyMessage, 2); // 2=16进制 } if (retCode == 0) { 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 f934d86..e22284a 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 @@ -48,7 +48,7 @@ // 业务字段List String tagListString; - Map tagList; + Map> tagList; // CRC String crc; @@ -83,7 +83,9 @@ DateTimeTag dateTimeTag = new DateTimeTag(); dateTimeTag.setDateTime(LocalDateTime.now()); - tagList.put(DateTimeTag.class.getSimpleName(), dateTimeTag); + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); } } 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 ef031b8..772092d 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 @@ -2,6 +2,7 @@ import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; +import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; public class BirmmFrameBuilderFactory { @@ -12,6 +13,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); + case WELL: return null; @@ -31,6 +35,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); + case WELL: return null; 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 index 71023ee..3617ae7 100644 --- 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 @@ -9,6 +9,9 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + case UP_TRAP_REQUEST: return new MethaneTrapRequestFrame(); @@ -30,6 +33,10 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE return new MethaneTrapResponseFrame(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java new file mode 100644 index 0000000..a1fd8bc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java @@ -0,0 +1,43 @@ +package com.casic.missiles.frame.methane; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; +import com.casic.missiles.frame.tag.ota.RequestSizeTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; + +import java.time.format.DateTimeFormatter; + +public class MethaneGetRequestFrame extends BirmmBaseFrame { + + private final String DEV_TYPE = "Methane"; + private final String MESSAGE_TYPE = "GetRequest"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); + body.put("reqSize", tag.getRequestSize()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); + body.put("reqOffset", tag.getRequestOffset()); + } + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java new file mode 100644 index 0000000..5f49fe7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.ota.PackageDataTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MethaneGetResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.UP_GET_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } + + @Override + public void replyBizTag() { + // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) + // TODO-LIST + + Map> tagList = new HashMap<>(); + + RequestOffsetTag offsetTag = new RequestOffsetTag(); + offsetTag.setRequestOffset(0); + List offsetTags = new ArrayList<>(); + offsetTags.add(offsetTag); + tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); + + PackageDataTag dataTag = new PackageDataTag(); + dataTag.setData(new byte[] {0}); + List dataTags = new ArrayList<>(); + dataTags.add(dataTag); + tagList.put(PackageDataTag.class.getSimpleName(), dataTags); + + super.setTagList(tagList); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java index 37b7fc8..e936a9c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java @@ -22,7 +22,7 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()); + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); body.put("softwareVersion", tag.getVersion()); } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 70596b6..3ac4de7 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -69,7 +69,7 @@ enable: true sensorhub: config: - port: 7091 + port: 22009 bean: "functionCallback" url: "http://127.0.0.1:7093/push/test" fileUrl: D:\casic\file\ diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 8dcc497..da561cd 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -49,6 +49,12 @@ + cn.hutool + hutool-all + 5.7.16 + + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} 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 32dfdf3..140ee01 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 @@ -1,6 +1,10 @@ package com.casic.missiles.controller; +import cn.hutool.Hutool; import cn.hutool.core.lang.generator.UUIDGenerator; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.model.DeviceBizData; @@ -76,6 +80,12 @@ frameLog.setLogtime(birmmFrame.getLogTime()); frameLogService.save(frameLog); + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + // 保存业务数据 if (birmmFrame.isBizDataFrame()) { List bizDataList = birmmFrame.convertToBizDataList(); @@ -105,13 +115,15 @@ if (dataMap.containsKey("profile")) { hasProfile = (Boolean) dataMap.get("profile"); } - aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); + aepCmdService.setDeviceId((String) dataMap.get("deviceId")); aepCmdService.setProductId((String) dataMap.get("productId")); if (hasProfile) { + aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); retCode = aepCmdService.handleSendCommandWithProfile(replyMessage); } else { - retCode = aepCmdService.handleSendCommand(replyMessage); + aepCmdService.setMasterApiKey("ee2f4011f0a04f28b1572967891b57d5"); + retCode = aepCmdService.handleSendCommand(replyMessage, 2); // 2=16进制 } if (retCode == 0) { 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 f934d86..e22284a 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 @@ -48,7 +48,7 @@ // 业务字段List String tagListString; - Map tagList; + Map> tagList; // CRC String crc; @@ -83,7 +83,9 @@ DateTimeTag dateTimeTag = new DateTimeTag(); dateTimeTag.setDateTime(LocalDateTime.now()); - tagList.put(DateTimeTag.class.getSimpleName(), dateTimeTag); + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); } } 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 ef031b8..772092d 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 @@ -2,6 +2,7 @@ import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; +import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; public class BirmmFrameBuilderFactory { @@ -12,6 +13,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); + case WELL: return null; @@ -31,6 +35,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); + case WELL: return null; 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 index 71023ee..3617ae7 100644 --- 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 @@ -9,6 +9,9 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + case UP_TRAP_REQUEST: return new MethaneTrapRequestFrame(); @@ -30,6 +33,10 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE return new MethaneTrapResponseFrame(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java new file mode 100644 index 0000000..a1fd8bc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java @@ -0,0 +1,43 @@ +package com.casic.missiles.frame.methane; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; +import com.casic.missiles.frame.tag.ota.RequestSizeTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; + +import java.time.format.DateTimeFormatter; + +public class MethaneGetRequestFrame extends BirmmBaseFrame { + + private final String DEV_TYPE = "Methane"; + private final String MESSAGE_TYPE = "GetRequest"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); + body.put("reqSize", tag.getRequestSize()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); + body.put("reqOffset", tag.getRequestOffset()); + } + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java new file mode 100644 index 0000000..5f49fe7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.ota.PackageDataTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MethaneGetResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.UP_GET_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } + + @Override + public void replyBizTag() { + // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) + // TODO-LIST + + Map> tagList = new HashMap<>(); + + RequestOffsetTag offsetTag = new RequestOffsetTag(); + offsetTag.setRequestOffset(0); + List offsetTags = new ArrayList<>(); + offsetTags.add(offsetTag); + tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); + + PackageDataTag dataTag = new PackageDataTag(); + dataTag.setData(new byte[] {0}); + List dataTags = new ArrayList<>(); + dataTags.add(dataTag); + tagList.put(PackageDataTag.class.getSimpleName(), dataTags); + + super.setTagList(tagList); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java index 37b7fc8..e936a9c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java @@ -22,7 +22,7 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()); + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); body.put("softwareVersion", tag.getVersion()); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java index cd62d6d..d478366 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java @@ -3,11 +3,11 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.frame.BirmmBaseTag; -import com.casic.missiles.frame.tag.config.DateTimeTag; -import com.casic.missiles.frame.tag.ota.OTANeedTag; +import com.casic.missiles.frame.tag.ota.NeedOTATag; -import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; public class MethaneOnlineResponseFrame extends BirmmBaseFrame { @@ -27,12 +27,16 @@ @Override public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map tagList = new HashMap<>(); - OTANeedTag needTag = new OTANeedTag(); + Map> tagList = new HashMap<>(); + NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); - tagList.put(OTANeedTag.class.getSimpleName(), needTag); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); super.setTagList(tagList); } } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 70596b6..3ac4de7 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -69,7 +69,7 @@ enable: true sensorhub: config: - port: 7091 + port: 22009 bean: "functionCallback" url: "http://127.0.0.1:7093/push/test" fileUrl: D:\casic\file\ diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 8dcc497..da561cd 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -49,6 +49,12 @@ + cn.hutool + hutool-all + 5.7.16 + + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} 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 32dfdf3..140ee01 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 @@ -1,6 +1,10 @@ package com.casic.missiles.controller; +import cn.hutool.Hutool; import cn.hutool.core.lang.generator.UUIDGenerator; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.model.DeviceBizData; @@ -76,6 +80,12 @@ frameLog.setLogtime(birmmFrame.getLogTime()); frameLogService.save(frameLog); + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + // 保存业务数据 if (birmmFrame.isBizDataFrame()) { List bizDataList = birmmFrame.convertToBizDataList(); @@ -105,13 +115,15 @@ if (dataMap.containsKey("profile")) { hasProfile = (Boolean) dataMap.get("profile"); } - aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); + aepCmdService.setDeviceId((String) dataMap.get("deviceId")); aepCmdService.setProductId((String) dataMap.get("productId")); if (hasProfile) { + aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); retCode = aepCmdService.handleSendCommandWithProfile(replyMessage); } else { - retCode = aepCmdService.handleSendCommand(replyMessage); + aepCmdService.setMasterApiKey("ee2f4011f0a04f28b1572967891b57d5"); + retCode = aepCmdService.handleSendCommand(replyMessage, 2); // 2=16进制 } if (retCode == 0) { 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 f934d86..e22284a 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 @@ -48,7 +48,7 @@ // 业务字段List String tagListString; - Map tagList; + Map> tagList; // CRC String crc; @@ -83,7 +83,9 @@ DateTimeTag dateTimeTag = new DateTimeTag(); dateTimeTag.setDateTime(LocalDateTime.now()); - tagList.put(DateTimeTag.class.getSimpleName(), dateTimeTag); + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); } } 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 ef031b8..772092d 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 @@ -2,6 +2,7 @@ import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; +import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; public class BirmmFrameBuilderFactory { @@ -12,6 +13,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); + case WELL: return null; @@ -31,6 +35,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); + case WELL: return null; 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 index 71023ee..3617ae7 100644 --- 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 @@ -9,6 +9,9 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + case UP_TRAP_REQUEST: return new MethaneTrapRequestFrame(); @@ -30,6 +33,10 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE return new MethaneTrapResponseFrame(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java new file mode 100644 index 0000000..a1fd8bc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java @@ -0,0 +1,43 @@ +package com.casic.missiles.frame.methane; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; +import com.casic.missiles.frame.tag.ota.RequestSizeTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; + +import java.time.format.DateTimeFormatter; + +public class MethaneGetRequestFrame extends BirmmBaseFrame { + + private final String DEV_TYPE = "Methane"; + private final String MESSAGE_TYPE = "GetRequest"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); + body.put("reqSize", tag.getRequestSize()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); + body.put("reqOffset", tag.getRequestOffset()); + } + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java new file mode 100644 index 0000000..5f49fe7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.ota.PackageDataTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MethaneGetResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.UP_GET_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } + + @Override + public void replyBizTag() { + // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) + // TODO-LIST + + Map> tagList = new HashMap<>(); + + RequestOffsetTag offsetTag = new RequestOffsetTag(); + offsetTag.setRequestOffset(0); + List offsetTags = new ArrayList<>(); + offsetTags.add(offsetTag); + tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); + + PackageDataTag dataTag = new PackageDataTag(); + dataTag.setData(new byte[] {0}); + List dataTags = new ArrayList<>(); + dataTags.add(dataTag); + tagList.put(PackageDataTag.class.getSimpleName(), dataTags); + + super.setTagList(tagList); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java index 37b7fc8..e936a9c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java @@ -22,7 +22,7 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()); + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); body.put("softwareVersion", tag.getVersion()); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java index cd62d6d..d478366 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java @@ -3,11 +3,11 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.frame.BirmmBaseTag; -import com.casic.missiles.frame.tag.config.DateTimeTag; -import com.casic.missiles.frame.tag.ota.OTANeedTag; +import com.casic.missiles.frame.tag.ota.NeedOTATag; -import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; public class MethaneOnlineResponseFrame extends BirmmBaseFrame { @@ -27,12 +27,16 @@ @Override public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map tagList = new HashMap<>(); - OTANeedTag needTag = new OTANeedTag(); + Map> tagList = new HashMap<>(); + NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); - tagList.put(OTANeedTag.class.getSimpleName(), needTag); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); super.setTagList(tagList); } } 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 690b9c5..6ba27f6 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 @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; import com.casic.missiles.frame.tag.biz.CellTag; import com.casic.missiles.frame.tag.biz.DateTag; import com.casic.missiles.frame.tag.biz.SensorStateTag; @@ -39,19 +40,19 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); body.put("cell", cellTag.getCellVal()); } if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); body.put("pci", pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); body.put("rsrp", rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); body.put("snr", snrTag.getSnr()); } @@ -86,21 +87,21 @@ // 电量 if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); bizData.setCell(cellTag.getCellVal()); } // 信号质量 if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); bizData.setPci(pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); bizData.setRsrp(rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); bizData.setSnr(snrTag.getSnr()); } @@ -123,47 +124,57 @@ } private void handleUploadTag() { - UploadTag uploadTag = (UploadTag) getTagList().get(UploadTag.class.getSimpleName()); + List tags = getTagList().get(UploadTag.class.getSimpleName()); - // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 - boolean isValid = uploadTag.checkOid(); - if (isValid) { - // 找到DateTag 取出其中的日期 - DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()); - uploadTag.setStartDate(dateTag.getDate()); + bizDataList = new ArrayList<>(); - 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(); + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); - 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)); // 转成浮点数 + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + MethaneBizData bizData = new MethaneBizData(); - bizDataList.add(bizData); + 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)); // 转成浮点数 - // 加上时间间隔 - start = start.plusMinutes(uploadTag.getInterval()); + bizDataList.add(bizData); + + // 加上时间间隔 + start = start.plusMinutes(uploadTag.getInterval()); + } } } } private void handleSensorStateTag() { - SensorStateTag sensorStateTag = (SensorStateTag) getTagList().get(SensorStateTag.class.getSimpleName()); - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { - // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { - // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - // TODO-LIST - // 传感器状态异常时需要上报异常事件 + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } } } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 70596b6..3ac4de7 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -69,7 +69,7 @@ enable: true sensorhub: config: - port: 7091 + port: 22009 bean: "functionCallback" url: "http://127.0.0.1:7093/push/test" fileUrl: D:\casic\file\ diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 8dcc497..da561cd 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -49,6 +49,12 @@ + cn.hutool + hutool-all + 5.7.16 + + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} 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 32dfdf3..140ee01 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 @@ -1,6 +1,10 @@ package com.casic.missiles.controller; +import cn.hutool.Hutool; import cn.hutool.core.lang.generator.UUIDGenerator; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.model.DeviceBizData; @@ -76,6 +80,12 @@ frameLog.setLogtime(birmmFrame.getLogTime()); frameLogService.save(frameLog); + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + // 保存业务数据 if (birmmFrame.isBizDataFrame()) { List bizDataList = birmmFrame.convertToBizDataList(); @@ -105,13 +115,15 @@ if (dataMap.containsKey("profile")) { hasProfile = (Boolean) dataMap.get("profile"); } - aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); + aepCmdService.setDeviceId((String) dataMap.get("deviceId")); aepCmdService.setProductId((String) dataMap.get("productId")); if (hasProfile) { + aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); retCode = aepCmdService.handleSendCommandWithProfile(replyMessage); } else { - retCode = aepCmdService.handleSendCommand(replyMessage); + aepCmdService.setMasterApiKey("ee2f4011f0a04f28b1572967891b57d5"); + retCode = aepCmdService.handleSendCommand(replyMessage, 2); // 2=16进制 } if (retCode == 0) { 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 f934d86..e22284a 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 @@ -48,7 +48,7 @@ // 业务字段List String tagListString; - Map tagList; + Map> tagList; // CRC String crc; @@ -83,7 +83,9 @@ DateTimeTag dateTimeTag = new DateTimeTag(); dateTimeTag.setDateTime(LocalDateTime.now()); - tagList.put(DateTimeTag.class.getSimpleName(), dateTimeTag); + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); } } 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 ef031b8..772092d 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 @@ -2,6 +2,7 @@ import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; +import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; public class BirmmFrameBuilderFactory { @@ -12,6 +13,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); + case WELL: return null; @@ -31,6 +35,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); + case WELL: return null; 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 index 71023ee..3617ae7 100644 --- 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 @@ -9,6 +9,9 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + case UP_TRAP_REQUEST: return new MethaneTrapRequestFrame(); @@ -30,6 +33,10 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE return new MethaneTrapResponseFrame(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java new file mode 100644 index 0000000..a1fd8bc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java @@ -0,0 +1,43 @@ +package com.casic.missiles.frame.methane; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; +import com.casic.missiles.frame.tag.ota.RequestSizeTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; + +import java.time.format.DateTimeFormatter; + +public class MethaneGetRequestFrame extends BirmmBaseFrame { + + private final String DEV_TYPE = "Methane"; + private final String MESSAGE_TYPE = "GetRequest"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); + body.put("reqSize", tag.getRequestSize()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); + body.put("reqOffset", tag.getRequestOffset()); + } + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java new file mode 100644 index 0000000..5f49fe7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.ota.PackageDataTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MethaneGetResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.UP_GET_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } + + @Override + public void replyBizTag() { + // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) + // TODO-LIST + + Map> tagList = new HashMap<>(); + + RequestOffsetTag offsetTag = new RequestOffsetTag(); + offsetTag.setRequestOffset(0); + List offsetTags = new ArrayList<>(); + offsetTags.add(offsetTag); + tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); + + PackageDataTag dataTag = new PackageDataTag(); + dataTag.setData(new byte[] {0}); + List dataTags = new ArrayList<>(); + dataTags.add(dataTag); + tagList.put(PackageDataTag.class.getSimpleName(), dataTags); + + super.setTagList(tagList); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java index 37b7fc8..e936a9c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java @@ -22,7 +22,7 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()); + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); body.put("softwareVersion", tag.getVersion()); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java index cd62d6d..d478366 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java @@ -3,11 +3,11 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.frame.BirmmBaseTag; -import com.casic.missiles.frame.tag.config.DateTimeTag; -import com.casic.missiles.frame.tag.ota.OTANeedTag; +import com.casic.missiles.frame.tag.ota.NeedOTATag; -import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; public class MethaneOnlineResponseFrame extends BirmmBaseFrame { @@ -27,12 +27,16 @@ @Override public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map tagList = new HashMap<>(); - OTANeedTag needTag = new OTANeedTag(); + Map> tagList = new HashMap<>(); + NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); - tagList.put(OTANeedTag.class.getSimpleName(), needTag); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); super.setTagList(tagList); } } 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 690b9c5..6ba27f6 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 @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; import com.casic.missiles.frame.tag.biz.CellTag; import com.casic.missiles.frame.tag.biz.DateTag; import com.casic.missiles.frame.tag.biz.SensorStateTag; @@ -39,19 +40,19 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); body.put("cell", cellTag.getCellVal()); } if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); body.put("pci", pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); body.put("rsrp", rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); body.put("snr", snrTag.getSnr()); } @@ -86,21 +87,21 @@ // 电量 if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); bizData.setCell(cellTag.getCellVal()); } // 信号质量 if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); bizData.setPci(pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); bizData.setRsrp(rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); bizData.setSnr(snrTag.getSnr()); } @@ -123,47 +124,57 @@ } private void handleUploadTag() { - UploadTag uploadTag = (UploadTag) getTagList().get(UploadTag.class.getSimpleName()); + List tags = getTagList().get(UploadTag.class.getSimpleName()); - // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 - boolean isValid = uploadTag.checkOid(); - if (isValid) { - // 找到DateTag 取出其中的日期 - DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()); - uploadTag.setStartDate(dateTag.getDate()); + bizDataList = new ArrayList<>(); - 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(); + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); - 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)); // 转成浮点数 + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + MethaneBizData bizData = new MethaneBizData(); - bizDataList.add(bizData); + 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)); // 转成浮点数 - // 加上时间间隔 - start = start.plusMinutes(uploadTag.getInterval()); + bizDataList.add(bizData); + + // 加上时间间隔 + start = start.plusMinutes(uploadTag.getInterval()); + } } } } private void handleSensorStateTag() { - SensorStateTag sensorStateTag = (SensorStateTag) getTagList().get(SensorStateTag.class.getSimpleName()); - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { - // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { - // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - // TODO-LIST - // 传感器状态异常时需要上报异常事件 + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java new file mode 100644 index 0000000..458e393 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java @@ -0,0 +1,28 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class SentinelBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + "][" + value + "][" + bizType + "]"; + } + + public JSONObject toJSON() { + JSONObject json = new JSONObject(); + json.put(BirmmDataBizTypeEnums.toType(bizType).getName(), String.format("%.3f", value)); + json.put("uptime", uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + return json; + } +} diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 70596b6..3ac4de7 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -69,7 +69,7 @@ enable: true sensorhub: config: - port: 7091 + port: 22009 bean: "functionCallback" url: "http://127.0.0.1:7093/push/test" fileUrl: D:\casic\file\ diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 8dcc497..da561cd 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -49,6 +49,12 @@ + cn.hutool + hutool-all + 5.7.16 + + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} 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 32dfdf3..140ee01 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 @@ -1,6 +1,10 @@ package com.casic.missiles.controller; +import cn.hutool.Hutool; import cn.hutool.core.lang.generator.UUIDGenerator; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.model.DeviceBizData; @@ -76,6 +80,12 @@ frameLog.setLogtime(birmmFrame.getLogTime()); frameLogService.save(frameLog); + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + // 保存业务数据 if (birmmFrame.isBizDataFrame()) { List bizDataList = birmmFrame.convertToBizDataList(); @@ -105,13 +115,15 @@ if (dataMap.containsKey("profile")) { hasProfile = (Boolean) dataMap.get("profile"); } - aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); + aepCmdService.setDeviceId((String) dataMap.get("deviceId")); aepCmdService.setProductId((String) dataMap.get("productId")); if (hasProfile) { + aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); retCode = aepCmdService.handleSendCommandWithProfile(replyMessage); } else { - retCode = aepCmdService.handleSendCommand(replyMessage); + aepCmdService.setMasterApiKey("ee2f4011f0a04f28b1572967891b57d5"); + retCode = aepCmdService.handleSendCommand(replyMessage, 2); // 2=16进制 } if (retCode == 0) { 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 f934d86..e22284a 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 @@ -48,7 +48,7 @@ // 业务字段List String tagListString; - Map tagList; + Map> tagList; // CRC String crc; @@ -83,7 +83,9 @@ DateTimeTag dateTimeTag = new DateTimeTag(); dateTimeTag.setDateTime(LocalDateTime.now()); - tagList.put(DateTimeTag.class.getSimpleName(), dateTimeTag); + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); } } 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 ef031b8..772092d 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 @@ -2,6 +2,7 @@ import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; +import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; public class BirmmFrameBuilderFactory { @@ -12,6 +13,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); + case WELL: return null; @@ -31,6 +35,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); + case WELL: return null; 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 index 71023ee..3617ae7 100644 --- 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 @@ -9,6 +9,9 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + case UP_TRAP_REQUEST: return new MethaneTrapRequestFrame(); @@ -30,6 +33,10 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE return new MethaneTrapResponseFrame(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java new file mode 100644 index 0000000..a1fd8bc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java @@ -0,0 +1,43 @@ +package com.casic.missiles.frame.methane; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; +import com.casic.missiles.frame.tag.ota.RequestSizeTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; + +import java.time.format.DateTimeFormatter; + +public class MethaneGetRequestFrame extends BirmmBaseFrame { + + private final String DEV_TYPE = "Methane"; + private final String MESSAGE_TYPE = "GetRequest"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); + body.put("reqSize", tag.getRequestSize()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); + body.put("reqOffset", tag.getRequestOffset()); + } + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java new file mode 100644 index 0000000..5f49fe7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.ota.PackageDataTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MethaneGetResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.UP_GET_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } + + @Override + public void replyBizTag() { + // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) + // TODO-LIST + + Map> tagList = new HashMap<>(); + + RequestOffsetTag offsetTag = new RequestOffsetTag(); + offsetTag.setRequestOffset(0); + List offsetTags = new ArrayList<>(); + offsetTags.add(offsetTag); + tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); + + PackageDataTag dataTag = new PackageDataTag(); + dataTag.setData(new byte[] {0}); + List dataTags = new ArrayList<>(); + dataTags.add(dataTag); + tagList.put(PackageDataTag.class.getSimpleName(), dataTags); + + super.setTagList(tagList); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java index 37b7fc8..e936a9c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java @@ -22,7 +22,7 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()); + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); body.put("softwareVersion", tag.getVersion()); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java index cd62d6d..d478366 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java @@ -3,11 +3,11 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.frame.BirmmBaseTag; -import com.casic.missiles.frame.tag.config.DateTimeTag; -import com.casic.missiles.frame.tag.ota.OTANeedTag; +import com.casic.missiles.frame.tag.ota.NeedOTATag; -import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; public class MethaneOnlineResponseFrame extends BirmmBaseFrame { @@ -27,12 +27,16 @@ @Override public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map tagList = new HashMap<>(); - OTANeedTag needTag = new OTANeedTag(); + Map> tagList = new HashMap<>(); + NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); - tagList.put(OTANeedTag.class.getSimpleName(), needTag); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); super.setTagList(tagList); } } 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 690b9c5..6ba27f6 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 @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; import com.casic.missiles.frame.tag.biz.CellTag; import com.casic.missiles.frame.tag.biz.DateTag; import com.casic.missiles.frame.tag.biz.SensorStateTag; @@ -39,19 +40,19 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); body.put("cell", cellTag.getCellVal()); } if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); body.put("pci", pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); body.put("rsrp", rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); body.put("snr", snrTag.getSnr()); } @@ -86,21 +87,21 @@ // 电量 if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); bizData.setCell(cellTag.getCellVal()); } // 信号质量 if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); bizData.setPci(pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); bizData.setRsrp(rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); bizData.setSnr(snrTag.getSnr()); } @@ -123,47 +124,57 @@ } private void handleUploadTag() { - UploadTag uploadTag = (UploadTag) getTagList().get(UploadTag.class.getSimpleName()); + List tags = getTagList().get(UploadTag.class.getSimpleName()); - // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 - boolean isValid = uploadTag.checkOid(); - if (isValid) { - // 找到DateTag 取出其中的日期 - DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()); - uploadTag.setStartDate(dateTag.getDate()); + bizDataList = new ArrayList<>(); - 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(); + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); - 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)); // 转成浮点数 + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + MethaneBizData bizData = new MethaneBizData(); - bizDataList.add(bizData); + 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)); // 转成浮点数 - // 加上时间间隔 - start = start.plusMinutes(uploadTag.getInterval()); + bizDataList.add(bizData); + + // 加上时间间隔 + start = start.plusMinutes(uploadTag.getInterval()); + } } } } private void handleSensorStateTag() { - SensorStateTag sensorStateTag = (SensorStateTag) getTagList().get(SensorStateTag.class.getSimpleName()); - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { - // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { - // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - // TODO-LIST - // 传感器状态异常时需要上报异常事件 + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java new file mode 100644 index 0000000..458e393 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java @@ -0,0 +1,28 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class SentinelBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + "][" + value + "][" + bizType + "]"; + } + + public JSONObject toJSON() { + JSONObject json = new JSONObject(); + json.put(BirmmDataBizTypeEnums.toType(bizType).getName(), String.format("%.3f", value)); + json.put("uptime", uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java new file mode 100644 index 0000000..bafe173 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java @@ -0,0 +1,56 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.methane.*; + +public class SentinelFrameBuilderFactory { + + public static BirmmBaseFrame createSentinelFrameByOperation(String operaType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + + case UP_TRAP_REQUEST: + return new SentinelTrapRequestFrame(); + + case UP_ONLINE_REQUEST: + return new MethaneOnlineRequestFrame(); + + case UP_SET_RESPONSE: + return new MethaneSetResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } + + public static BirmmBaseFrame createSentinelReplyFrameByOperation(String uploadOperationType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + + case UP_TRAP_REQUEST: + // TRAP_REQUEST消息回复TRAP_RESPONSE + return new SentinelTrapResponseFrame(); + + case UP_ONLINE_REQUEST: + // ONLINE_REQUEST消息回复ONLINE_RESPONSE + return new MethaneOnlineResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } +} diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 70596b6..3ac4de7 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -69,7 +69,7 @@ enable: true sensorhub: config: - port: 7091 + port: 22009 bean: "functionCallback" url: "http://127.0.0.1:7093/push/test" fileUrl: D:\casic\file\ diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 8dcc497..da561cd 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -49,6 +49,12 @@ + cn.hutool + hutool-all + 5.7.16 + + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} 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 32dfdf3..140ee01 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 @@ -1,6 +1,10 @@ package com.casic.missiles.controller; +import cn.hutool.Hutool; import cn.hutool.core.lang.generator.UUIDGenerator; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.model.DeviceBizData; @@ -76,6 +80,12 @@ frameLog.setLogtime(birmmFrame.getLogTime()); frameLogService.save(frameLog); + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + // 保存业务数据 if (birmmFrame.isBizDataFrame()) { List bizDataList = birmmFrame.convertToBizDataList(); @@ -105,13 +115,15 @@ if (dataMap.containsKey("profile")) { hasProfile = (Boolean) dataMap.get("profile"); } - aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); + aepCmdService.setDeviceId((String) dataMap.get("deviceId")); aepCmdService.setProductId((String) dataMap.get("productId")); if (hasProfile) { + aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); retCode = aepCmdService.handleSendCommandWithProfile(replyMessage); } else { - retCode = aepCmdService.handleSendCommand(replyMessage); + aepCmdService.setMasterApiKey("ee2f4011f0a04f28b1572967891b57d5"); + retCode = aepCmdService.handleSendCommand(replyMessage, 2); // 2=16进制 } if (retCode == 0) { 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 f934d86..e22284a 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 @@ -48,7 +48,7 @@ // 业务字段List String tagListString; - Map tagList; + Map> tagList; // CRC String crc; @@ -83,7 +83,9 @@ DateTimeTag dateTimeTag = new DateTimeTag(); dateTimeTag.setDateTime(LocalDateTime.now()); - tagList.put(DateTimeTag.class.getSimpleName(), dateTimeTag); + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); } } 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 ef031b8..772092d 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 @@ -2,6 +2,7 @@ import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; +import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; public class BirmmFrameBuilderFactory { @@ -12,6 +13,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); + case WELL: return null; @@ -31,6 +35,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); + case WELL: return null; 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 index 71023ee..3617ae7 100644 --- 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 @@ -9,6 +9,9 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + case UP_TRAP_REQUEST: return new MethaneTrapRequestFrame(); @@ -30,6 +33,10 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE return new MethaneTrapResponseFrame(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java new file mode 100644 index 0000000..a1fd8bc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java @@ -0,0 +1,43 @@ +package com.casic.missiles.frame.methane; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; +import com.casic.missiles.frame.tag.ota.RequestSizeTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; + +import java.time.format.DateTimeFormatter; + +public class MethaneGetRequestFrame extends BirmmBaseFrame { + + private final String DEV_TYPE = "Methane"; + private final String MESSAGE_TYPE = "GetRequest"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); + body.put("reqSize", tag.getRequestSize()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); + body.put("reqOffset", tag.getRequestOffset()); + } + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java new file mode 100644 index 0000000..5f49fe7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.ota.PackageDataTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MethaneGetResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.UP_GET_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } + + @Override + public void replyBizTag() { + // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) + // TODO-LIST + + Map> tagList = new HashMap<>(); + + RequestOffsetTag offsetTag = new RequestOffsetTag(); + offsetTag.setRequestOffset(0); + List offsetTags = new ArrayList<>(); + offsetTags.add(offsetTag); + tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); + + PackageDataTag dataTag = new PackageDataTag(); + dataTag.setData(new byte[] {0}); + List dataTags = new ArrayList<>(); + dataTags.add(dataTag); + tagList.put(PackageDataTag.class.getSimpleName(), dataTags); + + super.setTagList(tagList); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java index 37b7fc8..e936a9c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java @@ -22,7 +22,7 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()); + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); body.put("softwareVersion", tag.getVersion()); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java index cd62d6d..d478366 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java @@ -3,11 +3,11 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.frame.BirmmBaseTag; -import com.casic.missiles.frame.tag.config.DateTimeTag; -import com.casic.missiles.frame.tag.ota.OTANeedTag; +import com.casic.missiles.frame.tag.ota.NeedOTATag; -import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; public class MethaneOnlineResponseFrame extends BirmmBaseFrame { @@ -27,12 +27,16 @@ @Override public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map tagList = new HashMap<>(); - OTANeedTag needTag = new OTANeedTag(); + Map> tagList = new HashMap<>(); + NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); - tagList.put(OTANeedTag.class.getSimpleName(), needTag); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); super.setTagList(tagList); } } 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 690b9c5..6ba27f6 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 @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; import com.casic.missiles.frame.tag.biz.CellTag; import com.casic.missiles.frame.tag.biz.DateTag; import com.casic.missiles.frame.tag.biz.SensorStateTag; @@ -39,19 +40,19 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); body.put("cell", cellTag.getCellVal()); } if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); body.put("pci", pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); body.put("rsrp", rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); body.put("snr", snrTag.getSnr()); } @@ -86,21 +87,21 @@ // 电量 if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); bizData.setCell(cellTag.getCellVal()); } // 信号质量 if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); bizData.setPci(pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); bizData.setRsrp(rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); bizData.setSnr(snrTag.getSnr()); } @@ -123,47 +124,57 @@ } private void handleUploadTag() { - UploadTag uploadTag = (UploadTag) getTagList().get(UploadTag.class.getSimpleName()); + List tags = getTagList().get(UploadTag.class.getSimpleName()); - // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 - boolean isValid = uploadTag.checkOid(); - if (isValid) { - // 找到DateTag 取出其中的日期 - DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()); - uploadTag.setStartDate(dateTag.getDate()); + bizDataList = new ArrayList<>(); - 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(); + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); - 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)); // 转成浮点数 + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + MethaneBizData bizData = new MethaneBizData(); - bizDataList.add(bizData); + 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)); // 转成浮点数 - // 加上时间间隔 - start = start.plusMinutes(uploadTag.getInterval()); + bizDataList.add(bizData); + + // 加上时间间隔 + start = start.plusMinutes(uploadTag.getInterval()); + } } } } private void handleSensorStateTag() { - SensorStateTag sensorStateTag = (SensorStateTag) getTagList().get(SensorStateTag.class.getSimpleName()); - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { - // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { - // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - // TODO-LIST - // 传感器状态异常时需要上报异常事件 + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java new file mode 100644 index 0000000..458e393 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java @@ -0,0 +1,28 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class SentinelBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + "][" + value + "][" + bizType + "]"; + } + + public JSONObject toJSON() { + JSONObject json = new JSONObject(); + json.put(BirmmDataBizTypeEnums.toType(bizType).getName(), String.format("%.3f", value)); + json.put("uptime", uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java new file mode 100644 index 0000000..bafe173 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java @@ -0,0 +1,56 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.methane.*; + +public class SentinelFrameBuilderFactory { + + public static BirmmBaseFrame createSentinelFrameByOperation(String operaType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + + case UP_TRAP_REQUEST: + return new SentinelTrapRequestFrame(); + + case UP_ONLINE_REQUEST: + return new MethaneOnlineRequestFrame(); + + case UP_SET_RESPONSE: + return new MethaneSetResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } + + public static BirmmBaseFrame createSentinelReplyFrameByOperation(String uploadOperationType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + + case UP_TRAP_REQUEST: + // TRAP_REQUEST消息回复TRAP_RESPONSE + return new SentinelTrapResponseFrame(); + + case UP_ONLINE_REQUEST: + // ONLINE_REQUEST消息回复ONLINE_RESPONSE + return new MethaneOnlineResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java new file mode 100644 index 0000000..a36d243 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -0,0 +1,180 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.biz.DateTag; +import com.casic.missiles.frame.tag.biz.SensorStateTag; +import com.casic.missiles.frame.tag.biz.UploadTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; +import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.BytesUtil; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Slf4j +public class SentinelTrapRequestFrame extends BirmmBaseFrame { + + private List bizDataList; + + private final String DEV_TYPE = "Sentinel"; + private final String MESSAGE_TYPE = "Data"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + body.put("cell", cellTag.getCellVal()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + body.put("pci", pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + body.put("rsrp", rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + body.put("snr", snrTag.getSnr()); + } + + // 业务数据 + if (bizDataList != null) { + JSONArray datas = new JSONArray(); + for (SentinelBizData bizData : bizDataList) { + datas.add(bizData.toJSON()); + } + body.put("datas", datas); + } + + json.put("mBody", body); + + return json; + } + + @Override + public boolean isBizDataFrame() { + return true; + } + + @Override + public List convertToBizDataList() { + List resultList = new ArrayList<>(); + if (bizDataList != null) { + for (SentinelBizData data : bizDataList) { + DeviceBizData bizData = new DeviceBizData(); + bizData.setBizType(String.valueOf(data.getBizType())); + bizData.setValue(String.format("%.3f", data.getValue())); + bizData.setUptime(data.getUptime()); + + // 电量 + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + bizData.setCell(cellTag.getCellVal()); + } + + // 信号质量 + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + bizData.setPci(pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + bizData.setRsrp(rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + bizData.setSnr(snrTag.getSnr()); + } + + resultList.add(bizData); + } + } + + return resultList; + } + + @Override + public void doParseBizTag() { + if (getTagList().containsKey(UploadTag.class.getSimpleName())) { + handleUploadTag(); + } + + if (getTagList().containsKey(SensorStateTag.class.getSimpleName())) { + handleSensorStateTag(); + } + } + + private void handleUploadTag() { + List tags = getTagList().get(UploadTag.class.getSimpleName()); + + bizDataList = new ArrayList<>(); + + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); + + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + SentinelBizData bizData = new SentinelBizData(); + + 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() { + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } + } +} diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 70596b6..3ac4de7 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -69,7 +69,7 @@ enable: true sensorhub: config: - port: 7091 + port: 22009 bean: "functionCallback" url: "http://127.0.0.1:7093/push/test" fileUrl: D:\casic\file\ diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 8dcc497..da561cd 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -49,6 +49,12 @@ + cn.hutool + hutool-all + 5.7.16 + + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} 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 32dfdf3..140ee01 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 @@ -1,6 +1,10 @@ package com.casic.missiles.controller; +import cn.hutool.Hutool; import cn.hutool.core.lang.generator.UUIDGenerator; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.model.DeviceBizData; @@ -76,6 +80,12 @@ frameLog.setLogtime(birmmFrame.getLogTime()); frameLogService.save(frameLog); + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + // 保存业务数据 if (birmmFrame.isBizDataFrame()) { List bizDataList = birmmFrame.convertToBizDataList(); @@ -105,13 +115,15 @@ if (dataMap.containsKey("profile")) { hasProfile = (Boolean) dataMap.get("profile"); } - aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); + aepCmdService.setDeviceId((String) dataMap.get("deviceId")); aepCmdService.setProductId((String) dataMap.get("productId")); if (hasProfile) { + aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); retCode = aepCmdService.handleSendCommandWithProfile(replyMessage); } else { - retCode = aepCmdService.handleSendCommand(replyMessage); + aepCmdService.setMasterApiKey("ee2f4011f0a04f28b1572967891b57d5"); + retCode = aepCmdService.handleSendCommand(replyMessage, 2); // 2=16进制 } if (retCode == 0) { 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 f934d86..e22284a 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 @@ -48,7 +48,7 @@ // 业务字段List String tagListString; - Map tagList; + Map> tagList; // CRC String crc; @@ -83,7 +83,9 @@ DateTimeTag dateTimeTag = new DateTimeTag(); dateTimeTag.setDateTime(LocalDateTime.now()); - tagList.put(DateTimeTag.class.getSimpleName(), dateTimeTag); + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); } } 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 ef031b8..772092d 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 @@ -2,6 +2,7 @@ import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; +import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; public class BirmmFrameBuilderFactory { @@ -12,6 +13,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); + case WELL: return null; @@ -31,6 +35,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); + case WELL: return null; 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 index 71023ee..3617ae7 100644 --- 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 @@ -9,6 +9,9 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + case UP_TRAP_REQUEST: return new MethaneTrapRequestFrame(); @@ -30,6 +33,10 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE return new MethaneTrapResponseFrame(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java new file mode 100644 index 0000000..a1fd8bc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java @@ -0,0 +1,43 @@ +package com.casic.missiles.frame.methane; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; +import com.casic.missiles.frame.tag.ota.RequestSizeTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; + +import java.time.format.DateTimeFormatter; + +public class MethaneGetRequestFrame extends BirmmBaseFrame { + + private final String DEV_TYPE = "Methane"; + private final String MESSAGE_TYPE = "GetRequest"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); + body.put("reqSize", tag.getRequestSize()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); + body.put("reqOffset", tag.getRequestOffset()); + } + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java new file mode 100644 index 0000000..5f49fe7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.ota.PackageDataTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MethaneGetResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.UP_GET_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } + + @Override + public void replyBizTag() { + // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) + // TODO-LIST + + Map> tagList = new HashMap<>(); + + RequestOffsetTag offsetTag = new RequestOffsetTag(); + offsetTag.setRequestOffset(0); + List offsetTags = new ArrayList<>(); + offsetTags.add(offsetTag); + tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); + + PackageDataTag dataTag = new PackageDataTag(); + dataTag.setData(new byte[] {0}); + List dataTags = new ArrayList<>(); + dataTags.add(dataTag); + tagList.put(PackageDataTag.class.getSimpleName(), dataTags); + + super.setTagList(tagList); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java index 37b7fc8..e936a9c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java @@ -22,7 +22,7 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()); + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); body.put("softwareVersion", tag.getVersion()); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java index cd62d6d..d478366 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java @@ -3,11 +3,11 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.frame.BirmmBaseTag; -import com.casic.missiles.frame.tag.config.DateTimeTag; -import com.casic.missiles.frame.tag.ota.OTANeedTag; +import com.casic.missiles.frame.tag.ota.NeedOTATag; -import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; public class MethaneOnlineResponseFrame extends BirmmBaseFrame { @@ -27,12 +27,16 @@ @Override public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map tagList = new HashMap<>(); - OTANeedTag needTag = new OTANeedTag(); + Map> tagList = new HashMap<>(); + NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); - tagList.put(OTANeedTag.class.getSimpleName(), needTag); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); super.setTagList(tagList); } } 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 690b9c5..6ba27f6 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 @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; import com.casic.missiles.frame.tag.biz.CellTag; import com.casic.missiles.frame.tag.biz.DateTag; import com.casic.missiles.frame.tag.biz.SensorStateTag; @@ -39,19 +40,19 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); body.put("cell", cellTag.getCellVal()); } if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); body.put("pci", pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); body.put("rsrp", rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); body.put("snr", snrTag.getSnr()); } @@ -86,21 +87,21 @@ // 电量 if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); bizData.setCell(cellTag.getCellVal()); } // 信号质量 if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); bizData.setPci(pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); bizData.setRsrp(rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); bizData.setSnr(snrTag.getSnr()); } @@ -123,47 +124,57 @@ } private void handleUploadTag() { - UploadTag uploadTag = (UploadTag) getTagList().get(UploadTag.class.getSimpleName()); + List tags = getTagList().get(UploadTag.class.getSimpleName()); - // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 - boolean isValid = uploadTag.checkOid(); - if (isValid) { - // 找到DateTag 取出其中的日期 - DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()); - uploadTag.setStartDate(dateTag.getDate()); + bizDataList = new ArrayList<>(); - 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(); + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); - 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)); // 转成浮点数 + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + MethaneBizData bizData = new MethaneBizData(); - bizDataList.add(bizData); + 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)); // 转成浮点数 - // 加上时间间隔 - start = start.plusMinutes(uploadTag.getInterval()); + bizDataList.add(bizData); + + // 加上时间间隔 + start = start.plusMinutes(uploadTag.getInterval()); + } } } } private void handleSensorStateTag() { - SensorStateTag sensorStateTag = (SensorStateTag) getTagList().get(SensorStateTag.class.getSimpleName()); - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { - // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { - // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - // TODO-LIST - // 传感器状态异常时需要上报异常事件 + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java new file mode 100644 index 0000000..458e393 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java @@ -0,0 +1,28 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class SentinelBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + "][" + value + "][" + bizType + "]"; + } + + public JSONObject toJSON() { + JSONObject json = new JSONObject(); + json.put(BirmmDataBizTypeEnums.toType(bizType).getName(), String.format("%.3f", value)); + json.put("uptime", uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java new file mode 100644 index 0000000..bafe173 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java @@ -0,0 +1,56 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.methane.*; + +public class SentinelFrameBuilderFactory { + + public static BirmmBaseFrame createSentinelFrameByOperation(String operaType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + + case UP_TRAP_REQUEST: + return new SentinelTrapRequestFrame(); + + case UP_ONLINE_REQUEST: + return new MethaneOnlineRequestFrame(); + + case UP_SET_RESPONSE: + return new MethaneSetResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } + + public static BirmmBaseFrame createSentinelReplyFrameByOperation(String uploadOperationType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + + case UP_TRAP_REQUEST: + // TRAP_REQUEST消息回复TRAP_RESPONSE + return new SentinelTrapResponseFrame(); + + case UP_ONLINE_REQUEST: + // ONLINE_REQUEST消息回复ONLINE_RESPONSE + return new MethaneOnlineResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java new file mode 100644 index 0000000..a36d243 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -0,0 +1,180 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.biz.DateTag; +import com.casic.missiles.frame.tag.biz.SensorStateTag; +import com.casic.missiles.frame.tag.biz.UploadTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; +import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.BytesUtil; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Slf4j +public class SentinelTrapRequestFrame extends BirmmBaseFrame { + + private List bizDataList; + + private final String DEV_TYPE = "Sentinel"; + private final String MESSAGE_TYPE = "Data"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + body.put("cell", cellTag.getCellVal()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + body.put("pci", pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + body.put("rsrp", rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + body.put("snr", snrTag.getSnr()); + } + + // 业务数据 + if (bizDataList != null) { + JSONArray datas = new JSONArray(); + for (SentinelBizData bizData : bizDataList) { + datas.add(bizData.toJSON()); + } + body.put("datas", datas); + } + + json.put("mBody", body); + + return json; + } + + @Override + public boolean isBizDataFrame() { + return true; + } + + @Override + public List convertToBizDataList() { + List resultList = new ArrayList<>(); + if (bizDataList != null) { + for (SentinelBizData data : bizDataList) { + DeviceBizData bizData = new DeviceBizData(); + bizData.setBizType(String.valueOf(data.getBizType())); + bizData.setValue(String.format("%.3f", data.getValue())); + bizData.setUptime(data.getUptime()); + + // 电量 + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + bizData.setCell(cellTag.getCellVal()); + } + + // 信号质量 + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + bizData.setPci(pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + bizData.setRsrp(rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + bizData.setSnr(snrTag.getSnr()); + } + + resultList.add(bizData); + } + } + + return resultList; + } + + @Override + public void doParseBizTag() { + if (getTagList().containsKey(UploadTag.class.getSimpleName())) { + handleUploadTag(); + } + + if (getTagList().containsKey(SensorStateTag.class.getSimpleName())) { + handleSensorStateTag(); + } + } + + private void handleUploadTag() { + List tags = getTagList().get(UploadTag.class.getSimpleName()); + + bizDataList = new ArrayList<>(); + + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); + + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + SentinelBizData bizData = new SentinelBizData(); + + 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() { + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java new file mode 100644 index 0000000..2a87b3f --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java @@ -0,0 +1,20 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; + +public class SentinelTrapResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } +} diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 70596b6..3ac4de7 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -69,7 +69,7 @@ enable: true sensorhub: config: - port: 7091 + port: 22009 bean: "functionCallback" url: "http://127.0.0.1:7093/push/test" fileUrl: D:\casic\file\ diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 8dcc497..da561cd 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -49,6 +49,12 @@ + cn.hutool + hutool-all + 5.7.16 + + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} 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 32dfdf3..140ee01 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 @@ -1,6 +1,10 @@ package com.casic.missiles.controller; +import cn.hutool.Hutool; import cn.hutool.core.lang.generator.UUIDGenerator; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.model.DeviceBizData; @@ -76,6 +80,12 @@ frameLog.setLogtime(birmmFrame.getLogTime()); frameLogService.save(frameLog); + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + // 保存业务数据 if (birmmFrame.isBizDataFrame()) { List bizDataList = birmmFrame.convertToBizDataList(); @@ -105,13 +115,15 @@ if (dataMap.containsKey("profile")) { hasProfile = (Boolean) dataMap.get("profile"); } - aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); + aepCmdService.setDeviceId((String) dataMap.get("deviceId")); aepCmdService.setProductId((String) dataMap.get("productId")); if (hasProfile) { + aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); retCode = aepCmdService.handleSendCommandWithProfile(replyMessage); } else { - retCode = aepCmdService.handleSendCommand(replyMessage); + aepCmdService.setMasterApiKey("ee2f4011f0a04f28b1572967891b57d5"); + retCode = aepCmdService.handleSendCommand(replyMessage, 2); // 2=16进制 } if (retCode == 0) { 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 f934d86..e22284a 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 @@ -48,7 +48,7 @@ // 业务字段List String tagListString; - Map tagList; + Map> tagList; // CRC String crc; @@ -83,7 +83,9 @@ DateTimeTag dateTimeTag = new DateTimeTag(); dateTimeTag.setDateTime(LocalDateTime.now()); - tagList.put(DateTimeTag.class.getSimpleName(), dateTimeTag); + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); } } 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 ef031b8..772092d 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 @@ -2,6 +2,7 @@ import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; +import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; public class BirmmFrameBuilderFactory { @@ -12,6 +13,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); + case WELL: return null; @@ -31,6 +35,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); + case WELL: return null; 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 index 71023ee..3617ae7 100644 --- 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 @@ -9,6 +9,9 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + case UP_TRAP_REQUEST: return new MethaneTrapRequestFrame(); @@ -30,6 +33,10 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE return new MethaneTrapResponseFrame(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java new file mode 100644 index 0000000..a1fd8bc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java @@ -0,0 +1,43 @@ +package com.casic.missiles.frame.methane; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; +import com.casic.missiles.frame.tag.ota.RequestSizeTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; + +import java.time.format.DateTimeFormatter; + +public class MethaneGetRequestFrame extends BirmmBaseFrame { + + private final String DEV_TYPE = "Methane"; + private final String MESSAGE_TYPE = "GetRequest"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); + body.put("reqSize", tag.getRequestSize()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); + body.put("reqOffset", tag.getRequestOffset()); + } + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java new file mode 100644 index 0000000..5f49fe7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.ota.PackageDataTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MethaneGetResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.UP_GET_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } + + @Override + public void replyBizTag() { + // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) + // TODO-LIST + + Map> tagList = new HashMap<>(); + + RequestOffsetTag offsetTag = new RequestOffsetTag(); + offsetTag.setRequestOffset(0); + List offsetTags = new ArrayList<>(); + offsetTags.add(offsetTag); + tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); + + PackageDataTag dataTag = new PackageDataTag(); + dataTag.setData(new byte[] {0}); + List dataTags = new ArrayList<>(); + dataTags.add(dataTag); + tagList.put(PackageDataTag.class.getSimpleName(), dataTags); + + super.setTagList(tagList); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java index 37b7fc8..e936a9c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java @@ -22,7 +22,7 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()); + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); body.put("softwareVersion", tag.getVersion()); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java index cd62d6d..d478366 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java @@ -3,11 +3,11 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.frame.BirmmBaseTag; -import com.casic.missiles.frame.tag.config.DateTimeTag; -import com.casic.missiles.frame.tag.ota.OTANeedTag; +import com.casic.missiles.frame.tag.ota.NeedOTATag; -import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; public class MethaneOnlineResponseFrame extends BirmmBaseFrame { @@ -27,12 +27,16 @@ @Override public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map tagList = new HashMap<>(); - OTANeedTag needTag = new OTANeedTag(); + Map> tagList = new HashMap<>(); + NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); - tagList.put(OTANeedTag.class.getSimpleName(), needTag); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); super.setTagList(tagList); } } 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 690b9c5..6ba27f6 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 @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; import com.casic.missiles.frame.tag.biz.CellTag; import com.casic.missiles.frame.tag.biz.DateTag; import com.casic.missiles.frame.tag.biz.SensorStateTag; @@ -39,19 +40,19 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); body.put("cell", cellTag.getCellVal()); } if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); body.put("pci", pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); body.put("rsrp", rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); body.put("snr", snrTag.getSnr()); } @@ -86,21 +87,21 @@ // 电量 if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); bizData.setCell(cellTag.getCellVal()); } // 信号质量 if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); bizData.setPci(pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); bizData.setRsrp(rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); bizData.setSnr(snrTag.getSnr()); } @@ -123,47 +124,57 @@ } private void handleUploadTag() { - UploadTag uploadTag = (UploadTag) getTagList().get(UploadTag.class.getSimpleName()); + List tags = getTagList().get(UploadTag.class.getSimpleName()); - // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 - boolean isValid = uploadTag.checkOid(); - if (isValid) { - // 找到DateTag 取出其中的日期 - DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()); - uploadTag.setStartDate(dateTag.getDate()); + bizDataList = new ArrayList<>(); - 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(); + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); - 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)); // 转成浮点数 + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + MethaneBizData bizData = new MethaneBizData(); - bizDataList.add(bizData); + 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)); // 转成浮点数 - // 加上时间间隔 - start = start.plusMinutes(uploadTag.getInterval()); + bizDataList.add(bizData); + + // 加上时间间隔 + start = start.plusMinutes(uploadTag.getInterval()); + } } } } private void handleSensorStateTag() { - SensorStateTag sensorStateTag = (SensorStateTag) getTagList().get(SensorStateTag.class.getSimpleName()); - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { - // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { - // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - // TODO-LIST - // 传感器状态异常时需要上报异常事件 + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java new file mode 100644 index 0000000..458e393 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java @@ -0,0 +1,28 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class SentinelBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + "][" + value + "][" + bizType + "]"; + } + + public JSONObject toJSON() { + JSONObject json = new JSONObject(); + json.put(BirmmDataBizTypeEnums.toType(bizType).getName(), String.format("%.3f", value)); + json.put("uptime", uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java new file mode 100644 index 0000000..bafe173 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java @@ -0,0 +1,56 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.methane.*; + +public class SentinelFrameBuilderFactory { + + public static BirmmBaseFrame createSentinelFrameByOperation(String operaType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + + case UP_TRAP_REQUEST: + return new SentinelTrapRequestFrame(); + + case UP_ONLINE_REQUEST: + return new MethaneOnlineRequestFrame(); + + case UP_SET_RESPONSE: + return new MethaneSetResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } + + public static BirmmBaseFrame createSentinelReplyFrameByOperation(String uploadOperationType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + + case UP_TRAP_REQUEST: + // TRAP_REQUEST消息回复TRAP_RESPONSE + return new SentinelTrapResponseFrame(); + + case UP_ONLINE_REQUEST: + // ONLINE_REQUEST消息回复ONLINE_RESPONSE + return new MethaneOnlineResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java new file mode 100644 index 0000000..a36d243 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -0,0 +1,180 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.biz.DateTag; +import com.casic.missiles.frame.tag.biz.SensorStateTag; +import com.casic.missiles.frame.tag.biz.UploadTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; +import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.BytesUtil; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Slf4j +public class SentinelTrapRequestFrame extends BirmmBaseFrame { + + private List bizDataList; + + private final String DEV_TYPE = "Sentinel"; + private final String MESSAGE_TYPE = "Data"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + body.put("cell", cellTag.getCellVal()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + body.put("pci", pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + body.put("rsrp", rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + body.put("snr", snrTag.getSnr()); + } + + // 业务数据 + if (bizDataList != null) { + JSONArray datas = new JSONArray(); + for (SentinelBizData bizData : bizDataList) { + datas.add(bizData.toJSON()); + } + body.put("datas", datas); + } + + json.put("mBody", body); + + return json; + } + + @Override + public boolean isBizDataFrame() { + return true; + } + + @Override + public List convertToBizDataList() { + List resultList = new ArrayList<>(); + if (bizDataList != null) { + for (SentinelBizData data : bizDataList) { + DeviceBizData bizData = new DeviceBizData(); + bizData.setBizType(String.valueOf(data.getBizType())); + bizData.setValue(String.format("%.3f", data.getValue())); + bizData.setUptime(data.getUptime()); + + // 电量 + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + bizData.setCell(cellTag.getCellVal()); + } + + // 信号质量 + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + bizData.setPci(pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + bizData.setRsrp(rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + bizData.setSnr(snrTag.getSnr()); + } + + resultList.add(bizData); + } + } + + return resultList; + } + + @Override + public void doParseBizTag() { + if (getTagList().containsKey(UploadTag.class.getSimpleName())) { + handleUploadTag(); + } + + if (getTagList().containsKey(SensorStateTag.class.getSimpleName())) { + handleSensorStateTag(); + } + } + + private void handleUploadTag() { + List tags = getTagList().get(UploadTag.class.getSimpleName()); + + bizDataList = new ArrayList<>(); + + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); + + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + SentinelBizData bizData = new SentinelBizData(); + + 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() { + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java new file mode 100644 index 0000000..2a87b3f --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java @@ -0,0 +1,20 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; + +public class SentinelTrapResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java new file mode 100644 index 0000000..8e40b85 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class NeedOTATag extends BirmmBaseTag { + + final String NEED_OTA_TAG_OID = "60000600"; + + boolean need; + + @Override + public String toString() { + return super.toString() + "[value: " + need + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength() * 2 + "x", need ? 1 : 0); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + need = Boolean.parseBoolean(valueStr); + } +} diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 70596b6..3ac4de7 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -69,7 +69,7 @@ enable: true sensorhub: config: - port: 7091 + port: 22009 bean: "functionCallback" url: "http://127.0.0.1:7093/push/test" fileUrl: D:\casic\file\ diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 8dcc497..da561cd 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -49,6 +49,12 @@ + cn.hutool + hutool-all + 5.7.16 + + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} 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 32dfdf3..140ee01 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 @@ -1,6 +1,10 @@ package com.casic.missiles.controller; +import cn.hutool.Hutool; import cn.hutool.core.lang.generator.UUIDGenerator; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.model.DeviceBizData; @@ -76,6 +80,12 @@ frameLog.setLogtime(birmmFrame.getLogTime()); frameLogService.save(frameLog); + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + // 保存业务数据 if (birmmFrame.isBizDataFrame()) { List bizDataList = birmmFrame.convertToBizDataList(); @@ -105,13 +115,15 @@ if (dataMap.containsKey("profile")) { hasProfile = (Boolean) dataMap.get("profile"); } - aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); + aepCmdService.setDeviceId((String) dataMap.get("deviceId")); aepCmdService.setProductId((String) dataMap.get("productId")); if (hasProfile) { + aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); retCode = aepCmdService.handleSendCommandWithProfile(replyMessage); } else { - retCode = aepCmdService.handleSendCommand(replyMessage); + aepCmdService.setMasterApiKey("ee2f4011f0a04f28b1572967891b57d5"); + retCode = aepCmdService.handleSendCommand(replyMessage, 2); // 2=16进制 } if (retCode == 0) { 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 f934d86..e22284a 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 @@ -48,7 +48,7 @@ // 业务字段List String tagListString; - Map tagList; + Map> tagList; // CRC String crc; @@ -83,7 +83,9 @@ DateTimeTag dateTimeTag = new DateTimeTag(); dateTimeTag.setDateTime(LocalDateTime.now()); - tagList.put(DateTimeTag.class.getSimpleName(), dateTimeTag); + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); } } 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 ef031b8..772092d 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 @@ -2,6 +2,7 @@ import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; +import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; public class BirmmFrameBuilderFactory { @@ -12,6 +13,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); + case WELL: return null; @@ -31,6 +35,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); + case WELL: return null; 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 index 71023ee..3617ae7 100644 --- 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 @@ -9,6 +9,9 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + case UP_TRAP_REQUEST: return new MethaneTrapRequestFrame(); @@ -30,6 +33,10 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE return new MethaneTrapResponseFrame(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java new file mode 100644 index 0000000..a1fd8bc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java @@ -0,0 +1,43 @@ +package com.casic.missiles.frame.methane; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; +import com.casic.missiles.frame.tag.ota.RequestSizeTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; + +import java.time.format.DateTimeFormatter; + +public class MethaneGetRequestFrame extends BirmmBaseFrame { + + private final String DEV_TYPE = "Methane"; + private final String MESSAGE_TYPE = "GetRequest"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); + body.put("reqSize", tag.getRequestSize()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); + body.put("reqOffset", tag.getRequestOffset()); + } + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java new file mode 100644 index 0000000..5f49fe7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.ota.PackageDataTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MethaneGetResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.UP_GET_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } + + @Override + public void replyBizTag() { + // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) + // TODO-LIST + + Map> tagList = new HashMap<>(); + + RequestOffsetTag offsetTag = new RequestOffsetTag(); + offsetTag.setRequestOffset(0); + List offsetTags = new ArrayList<>(); + offsetTags.add(offsetTag); + tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); + + PackageDataTag dataTag = new PackageDataTag(); + dataTag.setData(new byte[] {0}); + List dataTags = new ArrayList<>(); + dataTags.add(dataTag); + tagList.put(PackageDataTag.class.getSimpleName(), dataTags); + + super.setTagList(tagList); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java index 37b7fc8..e936a9c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java @@ -22,7 +22,7 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()); + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); body.put("softwareVersion", tag.getVersion()); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java index cd62d6d..d478366 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java @@ -3,11 +3,11 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.frame.BirmmBaseTag; -import com.casic.missiles.frame.tag.config.DateTimeTag; -import com.casic.missiles.frame.tag.ota.OTANeedTag; +import com.casic.missiles.frame.tag.ota.NeedOTATag; -import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; public class MethaneOnlineResponseFrame extends BirmmBaseFrame { @@ -27,12 +27,16 @@ @Override public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map tagList = new HashMap<>(); - OTANeedTag needTag = new OTANeedTag(); + Map> tagList = new HashMap<>(); + NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); - tagList.put(OTANeedTag.class.getSimpleName(), needTag); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); super.setTagList(tagList); } } 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 690b9c5..6ba27f6 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 @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; import com.casic.missiles.frame.tag.biz.CellTag; import com.casic.missiles.frame.tag.biz.DateTag; import com.casic.missiles.frame.tag.biz.SensorStateTag; @@ -39,19 +40,19 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); body.put("cell", cellTag.getCellVal()); } if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); body.put("pci", pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); body.put("rsrp", rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); body.put("snr", snrTag.getSnr()); } @@ -86,21 +87,21 @@ // 电量 if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); bizData.setCell(cellTag.getCellVal()); } // 信号质量 if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); bizData.setPci(pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); bizData.setRsrp(rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); bizData.setSnr(snrTag.getSnr()); } @@ -123,47 +124,57 @@ } private void handleUploadTag() { - UploadTag uploadTag = (UploadTag) getTagList().get(UploadTag.class.getSimpleName()); + List tags = getTagList().get(UploadTag.class.getSimpleName()); - // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 - boolean isValid = uploadTag.checkOid(); - if (isValid) { - // 找到DateTag 取出其中的日期 - DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()); - uploadTag.setStartDate(dateTag.getDate()); + bizDataList = new ArrayList<>(); - 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(); + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); - 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)); // 转成浮点数 + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + MethaneBizData bizData = new MethaneBizData(); - bizDataList.add(bizData); + 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)); // 转成浮点数 - // 加上时间间隔 - start = start.plusMinutes(uploadTag.getInterval()); + bizDataList.add(bizData); + + // 加上时间间隔 + start = start.plusMinutes(uploadTag.getInterval()); + } } } } private void handleSensorStateTag() { - SensorStateTag sensorStateTag = (SensorStateTag) getTagList().get(SensorStateTag.class.getSimpleName()); - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { - // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { - // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - // TODO-LIST - // 传感器状态异常时需要上报异常事件 + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java new file mode 100644 index 0000000..458e393 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java @@ -0,0 +1,28 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class SentinelBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + "][" + value + "][" + bizType + "]"; + } + + public JSONObject toJSON() { + JSONObject json = new JSONObject(); + json.put(BirmmDataBizTypeEnums.toType(bizType).getName(), String.format("%.3f", value)); + json.put("uptime", uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java new file mode 100644 index 0000000..bafe173 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java @@ -0,0 +1,56 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.methane.*; + +public class SentinelFrameBuilderFactory { + + public static BirmmBaseFrame createSentinelFrameByOperation(String operaType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + + case UP_TRAP_REQUEST: + return new SentinelTrapRequestFrame(); + + case UP_ONLINE_REQUEST: + return new MethaneOnlineRequestFrame(); + + case UP_SET_RESPONSE: + return new MethaneSetResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } + + public static BirmmBaseFrame createSentinelReplyFrameByOperation(String uploadOperationType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + + case UP_TRAP_REQUEST: + // TRAP_REQUEST消息回复TRAP_RESPONSE + return new SentinelTrapResponseFrame(); + + case UP_ONLINE_REQUEST: + // ONLINE_REQUEST消息回复ONLINE_RESPONSE + return new MethaneOnlineResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java new file mode 100644 index 0000000..a36d243 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -0,0 +1,180 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.biz.DateTag; +import com.casic.missiles.frame.tag.biz.SensorStateTag; +import com.casic.missiles.frame.tag.biz.UploadTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; +import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.BytesUtil; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Slf4j +public class SentinelTrapRequestFrame extends BirmmBaseFrame { + + private List bizDataList; + + private final String DEV_TYPE = "Sentinel"; + private final String MESSAGE_TYPE = "Data"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + body.put("cell", cellTag.getCellVal()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + body.put("pci", pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + body.put("rsrp", rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + body.put("snr", snrTag.getSnr()); + } + + // 业务数据 + if (bizDataList != null) { + JSONArray datas = new JSONArray(); + for (SentinelBizData bizData : bizDataList) { + datas.add(bizData.toJSON()); + } + body.put("datas", datas); + } + + json.put("mBody", body); + + return json; + } + + @Override + public boolean isBizDataFrame() { + return true; + } + + @Override + public List convertToBizDataList() { + List resultList = new ArrayList<>(); + if (bizDataList != null) { + for (SentinelBizData data : bizDataList) { + DeviceBizData bizData = new DeviceBizData(); + bizData.setBizType(String.valueOf(data.getBizType())); + bizData.setValue(String.format("%.3f", data.getValue())); + bizData.setUptime(data.getUptime()); + + // 电量 + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + bizData.setCell(cellTag.getCellVal()); + } + + // 信号质量 + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + bizData.setPci(pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + bizData.setRsrp(rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + bizData.setSnr(snrTag.getSnr()); + } + + resultList.add(bizData); + } + } + + return resultList; + } + + @Override + public void doParseBizTag() { + if (getTagList().containsKey(UploadTag.class.getSimpleName())) { + handleUploadTag(); + } + + if (getTagList().containsKey(SensorStateTag.class.getSimpleName())) { + handleSensorStateTag(); + } + } + + private void handleUploadTag() { + List tags = getTagList().get(UploadTag.class.getSimpleName()); + + bizDataList = new ArrayList<>(); + + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); + + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + SentinelBizData bizData = new SentinelBizData(); + + 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() { + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java new file mode 100644 index 0000000..2a87b3f --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java @@ -0,0 +1,20 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; + +public class SentinelTrapResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java new file mode 100644 index 0000000..8e40b85 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class NeedOTATag extends BirmmBaseTag { + + final String NEED_OTA_TAG_OID = "60000600"; + + boolean need; + + @Override + public String toString() { + return super.toString() + "[value: " + need + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength() * 2 + "x", need ? 1 : 0); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + need = Boolean.parseBoolean(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java deleted file mode 100644 index 884b44f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.frame.tag.ota; - -import com.casic.missiles.enums.BirmmTagTypeEnums; -import com.casic.missiles.frame.BirmmBaseTag; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -@Data -public class OTANeedTag extends BirmmBaseTag { - - final String OTA_NEED_TAG_OID = "60000600"; - - boolean need; - - @Override - public String toString() { - return super.toString() + "[value: " + need + "]"; - } - - @Override - public String toProtocolString() { - String result = ""; - result += BirmmTagTypeEnums.OTA_NEED_TAG.getName(); // OID - result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_TAG.getLength()); // 长度 - result += String.format("%02x", need ? 1 : 0); - - return result; - } - - @Override - public void setValueStr(String valueStr) { - super.setValueStr(valueStr); - need = Boolean.parseBoolean(valueStr); - } -} diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 70596b6..3ac4de7 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -69,7 +69,7 @@ enable: true sensorhub: config: - port: 7091 + port: 22009 bean: "functionCallback" url: "http://127.0.0.1:7093/push/test" fileUrl: D:\casic\file\ diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 8dcc497..da561cd 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -49,6 +49,12 @@ + cn.hutool + hutool-all + 5.7.16 + + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} 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 32dfdf3..140ee01 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 @@ -1,6 +1,10 @@ package com.casic.missiles.controller; +import cn.hutool.Hutool; import cn.hutool.core.lang.generator.UUIDGenerator; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.model.DeviceBizData; @@ -76,6 +80,12 @@ frameLog.setLogtime(birmmFrame.getLogTime()); frameLogService.save(frameLog); + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + // 保存业务数据 if (birmmFrame.isBizDataFrame()) { List bizDataList = birmmFrame.convertToBizDataList(); @@ -105,13 +115,15 @@ if (dataMap.containsKey("profile")) { hasProfile = (Boolean) dataMap.get("profile"); } - aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); + aepCmdService.setDeviceId((String) dataMap.get("deviceId")); aepCmdService.setProductId((String) dataMap.get("productId")); if (hasProfile) { + aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); retCode = aepCmdService.handleSendCommandWithProfile(replyMessage); } else { - retCode = aepCmdService.handleSendCommand(replyMessage); + aepCmdService.setMasterApiKey("ee2f4011f0a04f28b1572967891b57d5"); + retCode = aepCmdService.handleSendCommand(replyMessage, 2); // 2=16进制 } if (retCode == 0) { 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 f934d86..e22284a 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 @@ -48,7 +48,7 @@ // 业务字段List String tagListString; - Map tagList; + Map> tagList; // CRC String crc; @@ -83,7 +83,9 @@ DateTimeTag dateTimeTag = new DateTimeTag(); dateTimeTag.setDateTime(LocalDateTime.now()); - tagList.put(DateTimeTag.class.getSimpleName(), dateTimeTag); + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); } } 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 ef031b8..772092d 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 @@ -2,6 +2,7 @@ import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; +import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; public class BirmmFrameBuilderFactory { @@ -12,6 +13,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); + case WELL: return null; @@ -31,6 +35,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); + case WELL: return null; 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 index 71023ee..3617ae7 100644 --- 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 @@ -9,6 +9,9 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + case UP_TRAP_REQUEST: return new MethaneTrapRequestFrame(); @@ -30,6 +33,10 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE return new MethaneTrapResponseFrame(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java new file mode 100644 index 0000000..a1fd8bc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java @@ -0,0 +1,43 @@ +package com.casic.missiles.frame.methane; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; +import com.casic.missiles.frame.tag.ota.RequestSizeTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; + +import java.time.format.DateTimeFormatter; + +public class MethaneGetRequestFrame extends BirmmBaseFrame { + + private final String DEV_TYPE = "Methane"; + private final String MESSAGE_TYPE = "GetRequest"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); + body.put("reqSize", tag.getRequestSize()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); + body.put("reqOffset", tag.getRequestOffset()); + } + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java new file mode 100644 index 0000000..5f49fe7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.ota.PackageDataTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MethaneGetResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.UP_GET_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } + + @Override + public void replyBizTag() { + // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) + // TODO-LIST + + Map> tagList = new HashMap<>(); + + RequestOffsetTag offsetTag = new RequestOffsetTag(); + offsetTag.setRequestOffset(0); + List offsetTags = new ArrayList<>(); + offsetTags.add(offsetTag); + tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); + + PackageDataTag dataTag = new PackageDataTag(); + dataTag.setData(new byte[] {0}); + List dataTags = new ArrayList<>(); + dataTags.add(dataTag); + tagList.put(PackageDataTag.class.getSimpleName(), dataTags); + + super.setTagList(tagList); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java index 37b7fc8..e936a9c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java @@ -22,7 +22,7 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()); + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); body.put("softwareVersion", tag.getVersion()); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java index cd62d6d..d478366 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java @@ -3,11 +3,11 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.frame.BirmmBaseTag; -import com.casic.missiles.frame.tag.config.DateTimeTag; -import com.casic.missiles.frame.tag.ota.OTANeedTag; +import com.casic.missiles.frame.tag.ota.NeedOTATag; -import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; public class MethaneOnlineResponseFrame extends BirmmBaseFrame { @@ -27,12 +27,16 @@ @Override public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map tagList = new HashMap<>(); - OTANeedTag needTag = new OTANeedTag(); + Map> tagList = new HashMap<>(); + NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); - tagList.put(OTANeedTag.class.getSimpleName(), needTag); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); super.setTagList(tagList); } } 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 690b9c5..6ba27f6 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 @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; import com.casic.missiles.frame.tag.biz.CellTag; import com.casic.missiles.frame.tag.biz.DateTag; import com.casic.missiles.frame.tag.biz.SensorStateTag; @@ -39,19 +40,19 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); body.put("cell", cellTag.getCellVal()); } if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); body.put("pci", pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); body.put("rsrp", rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); body.put("snr", snrTag.getSnr()); } @@ -86,21 +87,21 @@ // 电量 if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); bizData.setCell(cellTag.getCellVal()); } // 信号质量 if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); bizData.setPci(pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); bizData.setRsrp(rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); bizData.setSnr(snrTag.getSnr()); } @@ -123,47 +124,57 @@ } private void handleUploadTag() { - UploadTag uploadTag = (UploadTag) getTagList().get(UploadTag.class.getSimpleName()); + List tags = getTagList().get(UploadTag.class.getSimpleName()); - // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 - boolean isValid = uploadTag.checkOid(); - if (isValid) { - // 找到DateTag 取出其中的日期 - DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()); - uploadTag.setStartDate(dateTag.getDate()); + bizDataList = new ArrayList<>(); - 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(); + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); - 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)); // 转成浮点数 + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + MethaneBizData bizData = new MethaneBizData(); - bizDataList.add(bizData); + 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)); // 转成浮点数 - // 加上时间间隔 - start = start.plusMinutes(uploadTag.getInterval()); + bizDataList.add(bizData); + + // 加上时间间隔 + start = start.plusMinutes(uploadTag.getInterval()); + } } } } private void handleSensorStateTag() { - SensorStateTag sensorStateTag = (SensorStateTag) getTagList().get(SensorStateTag.class.getSimpleName()); - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { - // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { - // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - // TODO-LIST - // 传感器状态异常时需要上报异常事件 + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java new file mode 100644 index 0000000..458e393 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java @@ -0,0 +1,28 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class SentinelBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + "][" + value + "][" + bizType + "]"; + } + + public JSONObject toJSON() { + JSONObject json = new JSONObject(); + json.put(BirmmDataBizTypeEnums.toType(bizType).getName(), String.format("%.3f", value)); + json.put("uptime", uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java new file mode 100644 index 0000000..bafe173 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java @@ -0,0 +1,56 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.methane.*; + +public class SentinelFrameBuilderFactory { + + public static BirmmBaseFrame createSentinelFrameByOperation(String operaType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + + case UP_TRAP_REQUEST: + return new SentinelTrapRequestFrame(); + + case UP_ONLINE_REQUEST: + return new MethaneOnlineRequestFrame(); + + case UP_SET_RESPONSE: + return new MethaneSetResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } + + public static BirmmBaseFrame createSentinelReplyFrameByOperation(String uploadOperationType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + + case UP_TRAP_REQUEST: + // TRAP_REQUEST消息回复TRAP_RESPONSE + return new SentinelTrapResponseFrame(); + + case UP_ONLINE_REQUEST: + // ONLINE_REQUEST消息回复ONLINE_RESPONSE + return new MethaneOnlineResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java new file mode 100644 index 0000000..a36d243 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -0,0 +1,180 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.biz.DateTag; +import com.casic.missiles.frame.tag.biz.SensorStateTag; +import com.casic.missiles.frame.tag.biz.UploadTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; +import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.BytesUtil; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Slf4j +public class SentinelTrapRequestFrame extends BirmmBaseFrame { + + private List bizDataList; + + private final String DEV_TYPE = "Sentinel"; + private final String MESSAGE_TYPE = "Data"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + body.put("cell", cellTag.getCellVal()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + body.put("pci", pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + body.put("rsrp", rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + body.put("snr", snrTag.getSnr()); + } + + // 业务数据 + if (bizDataList != null) { + JSONArray datas = new JSONArray(); + for (SentinelBizData bizData : bizDataList) { + datas.add(bizData.toJSON()); + } + body.put("datas", datas); + } + + json.put("mBody", body); + + return json; + } + + @Override + public boolean isBizDataFrame() { + return true; + } + + @Override + public List convertToBizDataList() { + List resultList = new ArrayList<>(); + if (bizDataList != null) { + for (SentinelBizData data : bizDataList) { + DeviceBizData bizData = new DeviceBizData(); + bizData.setBizType(String.valueOf(data.getBizType())); + bizData.setValue(String.format("%.3f", data.getValue())); + bizData.setUptime(data.getUptime()); + + // 电量 + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + bizData.setCell(cellTag.getCellVal()); + } + + // 信号质量 + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + bizData.setPci(pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + bizData.setRsrp(rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + bizData.setSnr(snrTag.getSnr()); + } + + resultList.add(bizData); + } + } + + return resultList; + } + + @Override + public void doParseBizTag() { + if (getTagList().containsKey(UploadTag.class.getSimpleName())) { + handleUploadTag(); + } + + if (getTagList().containsKey(SensorStateTag.class.getSimpleName())) { + handleSensorStateTag(); + } + } + + private void handleUploadTag() { + List tags = getTagList().get(UploadTag.class.getSimpleName()); + + bizDataList = new ArrayList<>(); + + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); + + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + SentinelBizData bizData = new SentinelBizData(); + + 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() { + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java new file mode 100644 index 0000000..2a87b3f --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java @@ -0,0 +1,20 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; + +public class SentinelTrapResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java new file mode 100644 index 0000000..8e40b85 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class NeedOTATag extends BirmmBaseTag { + + final String NEED_OTA_TAG_OID = "60000600"; + + boolean need; + + @Override + public String toString() { + return super.toString() + "[value: " + need + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength() * 2 + "x", need ? 1 : 0); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + need = Boolean.parseBoolean(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java deleted file mode 100644 index 884b44f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.frame.tag.ota; - -import com.casic.missiles.enums.BirmmTagTypeEnums; -import com.casic.missiles.frame.BirmmBaseTag; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -@Data -public class OTANeedTag extends BirmmBaseTag { - - final String OTA_NEED_TAG_OID = "60000600"; - - boolean need; - - @Override - public String toString() { - return super.toString() + "[value: " + need + "]"; - } - - @Override - public String toProtocolString() { - String result = ""; - result += BirmmTagTypeEnums.OTA_NEED_TAG.getName(); // OID - result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_TAG.getLength()); // 长度 - result += String.format("%02x", need ? 1 : 0); - - return result; - } - - @Override - public void setValueStr(String valueStr) { - super.setValueStr(valueStr); - need = Boolean.parseBoolean(valueStr); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java new file mode 100644 index 0000000..08dafcf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageCRCTag extends BirmmBaseTag { + + final String PACKAGE_CRC_TAG_OID = "60000603"; + + String packCRC; + + @Override + public String toString() { + return super.toString() + "[value: " + packCRC + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength() * 2 + "x", packCRC); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + packCRC = valueStr; + } +} diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 70596b6..3ac4de7 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -69,7 +69,7 @@ enable: true sensorhub: config: - port: 7091 + port: 22009 bean: "functionCallback" url: "http://127.0.0.1:7093/push/test" fileUrl: D:\casic\file\ diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 8dcc497..da561cd 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -49,6 +49,12 @@ + cn.hutool + hutool-all + 5.7.16 + + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} 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 32dfdf3..140ee01 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 @@ -1,6 +1,10 @@ package com.casic.missiles.controller; +import cn.hutool.Hutool; import cn.hutool.core.lang.generator.UUIDGenerator; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.model.DeviceBizData; @@ -76,6 +80,12 @@ frameLog.setLogtime(birmmFrame.getLogTime()); frameLogService.save(frameLog); + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + // 保存业务数据 if (birmmFrame.isBizDataFrame()) { List bizDataList = birmmFrame.convertToBizDataList(); @@ -105,13 +115,15 @@ if (dataMap.containsKey("profile")) { hasProfile = (Boolean) dataMap.get("profile"); } - aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); + aepCmdService.setDeviceId((String) dataMap.get("deviceId")); aepCmdService.setProductId((String) dataMap.get("productId")); if (hasProfile) { + aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); retCode = aepCmdService.handleSendCommandWithProfile(replyMessage); } else { - retCode = aepCmdService.handleSendCommand(replyMessage); + aepCmdService.setMasterApiKey("ee2f4011f0a04f28b1572967891b57d5"); + retCode = aepCmdService.handleSendCommand(replyMessage, 2); // 2=16进制 } if (retCode == 0) { 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 f934d86..e22284a 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 @@ -48,7 +48,7 @@ // 业务字段List String tagListString; - Map tagList; + Map> tagList; // CRC String crc; @@ -83,7 +83,9 @@ DateTimeTag dateTimeTag = new DateTimeTag(); dateTimeTag.setDateTime(LocalDateTime.now()); - tagList.put(DateTimeTag.class.getSimpleName(), dateTimeTag); + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); } } 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 ef031b8..772092d 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 @@ -2,6 +2,7 @@ import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; +import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; public class BirmmFrameBuilderFactory { @@ -12,6 +13,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); + case WELL: return null; @@ -31,6 +35,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); + case WELL: return null; 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 index 71023ee..3617ae7 100644 --- 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 @@ -9,6 +9,9 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + case UP_TRAP_REQUEST: return new MethaneTrapRequestFrame(); @@ -30,6 +33,10 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE return new MethaneTrapResponseFrame(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java new file mode 100644 index 0000000..a1fd8bc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java @@ -0,0 +1,43 @@ +package com.casic.missiles.frame.methane; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; +import com.casic.missiles.frame.tag.ota.RequestSizeTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; + +import java.time.format.DateTimeFormatter; + +public class MethaneGetRequestFrame extends BirmmBaseFrame { + + private final String DEV_TYPE = "Methane"; + private final String MESSAGE_TYPE = "GetRequest"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); + body.put("reqSize", tag.getRequestSize()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); + body.put("reqOffset", tag.getRequestOffset()); + } + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java new file mode 100644 index 0000000..5f49fe7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.ota.PackageDataTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MethaneGetResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.UP_GET_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } + + @Override + public void replyBizTag() { + // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) + // TODO-LIST + + Map> tagList = new HashMap<>(); + + RequestOffsetTag offsetTag = new RequestOffsetTag(); + offsetTag.setRequestOffset(0); + List offsetTags = new ArrayList<>(); + offsetTags.add(offsetTag); + tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); + + PackageDataTag dataTag = new PackageDataTag(); + dataTag.setData(new byte[] {0}); + List dataTags = new ArrayList<>(); + dataTags.add(dataTag); + tagList.put(PackageDataTag.class.getSimpleName(), dataTags); + + super.setTagList(tagList); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java index 37b7fc8..e936a9c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java @@ -22,7 +22,7 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()); + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); body.put("softwareVersion", tag.getVersion()); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java index cd62d6d..d478366 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java @@ -3,11 +3,11 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.frame.BirmmBaseTag; -import com.casic.missiles.frame.tag.config.DateTimeTag; -import com.casic.missiles.frame.tag.ota.OTANeedTag; +import com.casic.missiles.frame.tag.ota.NeedOTATag; -import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; public class MethaneOnlineResponseFrame extends BirmmBaseFrame { @@ -27,12 +27,16 @@ @Override public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map tagList = new HashMap<>(); - OTANeedTag needTag = new OTANeedTag(); + Map> tagList = new HashMap<>(); + NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); - tagList.put(OTANeedTag.class.getSimpleName(), needTag); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); super.setTagList(tagList); } } 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 690b9c5..6ba27f6 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 @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; import com.casic.missiles.frame.tag.biz.CellTag; import com.casic.missiles.frame.tag.biz.DateTag; import com.casic.missiles.frame.tag.biz.SensorStateTag; @@ -39,19 +40,19 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); body.put("cell", cellTag.getCellVal()); } if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); body.put("pci", pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); body.put("rsrp", rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); body.put("snr", snrTag.getSnr()); } @@ -86,21 +87,21 @@ // 电量 if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); bizData.setCell(cellTag.getCellVal()); } // 信号质量 if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); bizData.setPci(pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); bizData.setRsrp(rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); bizData.setSnr(snrTag.getSnr()); } @@ -123,47 +124,57 @@ } private void handleUploadTag() { - UploadTag uploadTag = (UploadTag) getTagList().get(UploadTag.class.getSimpleName()); + List tags = getTagList().get(UploadTag.class.getSimpleName()); - // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 - boolean isValid = uploadTag.checkOid(); - if (isValid) { - // 找到DateTag 取出其中的日期 - DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()); - uploadTag.setStartDate(dateTag.getDate()); + bizDataList = new ArrayList<>(); - 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(); + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); - 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)); // 转成浮点数 + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + MethaneBizData bizData = new MethaneBizData(); - bizDataList.add(bizData); + 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)); // 转成浮点数 - // 加上时间间隔 - start = start.plusMinutes(uploadTag.getInterval()); + bizDataList.add(bizData); + + // 加上时间间隔 + start = start.plusMinutes(uploadTag.getInterval()); + } } } } private void handleSensorStateTag() { - SensorStateTag sensorStateTag = (SensorStateTag) getTagList().get(SensorStateTag.class.getSimpleName()); - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { - // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { - // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - // TODO-LIST - // 传感器状态异常时需要上报异常事件 + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java new file mode 100644 index 0000000..458e393 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java @@ -0,0 +1,28 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class SentinelBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + "][" + value + "][" + bizType + "]"; + } + + public JSONObject toJSON() { + JSONObject json = new JSONObject(); + json.put(BirmmDataBizTypeEnums.toType(bizType).getName(), String.format("%.3f", value)); + json.put("uptime", uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java new file mode 100644 index 0000000..bafe173 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java @@ -0,0 +1,56 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.methane.*; + +public class SentinelFrameBuilderFactory { + + public static BirmmBaseFrame createSentinelFrameByOperation(String operaType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + + case UP_TRAP_REQUEST: + return new SentinelTrapRequestFrame(); + + case UP_ONLINE_REQUEST: + return new MethaneOnlineRequestFrame(); + + case UP_SET_RESPONSE: + return new MethaneSetResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } + + public static BirmmBaseFrame createSentinelReplyFrameByOperation(String uploadOperationType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + + case UP_TRAP_REQUEST: + // TRAP_REQUEST消息回复TRAP_RESPONSE + return new SentinelTrapResponseFrame(); + + case UP_ONLINE_REQUEST: + // ONLINE_REQUEST消息回复ONLINE_RESPONSE + return new MethaneOnlineResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java new file mode 100644 index 0000000..a36d243 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -0,0 +1,180 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.biz.DateTag; +import com.casic.missiles.frame.tag.biz.SensorStateTag; +import com.casic.missiles.frame.tag.biz.UploadTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; +import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.BytesUtil; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Slf4j +public class SentinelTrapRequestFrame extends BirmmBaseFrame { + + private List bizDataList; + + private final String DEV_TYPE = "Sentinel"; + private final String MESSAGE_TYPE = "Data"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + body.put("cell", cellTag.getCellVal()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + body.put("pci", pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + body.put("rsrp", rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + body.put("snr", snrTag.getSnr()); + } + + // 业务数据 + if (bizDataList != null) { + JSONArray datas = new JSONArray(); + for (SentinelBizData bizData : bizDataList) { + datas.add(bizData.toJSON()); + } + body.put("datas", datas); + } + + json.put("mBody", body); + + return json; + } + + @Override + public boolean isBizDataFrame() { + return true; + } + + @Override + public List convertToBizDataList() { + List resultList = new ArrayList<>(); + if (bizDataList != null) { + for (SentinelBizData data : bizDataList) { + DeviceBizData bizData = new DeviceBizData(); + bizData.setBizType(String.valueOf(data.getBizType())); + bizData.setValue(String.format("%.3f", data.getValue())); + bizData.setUptime(data.getUptime()); + + // 电量 + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + bizData.setCell(cellTag.getCellVal()); + } + + // 信号质量 + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + bizData.setPci(pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + bizData.setRsrp(rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + bizData.setSnr(snrTag.getSnr()); + } + + resultList.add(bizData); + } + } + + return resultList; + } + + @Override + public void doParseBizTag() { + if (getTagList().containsKey(UploadTag.class.getSimpleName())) { + handleUploadTag(); + } + + if (getTagList().containsKey(SensorStateTag.class.getSimpleName())) { + handleSensorStateTag(); + } + } + + private void handleUploadTag() { + List tags = getTagList().get(UploadTag.class.getSimpleName()); + + bizDataList = new ArrayList<>(); + + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); + + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + SentinelBizData bizData = new SentinelBizData(); + + 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() { + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java new file mode 100644 index 0000000..2a87b3f --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java @@ -0,0 +1,20 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; + +public class SentinelTrapResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java new file mode 100644 index 0000000..8e40b85 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class NeedOTATag extends BirmmBaseTag { + + final String NEED_OTA_TAG_OID = "60000600"; + + boolean need; + + @Override + public String toString() { + return super.toString() + "[value: " + need + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength() * 2 + "x", need ? 1 : 0); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + need = Boolean.parseBoolean(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java deleted file mode 100644 index 884b44f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.frame.tag.ota; - -import com.casic.missiles.enums.BirmmTagTypeEnums; -import com.casic.missiles.frame.BirmmBaseTag; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -@Data -public class OTANeedTag extends BirmmBaseTag { - - final String OTA_NEED_TAG_OID = "60000600"; - - boolean need; - - @Override - public String toString() { - return super.toString() + "[value: " + need + "]"; - } - - @Override - public String toProtocolString() { - String result = ""; - result += BirmmTagTypeEnums.OTA_NEED_TAG.getName(); // OID - result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_TAG.getLength()); // 长度 - result += String.format("%02x", need ? 1 : 0); - - return result; - } - - @Override - public void setValueStr(String valueStr) { - super.setValueStr(valueStr); - need = Boolean.parseBoolean(valueStr); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java new file mode 100644 index 0000000..08dafcf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageCRCTag extends BirmmBaseTag { + + final String PACKAGE_CRC_TAG_OID = "60000603"; + + String packCRC; + + @Override + public String toString() { + return super.toString() + "[value: " + packCRC + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength() * 2 + "x", packCRC); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + packCRC = valueStr; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java new file mode 100644 index 0000000..f9801a2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.tomcat.util.buf.HexUtils; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageDataTag extends BirmmBaseTag { + + final String PACKAGE_DATA_TAG_OID = "60000601"; + + byte[] data; + + @Override + public String toString() { + return super.toString() + "[value: " + HexUtils.toHexString(data) + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_DATA_TAG.getName(); // OID + result += String.format("%04d", data.length); // 长度 + result += HexUtils.toHexString(data); + + return result; + } +} diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 70596b6..3ac4de7 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -69,7 +69,7 @@ enable: true sensorhub: config: - port: 7091 + port: 22009 bean: "functionCallback" url: "http://127.0.0.1:7093/push/test" fileUrl: D:\casic\file\ diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 8dcc497..da561cd 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -49,6 +49,12 @@ + cn.hutool + hutool-all + 5.7.16 + + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} 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 32dfdf3..140ee01 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 @@ -1,6 +1,10 @@ package com.casic.missiles.controller; +import cn.hutool.Hutool; import cn.hutool.core.lang.generator.UUIDGenerator; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.model.DeviceBizData; @@ -76,6 +80,12 @@ frameLog.setLogtime(birmmFrame.getLogTime()); frameLogService.save(frameLog); + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + // 保存业务数据 if (birmmFrame.isBizDataFrame()) { List bizDataList = birmmFrame.convertToBizDataList(); @@ -105,13 +115,15 @@ if (dataMap.containsKey("profile")) { hasProfile = (Boolean) dataMap.get("profile"); } - aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); + aepCmdService.setDeviceId((String) dataMap.get("deviceId")); aepCmdService.setProductId((String) dataMap.get("productId")); if (hasProfile) { + aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); retCode = aepCmdService.handleSendCommandWithProfile(replyMessage); } else { - retCode = aepCmdService.handleSendCommand(replyMessage); + aepCmdService.setMasterApiKey("ee2f4011f0a04f28b1572967891b57d5"); + retCode = aepCmdService.handleSendCommand(replyMessage, 2); // 2=16进制 } if (retCode == 0) { 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 f934d86..e22284a 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 @@ -48,7 +48,7 @@ // 业务字段List String tagListString; - Map tagList; + Map> tagList; // CRC String crc; @@ -83,7 +83,9 @@ DateTimeTag dateTimeTag = new DateTimeTag(); dateTimeTag.setDateTime(LocalDateTime.now()); - tagList.put(DateTimeTag.class.getSimpleName(), dateTimeTag); + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); } } 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 ef031b8..772092d 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 @@ -2,6 +2,7 @@ import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; +import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; public class BirmmFrameBuilderFactory { @@ -12,6 +13,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); + case WELL: return null; @@ -31,6 +35,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); + case WELL: return null; 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 index 71023ee..3617ae7 100644 --- 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 @@ -9,6 +9,9 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + case UP_TRAP_REQUEST: return new MethaneTrapRequestFrame(); @@ -30,6 +33,10 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE return new MethaneTrapResponseFrame(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java new file mode 100644 index 0000000..a1fd8bc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java @@ -0,0 +1,43 @@ +package com.casic.missiles.frame.methane; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; +import com.casic.missiles.frame.tag.ota.RequestSizeTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; + +import java.time.format.DateTimeFormatter; + +public class MethaneGetRequestFrame extends BirmmBaseFrame { + + private final String DEV_TYPE = "Methane"; + private final String MESSAGE_TYPE = "GetRequest"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); + body.put("reqSize", tag.getRequestSize()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); + body.put("reqOffset", tag.getRequestOffset()); + } + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java new file mode 100644 index 0000000..5f49fe7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.ota.PackageDataTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MethaneGetResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.UP_GET_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } + + @Override + public void replyBizTag() { + // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) + // TODO-LIST + + Map> tagList = new HashMap<>(); + + RequestOffsetTag offsetTag = new RequestOffsetTag(); + offsetTag.setRequestOffset(0); + List offsetTags = new ArrayList<>(); + offsetTags.add(offsetTag); + tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); + + PackageDataTag dataTag = new PackageDataTag(); + dataTag.setData(new byte[] {0}); + List dataTags = new ArrayList<>(); + dataTags.add(dataTag); + tagList.put(PackageDataTag.class.getSimpleName(), dataTags); + + super.setTagList(tagList); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java index 37b7fc8..e936a9c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java @@ -22,7 +22,7 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()); + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); body.put("softwareVersion", tag.getVersion()); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java index cd62d6d..d478366 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java @@ -3,11 +3,11 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.frame.BirmmBaseTag; -import com.casic.missiles.frame.tag.config.DateTimeTag; -import com.casic.missiles.frame.tag.ota.OTANeedTag; +import com.casic.missiles.frame.tag.ota.NeedOTATag; -import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; public class MethaneOnlineResponseFrame extends BirmmBaseFrame { @@ -27,12 +27,16 @@ @Override public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map tagList = new HashMap<>(); - OTANeedTag needTag = new OTANeedTag(); + Map> tagList = new HashMap<>(); + NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); - tagList.put(OTANeedTag.class.getSimpleName(), needTag); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); super.setTagList(tagList); } } 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 690b9c5..6ba27f6 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 @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; import com.casic.missiles.frame.tag.biz.CellTag; import com.casic.missiles.frame.tag.biz.DateTag; import com.casic.missiles.frame.tag.biz.SensorStateTag; @@ -39,19 +40,19 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); body.put("cell", cellTag.getCellVal()); } if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); body.put("pci", pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); body.put("rsrp", rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); body.put("snr", snrTag.getSnr()); } @@ -86,21 +87,21 @@ // 电量 if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); bizData.setCell(cellTag.getCellVal()); } // 信号质量 if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); bizData.setPci(pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); bizData.setRsrp(rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); bizData.setSnr(snrTag.getSnr()); } @@ -123,47 +124,57 @@ } private void handleUploadTag() { - UploadTag uploadTag = (UploadTag) getTagList().get(UploadTag.class.getSimpleName()); + List tags = getTagList().get(UploadTag.class.getSimpleName()); - // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 - boolean isValid = uploadTag.checkOid(); - if (isValid) { - // 找到DateTag 取出其中的日期 - DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()); - uploadTag.setStartDate(dateTag.getDate()); + bizDataList = new ArrayList<>(); - 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(); + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); - 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)); // 转成浮点数 + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + MethaneBizData bizData = new MethaneBizData(); - bizDataList.add(bizData); + 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)); // 转成浮点数 - // 加上时间间隔 - start = start.plusMinutes(uploadTag.getInterval()); + bizDataList.add(bizData); + + // 加上时间间隔 + start = start.plusMinutes(uploadTag.getInterval()); + } } } } private void handleSensorStateTag() { - SensorStateTag sensorStateTag = (SensorStateTag) getTagList().get(SensorStateTag.class.getSimpleName()); - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { - // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { - // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - // TODO-LIST - // 传感器状态异常时需要上报异常事件 + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java new file mode 100644 index 0000000..458e393 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java @@ -0,0 +1,28 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class SentinelBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + "][" + value + "][" + bizType + "]"; + } + + public JSONObject toJSON() { + JSONObject json = new JSONObject(); + json.put(BirmmDataBizTypeEnums.toType(bizType).getName(), String.format("%.3f", value)); + json.put("uptime", uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java new file mode 100644 index 0000000..bafe173 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java @@ -0,0 +1,56 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.methane.*; + +public class SentinelFrameBuilderFactory { + + public static BirmmBaseFrame createSentinelFrameByOperation(String operaType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + + case UP_TRAP_REQUEST: + return new SentinelTrapRequestFrame(); + + case UP_ONLINE_REQUEST: + return new MethaneOnlineRequestFrame(); + + case UP_SET_RESPONSE: + return new MethaneSetResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } + + public static BirmmBaseFrame createSentinelReplyFrameByOperation(String uploadOperationType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + + case UP_TRAP_REQUEST: + // TRAP_REQUEST消息回复TRAP_RESPONSE + return new SentinelTrapResponseFrame(); + + case UP_ONLINE_REQUEST: + // ONLINE_REQUEST消息回复ONLINE_RESPONSE + return new MethaneOnlineResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java new file mode 100644 index 0000000..a36d243 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -0,0 +1,180 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.biz.DateTag; +import com.casic.missiles.frame.tag.biz.SensorStateTag; +import com.casic.missiles.frame.tag.biz.UploadTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; +import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.BytesUtil; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Slf4j +public class SentinelTrapRequestFrame extends BirmmBaseFrame { + + private List bizDataList; + + private final String DEV_TYPE = "Sentinel"; + private final String MESSAGE_TYPE = "Data"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + body.put("cell", cellTag.getCellVal()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + body.put("pci", pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + body.put("rsrp", rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + body.put("snr", snrTag.getSnr()); + } + + // 业务数据 + if (bizDataList != null) { + JSONArray datas = new JSONArray(); + for (SentinelBizData bizData : bizDataList) { + datas.add(bizData.toJSON()); + } + body.put("datas", datas); + } + + json.put("mBody", body); + + return json; + } + + @Override + public boolean isBizDataFrame() { + return true; + } + + @Override + public List convertToBizDataList() { + List resultList = new ArrayList<>(); + if (bizDataList != null) { + for (SentinelBizData data : bizDataList) { + DeviceBizData bizData = new DeviceBizData(); + bizData.setBizType(String.valueOf(data.getBizType())); + bizData.setValue(String.format("%.3f", data.getValue())); + bizData.setUptime(data.getUptime()); + + // 电量 + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + bizData.setCell(cellTag.getCellVal()); + } + + // 信号质量 + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + bizData.setPci(pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + bizData.setRsrp(rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + bizData.setSnr(snrTag.getSnr()); + } + + resultList.add(bizData); + } + } + + return resultList; + } + + @Override + public void doParseBizTag() { + if (getTagList().containsKey(UploadTag.class.getSimpleName())) { + handleUploadTag(); + } + + if (getTagList().containsKey(SensorStateTag.class.getSimpleName())) { + handleSensorStateTag(); + } + } + + private void handleUploadTag() { + List tags = getTagList().get(UploadTag.class.getSimpleName()); + + bizDataList = new ArrayList<>(); + + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); + + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + SentinelBizData bizData = new SentinelBizData(); + + 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() { + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java new file mode 100644 index 0000000..2a87b3f --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java @@ -0,0 +1,20 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; + +public class SentinelTrapResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java new file mode 100644 index 0000000..8e40b85 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class NeedOTATag extends BirmmBaseTag { + + final String NEED_OTA_TAG_OID = "60000600"; + + boolean need; + + @Override + public String toString() { + return super.toString() + "[value: " + need + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength() * 2 + "x", need ? 1 : 0); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + need = Boolean.parseBoolean(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java deleted file mode 100644 index 884b44f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.frame.tag.ota; - -import com.casic.missiles.enums.BirmmTagTypeEnums; -import com.casic.missiles.frame.BirmmBaseTag; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -@Data -public class OTANeedTag extends BirmmBaseTag { - - final String OTA_NEED_TAG_OID = "60000600"; - - boolean need; - - @Override - public String toString() { - return super.toString() + "[value: " + need + "]"; - } - - @Override - public String toProtocolString() { - String result = ""; - result += BirmmTagTypeEnums.OTA_NEED_TAG.getName(); // OID - result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_TAG.getLength()); // 长度 - result += String.format("%02x", need ? 1 : 0); - - return result; - } - - @Override - public void setValueStr(String valueStr) { - super.setValueStr(valueStr); - need = Boolean.parseBoolean(valueStr); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java new file mode 100644 index 0000000..08dafcf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageCRCTag extends BirmmBaseTag { + + final String PACKAGE_CRC_TAG_OID = "60000603"; + + String packCRC; + + @Override + public String toString() { + return super.toString() + "[value: " + packCRC + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength() * 2 + "x", packCRC); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + packCRC = valueStr; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java new file mode 100644 index 0000000..f9801a2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.tomcat.util.buf.HexUtils; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageDataTag extends BirmmBaseTag { + + final String PACKAGE_DATA_TAG_OID = "60000601"; + + byte[] data; + + @Override + public String toString() { + return super.toString() + "[value: " + HexUtils.toHexString(data) + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_DATA_TAG.getName(); // OID + result += String.format("%04d", data.length); // 长度 + result += HexUtils.toHexString(data); + + return result; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java new file mode 100644 index 0000000..05ff3c1 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageSizeTag extends BirmmBaseTag { + + final String PACKAGE_SIZE_TAG_OID = "60000602"; + + int packSize; + + @Override + public String toString() { + return super.toString() + "[value: " + packSize + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength() * 2 + "x", packSize); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + packSize = Integer.parseInt(valueStr); + } +} diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 70596b6..3ac4de7 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -69,7 +69,7 @@ enable: true sensorhub: config: - port: 7091 + port: 22009 bean: "functionCallback" url: "http://127.0.0.1:7093/push/test" fileUrl: D:\casic\file\ diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 8dcc497..da561cd 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -49,6 +49,12 @@ + cn.hutool + hutool-all + 5.7.16 + + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} 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 32dfdf3..140ee01 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 @@ -1,6 +1,10 @@ package com.casic.missiles.controller; +import cn.hutool.Hutool; import cn.hutool.core.lang.generator.UUIDGenerator; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.model.DeviceBizData; @@ -76,6 +80,12 @@ frameLog.setLogtime(birmmFrame.getLogTime()); frameLogService.save(frameLog); + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + // 保存业务数据 if (birmmFrame.isBizDataFrame()) { List bizDataList = birmmFrame.convertToBizDataList(); @@ -105,13 +115,15 @@ if (dataMap.containsKey("profile")) { hasProfile = (Boolean) dataMap.get("profile"); } - aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); + aepCmdService.setDeviceId((String) dataMap.get("deviceId")); aepCmdService.setProductId((String) dataMap.get("productId")); if (hasProfile) { + aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); retCode = aepCmdService.handleSendCommandWithProfile(replyMessage); } else { - retCode = aepCmdService.handleSendCommand(replyMessage); + aepCmdService.setMasterApiKey("ee2f4011f0a04f28b1572967891b57d5"); + retCode = aepCmdService.handleSendCommand(replyMessage, 2); // 2=16进制 } if (retCode == 0) { 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 f934d86..e22284a 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 @@ -48,7 +48,7 @@ // 业务字段List String tagListString; - Map tagList; + Map> tagList; // CRC String crc; @@ -83,7 +83,9 @@ DateTimeTag dateTimeTag = new DateTimeTag(); dateTimeTag.setDateTime(LocalDateTime.now()); - tagList.put(DateTimeTag.class.getSimpleName(), dateTimeTag); + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); } } 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 ef031b8..772092d 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 @@ -2,6 +2,7 @@ import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; +import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; public class BirmmFrameBuilderFactory { @@ -12,6 +13,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); + case WELL: return null; @@ -31,6 +35,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); + case WELL: return null; 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 index 71023ee..3617ae7 100644 --- 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 @@ -9,6 +9,9 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + case UP_TRAP_REQUEST: return new MethaneTrapRequestFrame(); @@ -30,6 +33,10 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE return new MethaneTrapResponseFrame(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java new file mode 100644 index 0000000..a1fd8bc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java @@ -0,0 +1,43 @@ +package com.casic.missiles.frame.methane; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; +import com.casic.missiles.frame.tag.ota.RequestSizeTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; + +import java.time.format.DateTimeFormatter; + +public class MethaneGetRequestFrame extends BirmmBaseFrame { + + private final String DEV_TYPE = "Methane"; + private final String MESSAGE_TYPE = "GetRequest"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); + body.put("reqSize", tag.getRequestSize()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); + body.put("reqOffset", tag.getRequestOffset()); + } + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java new file mode 100644 index 0000000..5f49fe7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.ota.PackageDataTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MethaneGetResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.UP_GET_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } + + @Override + public void replyBizTag() { + // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) + // TODO-LIST + + Map> tagList = new HashMap<>(); + + RequestOffsetTag offsetTag = new RequestOffsetTag(); + offsetTag.setRequestOffset(0); + List offsetTags = new ArrayList<>(); + offsetTags.add(offsetTag); + tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); + + PackageDataTag dataTag = new PackageDataTag(); + dataTag.setData(new byte[] {0}); + List dataTags = new ArrayList<>(); + dataTags.add(dataTag); + tagList.put(PackageDataTag.class.getSimpleName(), dataTags); + + super.setTagList(tagList); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java index 37b7fc8..e936a9c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java @@ -22,7 +22,7 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()); + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); body.put("softwareVersion", tag.getVersion()); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java index cd62d6d..d478366 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java @@ -3,11 +3,11 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.frame.BirmmBaseTag; -import com.casic.missiles.frame.tag.config.DateTimeTag; -import com.casic.missiles.frame.tag.ota.OTANeedTag; +import com.casic.missiles.frame.tag.ota.NeedOTATag; -import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; public class MethaneOnlineResponseFrame extends BirmmBaseFrame { @@ -27,12 +27,16 @@ @Override public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map tagList = new HashMap<>(); - OTANeedTag needTag = new OTANeedTag(); + Map> tagList = new HashMap<>(); + NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); - tagList.put(OTANeedTag.class.getSimpleName(), needTag); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); super.setTagList(tagList); } } 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 690b9c5..6ba27f6 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 @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; import com.casic.missiles.frame.tag.biz.CellTag; import com.casic.missiles.frame.tag.biz.DateTag; import com.casic.missiles.frame.tag.biz.SensorStateTag; @@ -39,19 +40,19 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); body.put("cell", cellTag.getCellVal()); } if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); body.put("pci", pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); body.put("rsrp", rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); body.put("snr", snrTag.getSnr()); } @@ -86,21 +87,21 @@ // 电量 if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); bizData.setCell(cellTag.getCellVal()); } // 信号质量 if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); bizData.setPci(pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); bizData.setRsrp(rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); bizData.setSnr(snrTag.getSnr()); } @@ -123,47 +124,57 @@ } private void handleUploadTag() { - UploadTag uploadTag = (UploadTag) getTagList().get(UploadTag.class.getSimpleName()); + List tags = getTagList().get(UploadTag.class.getSimpleName()); - // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 - boolean isValid = uploadTag.checkOid(); - if (isValid) { - // 找到DateTag 取出其中的日期 - DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()); - uploadTag.setStartDate(dateTag.getDate()); + bizDataList = new ArrayList<>(); - 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(); + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); - 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)); // 转成浮点数 + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + MethaneBizData bizData = new MethaneBizData(); - bizDataList.add(bizData); + 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)); // 转成浮点数 - // 加上时间间隔 - start = start.plusMinutes(uploadTag.getInterval()); + bizDataList.add(bizData); + + // 加上时间间隔 + start = start.plusMinutes(uploadTag.getInterval()); + } } } } private void handleSensorStateTag() { - SensorStateTag sensorStateTag = (SensorStateTag) getTagList().get(SensorStateTag.class.getSimpleName()); - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { - // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { - // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - // TODO-LIST - // 传感器状态异常时需要上报异常事件 + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java new file mode 100644 index 0000000..458e393 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java @@ -0,0 +1,28 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class SentinelBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + "][" + value + "][" + bizType + "]"; + } + + public JSONObject toJSON() { + JSONObject json = new JSONObject(); + json.put(BirmmDataBizTypeEnums.toType(bizType).getName(), String.format("%.3f", value)); + json.put("uptime", uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java new file mode 100644 index 0000000..bafe173 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java @@ -0,0 +1,56 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.methane.*; + +public class SentinelFrameBuilderFactory { + + public static BirmmBaseFrame createSentinelFrameByOperation(String operaType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + + case UP_TRAP_REQUEST: + return new SentinelTrapRequestFrame(); + + case UP_ONLINE_REQUEST: + return new MethaneOnlineRequestFrame(); + + case UP_SET_RESPONSE: + return new MethaneSetResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } + + public static BirmmBaseFrame createSentinelReplyFrameByOperation(String uploadOperationType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + + case UP_TRAP_REQUEST: + // TRAP_REQUEST消息回复TRAP_RESPONSE + return new SentinelTrapResponseFrame(); + + case UP_ONLINE_REQUEST: + // ONLINE_REQUEST消息回复ONLINE_RESPONSE + return new MethaneOnlineResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java new file mode 100644 index 0000000..a36d243 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -0,0 +1,180 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.biz.DateTag; +import com.casic.missiles.frame.tag.biz.SensorStateTag; +import com.casic.missiles.frame.tag.biz.UploadTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; +import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.BytesUtil; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Slf4j +public class SentinelTrapRequestFrame extends BirmmBaseFrame { + + private List bizDataList; + + private final String DEV_TYPE = "Sentinel"; + private final String MESSAGE_TYPE = "Data"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + body.put("cell", cellTag.getCellVal()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + body.put("pci", pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + body.put("rsrp", rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + body.put("snr", snrTag.getSnr()); + } + + // 业务数据 + if (bizDataList != null) { + JSONArray datas = new JSONArray(); + for (SentinelBizData bizData : bizDataList) { + datas.add(bizData.toJSON()); + } + body.put("datas", datas); + } + + json.put("mBody", body); + + return json; + } + + @Override + public boolean isBizDataFrame() { + return true; + } + + @Override + public List convertToBizDataList() { + List resultList = new ArrayList<>(); + if (bizDataList != null) { + for (SentinelBizData data : bizDataList) { + DeviceBizData bizData = new DeviceBizData(); + bizData.setBizType(String.valueOf(data.getBizType())); + bizData.setValue(String.format("%.3f", data.getValue())); + bizData.setUptime(data.getUptime()); + + // 电量 + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + bizData.setCell(cellTag.getCellVal()); + } + + // 信号质量 + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + bizData.setPci(pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + bizData.setRsrp(rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + bizData.setSnr(snrTag.getSnr()); + } + + resultList.add(bizData); + } + } + + return resultList; + } + + @Override + public void doParseBizTag() { + if (getTagList().containsKey(UploadTag.class.getSimpleName())) { + handleUploadTag(); + } + + if (getTagList().containsKey(SensorStateTag.class.getSimpleName())) { + handleSensorStateTag(); + } + } + + private void handleUploadTag() { + List tags = getTagList().get(UploadTag.class.getSimpleName()); + + bizDataList = new ArrayList<>(); + + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); + + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + SentinelBizData bizData = new SentinelBizData(); + + 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() { + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java new file mode 100644 index 0000000..2a87b3f --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java @@ -0,0 +1,20 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; + +public class SentinelTrapResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java new file mode 100644 index 0000000..8e40b85 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class NeedOTATag extends BirmmBaseTag { + + final String NEED_OTA_TAG_OID = "60000600"; + + boolean need; + + @Override + public String toString() { + return super.toString() + "[value: " + need + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength() * 2 + "x", need ? 1 : 0); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + need = Boolean.parseBoolean(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java deleted file mode 100644 index 884b44f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.frame.tag.ota; - -import com.casic.missiles.enums.BirmmTagTypeEnums; -import com.casic.missiles.frame.BirmmBaseTag; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -@Data -public class OTANeedTag extends BirmmBaseTag { - - final String OTA_NEED_TAG_OID = "60000600"; - - boolean need; - - @Override - public String toString() { - return super.toString() + "[value: " + need + "]"; - } - - @Override - public String toProtocolString() { - String result = ""; - result += BirmmTagTypeEnums.OTA_NEED_TAG.getName(); // OID - result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_TAG.getLength()); // 长度 - result += String.format("%02x", need ? 1 : 0); - - return result; - } - - @Override - public void setValueStr(String valueStr) { - super.setValueStr(valueStr); - need = Boolean.parseBoolean(valueStr); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java new file mode 100644 index 0000000..08dafcf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageCRCTag extends BirmmBaseTag { + + final String PACKAGE_CRC_TAG_OID = "60000603"; + + String packCRC; + + @Override + public String toString() { + return super.toString() + "[value: " + packCRC + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength() * 2 + "x", packCRC); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + packCRC = valueStr; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java new file mode 100644 index 0000000..f9801a2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.tomcat.util.buf.HexUtils; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageDataTag extends BirmmBaseTag { + + final String PACKAGE_DATA_TAG_OID = "60000601"; + + byte[] data; + + @Override + public String toString() { + return super.toString() + "[value: " + HexUtils.toHexString(data) + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_DATA_TAG.getName(); // OID + result += String.format("%04d", data.length); // 长度 + result += HexUtils.toHexString(data); + + return result; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java new file mode 100644 index 0000000..05ff3c1 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageSizeTag extends BirmmBaseTag { + + final String PACKAGE_SIZE_TAG_OID = "60000602"; + + int packSize; + + @Override + public String toString() { + return super.toString() + "[value: " + packSize + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength() * 2 + "x", packSize); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + packSize = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java new file mode 100644 index 0000000..bfc83dd --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java @@ -0,0 +1,37 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class RequestOffsetTag extends BirmmBaseTag { + + final String REQUEST_OFFSET_TAG_OID = "20000102"; + + // 本次请求的升级包偏移量 + int requestOffset; + + @Override + public String toString() { + return super.toString() + "[value: " + requestOffset + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength() * 2 + "x", requestOffset); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + requestOffset = Integer.parseInt(valueStr); + } +} diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 70596b6..3ac4de7 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -69,7 +69,7 @@ enable: true sensorhub: config: - port: 7091 + port: 22009 bean: "functionCallback" url: "http://127.0.0.1:7093/push/test" fileUrl: D:\casic\file\ diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 8dcc497..da561cd 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -49,6 +49,12 @@ + cn.hutool + hutool-all + 5.7.16 + + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} 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 32dfdf3..140ee01 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 @@ -1,6 +1,10 @@ package com.casic.missiles.controller; +import cn.hutool.Hutool; import cn.hutool.core.lang.generator.UUIDGenerator; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.model.DeviceBizData; @@ -76,6 +80,12 @@ frameLog.setLogtime(birmmFrame.getLogTime()); frameLogService.save(frameLog); + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + // 保存业务数据 if (birmmFrame.isBizDataFrame()) { List bizDataList = birmmFrame.convertToBizDataList(); @@ -105,13 +115,15 @@ if (dataMap.containsKey("profile")) { hasProfile = (Boolean) dataMap.get("profile"); } - aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); + aepCmdService.setDeviceId((String) dataMap.get("deviceId")); aepCmdService.setProductId((String) dataMap.get("productId")); if (hasProfile) { + aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); retCode = aepCmdService.handleSendCommandWithProfile(replyMessage); } else { - retCode = aepCmdService.handleSendCommand(replyMessage); + aepCmdService.setMasterApiKey("ee2f4011f0a04f28b1572967891b57d5"); + retCode = aepCmdService.handleSendCommand(replyMessage, 2); // 2=16进制 } if (retCode == 0) { 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 f934d86..e22284a 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 @@ -48,7 +48,7 @@ // 业务字段List String tagListString; - Map tagList; + Map> tagList; // CRC String crc; @@ -83,7 +83,9 @@ DateTimeTag dateTimeTag = new DateTimeTag(); dateTimeTag.setDateTime(LocalDateTime.now()); - tagList.put(DateTimeTag.class.getSimpleName(), dateTimeTag); + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); } } 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 ef031b8..772092d 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 @@ -2,6 +2,7 @@ import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; +import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; public class BirmmFrameBuilderFactory { @@ -12,6 +13,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); + case WELL: return null; @@ -31,6 +35,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); + case WELL: return null; 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 index 71023ee..3617ae7 100644 --- 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 @@ -9,6 +9,9 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + case UP_TRAP_REQUEST: return new MethaneTrapRequestFrame(); @@ -30,6 +33,10 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE return new MethaneTrapResponseFrame(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java new file mode 100644 index 0000000..a1fd8bc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java @@ -0,0 +1,43 @@ +package com.casic.missiles.frame.methane; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; +import com.casic.missiles.frame.tag.ota.RequestSizeTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; + +import java.time.format.DateTimeFormatter; + +public class MethaneGetRequestFrame extends BirmmBaseFrame { + + private final String DEV_TYPE = "Methane"; + private final String MESSAGE_TYPE = "GetRequest"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); + body.put("reqSize", tag.getRequestSize()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); + body.put("reqOffset", tag.getRequestOffset()); + } + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java new file mode 100644 index 0000000..5f49fe7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.ota.PackageDataTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MethaneGetResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.UP_GET_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } + + @Override + public void replyBizTag() { + // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) + // TODO-LIST + + Map> tagList = new HashMap<>(); + + RequestOffsetTag offsetTag = new RequestOffsetTag(); + offsetTag.setRequestOffset(0); + List offsetTags = new ArrayList<>(); + offsetTags.add(offsetTag); + tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); + + PackageDataTag dataTag = new PackageDataTag(); + dataTag.setData(new byte[] {0}); + List dataTags = new ArrayList<>(); + dataTags.add(dataTag); + tagList.put(PackageDataTag.class.getSimpleName(), dataTags); + + super.setTagList(tagList); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java index 37b7fc8..e936a9c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java @@ -22,7 +22,7 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()); + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); body.put("softwareVersion", tag.getVersion()); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java index cd62d6d..d478366 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java @@ -3,11 +3,11 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.frame.BirmmBaseTag; -import com.casic.missiles.frame.tag.config.DateTimeTag; -import com.casic.missiles.frame.tag.ota.OTANeedTag; +import com.casic.missiles.frame.tag.ota.NeedOTATag; -import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; public class MethaneOnlineResponseFrame extends BirmmBaseFrame { @@ -27,12 +27,16 @@ @Override public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map tagList = new HashMap<>(); - OTANeedTag needTag = new OTANeedTag(); + Map> tagList = new HashMap<>(); + NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); - tagList.put(OTANeedTag.class.getSimpleName(), needTag); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); super.setTagList(tagList); } } 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 690b9c5..6ba27f6 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 @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; import com.casic.missiles.frame.tag.biz.CellTag; import com.casic.missiles.frame.tag.biz.DateTag; import com.casic.missiles.frame.tag.biz.SensorStateTag; @@ -39,19 +40,19 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); body.put("cell", cellTag.getCellVal()); } if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); body.put("pci", pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); body.put("rsrp", rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); body.put("snr", snrTag.getSnr()); } @@ -86,21 +87,21 @@ // 电量 if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); bizData.setCell(cellTag.getCellVal()); } // 信号质量 if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); bizData.setPci(pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); bizData.setRsrp(rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); bizData.setSnr(snrTag.getSnr()); } @@ -123,47 +124,57 @@ } private void handleUploadTag() { - UploadTag uploadTag = (UploadTag) getTagList().get(UploadTag.class.getSimpleName()); + List tags = getTagList().get(UploadTag.class.getSimpleName()); - // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 - boolean isValid = uploadTag.checkOid(); - if (isValid) { - // 找到DateTag 取出其中的日期 - DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()); - uploadTag.setStartDate(dateTag.getDate()); + bizDataList = new ArrayList<>(); - 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(); + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); - 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)); // 转成浮点数 + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + MethaneBizData bizData = new MethaneBizData(); - bizDataList.add(bizData); + 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)); // 转成浮点数 - // 加上时间间隔 - start = start.plusMinutes(uploadTag.getInterval()); + bizDataList.add(bizData); + + // 加上时间间隔 + start = start.plusMinutes(uploadTag.getInterval()); + } } } } private void handleSensorStateTag() { - SensorStateTag sensorStateTag = (SensorStateTag) getTagList().get(SensorStateTag.class.getSimpleName()); - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { - // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { - // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - // TODO-LIST - // 传感器状态异常时需要上报异常事件 + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java new file mode 100644 index 0000000..458e393 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java @@ -0,0 +1,28 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class SentinelBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + "][" + value + "][" + bizType + "]"; + } + + public JSONObject toJSON() { + JSONObject json = new JSONObject(); + json.put(BirmmDataBizTypeEnums.toType(bizType).getName(), String.format("%.3f", value)); + json.put("uptime", uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java new file mode 100644 index 0000000..bafe173 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java @@ -0,0 +1,56 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.methane.*; + +public class SentinelFrameBuilderFactory { + + public static BirmmBaseFrame createSentinelFrameByOperation(String operaType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + + case UP_TRAP_REQUEST: + return new SentinelTrapRequestFrame(); + + case UP_ONLINE_REQUEST: + return new MethaneOnlineRequestFrame(); + + case UP_SET_RESPONSE: + return new MethaneSetResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } + + public static BirmmBaseFrame createSentinelReplyFrameByOperation(String uploadOperationType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + + case UP_TRAP_REQUEST: + // TRAP_REQUEST消息回复TRAP_RESPONSE + return new SentinelTrapResponseFrame(); + + case UP_ONLINE_REQUEST: + // ONLINE_REQUEST消息回复ONLINE_RESPONSE + return new MethaneOnlineResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java new file mode 100644 index 0000000..a36d243 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -0,0 +1,180 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.biz.DateTag; +import com.casic.missiles.frame.tag.biz.SensorStateTag; +import com.casic.missiles.frame.tag.biz.UploadTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; +import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.BytesUtil; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Slf4j +public class SentinelTrapRequestFrame extends BirmmBaseFrame { + + private List bizDataList; + + private final String DEV_TYPE = "Sentinel"; + private final String MESSAGE_TYPE = "Data"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + body.put("cell", cellTag.getCellVal()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + body.put("pci", pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + body.put("rsrp", rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + body.put("snr", snrTag.getSnr()); + } + + // 业务数据 + if (bizDataList != null) { + JSONArray datas = new JSONArray(); + for (SentinelBizData bizData : bizDataList) { + datas.add(bizData.toJSON()); + } + body.put("datas", datas); + } + + json.put("mBody", body); + + return json; + } + + @Override + public boolean isBizDataFrame() { + return true; + } + + @Override + public List convertToBizDataList() { + List resultList = new ArrayList<>(); + if (bizDataList != null) { + for (SentinelBizData data : bizDataList) { + DeviceBizData bizData = new DeviceBizData(); + bizData.setBizType(String.valueOf(data.getBizType())); + bizData.setValue(String.format("%.3f", data.getValue())); + bizData.setUptime(data.getUptime()); + + // 电量 + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + bizData.setCell(cellTag.getCellVal()); + } + + // 信号质量 + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + bizData.setPci(pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + bizData.setRsrp(rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + bizData.setSnr(snrTag.getSnr()); + } + + resultList.add(bizData); + } + } + + return resultList; + } + + @Override + public void doParseBizTag() { + if (getTagList().containsKey(UploadTag.class.getSimpleName())) { + handleUploadTag(); + } + + if (getTagList().containsKey(SensorStateTag.class.getSimpleName())) { + handleSensorStateTag(); + } + } + + private void handleUploadTag() { + List tags = getTagList().get(UploadTag.class.getSimpleName()); + + bizDataList = new ArrayList<>(); + + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); + + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + SentinelBizData bizData = new SentinelBizData(); + + 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() { + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java new file mode 100644 index 0000000..2a87b3f --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java @@ -0,0 +1,20 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; + +public class SentinelTrapResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java new file mode 100644 index 0000000..8e40b85 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class NeedOTATag extends BirmmBaseTag { + + final String NEED_OTA_TAG_OID = "60000600"; + + boolean need; + + @Override + public String toString() { + return super.toString() + "[value: " + need + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength() * 2 + "x", need ? 1 : 0); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + need = Boolean.parseBoolean(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java deleted file mode 100644 index 884b44f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.frame.tag.ota; - -import com.casic.missiles.enums.BirmmTagTypeEnums; -import com.casic.missiles.frame.BirmmBaseTag; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -@Data -public class OTANeedTag extends BirmmBaseTag { - - final String OTA_NEED_TAG_OID = "60000600"; - - boolean need; - - @Override - public String toString() { - return super.toString() + "[value: " + need + "]"; - } - - @Override - public String toProtocolString() { - String result = ""; - result += BirmmTagTypeEnums.OTA_NEED_TAG.getName(); // OID - result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_TAG.getLength()); // 长度 - result += String.format("%02x", need ? 1 : 0); - - return result; - } - - @Override - public void setValueStr(String valueStr) { - super.setValueStr(valueStr); - need = Boolean.parseBoolean(valueStr); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java new file mode 100644 index 0000000..08dafcf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageCRCTag extends BirmmBaseTag { + + final String PACKAGE_CRC_TAG_OID = "60000603"; + + String packCRC; + + @Override + public String toString() { + return super.toString() + "[value: " + packCRC + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength() * 2 + "x", packCRC); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + packCRC = valueStr; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java new file mode 100644 index 0000000..f9801a2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.tomcat.util.buf.HexUtils; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageDataTag extends BirmmBaseTag { + + final String PACKAGE_DATA_TAG_OID = "60000601"; + + byte[] data; + + @Override + public String toString() { + return super.toString() + "[value: " + HexUtils.toHexString(data) + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_DATA_TAG.getName(); // OID + result += String.format("%04d", data.length); // 长度 + result += HexUtils.toHexString(data); + + return result; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java new file mode 100644 index 0000000..05ff3c1 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageSizeTag extends BirmmBaseTag { + + final String PACKAGE_SIZE_TAG_OID = "60000602"; + + int packSize; + + @Override + public String toString() { + return super.toString() + "[value: " + packSize + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength() * 2 + "x", packSize); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + packSize = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java new file mode 100644 index 0000000..bfc83dd --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java @@ -0,0 +1,37 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class RequestOffsetTag extends BirmmBaseTag { + + final String REQUEST_OFFSET_TAG_OID = "20000102"; + + // 本次请求的升级包偏移量 + int requestOffset; + + @Override + public String toString() { + return super.toString() + "[value: " + requestOffset + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength() * 2 + "x", requestOffset); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + requestOffset = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java new file mode 100644 index 0000000..6c096a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java @@ -0,0 +1,27 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class RequestSizeTag extends BirmmBaseTag { + + final String REQUEST_SIZE_TAG_OID = "20000100"; + + // 本次请求的升级包大小 + int requestSize; + + @Override + public String toString() { + return super.toString() + "[value: " + requestSize + "]"; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + requestSize = Integer.parseInt(valueStr); + } +} diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 70596b6..3ac4de7 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -69,7 +69,7 @@ enable: true sensorhub: config: - port: 7091 + port: 22009 bean: "functionCallback" url: "http://127.0.0.1:7093/push/test" fileUrl: D:\casic\file\ diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 8dcc497..da561cd 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -49,6 +49,12 @@ + cn.hutool + hutool-all + 5.7.16 + + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} 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 32dfdf3..140ee01 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 @@ -1,6 +1,10 @@ package com.casic.missiles.controller; +import cn.hutool.Hutool; import cn.hutool.core.lang.generator.UUIDGenerator; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.model.DeviceBizData; @@ -76,6 +80,12 @@ frameLog.setLogtime(birmmFrame.getLogTime()); frameLogService.save(frameLog); + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + // 保存业务数据 if (birmmFrame.isBizDataFrame()) { List bizDataList = birmmFrame.convertToBizDataList(); @@ -105,13 +115,15 @@ if (dataMap.containsKey("profile")) { hasProfile = (Boolean) dataMap.get("profile"); } - aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); + aepCmdService.setDeviceId((String) dataMap.get("deviceId")); aepCmdService.setProductId((String) dataMap.get("productId")); if (hasProfile) { + aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); retCode = aepCmdService.handleSendCommandWithProfile(replyMessage); } else { - retCode = aepCmdService.handleSendCommand(replyMessage); + aepCmdService.setMasterApiKey("ee2f4011f0a04f28b1572967891b57d5"); + retCode = aepCmdService.handleSendCommand(replyMessage, 2); // 2=16进制 } if (retCode == 0) { 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 f934d86..e22284a 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 @@ -48,7 +48,7 @@ // 业务字段List String tagListString; - Map tagList; + Map> tagList; // CRC String crc; @@ -83,7 +83,9 @@ DateTimeTag dateTimeTag = new DateTimeTag(); dateTimeTag.setDateTime(LocalDateTime.now()); - tagList.put(DateTimeTag.class.getSimpleName(), dateTimeTag); + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); } } 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 ef031b8..772092d 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 @@ -2,6 +2,7 @@ import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; +import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; public class BirmmFrameBuilderFactory { @@ -12,6 +13,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); + case WELL: return null; @@ -31,6 +35,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); + case WELL: return null; 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 index 71023ee..3617ae7 100644 --- 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 @@ -9,6 +9,9 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + case UP_TRAP_REQUEST: return new MethaneTrapRequestFrame(); @@ -30,6 +33,10 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE return new MethaneTrapResponseFrame(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java new file mode 100644 index 0000000..a1fd8bc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java @@ -0,0 +1,43 @@ +package com.casic.missiles.frame.methane; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; +import com.casic.missiles.frame.tag.ota.RequestSizeTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; + +import java.time.format.DateTimeFormatter; + +public class MethaneGetRequestFrame extends BirmmBaseFrame { + + private final String DEV_TYPE = "Methane"; + private final String MESSAGE_TYPE = "GetRequest"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); + body.put("reqSize", tag.getRequestSize()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); + body.put("reqOffset", tag.getRequestOffset()); + } + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java new file mode 100644 index 0000000..5f49fe7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.ota.PackageDataTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MethaneGetResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.UP_GET_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } + + @Override + public void replyBizTag() { + // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) + // TODO-LIST + + Map> tagList = new HashMap<>(); + + RequestOffsetTag offsetTag = new RequestOffsetTag(); + offsetTag.setRequestOffset(0); + List offsetTags = new ArrayList<>(); + offsetTags.add(offsetTag); + tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); + + PackageDataTag dataTag = new PackageDataTag(); + dataTag.setData(new byte[] {0}); + List dataTags = new ArrayList<>(); + dataTags.add(dataTag); + tagList.put(PackageDataTag.class.getSimpleName(), dataTags); + + super.setTagList(tagList); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java index 37b7fc8..e936a9c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java @@ -22,7 +22,7 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()); + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); body.put("softwareVersion", tag.getVersion()); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java index cd62d6d..d478366 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java @@ -3,11 +3,11 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.frame.BirmmBaseTag; -import com.casic.missiles.frame.tag.config.DateTimeTag; -import com.casic.missiles.frame.tag.ota.OTANeedTag; +import com.casic.missiles.frame.tag.ota.NeedOTATag; -import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; public class MethaneOnlineResponseFrame extends BirmmBaseFrame { @@ -27,12 +27,16 @@ @Override public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map tagList = new HashMap<>(); - OTANeedTag needTag = new OTANeedTag(); + Map> tagList = new HashMap<>(); + NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); - tagList.put(OTANeedTag.class.getSimpleName(), needTag); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); super.setTagList(tagList); } } 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 690b9c5..6ba27f6 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 @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; import com.casic.missiles.frame.tag.biz.CellTag; import com.casic.missiles.frame.tag.biz.DateTag; import com.casic.missiles.frame.tag.biz.SensorStateTag; @@ -39,19 +40,19 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); body.put("cell", cellTag.getCellVal()); } if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); body.put("pci", pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); body.put("rsrp", rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); body.put("snr", snrTag.getSnr()); } @@ -86,21 +87,21 @@ // 电量 if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); bizData.setCell(cellTag.getCellVal()); } // 信号质量 if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); bizData.setPci(pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); bizData.setRsrp(rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); bizData.setSnr(snrTag.getSnr()); } @@ -123,47 +124,57 @@ } private void handleUploadTag() { - UploadTag uploadTag = (UploadTag) getTagList().get(UploadTag.class.getSimpleName()); + List tags = getTagList().get(UploadTag.class.getSimpleName()); - // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 - boolean isValid = uploadTag.checkOid(); - if (isValid) { - // 找到DateTag 取出其中的日期 - DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()); - uploadTag.setStartDate(dateTag.getDate()); + bizDataList = new ArrayList<>(); - 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(); + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); - 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)); // 转成浮点数 + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + MethaneBizData bizData = new MethaneBizData(); - bizDataList.add(bizData); + 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)); // 转成浮点数 - // 加上时间间隔 - start = start.plusMinutes(uploadTag.getInterval()); + bizDataList.add(bizData); + + // 加上时间间隔 + start = start.plusMinutes(uploadTag.getInterval()); + } } } } private void handleSensorStateTag() { - SensorStateTag sensorStateTag = (SensorStateTag) getTagList().get(SensorStateTag.class.getSimpleName()); - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { - // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { - // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - // TODO-LIST - // 传感器状态异常时需要上报异常事件 + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java new file mode 100644 index 0000000..458e393 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java @@ -0,0 +1,28 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class SentinelBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + "][" + value + "][" + bizType + "]"; + } + + public JSONObject toJSON() { + JSONObject json = new JSONObject(); + json.put(BirmmDataBizTypeEnums.toType(bizType).getName(), String.format("%.3f", value)); + json.put("uptime", uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java new file mode 100644 index 0000000..bafe173 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java @@ -0,0 +1,56 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.methane.*; + +public class SentinelFrameBuilderFactory { + + public static BirmmBaseFrame createSentinelFrameByOperation(String operaType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + + case UP_TRAP_REQUEST: + return new SentinelTrapRequestFrame(); + + case UP_ONLINE_REQUEST: + return new MethaneOnlineRequestFrame(); + + case UP_SET_RESPONSE: + return new MethaneSetResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } + + public static BirmmBaseFrame createSentinelReplyFrameByOperation(String uploadOperationType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + + case UP_TRAP_REQUEST: + // TRAP_REQUEST消息回复TRAP_RESPONSE + return new SentinelTrapResponseFrame(); + + case UP_ONLINE_REQUEST: + // ONLINE_REQUEST消息回复ONLINE_RESPONSE + return new MethaneOnlineResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java new file mode 100644 index 0000000..a36d243 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -0,0 +1,180 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.biz.DateTag; +import com.casic.missiles.frame.tag.biz.SensorStateTag; +import com.casic.missiles.frame.tag.biz.UploadTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; +import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.BytesUtil; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Slf4j +public class SentinelTrapRequestFrame extends BirmmBaseFrame { + + private List bizDataList; + + private final String DEV_TYPE = "Sentinel"; + private final String MESSAGE_TYPE = "Data"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + body.put("cell", cellTag.getCellVal()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + body.put("pci", pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + body.put("rsrp", rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + body.put("snr", snrTag.getSnr()); + } + + // 业务数据 + if (bizDataList != null) { + JSONArray datas = new JSONArray(); + for (SentinelBizData bizData : bizDataList) { + datas.add(bizData.toJSON()); + } + body.put("datas", datas); + } + + json.put("mBody", body); + + return json; + } + + @Override + public boolean isBizDataFrame() { + return true; + } + + @Override + public List convertToBizDataList() { + List resultList = new ArrayList<>(); + if (bizDataList != null) { + for (SentinelBizData data : bizDataList) { + DeviceBizData bizData = new DeviceBizData(); + bizData.setBizType(String.valueOf(data.getBizType())); + bizData.setValue(String.format("%.3f", data.getValue())); + bizData.setUptime(data.getUptime()); + + // 电量 + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + bizData.setCell(cellTag.getCellVal()); + } + + // 信号质量 + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + bizData.setPci(pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + bizData.setRsrp(rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + bizData.setSnr(snrTag.getSnr()); + } + + resultList.add(bizData); + } + } + + return resultList; + } + + @Override + public void doParseBizTag() { + if (getTagList().containsKey(UploadTag.class.getSimpleName())) { + handleUploadTag(); + } + + if (getTagList().containsKey(SensorStateTag.class.getSimpleName())) { + handleSensorStateTag(); + } + } + + private void handleUploadTag() { + List tags = getTagList().get(UploadTag.class.getSimpleName()); + + bizDataList = new ArrayList<>(); + + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); + + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + SentinelBizData bizData = new SentinelBizData(); + + 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() { + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java new file mode 100644 index 0000000..2a87b3f --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java @@ -0,0 +1,20 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; + +public class SentinelTrapResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java new file mode 100644 index 0000000..8e40b85 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class NeedOTATag extends BirmmBaseTag { + + final String NEED_OTA_TAG_OID = "60000600"; + + boolean need; + + @Override + public String toString() { + return super.toString() + "[value: " + need + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength() * 2 + "x", need ? 1 : 0); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + need = Boolean.parseBoolean(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java deleted file mode 100644 index 884b44f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.frame.tag.ota; - -import com.casic.missiles.enums.BirmmTagTypeEnums; -import com.casic.missiles.frame.BirmmBaseTag; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -@Data -public class OTANeedTag extends BirmmBaseTag { - - final String OTA_NEED_TAG_OID = "60000600"; - - boolean need; - - @Override - public String toString() { - return super.toString() + "[value: " + need + "]"; - } - - @Override - public String toProtocolString() { - String result = ""; - result += BirmmTagTypeEnums.OTA_NEED_TAG.getName(); // OID - result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_TAG.getLength()); // 长度 - result += String.format("%02x", need ? 1 : 0); - - return result; - } - - @Override - public void setValueStr(String valueStr) { - super.setValueStr(valueStr); - need = Boolean.parseBoolean(valueStr); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java new file mode 100644 index 0000000..08dafcf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageCRCTag extends BirmmBaseTag { + + final String PACKAGE_CRC_TAG_OID = "60000603"; + + String packCRC; + + @Override + public String toString() { + return super.toString() + "[value: " + packCRC + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength() * 2 + "x", packCRC); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + packCRC = valueStr; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java new file mode 100644 index 0000000..f9801a2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.tomcat.util.buf.HexUtils; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageDataTag extends BirmmBaseTag { + + final String PACKAGE_DATA_TAG_OID = "60000601"; + + byte[] data; + + @Override + public String toString() { + return super.toString() + "[value: " + HexUtils.toHexString(data) + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_DATA_TAG.getName(); // OID + result += String.format("%04d", data.length); // 长度 + result += HexUtils.toHexString(data); + + return result; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java new file mode 100644 index 0000000..05ff3c1 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageSizeTag extends BirmmBaseTag { + + final String PACKAGE_SIZE_TAG_OID = "60000602"; + + int packSize; + + @Override + public String toString() { + return super.toString() + "[value: " + packSize + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength() * 2 + "x", packSize); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + packSize = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java new file mode 100644 index 0000000..bfc83dd --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java @@ -0,0 +1,37 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class RequestOffsetTag extends BirmmBaseTag { + + final String REQUEST_OFFSET_TAG_OID = "20000102"; + + // 本次请求的升级包偏移量 + int requestOffset; + + @Override + public String toString() { + return super.toString() + "[value: " + requestOffset + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength() * 2 + "x", requestOffset); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + requestOffset = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java new file mode 100644 index 0000000..6c096a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java @@ -0,0 +1,27 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class RequestSizeTag extends BirmmBaseTag { + + final String REQUEST_SIZE_TAG_OID = "20000100"; + + // 本次请求的升级包大小 + int requestSize; + + @Override + public String toString() { + return super.toString() + "[value: " + requestSize + "]"; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + requestSize = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 91c81d0..207eca2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -15,6 +15,7 @@ import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; +import javax.annotation.Resource; /** * SensorhubServer netty服务端 @@ -32,6 +33,9 @@ EventLoopGroup bossGroup = new NioEventLoopGroup(4); // boss EventLoopGroup workerGroup = new NioEventLoopGroup(32); // worker + @Resource + SensorhubServerChannelInitialHandler pipeLine; + /** * sensorhub属性参数 */ @@ -71,7 +75,7 @@ ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) // 设置EventLoopGroup .channel(NioServerSocketChannel.class) // 指明新的Channel的类型 - .childHandler(new SensorhubServerChannelInitialHandler()) // 指定ChannelHandler + .childHandler(pipeLine) // 指定ChannelHandler .option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) .childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) .option(ChannelOption.SO_BACKLOG, 1024) // 设置的ServerChannel的一些选项 diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 70596b6..3ac4de7 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -69,7 +69,7 @@ enable: true sensorhub: config: - port: 7091 + port: 22009 bean: "functionCallback" url: "http://127.0.0.1:7093/push/test" fileUrl: D:\casic\file\ diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 8dcc497..da561cd 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -49,6 +49,12 @@ + cn.hutool + hutool-all + 5.7.16 + + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} 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 32dfdf3..140ee01 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 @@ -1,6 +1,10 @@ package com.casic.missiles.controller; +import cn.hutool.Hutool; import cn.hutool.core.lang.generator.UUIDGenerator; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.model.DeviceBizData; @@ -76,6 +80,12 @@ frameLog.setLogtime(birmmFrame.getLogTime()); frameLogService.save(frameLog); + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + // 保存业务数据 if (birmmFrame.isBizDataFrame()) { List bizDataList = birmmFrame.convertToBizDataList(); @@ -105,13 +115,15 @@ if (dataMap.containsKey("profile")) { hasProfile = (Boolean) dataMap.get("profile"); } - aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); + aepCmdService.setDeviceId((String) dataMap.get("deviceId")); aepCmdService.setProductId((String) dataMap.get("productId")); if (hasProfile) { + aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); retCode = aepCmdService.handleSendCommandWithProfile(replyMessage); } else { - retCode = aepCmdService.handleSendCommand(replyMessage); + aepCmdService.setMasterApiKey("ee2f4011f0a04f28b1572967891b57d5"); + retCode = aepCmdService.handleSendCommand(replyMessage, 2); // 2=16进制 } if (retCode == 0) { 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 f934d86..e22284a 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 @@ -48,7 +48,7 @@ // 业务字段List String tagListString; - Map tagList; + Map> tagList; // CRC String crc; @@ -83,7 +83,9 @@ DateTimeTag dateTimeTag = new DateTimeTag(); dateTimeTag.setDateTime(LocalDateTime.now()); - tagList.put(DateTimeTag.class.getSimpleName(), dateTimeTag); + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); } } 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 ef031b8..772092d 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 @@ -2,6 +2,7 @@ import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; +import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; public class BirmmFrameBuilderFactory { @@ -12,6 +13,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); + case WELL: return null; @@ -31,6 +35,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); + case WELL: return null; 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 index 71023ee..3617ae7 100644 --- 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 @@ -9,6 +9,9 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + case UP_TRAP_REQUEST: return new MethaneTrapRequestFrame(); @@ -30,6 +33,10 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE return new MethaneTrapResponseFrame(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java new file mode 100644 index 0000000..a1fd8bc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java @@ -0,0 +1,43 @@ +package com.casic.missiles.frame.methane; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; +import com.casic.missiles.frame.tag.ota.RequestSizeTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; + +import java.time.format.DateTimeFormatter; + +public class MethaneGetRequestFrame extends BirmmBaseFrame { + + private final String DEV_TYPE = "Methane"; + private final String MESSAGE_TYPE = "GetRequest"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); + body.put("reqSize", tag.getRequestSize()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); + body.put("reqOffset", tag.getRequestOffset()); + } + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java new file mode 100644 index 0000000..5f49fe7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.ota.PackageDataTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MethaneGetResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.UP_GET_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } + + @Override + public void replyBizTag() { + // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) + // TODO-LIST + + Map> tagList = new HashMap<>(); + + RequestOffsetTag offsetTag = new RequestOffsetTag(); + offsetTag.setRequestOffset(0); + List offsetTags = new ArrayList<>(); + offsetTags.add(offsetTag); + tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); + + PackageDataTag dataTag = new PackageDataTag(); + dataTag.setData(new byte[] {0}); + List dataTags = new ArrayList<>(); + dataTags.add(dataTag); + tagList.put(PackageDataTag.class.getSimpleName(), dataTags); + + super.setTagList(tagList); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java index 37b7fc8..e936a9c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java @@ -22,7 +22,7 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()); + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); body.put("softwareVersion", tag.getVersion()); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java index cd62d6d..d478366 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java @@ -3,11 +3,11 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.frame.BirmmBaseTag; -import com.casic.missiles.frame.tag.config.DateTimeTag; -import com.casic.missiles.frame.tag.ota.OTANeedTag; +import com.casic.missiles.frame.tag.ota.NeedOTATag; -import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; public class MethaneOnlineResponseFrame extends BirmmBaseFrame { @@ -27,12 +27,16 @@ @Override public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map tagList = new HashMap<>(); - OTANeedTag needTag = new OTANeedTag(); + Map> tagList = new HashMap<>(); + NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); - tagList.put(OTANeedTag.class.getSimpleName(), needTag); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); super.setTagList(tagList); } } 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 690b9c5..6ba27f6 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 @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; import com.casic.missiles.frame.tag.biz.CellTag; import com.casic.missiles.frame.tag.biz.DateTag; import com.casic.missiles.frame.tag.biz.SensorStateTag; @@ -39,19 +40,19 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); body.put("cell", cellTag.getCellVal()); } if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); body.put("pci", pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); body.put("rsrp", rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); body.put("snr", snrTag.getSnr()); } @@ -86,21 +87,21 @@ // 电量 if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); bizData.setCell(cellTag.getCellVal()); } // 信号质量 if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); bizData.setPci(pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); bizData.setRsrp(rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); bizData.setSnr(snrTag.getSnr()); } @@ -123,47 +124,57 @@ } private void handleUploadTag() { - UploadTag uploadTag = (UploadTag) getTagList().get(UploadTag.class.getSimpleName()); + List tags = getTagList().get(UploadTag.class.getSimpleName()); - // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 - boolean isValid = uploadTag.checkOid(); - if (isValid) { - // 找到DateTag 取出其中的日期 - DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()); - uploadTag.setStartDate(dateTag.getDate()); + bizDataList = new ArrayList<>(); - 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(); + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); - 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)); // 转成浮点数 + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + MethaneBizData bizData = new MethaneBizData(); - bizDataList.add(bizData); + 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)); // 转成浮点数 - // 加上时间间隔 - start = start.plusMinutes(uploadTag.getInterval()); + bizDataList.add(bizData); + + // 加上时间间隔 + start = start.plusMinutes(uploadTag.getInterval()); + } } } } private void handleSensorStateTag() { - SensorStateTag sensorStateTag = (SensorStateTag) getTagList().get(SensorStateTag.class.getSimpleName()); - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { - // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { - // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - // TODO-LIST - // 传感器状态异常时需要上报异常事件 + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java new file mode 100644 index 0000000..458e393 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java @@ -0,0 +1,28 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class SentinelBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + "][" + value + "][" + bizType + "]"; + } + + public JSONObject toJSON() { + JSONObject json = new JSONObject(); + json.put(BirmmDataBizTypeEnums.toType(bizType).getName(), String.format("%.3f", value)); + json.put("uptime", uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java new file mode 100644 index 0000000..bafe173 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java @@ -0,0 +1,56 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.methane.*; + +public class SentinelFrameBuilderFactory { + + public static BirmmBaseFrame createSentinelFrameByOperation(String operaType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + + case UP_TRAP_REQUEST: + return new SentinelTrapRequestFrame(); + + case UP_ONLINE_REQUEST: + return new MethaneOnlineRequestFrame(); + + case UP_SET_RESPONSE: + return new MethaneSetResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } + + public static BirmmBaseFrame createSentinelReplyFrameByOperation(String uploadOperationType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + + case UP_TRAP_REQUEST: + // TRAP_REQUEST消息回复TRAP_RESPONSE + return new SentinelTrapResponseFrame(); + + case UP_ONLINE_REQUEST: + // ONLINE_REQUEST消息回复ONLINE_RESPONSE + return new MethaneOnlineResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java new file mode 100644 index 0000000..a36d243 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -0,0 +1,180 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.biz.DateTag; +import com.casic.missiles.frame.tag.biz.SensorStateTag; +import com.casic.missiles.frame.tag.biz.UploadTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; +import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.BytesUtil; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Slf4j +public class SentinelTrapRequestFrame extends BirmmBaseFrame { + + private List bizDataList; + + private final String DEV_TYPE = "Sentinel"; + private final String MESSAGE_TYPE = "Data"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + body.put("cell", cellTag.getCellVal()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + body.put("pci", pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + body.put("rsrp", rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + body.put("snr", snrTag.getSnr()); + } + + // 业务数据 + if (bizDataList != null) { + JSONArray datas = new JSONArray(); + for (SentinelBizData bizData : bizDataList) { + datas.add(bizData.toJSON()); + } + body.put("datas", datas); + } + + json.put("mBody", body); + + return json; + } + + @Override + public boolean isBizDataFrame() { + return true; + } + + @Override + public List convertToBizDataList() { + List resultList = new ArrayList<>(); + if (bizDataList != null) { + for (SentinelBizData data : bizDataList) { + DeviceBizData bizData = new DeviceBizData(); + bizData.setBizType(String.valueOf(data.getBizType())); + bizData.setValue(String.format("%.3f", data.getValue())); + bizData.setUptime(data.getUptime()); + + // 电量 + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + bizData.setCell(cellTag.getCellVal()); + } + + // 信号质量 + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + bizData.setPci(pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + bizData.setRsrp(rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + bizData.setSnr(snrTag.getSnr()); + } + + resultList.add(bizData); + } + } + + return resultList; + } + + @Override + public void doParseBizTag() { + if (getTagList().containsKey(UploadTag.class.getSimpleName())) { + handleUploadTag(); + } + + if (getTagList().containsKey(SensorStateTag.class.getSimpleName())) { + handleSensorStateTag(); + } + } + + private void handleUploadTag() { + List tags = getTagList().get(UploadTag.class.getSimpleName()); + + bizDataList = new ArrayList<>(); + + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); + + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + SentinelBizData bizData = new SentinelBizData(); + + 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() { + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java new file mode 100644 index 0000000..2a87b3f --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java @@ -0,0 +1,20 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; + +public class SentinelTrapResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java new file mode 100644 index 0000000..8e40b85 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class NeedOTATag extends BirmmBaseTag { + + final String NEED_OTA_TAG_OID = "60000600"; + + boolean need; + + @Override + public String toString() { + return super.toString() + "[value: " + need + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength() * 2 + "x", need ? 1 : 0); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + need = Boolean.parseBoolean(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java deleted file mode 100644 index 884b44f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.frame.tag.ota; - -import com.casic.missiles.enums.BirmmTagTypeEnums; -import com.casic.missiles.frame.BirmmBaseTag; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -@Data -public class OTANeedTag extends BirmmBaseTag { - - final String OTA_NEED_TAG_OID = "60000600"; - - boolean need; - - @Override - public String toString() { - return super.toString() + "[value: " + need + "]"; - } - - @Override - public String toProtocolString() { - String result = ""; - result += BirmmTagTypeEnums.OTA_NEED_TAG.getName(); // OID - result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_TAG.getLength()); // 长度 - result += String.format("%02x", need ? 1 : 0); - - return result; - } - - @Override - public void setValueStr(String valueStr) { - super.setValueStr(valueStr); - need = Boolean.parseBoolean(valueStr); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java new file mode 100644 index 0000000..08dafcf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageCRCTag extends BirmmBaseTag { + + final String PACKAGE_CRC_TAG_OID = "60000603"; + + String packCRC; + + @Override + public String toString() { + return super.toString() + "[value: " + packCRC + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength() * 2 + "x", packCRC); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + packCRC = valueStr; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java new file mode 100644 index 0000000..f9801a2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.tomcat.util.buf.HexUtils; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageDataTag extends BirmmBaseTag { + + final String PACKAGE_DATA_TAG_OID = "60000601"; + + byte[] data; + + @Override + public String toString() { + return super.toString() + "[value: " + HexUtils.toHexString(data) + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_DATA_TAG.getName(); // OID + result += String.format("%04d", data.length); // 长度 + result += HexUtils.toHexString(data); + + return result; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java new file mode 100644 index 0000000..05ff3c1 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageSizeTag extends BirmmBaseTag { + + final String PACKAGE_SIZE_TAG_OID = "60000602"; + + int packSize; + + @Override + public String toString() { + return super.toString() + "[value: " + packSize + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength() * 2 + "x", packSize); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + packSize = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java new file mode 100644 index 0000000..bfc83dd --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java @@ -0,0 +1,37 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class RequestOffsetTag extends BirmmBaseTag { + + final String REQUEST_OFFSET_TAG_OID = "20000102"; + + // 本次请求的升级包偏移量 + int requestOffset; + + @Override + public String toString() { + return super.toString() + "[value: " + requestOffset + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength() * 2 + "x", requestOffset); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + requestOffset = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java new file mode 100644 index 0000000..6c096a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java @@ -0,0 +1,27 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class RequestSizeTag extends BirmmBaseTag { + + final String REQUEST_SIZE_TAG_OID = "20000100"; + + // 本次请求的升级包大小 + int requestSize; + + @Override + public String toString() { + return super.toString() + "[value: " + requestSize + "]"; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + requestSize = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 91c81d0..207eca2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -15,6 +15,7 @@ import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; +import javax.annotation.Resource; /** * SensorhubServer netty服务端 @@ -32,6 +33,9 @@ EventLoopGroup bossGroup = new NioEventLoopGroup(4); // boss EventLoopGroup workerGroup = new NioEventLoopGroup(32); // worker + @Resource + SensorhubServerChannelInitialHandler pipeLine; + /** * sensorhub属性参数 */ @@ -71,7 +75,7 @@ ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) // 设置EventLoopGroup .channel(NioServerSocketChannel.class) // 指明新的Channel的类型 - .childHandler(new SensorhubServerChannelInitialHandler()) // 指定ChannelHandler + .childHandler(pipeLine) // 指定ChannelHandler .option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) .childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) .option(ChannelOption.SO_BACKLOG, 1024) // 设置的ServerChannel的一些选项 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java index c3f82cc..02f1291 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java @@ -1,27 +1,38 @@ package com.casic.missiles.netty.handler; +import com.casic.missiles.parser.BirmmHexDecoder; import com.casic.missiles.parser.SensorhubDecoder; +import com.casic.missiles.parser.safe.impl.Sm4; +import com.casic.missiles.replier.CommonHexReplier; import com.casic.missiles.replier.SensorhubReplier; +import com.casic.missiles.util.SpringContextUtil; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; /** * @author cz * @date 2023-06-05 */ +@Component public class SensorhubServerChannelInitialHandler extends ChannelInitializer { - + @Resource + BirmmHexDecoder birmmHexDecoder; @Override protected void initChannel(SocketChannel socketChannel) { ChannelPipeline pipeline = socketChannel.pipeline(); pipeline.addLast(new LoggingHandler(LogLevel.INFO)); - pipeline.addLast(new SensorhubDecoder()); - pipeline.addLast(new SensorhubReplier()); +// pipeline.addLast(new SensorhubDecoder()); +// pipeline.addLast(birmmHexDecoder); + pipeline.addLast(new BirmmHexDecoder()); + pipeline.addLast(new CommonHexReplier()); // 心跳续约 // pipeline.addLast(this.heartBeatRespHandler); // pipeline.addLast(this.loginAuthRespHandler); 登录验证 diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 70596b6..3ac4de7 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -69,7 +69,7 @@ enable: true sensorhub: config: - port: 7091 + port: 22009 bean: "functionCallback" url: "http://127.0.0.1:7093/push/test" fileUrl: D:\casic\file\ diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 8dcc497..da561cd 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -49,6 +49,12 @@ + cn.hutool + hutool-all + 5.7.16 + + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} 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 32dfdf3..140ee01 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 @@ -1,6 +1,10 @@ package com.casic.missiles.controller; +import cn.hutool.Hutool; import cn.hutool.core.lang.generator.UUIDGenerator; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.model.DeviceBizData; @@ -76,6 +80,12 @@ frameLog.setLogtime(birmmFrame.getLogTime()); frameLogService.save(frameLog); + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + // 保存业务数据 if (birmmFrame.isBizDataFrame()) { List bizDataList = birmmFrame.convertToBizDataList(); @@ -105,13 +115,15 @@ if (dataMap.containsKey("profile")) { hasProfile = (Boolean) dataMap.get("profile"); } - aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); + aepCmdService.setDeviceId((String) dataMap.get("deviceId")); aepCmdService.setProductId((String) dataMap.get("productId")); if (hasProfile) { + aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); retCode = aepCmdService.handleSendCommandWithProfile(replyMessage); } else { - retCode = aepCmdService.handleSendCommand(replyMessage); + aepCmdService.setMasterApiKey("ee2f4011f0a04f28b1572967891b57d5"); + retCode = aepCmdService.handleSendCommand(replyMessage, 2); // 2=16进制 } if (retCode == 0) { 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 f934d86..e22284a 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 @@ -48,7 +48,7 @@ // 业务字段List String tagListString; - Map tagList; + Map> tagList; // CRC String crc; @@ -83,7 +83,9 @@ DateTimeTag dateTimeTag = new DateTimeTag(); dateTimeTag.setDateTime(LocalDateTime.now()); - tagList.put(DateTimeTag.class.getSimpleName(), dateTimeTag); + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); } } 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 ef031b8..772092d 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 @@ -2,6 +2,7 @@ import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; +import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; public class BirmmFrameBuilderFactory { @@ -12,6 +13,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); + case WELL: return null; @@ -31,6 +35,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); + case WELL: return null; 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 index 71023ee..3617ae7 100644 --- 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 @@ -9,6 +9,9 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + case UP_TRAP_REQUEST: return new MethaneTrapRequestFrame(); @@ -30,6 +33,10 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE return new MethaneTrapResponseFrame(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java new file mode 100644 index 0000000..a1fd8bc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java @@ -0,0 +1,43 @@ +package com.casic.missiles.frame.methane; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; +import com.casic.missiles.frame.tag.ota.RequestSizeTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; + +import java.time.format.DateTimeFormatter; + +public class MethaneGetRequestFrame extends BirmmBaseFrame { + + private final String DEV_TYPE = "Methane"; + private final String MESSAGE_TYPE = "GetRequest"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); + body.put("reqSize", tag.getRequestSize()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); + body.put("reqOffset", tag.getRequestOffset()); + } + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java new file mode 100644 index 0000000..5f49fe7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.ota.PackageDataTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MethaneGetResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.UP_GET_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } + + @Override + public void replyBizTag() { + // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) + // TODO-LIST + + Map> tagList = new HashMap<>(); + + RequestOffsetTag offsetTag = new RequestOffsetTag(); + offsetTag.setRequestOffset(0); + List offsetTags = new ArrayList<>(); + offsetTags.add(offsetTag); + tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); + + PackageDataTag dataTag = new PackageDataTag(); + dataTag.setData(new byte[] {0}); + List dataTags = new ArrayList<>(); + dataTags.add(dataTag); + tagList.put(PackageDataTag.class.getSimpleName(), dataTags); + + super.setTagList(tagList); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java index 37b7fc8..e936a9c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java @@ -22,7 +22,7 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()); + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); body.put("softwareVersion", tag.getVersion()); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java index cd62d6d..d478366 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java @@ -3,11 +3,11 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.frame.BirmmBaseTag; -import com.casic.missiles.frame.tag.config.DateTimeTag; -import com.casic.missiles.frame.tag.ota.OTANeedTag; +import com.casic.missiles.frame.tag.ota.NeedOTATag; -import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; public class MethaneOnlineResponseFrame extends BirmmBaseFrame { @@ -27,12 +27,16 @@ @Override public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map tagList = new HashMap<>(); - OTANeedTag needTag = new OTANeedTag(); + Map> tagList = new HashMap<>(); + NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); - tagList.put(OTANeedTag.class.getSimpleName(), needTag); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); super.setTagList(tagList); } } 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 690b9c5..6ba27f6 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 @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; import com.casic.missiles.frame.tag.biz.CellTag; import com.casic.missiles.frame.tag.biz.DateTag; import com.casic.missiles.frame.tag.biz.SensorStateTag; @@ -39,19 +40,19 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); body.put("cell", cellTag.getCellVal()); } if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); body.put("pci", pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); body.put("rsrp", rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); body.put("snr", snrTag.getSnr()); } @@ -86,21 +87,21 @@ // 电量 if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); bizData.setCell(cellTag.getCellVal()); } // 信号质量 if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); bizData.setPci(pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); bizData.setRsrp(rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); bizData.setSnr(snrTag.getSnr()); } @@ -123,47 +124,57 @@ } private void handleUploadTag() { - UploadTag uploadTag = (UploadTag) getTagList().get(UploadTag.class.getSimpleName()); + List tags = getTagList().get(UploadTag.class.getSimpleName()); - // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 - boolean isValid = uploadTag.checkOid(); - if (isValid) { - // 找到DateTag 取出其中的日期 - DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()); - uploadTag.setStartDate(dateTag.getDate()); + bizDataList = new ArrayList<>(); - 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(); + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); - 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)); // 转成浮点数 + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + MethaneBizData bizData = new MethaneBizData(); - bizDataList.add(bizData); + 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)); // 转成浮点数 - // 加上时间间隔 - start = start.plusMinutes(uploadTag.getInterval()); + bizDataList.add(bizData); + + // 加上时间间隔 + start = start.plusMinutes(uploadTag.getInterval()); + } } } } private void handleSensorStateTag() { - SensorStateTag sensorStateTag = (SensorStateTag) getTagList().get(SensorStateTag.class.getSimpleName()); - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { - // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { - // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - // TODO-LIST - // 传感器状态异常时需要上报异常事件 + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java new file mode 100644 index 0000000..458e393 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java @@ -0,0 +1,28 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class SentinelBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + "][" + value + "][" + bizType + "]"; + } + + public JSONObject toJSON() { + JSONObject json = new JSONObject(); + json.put(BirmmDataBizTypeEnums.toType(bizType).getName(), String.format("%.3f", value)); + json.put("uptime", uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java new file mode 100644 index 0000000..bafe173 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java @@ -0,0 +1,56 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.methane.*; + +public class SentinelFrameBuilderFactory { + + public static BirmmBaseFrame createSentinelFrameByOperation(String operaType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + + case UP_TRAP_REQUEST: + return new SentinelTrapRequestFrame(); + + case UP_ONLINE_REQUEST: + return new MethaneOnlineRequestFrame(); + + case UP_SET_RESPONSE: + return new MethaneSetResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } + + public static BirmmBaseFrame createSentinelReplyFrameByOperation(String uploadOperationType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + + case UP_TRAP_REQUEST: + // TRAP_REQUEST消息回复TRAP_RESPONSE + return new SentinelTrapResponseFrame(); + + case UP_ONLINE_REQUEST: + // ONLINE_REQUEST消息回复ONLINE_RESPONSE + return new MethaneOnlineResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java new file mode 100644 index 0000000..a36d243 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -0,0 +1,180 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.biz.DateTag; +import com.casic.missiles.frame.tag.biz.SensorStateTag; +import com.casic.missiles.frame.tag.biz.UploadTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; +import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.BytesUtil; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Slf4j +public class SentinelTrapRequestFrame extends BirmmBaseFrame { + + private List bizDataList; + + private final String DEV_TYPE = "Sentinel"; + private final String MESSAGE_TYPE = "Data"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + body.put("cell", cellTag.getCellVal()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + body.put("pci", pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + body.put("rsrp", rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + body.put("snr", snrTag.getSnr()); + } + + // 业务数据 + if (bizDataList != null) { + JSONArray datas = new JSONArray(); + for (SentinelBizData bizData : bizDataList) { + datas.add(bizData.toJSON()); + } + body.put("datas", datas); + } + + json.put("mBody", body); + + return json; + } + + @Override + public boolean isBizDataFrame() { + return true; + } + + @Override + public List convertToBizDataList() { + List resultList = new ArrayList<>(); + if (bizDataList != null) { + for (SentinelBizData data : bizDataList) { + DeviceBizData bizData = new DeviceBizData(); + bizData.setBizType(String.valueOf(data.getBizType())); + bizData.setValue(String.format("%.3f", data.getValue())); + bizData.setUptime(data.getUptime()); + + // 电量 + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + bizData.setCell(cellTag.getCellVal()); + } + + // 信号质量 + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + bizData.setPci(pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + bizData.setRsrp(rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + bizData.setSnr(snrTag.getSnr()); + } + + resultList.add(bizData); + } + } + + return resultList; + } + + @Override + public void doParseBizTag() { + if (getTagList().containsKey(UploadTag.class.getSimpleName())) { + handleUploadTag(); + } + + if (getTagList().containsKey(SensorStateTag.class.getSimpleName())) { + handleSensorStateTag(); + } + } + + private void handleUploadTag() { + List tags = getTagList().get(UploadTag.class.getSimpleName()); + + bizDataList = new ArrayList<>(); + + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); + + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + SentinelBizData bizData = new SentinelBizData(); + + 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() { + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java new file mode 100644 index 0000000..2a87b3f --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java @@ -0,0 +1,20 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; + +public class SentinelTrapResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java new file mode 100644 index 0000000..8e40b85 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class NeedOTATag extends BirmmBaseTag { + + final String NEED_OTA_TAG_OID = "60000600"; + + boolean need; + + @Override + public String toString() { + return super.toString() + "[value: " + need + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength() * 2 + "x", need ? 1 : 0); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + need = Boolean.parseBoolean(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java deleted file mode 100644 index 884b44f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.frame.tag.ota; - -import com.casic.missiles.enums.BirmmTagTypeEnums; -import com.casic.missiles.frame.BirmmBaseTag; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -@Data -public class OTANeedTag extends BirmmBaseTag { - - final String OTA_NEED_TAG_OID = "60000600"; - - boolean need; - - @Override - public String toString() { - return super.toString() + "[value: " + need + "]"; - } - - @Override - public String toProtocolString() { - String result = ""; - result += BirmmTagTypeEnums.OTA_NEED_TAG.getName(); // OID - result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_TAG.getLength()); // 长度 - result += String.format("%02x", need ? 1 : 0); - - return result; - } - - @Override - public void setValueStr(String valueStr) { - super.setValueStr(valueStr); - need = Boolean.parseBoolean(valueStr); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java new file mode 100644 index 0000000..08dafcf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageCRCTag extends BirmmBaseTag { + + final String PACKAGE_CRC_TAG_OID = "60000603"; + + String packCRC; + + @Override + public String toString() { + return super.toString() + "[value: " + packCRC + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength() * 2 + "x", packCRC); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + packCRC = valueStr; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java new file mode 100644 index 0000000..f9801a2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.tomcat.util.buf.HexUtils; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageDataTag extends BirmmBaseTag { + + final String PACKAGE_DATA_TAG_OID = "60000601"; + + byte[] data; + + @Override + public String toString() { + return super.toString() + "[value: " + HexUtils.toHexString(data) + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_DATA_TAG.getName(); // OID + result += String.format("%04d", data.length); // 长度 + result += HexUtils.toHexString(data); + + return result; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java new file mode 100644 index 0000000..05ff3c1 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageSizeTag extends BirmmBaseTag { + + final String PACKAGE_SIZE_TAG_OID = "60000602"; + + int packSize; + + @Override + public String toString() { + return super.toString() + "[value: " + packSize + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength() * 2 + "x", packSize); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + packSize = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java new file mode 100644 index 0000000..bfc83dd --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java @@ -0,0 +1,37 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class RequestOffsetTag extends BirmmBaseTag { + + final String REQUEST_OFFSET_TAG_OID = "20000102"; + + // 本次请求的升级包偏移量 + int requestOffset; + + @Override + public String toString() { + return super.toString() + "[value: " + requestOffset + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength() * 2 + "x", requestOffset); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + requestOffset = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java new file mode 100644 index 0000000..6c096a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java @@ -0,0 +1,27 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class RequestSizeTag extends BirmmBaseTag { + + final String REQUEST_SIZE_TAG_OID = "20000100"; + + // 本次请求的升级包大小 + int requestSize; + + @Override + public String toString() { + return super.toString() + "[value: " + requestSize + "]"; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + requestSize = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 91c81d0..207eca2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -15,6 +15,7 @@ import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; +import javax.annotation.Resource; /** * SensorhubServer netty服务端 @@ -32,6 +33,9 @@ EventLoopGroup bossGroup = new NioEventLoopGroup(4); // boss EventLoopGroup workerGroup = new NioEventLoopGroup(32); // worker + @Resource + SensorhubServerChannelInitialHandler pipeLine; + /** * sensorhub属性参数 */ @@ -71,7 +75,7 @@ ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) // 设置EventLoopGroup .channel(NioServerSocketChannel.class) // 指明新的Channel的类型 - .childHandler(new SensorhubServerChannelInitialHandler()) // 指定ChannelHandler + .childHandler(pipeLine) // 指定ChannelHandler .option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) .childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) .option(ChannelOption.SO_BACKLOG, 1024) // 设置的ServerChannel的一些选项 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java index c3f82cc..02f1291 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java @@ -1,27 +1,38 @@ package com.casic.missiles.netty.handler; +import com.casic.missiles.parser.BirmmHexDecoder; import com.casic.missiles.parser.SensorhubDecoder; +import com.casic.missiles.parser.safe.impl.Sm4; +import com.casic.missiles.replier.CommonHexReplier; import com.casic.missiles.replier.SensorhubReplier; +import com.casic.missiles.util.SpringContextUtil; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; /** * @author cz * @date 2023-06-05 */ +@Component public class SensorhubServerChannelInitialHandler extends ChannelInitializer { - + @Resource + BirmmHexDecoder birmmHexDecoder; @Override protected void initChannel(SocketChannel socketChannel) { ChannelPipeline pipeline = socketChannel.pipeline(); pipeline.addLast(new LoggingHandler(LogLevel.INFO)); - pipeline.addLast(new SensorhubDecoder()); - pipeline.addLast(new SensorhubReplier()); +// pipeline.addLast(new SensorhubDecoder()); +// pipeline.addLast(birmmHexDecoder); + pipeline.addLast(new BirmmHexDecoder()); + pipeline.addLast(new CommonHexReplier()); // 心跳续约 // pipeline.addLast(this.heartBeatRespHandler); // pipeline.addLast(this.loginAuthRespHandler); 登录验证 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java new file mode 100644 index 0000000..6931af5 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -0,0 +1,106 @@ +package com.casic.missiles.parser; + +import cn.hutool.http.HttpUtil; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.model.DeviceFrameLog; +import com.casic.missiles.service.GeneralServiceImpl; +import com.casic.missiles.service.IDeviceBizDataService; +import com.casic.missiles.service.IDeviceFrameLogService; +import com.casic.missiles.service.IGeneralService; +import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; +import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; +import com.casic.missiles.util.SnowflakeUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author tanyue + * @date 2024-07 + * BirmmHexDecoder + */ +@Slf4j +@Component("BirmmHexDecoder") +public class BirmmHexDecoder extends ByteToMessageDecoder { + + IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); + + IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); + + IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + log.info("建立连接:{}", ctx.channel().id()); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.info("断开连接:{}", ctx.channel().id()); + } + + @Override + public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { + byte[] frameBytes = new byte[buffer.readableBytes()]; + buffer.readBytes(frameBytes); + log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + + // 工厂类创建frame对象 + BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); + if (birmmFrame != null) { + // 处理业务数据 + birmmFrame.doParseBizTag(); + + log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); + + // 保存日志 + DeviceFrameLog frameLog = new DeviceFrameLog(); + frameLog.setId(new SnowflakeUtil().nextId()); + frameLog.setDevcode(birmmFrame.getDevCode()); + frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase()); + frameLog.setRawBizFrame(birmmFrame.getRawBizFrameString()); + frameLog.setDataJson(birmmFrame.toJSON().toJSONString()); + frameLog.setLogtime(birmmFrame.getLogTime()); + frameLogService.save(frameLog); + + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + + // 保存业务数据 + if (birmmFrame.isBizDataFrame()) { + List bizDataList = birmmFrame.convertToBizDataList(); + for (DeviceBizData bizData : bizDataList) { + // 设置其他的属性 + bizData.setId(new SnowflakeUtil().nextId()); + bizData.setFrameLogId(frameLog.getId()); // 关联日志记录id + bizData.setDevcode(birmmFrame.getDevCode()); + bizData.setDeviceType(Integer.valueOf(birmmFrame.getDeviceType())); + bizData.setLogtime(birmmFrame.getLogTime()); + } + + // 批量保存 + bizDataService.saveBatch(bizDataList); + } + + // 创建回复消息 + BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + if (configFrame != null) { + // 根据协议进行封装 + String replyMessage = defaultService.replyMessage(configFrame); + log.info("下行HEX字节消息帧:{}", replyMessage); + + list.add(replyMessage); + } + } + } +} diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 70596b6..3ac4de7 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -69,7 +69,7 @@ enable: true sensorhub: config: - port: 7091 + port: 22009 bean: "functionCallback" url: "http://127.0.0.1:7093/push/test" fileUrl: D:\casic\file\ diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 8dcc497..da561cd 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -49,6 +49,12 @@ + cn.hutool + hutool-all + 5.7.16 + + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} 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 32dfdf3..140ee01 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 @@ -1,6 +1,10 @@ package com.casic.missiles.controller; +import cn.hutool.Hutool; import cn.hutool.core.lang.generator.UUIDGenerator; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.model.DeviceBizData; @@ -76,6 +80,12 @@ frameLog.setLogtime(birmmFrame.getLogTime()); frameLogService.save(frameLog); + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + // 保存业务数据 if (birmmFrame.isBizDataFrame()) { List bizDataList = birmmFrame.convertToBizDataList(); @@ -105,13 +115,15 @@ if (dataMap.containsKey("profile")) { hasProfile = (Boolean) dataMap.get("profile"); } - aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); + aepCmdService.setDeviceId((String) dataMap.get("deviceId")); aepCmdService.setProductId((String) dataMap.get("productId")); if (hasProfile) { + aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); retCode = aepCmdService.handleSendCommandWithProfile(replyMessage); } else { - retCode = aepCmdService.handleSendCommand(replyMessage); + aepCmdService.setMasterApiKey("ee2f4011f0a04f28b1572967891b57d5"); + retCode = aepCmdService.handleSendCommand(replyMessage, 2); // 2=16进制 } if (retCode == 0) { 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 f934d86..e22284a 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 @@ -48,7 +48,7 @@ // 业务字段List String tagListString; - Map tagList; + Map> tagList; // CRC String crc; @@ -83,7 +83,9 @@ DateTimeTag dateTimeTag = new DateTimeTag(); dateTimeTag.setDateTime(LocalDateTime.now()); - tagList.put(DateTimeTag.class.getSimpleName(), dateTimeTag); + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); } } 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 ef031b8..772092d 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 @@ -2,6 +2,7 @@ import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; +import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; public class BirmmFrameBuilderFactory { @@ -12,6 +13,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); + case WELL: return null; @@ -31,6 +35,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); + case WELL: return null; 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 index 71023ee..3617ae7 100644 --- 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 @@ -9,6 +9,9 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + case UP_TRAP_REQUEST: return new MethaneTrapRequestFrame(); @@ -30,6 +33,10 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE return new MethaneTrapResponseFrame(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java new file mode 100644 index 0000000..a1fd8bc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java @@ -0,0 +1,43 @@ +package com.casic.missiles.frame.methane; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; +import com.casic.missiles.frame.tag.ota.RequestSizeTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; + +import java.time.format.DateTimeFormatter; + +public class MethaneGetRequestFrame extends BirmmBaseFrame { + + private final String DEV_TYPE = "Methane"; + private final String MESSAGE_TYPE = "GetRequest"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); + body.put("reqSize", tag.getRequestSize()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); + body.put("reqOffset", tag.getRequestOffset()); + } + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java new file mode 100644 index 0000000..5f49fe7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.ota.PackageDataTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MethaneGetResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.UP_GET_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } + + @Override + public void replyBizTag() { + // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) + // TODO-LIST + + Map> tagList = new HashMap<>(); + + RequestOffsetTag offsetTag = new RequestOffsetTag(); + offsetTag.setRequestOffset(0); + List offsetTags = new ArrayList<>(); + offsetTags.add(offsetTag); + tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); + + PackageDataTag dataTag = new PackageDataTag(); + dataTag.setData(new byte[] {0}); + List dataTags = new ArrayList<>(); + dataTags.add(dataTag); + tagList.put(PackageDataTag.class.getSimpleName(), dataTags); + + super.setTagList(tagList); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java index 37b7fc8..e936a9c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java @@ -22,7 +22,7 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()); + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); body.put("softwareVersion", tag.getVersion()); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java index cd62d6d..d478366 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java @@ -3,11 +3,11 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.frame.BirmmBaseTag; -import com.casic.missiles.frame.tag.config.DateTimeTag; -import com.casic.missiles.frame.tag.ota.OTANeedTag; +import com.casic.missiles.frame.tag.ota.NeedOTATag; -import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; public class MethaneOnlineResponseFrame extends BirmmBaseFrame { @@ -27,12 +27,16 @@ @Override public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map tagList = new HashMap<>(); - OTANeedTag needTag = new OTANeedTag(); + Map> tagList = new HashMap<>(); + NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); - tagList.put(OTANeedTag.class.getSimpleName(), needTag); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); super.setTagList(tagList); } } 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 690b9c5..6ba27f6 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 @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; import com.casic.missiles.frame.tag.biz.CellTag; import com.casic.missiles.frame.tag.biz.DateTag; import com.casic.missiles.frame.tag.biz.SensorStateTag; @@ -39,19 +40,19 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); body.put("cell", cellTag.getCellVal()); } if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); body.put("pci", pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); body.put("rsrp", rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); body.put("snr", snrTag.getSnr()); } @@ -86,21 +87,21 @@ // 电量 if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); bizData.setCell(cellTag.getCellVal()); } // 信号质量 if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); bizData.setPci(pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); bizData.setRsrp(rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); bizData.setSnr(snrTag.getSnr()); } @@ -123,47 +124,57 @@ } private void handleUploadTag() { - UploadTag uploadTag = (UploadTag) getTagList().get(UploadTag.class.getSimpleName()); + List tags = getTagList().get(UploadTag.class.getSimpleName()); - // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 - boolean isValid = uploadTag.checkOid(); - if (isValid) { - // 找到DateTag 取出其中的日期 - DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()); - uploadTag.setStartDate(dateTag.getDate()); + bizDataList = new ArrayList<>(); - 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(); + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); - 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)); // 转成浮点数 + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + MethaneBizData bizData = new MethaneBizData(); - bizDataList.add(bizData); + 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)); // 转成浮点数 - // 加上时间间隔 - start = start.plusMinutes(uploadTag.getInterval()); + bizDataList.add(bizData); + + // 加上时间间隔 + start = start.plusMinutes(uploadTag.getInterval()); + } } } } private void handleSensorStateTag() { - SensorStateTag sensorStateTag = (SensorStateTag) getTagList().get(SensorStateTag.class.getSimpleName()); - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { - // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { - // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - // TODO-LIST - // 传感器状态异常时需要上报异常事件 + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java new file mode 100644 index 0000000..458e393 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java @@ -0,0 +1,28 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class SentinelBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + "][" + value + "][" + bizType + "]"; + } + + public JSONObject toJSON() { + JSONObject json = new JSONObject(); + json.put(BirmmDataBizTypeEnums.toType(bizType).getName(), String.format("%.3f", value)); + json.put("uptime", uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java new file mode 100644 index 0000000..bafe173 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java @@ -0,0 +1,56 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.methane.*; + +public class SentinelFrameBuilderFactory { + + public static BirmmBaseFrame createSentinelFrameByOperation(String operaType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + + case UP_TRAP_REQUEST: + return new SentinelTrapRequestFrame(); + + case UP_ONLINE_REQUEST: + return new MethaneOnlineRequestFrame(); + + case UP_SET_RESPONSE: + return new MethaneSetResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } + + public static BirmmBaseFrame createSentinelReplyFrameByOperation(String uploadOperationType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + + case UP_TRAP_REQUEST: + // TRAP_REQUEST消息回复TRAP_RESPONSE + return new SentinelTrapResponseFrame(); + + case UP_ONLINE_REQUEST: + // ONLINE_REQUEST消息回复ONLINE_RESPONSE + return new MethaneOnlineResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java new file mode 100644 index 0000000..a36d243 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -0,0 +1,180 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.biz.DateTag; +import com.casic.missiles.frame.tag.biz.SensorStateTag; +import com.casic.missiles.frame.tag.biz.UploadTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; +import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.BytesUtil; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Slf4j +public class SentinelTrapRequestFrame extends BirmmBaseFrame { + + private List bizDataList; + + private final String DEV_TYPE = "Sentinel"; + private final String MESSAGE_TYPE = "Data"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + body.put("cell", cellTag.getCellVal()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + body.put("pci", pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + body.put("rsrp", rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + body.put("snr", snrTag.getSnr()); + } + + // 业务数据 + if (bizDataList != null) { + JSONArray datas = new JSONArray(); + for (SentinelBizData bizData : bizDataList) { + datas.add(bizData.toJSON()); + } + body.put("datas", datas); + } + + json.put("mBody", body); + + return json; + } + + @Override + public boolean isBizDataFrame() { + return true; + } + + @Override + public List convertToBizDataList() { + List resultList = new ArrayList<>(); + if (bizDataList != null) { + for (SentinelBizData data : bizDataList) { + DeviceBizData bizData = new DeviceBizData(); + bizData.setBizType(String.valueOf(data.getBizType())); + bizData.setValue(String.format("%.3f", data.getValue())); + bizData.setUptime(data.getUptime()); + + // 电量 + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + bizData.setCell(cellTag.getCellVal()); + } + + // 信号质量 + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + bizData.setPci(pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + bizData.setRsrp(rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + bizData.setSnr(snrTag.getSnr()); + } + + resultList.add(bizData); + } + } + + return resultList; + } + + @Override + public void doParseBizTag() { + if (getTagList().containsKey(UploadTag.class.getSimpleName())) { + handleUploadTag(); + } + + if (getTagList().containsKey(SensorStateTag.class.getSimpleName())) { + handleSensorStateTag(); + } + } + + private void handleUploadTag() { + List tags = getTagList().get(UploadTag.class.getSimpleName()); + + bizDataList = new ArrayList<>(); + + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); + + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + SentinelBizData bizData = new SentinelBizData(); + + 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() { + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java new file mode 100644 index 0000000..2a87b3f --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java @@ -0,0 +1,20 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; + +public class SentinelTrapResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java new file mode 100644 index 0000000..8e40b85 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class NeedOTATag extends BirmmBaseTag { + + final String NEED_OTA_TAG_OID = "60000600"; + + boolean need; + + @Override + public String toString() { + return super.toString() + "[value: " + need + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength() * 2 + "x", need ? 1 : 0); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + need = Boolean.parseBoolean(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java deleted file mode 100644 index 884b44f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.frame.tag.ota; - -import com.casic.missiles.enums.BirmmTagTypeEnums; -import com.casic.missiles.frame.BirmmBaseTag; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -@Data -public class OTANeedTag extends BirmmBaseTag { - - final String OTA_NEED_TAG_OID = "60000600"; - - boolean need; - - @Override - public String toString() { - return super.toString() + "[value: " + need + "]"; - } - - @Override - public String toProtocolString() { - String result = ""; - result += BirmmTagTypeEnums.OTA_NEED_TAG.getName(); // OID - result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_TAG.getLength()); // 长度 - result += String.format("%02x", need ? 1 : 0); - - return result; - } - - @Override - public void setValueStr(String valueStr) { - super.setValueStr(valueStr); - need = Boolean.parseBoolean(valueStr); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java new file mode 100644 index 0000000..08dafcf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageCRCTag extends BirmmBaseTag { + + final String PACKAGE_CRC_TAG_OID = "60000603"; + + String packCRC; + + @Override + public String toString() { + return super.toString() + "[value: " + packCRC + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength() * 2 + "x", packCRC); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + packCRC = valueStr; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java new file mode 100644 index 0000000..f9801a2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.tomcat.util.buf.HexUtils; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageDataTag extends BirmmBaseTag { + + final String PACKAGE_DATA_TAG_OID = "60000601"; + + byte[] data; + + @Override + public String toString() { + return super.toString() + "[value: " + HexUtils.toHexString(data) + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_DATA_TAG.getName(); // OID + result += String.format("%04d", data.length); // 长度 + result += HexUtils.toHexString(data); + + return result; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java new file mode 100644 index 0000000..05ff3c1 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageSizeTag extends BirmmBaseTag { + + final String PACKAGE_SIZE_TAG_OID = "60000602"; + + int packSize; + + @Override + public String toString() { + return super.toString() + "[value: " + packSize + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength() * 2 + "x", packSize); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + packSize = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java new file mode 100644 index 0000000..bfc83dd --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java @@ -0,0 +1,37 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class RequestOffsetTag extends BirmmBaseTag { + + final String REQUEST_OFFSET_TAG_OID = "20000102"; + + // 本次请求的升级包偏移量 + int requestOffset; + + @Override + public String toString() { + return super.toString() + "[value: " + requestOffset + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength() * 2 + "x", requestOffset); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + requestOffset = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java new file mode 100644 index 0000000..6c096a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java @@ -0,0 +1,27 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class RequestSizeTag extends BirmmBaseTag { + + final String REQUEST_SIZE_TAG_OID = "20000100"; + + // 本次请求的升级包大小 + int requestSize; + + @Override + public String toString() { + return super.toString() + "[value: " + requestSize + "]"; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + requestSize = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 91c81d0..207eca2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -15,6 +15,7 @@ import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; +import javax.annotation.Resource; /** * SensorhubServer netty服务端 @@ -32,6 +33,9 @@ EventLoopGroup bossGroup = new NioEventLoopGroup(4); // boss EventLoopGroup workerGroup = new NioEventLoopGroup(32); // worker + @Resource + SensorhubServerChannelInitialHandler pipeLine; + /** * sensorhub属性参数 */ @@ -71,7 +75,7 @@ ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) // 设置EventLoopGroup .channel(NioServerSocketChannel.class) // 指明新的Channel的类型 - .childHandler(new SensorhubServerChannelInitialHandler()) // 指定ChannelHandler + .childHandler(pipeLine) // 指定ChannelHandler .option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) .childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) .option(ChannelOption.SO_BACKLOG, 1024) // 设置的ServerChannel的一些选项 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java index c3f82cc..02f1291 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java @@ -1,27 +1,38 @@ package com.casic.missiles.netty.handler; +import com.casic.missiles.parser.BirmmHexDecoder; import com.casic.missiles.parser.SensorhubDecoder; +import com.casic.missiles.parser.safe.impl.Sm4; +import com.casic.missiles.replier.CommonHexReplier; import com.casic.missiles.replier.SensorhubReplier; +import com.casic.missiles.util.SpringContextUtil; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; /** * @author cz * @date 2023-06-05 */ +@Component public class SensorhubServerChannelInitialHandler extends ChannelInitializer { - + @Resource + BirmmHexDecoder birmmHexDecoder; @Override protected void initChannel(SocketChannel socketChannel) { ChannelPipeline pipeline = socketChannel.pipeline(); pipeline.addLast(new LoggingHandler(LogLevel.INFO)); - pipeline.addLast(new SensorhubDecoder()); - pipeline.addLast(new SensorhubReplier()); +// pipeline.addLast(new SensorhubDecoder()); +// pipeline.addLast(birmmHexDecoder); + pipeline.addLast(new BirmmHexDecoder()); + pipeline.addLast(new CommonHexReplier()); // 心跳续约 // pipeline.addLast(this.heartBeatRespHandler); // pipeline.addLast(this.loginAuthRespHandler); 登录验证 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java new file mode 100644 index 0000000..6931af5 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -0,0 +1,106 @@ +package com.casic.missiles.parser; + +import cn.hutool.http.HttpUtil; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.model.DeviceFrameLog; +import com.casic.missiles.service.GeneralServiceImpl; +import com.casic.missiles.service.IDeviceBizDataService; +import com.casic.missiles.service.IDeviceFrameLogService; +import com.casic.missiles.service.IGeneralService; +import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; +import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; +import com.casic.missiles.util.SnowflakeUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author tanyue + * @date 2024-07 + * BirmmHexDecoder + */ +@Slf4j +@Component("BirmmHexDecoder") +public class BirmmHexDecoder extends ByteToMessageDecoder { + + IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); + + IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); + + IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + log.info("建立连接:{}", ctx.channel().id()); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.info("断开连接:{}", ctx.channel().id()); + } + + @Override + public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { + byte[] frameBytes = new byte[buffer.readableBytes()]; + buffer.readBytes(frameBytes); + log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + + // 工厂类创建frame对象 + BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); + if (birmmFrame != null) { + // 处理业务数据 + birmmFrame.doParseBizTag(); + + log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); + + // 保存日志 + DeviceFrameLog frameLog = new DeviceFrameLog(); + frameLog.setId(new SnowflakeUtil().nextId()); + frameLog.setDevcode(birmmFrame.getDevCode()); + frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase()); + frameLog.setRawBizFrame(birmmFrame.getRawBizFrameString()); + frameLog.setDataJson(birmmFrame.toJSON().toJSONString()); + frameLog.setLogtime(birmmFrame.getLogTime()); + frameLogService.save(frameLog); + + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + + // 保存业务数据 + if (birmmFrame.isBizDataFrame()) { + List bizDataList = birmmFrame.convertToBizDataList(); + for (DeviceBizData bizData : bizDataList) { + // 设置其他的属性 + bizData.setId(new SnowflakeUtil().nextId()); + bizData.setFrameLogId(frameLog.getId()); // 关联日志记录id + bizData.setDevcode(birmmFrame.getDevCode()); + bizData.setDeviceType(Integer.valueOf(birmmFrame.getDeviceType())); + bizData.setLogtime(birmmFrame.getLogTime()); + } + + // 批量保存 + bizDataService.saveBatch(bizDataList); + } + + // 创建回复消息 + BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + if (configFrame != null) { + // 根据协议进行封装 + String replyMessage = defaultService.replyMessage(configFrame); + log.info("下行HEX字节消息帧:{}", replyMessage); + + list.add(replyMessage); + } + } + } +} 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 2f90c5f..c79095b 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 @@ -36,9 +36,9 @@ String getSequence(byte[] frameBytes); String getTagListString(byte[] frameBytes); - Map getTagList(byte[] tagBytes); + Map> getTagList(byte[] tagBytes); - String buildTagListStr(Map tagList); + String buildTagListStr(Map> tagList); String getCRC(byte[] frameBytes); String getToBeVerifiedCRCBytes(byte[] frameBytes); diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 70596b6..3ac4de7 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -69,7 +69,7 @@ enable: true sensorhub: config: - port: 7091 + port: 22009 bean: "functionCallback" url: "http://127.0.0.1:7093/push/test" fileUrl: D:\casic\file\ diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 8dcc497..da561cd 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -49,6 +49,12 @@ + cn.hutool + hutool-all + 5.7.16 + + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} 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 32dfdf3..140ee01 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 @@ -1,6 +1,10 @@ package com.casic.missiles.controller; +import cn.hutool.Hutool; import cn.hutool.core.lang.generator.UUIDGenerator; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.model.DeviceBizData; @@ -76,6 +80,12 @@ frameLog.setLogtime(birmmFrame.getLogTime()); frameLogService.save(frameLog); + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + // 保存业务数据 if (birmmFrame.isBizDataFrame()) { List bizDataList = birmmFrame.convertToBizDataList(); @@ -105,13 +115,15 @@ if (dataMap.containsKey("profile")) { hasProfile = (Boolean) dataMap.get("profile"); } - aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); + aepCmdService.setDeviceId((String) dataMap.get("deviceId")); aepCmdService.setProductId((String) dataMap.get("productId")); if (hasProfile) { + aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); retCode = aepCmdService.handleSendCommandWithProfile(replyMessage); } else { - retCode = aepCmdService.handleSendCommand(replyMessage); + aepCmdService.setMasterApiKey("ee2f4011f0a04f28b1572967891b57d5"); + retCode = aepCmdService.handleSendCommand(replyMessage, 2); // 2=16进制 } if (retCode == 0) { 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 f934d86..e22284a 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 @@ -48,7 +48,7 @@ // 业务字段List String tagListString; - Map tagList; + Map> tagList; // CRC String crc; @@ -83,7 +83,9 @@ DateTimeTag dateTimeTag = new DateTimeTag(); dateTimeTag.setDateTime(LocalDateTime.now()); - tagList.put(DateTimeTag.class.getSimpleName(), dateTimeTag); + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); } } 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 ef031b8..772092d 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 @@ -2,6 +2,7 @@ import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; +import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; public class BirmmFrameBuilderFactory { @@ -12,6 +13,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); + case WELL: return null; @@ -31,6 +35,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); + case WELL: return null; 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 index 71023ee..3617ae7 100644 --- 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 @@ -9,6 +9,9 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + case UP_TRAP_REQUEST: return new MethaneTrapRequestFrame(); @@ -30,6 +33,10 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE return new MethaneTrapResponseFrame(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java new file mode 100644 index 0000000..a1fd8bc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java @@ -0,0 +1,43 @@ +package com.casic.missiles.frame.methane; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; +import com.casic.missiles.frame.tag.ota.RequestSizeTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; + +import java.time.format.DateTimeFormatter; + +public class MethaneGetRequestFrame extends BirmmBaseFrame { + + private final String DEV_TYPE = "Methane"; + private final String MESSAGE_TYPE = "GetRequest"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); + body.put("reqSize", tag.getRequestSize()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); + body.put("reqOffset", tag.getRequestOffset()); + } + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java new file mode 100644 index 0000000..5f49fe7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.ota.PackageDataTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MethaneGetResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.UP_GET_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } + + @Override + public void replyBizTag() { + // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) + // TODO-LIST + + Map> tagList = new HashMap<>(); + + RequestOffsetTag offsetTag = new RequestOffsetTag(); + offsetTag.setRequestOffset(0); + List offsetTags = new ArrayList<>(); + offsetTags.add(offsetTag); + tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); + + PackageDataTag dataTag = new PackageDataTag(); + dataTag.setData(new byte[] {0}); + List dataTags = new ArrayList<>(); + dataTags.add(dataTag); + tagList.put(PackageDataTag.class.getSimpleName(), dataTags); + + super.setTagList(tagList); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java index 37b7fc8..e936a9c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java @@ -22,7 +22,7 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()); + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); body.put("softwareVersion", tag.getVersion()); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java index cd62d6d..d478366 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java @@ -3,11 +3,11 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.frame.BirmmBaseTag; -import com.casic.missiles.frame.tag.config.DateTimeTag; -import com.casic.missiles.frame.tag.ota.OTANeedTag; +import com.casic.missiles.frame.tag.ota.NeedOTATag; -import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; public class MethaneOnlineResponseFrame extends BirmmBaseFrame { @@ -27,12 +27,16 @@ @Override public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map tagList = new HashMap<>(); - OTANeedTag needTag = new OTANeedTag(); + Map> tagList = new HashMap<>(); + NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); - tagList.put(OTANeedTag.class.getSimpleName(), needTag); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); super.setTagList(tagList); } } 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 690b9c5..6ba27f6 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 @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; import com.casic.missiles.frame.tag.biz.CellTag; import com.casic.missiles.frame.tag.biz.DateTag; import com.casic.missiles.frame.tag.biz.SensorStateTag; @@ -39,19 +40,19 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); body.put("cell", cellTag.getCellVal()); } if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); body.put("pci", pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); body.put("rsrp", rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); body.put("snr", snrTag.getSnr()); } @@ -86,21 +87,21 @@ // 电量 if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); bizData.setCell(cellTag.getCellVal()); } // 信号质量 if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); bizData.setPci(pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); bizData.setRsrp(rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); bizData.setSnr(snrTag.getSnr()); } @@ -123,47 +124,57 @@ } private void handleUploadTag() { - UploadTag uploadTag = (UploadTag) getTagList().get(UploadTag.class.getSimpleName()); + List tags = getTagList().get(UploadTag.class.getSimpleName()); - // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 - boolean isValid = uploadTag.checkOid(); - if (isValid) { - // 找到DateTag 取出其中的日期 - DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()); - uploadTag.setStartDate(dateTag.getDate()); + bizDataList = new ArrayList<>(); - 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(); + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); - 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)); // 转成浮点数 + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + MethaneBizData bizData = new MethaneBizData(); - bizDataList.add(bizData); + 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)); // 转成浮点数 - // 加上时间间隔 - start = start.plusMinutes(uploadTag.getInterval()); + bizDataList.add(bizData); + + // 加上时间间隔 + start = start.plusMinutes(uploadTag.getInterval()); + } } } } private void handleSensorStateTag() { - SensorStateTag sensorStateTag = (SensorStateTag) getTagList().get(SensorStateTag.class.getSimpleName()); - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { - // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { - // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - // TODO-LIST - // 传感器状态异常时需要上报异常事件 + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java new file mode 100644 index 0000000..458e393 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java @@ -0,0 +1,28 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class SentinelBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + "][" + value + "][" + bizType + "]"; + } + + public JSONObject toJSON() { + JSONObject json = new JSONObject(); + json.put(BirmmDataBizTypeEnums.toType(bizType).getName(), String.format("%.3f", value)); + json.put("uptime", uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java new file mode 100644 index 0000000..bafe173 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java @@ -0,0 +1,56 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.methane.*; + +public class SentinelFrameBuilderFactory { + + public static BirmmBaseFrame createSentinelFrameByOperation(String operaType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + + case UP_TRAP_REQUEST: + return new SentinelTrapRequestFrame(); + + case UP_ONLINE_REQUEST: + return new MethaneOnlineRequestFrame(); + + case UP_SET_RESPONSE: + return new MethaneSetResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } + + public static BirmmBaseFrame createSentinelReplyFrameByOperation(String uploadOperationType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + + case UP_TRAP_REQUEST: + // TRAP_REQUEST消息回复TRAP_RESPONSE + return new SentinelTrapResponseFrame(); + + case UP_ONLINE_REQUEST: + // ONLINE_REQUEST消息回复ONLINE_RESPONSE + return new MethaneOnlineResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java new file mode 100644 index 0000000..a36d243 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -0,0 +1,180 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.biz.DateTag; +import com.casic.missiles.frame.tag.biz.SensorStateTag; +import com.casic.missiles.frame.tag.biz.UploadTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; +import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.BytesUtil; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Slf4j +public class SentinelTrapRequestFrame extends BirmmBaseFrame { + + private List bizDataList; + + private final String DEV_TYPE = "Sentinel"; + private final String MESSAGE_TYPE = "Data"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + body.put("cell", cellTag.getCellVal()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + body.put("pci", pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + body.put("rsrp", rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + body.put("snr", snrTag.getSnr()); + } + + // 业务数据 + if (bizDataList != null) { + JSONArray datas = new JSONArray(); + for (SentinelBizData bizData : bizDataList) { + datas.add(bizData.toJSON()); + } + body.put("datas", datas); + } + + json.put("mBody", body); + + return json; + } + + @Override + public boolean isBizDataFrame() { + return true; + } + + @Override + public List convertToBizDataList() { + List resultList = new ArrayList<>(); + if (bizDataList != null) { + for (SentinelBizData data : bizDataList) { + DeviceBizData bizData = new DeviceBizData(); + bizData.setBizType(String.valueOf(data.getBizType())); + bizData.setValue(String.format("%.3f", data.getValue())); + bizData.setUptime(data.getUptime()); + + // 电量 + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + bizData.setCell(cellTag.getCellVal()); + } + + // 信号质量 + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + bizData.setPci(pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + bizData.setRsrp(rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + bizData.setSnr(snrTag.getSnr()); + } + + resultList.add(bizData); + } + } + + return resultList; + } + + @Override + public void doParseBizTag() { + if (getTagList().containsKey(UploadTag.class.getSimpleName())) { + handleUploadTag(); + } + + if (getTagList().containsKey(SensorStateTag.class.getSimpleName())) { + handleSensorStateTag(); + } + } + + private void handleUploadTag() { + List tags = getTagList().get(UploadTag.class.getSimpleName()); + + bizDataList = new ArrayList<>(); + + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); + + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + SentinelBizData bizData = new SentinelBizData(); + + 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() { + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java new file mode 100644 index 0000000..2a87b3f --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java @@ -0,0 +1,20 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; + +public class SentinelTrapResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java new file mode 100644 index 0000000..8e40b85 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class NeedOTATag extends BirmmBaseTag { + + final String NEED_OTA_TAG_OID = "60000600"; + + boolean need; + + @Override + public String toString() { + return super.toString() + "[value: " + need + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength() * 2 + "x", need ? 1 : 0); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + need = Boolean.parseBoolean(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java deleted file mode 100644 index 884b44f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.frame.tag.ota; - -import com.casic.missiles.enums.BirmmTagTypeEnums; -import com.casic.missiles.frame.BirmmBaseTag; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -@Data -public class OTANeedTag extends BirmmBaseTag { - - final String OTA_NEED_TAG_OID = "60000600"; - - boolean need; - - @Override - public String toString() { - return super.toString() + "[value: " + need + "]"; - } - - @Override - public String toProtocolString() { - String result = ""; - result += BirmmTagTypeEnums.OTA_NEED_TAG.getName(); // OID - result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_TAG.getLength()); // 长度 - result += String.format("%02x", need ? 1 : 0); - - return result; - } - - @Override - public void setValueStr(String valueStr) { - super.setValueStr(valueStr); - need = Boolean.parseBoolean(valueStr); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java new file mode 100644 index 0000000..08dafcf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageCRCTag extends BirmmBaseTag { + + final String PACKAGE_CRC_TAG_OID = "60000603"; + + String packCRC; + + @Override + public String toString() { + return super.toString() + "[value: " + packCRC + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength() * 2 + "x", packCRC); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + packCRC = valueStr; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java new file mode 100644 index 0000000..f9801a2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.tomcat.util.buf.HexUtils; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageDataTag extends BirmmBaseTag { + + final String PACKAGE_DATA_TAG_OID = "60000601"; + + byte[] data; + + @Override + public String toString() { + return super.toString() + "[value: " + HexUtils.toHexString(data) + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_DATA_TAG.getName(); // OID + result += String.format("%04d", data.length); // 长度 + result += HexUtils.toHexString(data); + + return result; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java new file mode 100644 index 0000000..05ff3c1 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageSizeTag extends BirmmBaseTag { + + final String PACKAGE_SIZE_TAG_OID = "60000602"; + + int packSize; + + @Override + public String toString() { + return super.toString() + "[value: " + packSize + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength() * 2 + "x", packSize); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + packSize = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java new file mode 100644 index 0000000..bfc83dd --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java @@ -0,0 +1,37 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class RequestOffsetTag extends BirmmBaseTag { + + final String REQUEST_OFFSET_TAG_OID = "20000102"; + + // 本次请求的升级包偏移量 + int requestOffset; + + @Override + public String toString() { + return super.toString() + "[value: " + requestOffset + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength() * 2 + "x", requestOffset); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + requestOffset = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java new file mode 100644 index 0000000..6c096a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java @@ -0,0 +1,27 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class RequestSizeTag extends BirmmBaseTag { + + final String REQUEST_SIZE_TAG_OID = "20000100"; + + // 本次请求的升级包大小 + int requestSize; + + @Override + public String toString() { + return super.toString() + "[value: " + requestSize + "]"; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + requestSize = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 91c81d0..207eca2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -15,6 +15,7 @@ import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; +import javax.annotation.Resource; /** * SensorhubServer netty服务端 @@ -32,6 +33,9 @@ EventLoopGroup bossGroup = new NioEventLoopGroup(4); // boss EventLoopGroup workerGroup = new NioEventLoopGroup(32); // worker + @Resource + SensorhubServerChannelInitialHandler pipeLine; + /** * sensorhub属性参数 */ @@ -71,7 +75,7 @@ ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) // 设置EventLoopGroup .channel(NioServerSocketChannel.class) // 指明新的Channel的类型 - .childHandler(new SensorhubServerChannelInitialHandler()) // 指定ChannelHandler + .childHandler(pipeLine) // 指定ChannelHandler .option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) .childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) .option(ChannelOption.SO_BACKLOG, 1024) // 设置的ServerChannel的一些选项 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java index c3f82cc..02f1291 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java @@ -1,27 +1,38 @@ package com.casic.missiles.netty.handler; +import com.casic.missiles.parser.BirmmHexDecoder; import com.casic.missiles.parser.SensorhubDecoder; +import com.casic.missiles.parser.safe.impl.Sm4; +import com.casic.missiles.replier.CommonHexReplier; import com.casic.missiles.replier.SensorhubReplier; +import com.casic.missiles.util.SpringContextUtil; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; /** * @author cz * @date 2023-06-05 */ +@Component public class SensorhubServerChannelInitialHandler extends ChannelInitializer { - + @Resource + BirmmHexDecoder birmmHexDecoder; @Override protected void initChannel(SocketChannel socketChannel) { ChannelPipeline pipeline = socketChannel.pipeline(); pipeline.addLast(new LoggingHandler(LogLevel.INFO)); - pipeline.addLast(new SensorhubDecoder()); - pipeline.addLast(new SensorhubReplier()); +// pipeline.addLast(new SensorhubDecoder()); +// pipeline.addLast(birmmHexDecoder); + pipeline.addLast(new BirmmHexDecoder()); + pipeline.addLast(new CommonHexReplier()); // 心跳续约 // pipeline.addLast(this.heartBeatRespHandler); // pipeline.addLast(this.loginAuthRespHandler); 登录验证 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java new file mode 100644 index 0000000..6931af5 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -0,0 +1,106 @@ +package com.casic.missiles.parser; + +import cn.hutool.http.HttpUtil; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.model.DeviceFrameLog; +import com.casic.missiles.service.GeneralServiceImpl; +import com.casic.missiles.service.IDeviceBizDataService; +import com.casic.missiles.service.IDeviceFrameLogService; +import com.casic.missiles.service.IGeneralService; +import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; +import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; +import com.casic.missiles.util.SnowflakeUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author tanyue + * @date 2024-07 + * BirmmHexDecoder + */ +@Slf4j +@Component("BirmmHexDecoder") +public class BirmmHexDecoder extends ByteToMessageDecoder { + + IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); + + IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); + + IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + log.info("建立连接:{}", ctx.channel().id()); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.info("断开连接:{}", ctx.channel().id()); + } + + @Override + public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { + byte[] frameBytes = new byte[buffer.readableBytes()]; + buffer.readBytes(frameBytes); + log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + + // 工厂类创建frame对象 + BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); + if (birmmFrame != null) { + // 处理业务数据 + birmmFrame.doParseBizTag(); + + log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); + + // 保存日志 + DeviceFrameLog frameLog = new DeviceFrameLog(); + frameLog.setId(new SnowflakeUtil().nextId()); + frameLog.setDevcode(birmmFrame.getDevCode()); + frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase()); + frameLog.setRawBizFrame(birmmFrame.getRawBizFrameString()); + frameLog.setDataJson(birmmFrame.toJSON().toJSONString()); + frameLog.setLogtime(birmmFrame.getLogTime()); + frameLogService.save(frameLog); + + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + + // 保存业务数据 + if (birmmFrame.isBizDataFrame()) { + List bizDataList = birmmFrame.convertToBizDataList(); + for (DeviceBizData bizData : bizDataList) { + // 设置其他的属性 + bizData.setId(new SnowflakeUtil().nextId()); + bizData.setFrameLogId(frameLog.getId()); // 关联日志记录id + bizData.setDevcode(birmmFrame.getDevCode()); + bizData.setDeviceType(Integer.valueOf(birmmFrame.getDeviceType())); + bizData.setLogtime(birmmFrame.getLogTime()); + } + + // 批量保存 + bizDataService.saveBatch(bizDataList); + } + + // 创建回复消息 + BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + if (configFrame != null) { + // 根据协议进行封装 + String replyMessage = defaultService.replyMessage(configFrame); + log.info("下行HEX字节消息帧:{}", replyMessage); + + list.add(replyMessage); + } + } + } +} 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 2f90c5f..c79095b 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 @@ -36,9 +36,9 @@ String getSequence(byte[] frameBytes); String getTagListString(byte[] frameBytes); - Map getTagList(byte[] tagBytes); + Map> getTagList(byte[] tagBytes); - String buildTagListStr(Map tagList); + String buildTagListStr(Map> tagList); 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 8f0bd17..bda0040 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 @@ -1,6 +1,7 @@ package com.casic.missiles.parser.impl; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.frame.BirmmBaseTag; import com.casic.missiles.frame.BirmmTagBuilderFactory; import com.casic.missiles.parser.BirmmProtocolParser; @@ -10,7 +11,9 @@ import org.apache.tomcat.util.buf.HexUtils; import org.springframework.stereotype.Component; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; @Component @@ -129,12 +132,12 @@ } @Override - public Map getTagList(byte[] tagBytes) { + public Map> getTagList(byte[] tagBytes) { // 必须包含OID和长度 4 + 2 if (tagBytes.length < 6) { return null; } - Map tagList = new HashMap<>(); + Map> tagList = new HashMap<>(); int idx = 0; while (idx + 6 < tagBytes.length) { String oid = BytesUtil.extractHexString(tagBytes, idx, 4); @@ -149,7 +152,15 @@ log.debug("解析Tag:{}", tagBase); - tagList.put(tagBase.getClass().getSimpleName(), tagBase); + // 一包可能还有多个UploadTag 使用List + if (tagList.containsKey(tagBase.getClass().getSimpleName())) { + tagList.get(tagBase.getClass().getSimpleName()).add(tagBase); + } else { + List tags = new ArrayList<>(); + tags.add(tagBase); + tagList.put(tagBase.getClass().getSimpleName(), tags); + } + } } idx += tagLen; @@ -159,11 +170,13 @@ } @Override - public String buildTagListStr(Map tagList) { + public String buildTagListStr(Map> tagList) { StringBuilder result = new StringBuilder(); - for (BirmmBaseTag tag : tagList.values()) { - result.append(tag.toProtocolString()); + for (List tags : tagList.values()) { + for (BirmmBaseTag tag : tags) { + result.append(tag.toProtocolString()); + } } return result.toString().toUpperCase(); diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 70596b6..3ac4de7 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -69,7 +69,7 @@ enable: true sensorhub: config: - port: 7091 + port: 22009 bean: "functionCallback" url: "http://127.0.0.1:7093/push/test" fileUrl: D:\casic\file\ diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 8dcc497..da561cd 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -49,6 +49,12 @@ + cn.hutool + hutool-all + 5.7.16 + + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} 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 32dfdf3..140ee01 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 @@ -1,6 +1,10 @@ package com.casic.missiles.controller; +import cn.hutool.Hutool; import cn.hutool.core.lang.generator.UUIDGenerator; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.model.DeviceBizData; @@ -76,6 +80,12 @@ frameLog.setLogtime(birmmFrame.getLogTime()); frameLogService.save(frameLog); + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + // 保存业务数据 if (birmmFrame.isBizDataFrame()) { List bizDataList = birmmFrame.convertToBizDataList(); @@ -105,13 +115,15 @@ if (dataMap.containsKey("profile")) { hasProfile = (Boolean) dataMap.get("profile"); } - aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); + aepCmdService.setDeviceId((String) dataMap.get("deviceId")); aepCmdService.setProductId((String) dataMap.get("productId")); if (hasProfile) { + aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); retCode = aepCmdService.handleSendCommandWithProfile(replyMessage); } else { - retCode = aepCmdService.handleSendCommand(replyMessage); + aepCmdService.setMasterApiKey("ee2f4011f0a04f28b1572967891b57d5"); + retCode = aepCmdService.handleSendCommand(replyMessage, 2); // 2=16进制 } if (retCode == 0) { 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 f934d86..e22284a 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 @@ -48,7 +48,7 @@ // 业务字段List String tagListString; - Map tagList; + Map> tagList; // CRC String crc; @@ -83,7 +83,9 @@ DateTimeTag dateTimeTag = new DateTimeTag(); dateTimeTag.setDateTime(LocalDateTime.now()); - tagList.put(DateTimeTag.class.getSimpleName(), dateTimeTag); + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); } } 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 ef031b8..772092d 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 @@ -2,6 +2,7 @@ import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; +import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; public class BirmmFrameBuilderFactory { @@ -12,6 +13,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); + case WELL: return null; @@ -31,6 +35,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); + case WELL: return null; 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 index 71023ee..3617ae7 100644 --- 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 @@ -9,6 +9,9 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + case UP_TRAP_REQUEST: return new MethaneTrapRequestFrame(); @@ -30,6 +33,10 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE return new MethaneTrapResponseFrame(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java new file mode 100644 index 0000000..a1fd8bc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java @@ -0,0 +1,43 @@ +package com.casic.missiles.frame.methane; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; +import com.casic.missiles.frame.tag.ota.RequestSizeTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; + +import java.time.format.DateTimeFormatter; + +public class MethaneGetRequestFrame extends BirmmBaseFrame { + + private final String DEV_TYPE = "Methane"; + private final String MESSAGE_TYPE = "GetRequest"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); + body.put("reqSize", tag.getRequestSize()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); + body.put("reqOffset", tag.getRequestOffset()); + } + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java new file mode 100644 index 0000000..5f49fe7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.ota.PackageDataTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MethaneGetResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.UP_GET_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } + + @Override + public void replyBizTag() { + // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) + // TODO-LIST + + Map> tagList = new HashMap<>(); + + RequestOffsetTag offsetTag = new RequestOffsetTag(); + offsetTag.setRequestOffset(0); + List offsetTags = new ArrayList<>(); + offsetTags.add(offsetTag); + tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); + + PackageDataTag dataTag = new PackageDataTag(); + dataTag.setData(new byte[] {0}); + List dataTags = new ArrayList<>(); + dataTags.add(dataTag); + tagList.put(PackageDataTag.class.getSimpleName(), dataTags); + + super.setTagList(tagList); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java index 37b7fc8..e936a9c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java @@ -22,7 +22,7 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()); + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); body.put("softwareVersion", tag.getVersion()); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java index cd62d6d..d478366 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java @@ -3,11 +3,11 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.frame.BirmmBaseTag; -import com.casic.missiles.frame.tag.config.DateTimeTag; -import com.casic.missiles.frame.tag.ota.OTANeedTag; +import com.casic.missiles.frame.tag.ota.NeedOTATag; -import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; public class MethaneOnlineResponseFrame extends BirmmBaseFrame { @@ -27,12 +27,16 @@ @Override public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map tagList = new HashMap<>(); - OTANeedTag needTag = new OTANeedTag(); + Map> tagList = new HashMap<>(); + NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); - tagList.put(OTANeedTag.class.getSimpleName(), needTag); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); super.setTagList(tagList); } } 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 690b9c5..6ba27f6 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 @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; import com.casic.missiles.frame.tag.biz.CellTag; import com.casic.missiles.frame.tag.biz.DateTag; import com.casic.missiles.frame.tag.biz.SensorStateTag; @@ -39,19 +40,19 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); body.put("cell", cellTag.getCellVal()); } if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); body.put("pci", pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); body.put("rsrp", rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); body.put("snr", snrTag.getSnr()); } @@ -86,21 +87,21 @@ // 电量 if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); bizData.setCell(cellTag.getCellVal()); } // 信号质量 if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); bizData.setPci(pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); bizData.setRsrp(rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); bizData.setSnr(snrTag.getSnr()); } @@ -123,47 +124,57 @@ } private void handleUploadTag() { - UploadTag uploadTag = (UploadTag) getTagList().get(UploadTag.class.getSimpleName()); + List tags = getTagList().get(UploadTag.class.getSimpleName()); - // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 - boolean isValid = uploadTag.checkOid(); - if (isValid) { - // 找到DateTag 取出其中的日期 - DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()); - uploadTag.setStartDate(dateTag.getDate()); + bizDataList = new ArrayList<>(); - 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(); + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); - 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)); // 转成浮点数 + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + MethaneBizData bizData = new MethaneBizData(); - bizDataList.add(bizData); + 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)); // 转成浮点数 - // 加上时间间隔 - start = start.plusMinutes(uploadTag.getInterval()); + bizDataList.add(bizData); + + // 加上时间间隔 + start = start.plusMinutes(uploadTag.getInterval()); + } } } } private void handleSensorStateTag() { - SensorStateTag sensorStateTag = (SensorStateTag) getTagList().get(SensorStateTag.class.getSimpleName()); - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { - // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { - // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - // TODO-LIST - // 传感器状态异常时需要上报异常事件 + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java new file mode 100644 index 0000000..458e393 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java @@ -0,0 +1,28 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class SentinelBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + "][" + value + "][" + bizType + "]"; + } + + public JSONObject toJSON() { + JSONObject json = new JSONObject(); + json.put(BirmmDataBizTypeEnums.toType(bizType).getName(), String.format("%.3f", value)); + json.put("uptime", uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java new file mode 100644 index 0000000..bafe173 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java @@ -0,0 +1,56 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.methane.*; + +public class SentinelFrameBuilderFactory { + + public static BirmmBaseFrame createSentinelFrameByOperation(String operaType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + + case UP_TRAP_REQUEST: + return new SentinelTrapRequestFrame(); + + case UP_ONLINE_REQUEST: + return new MethaneOnlineRequestFrame(); + + case UP_SET_RESPONSE: + return new MethaneSetResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } + + public static BirmmBaseFrame createSentinelReplyFrameByOperation(String uploadOperationType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + + case UP_TRAP_REQUEST: + // TRAP_REQUEST消息回复TRAP_RESPONSE + return new SentinelTrapResponseFrame(); + + case UP_ONLINE_REQUEST: + // ONLINE_REQUEST消息回复ONLINE_RESPONSE + return new MethaneOnlineResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java new file mode 100644 index 0000000..a36d243 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -0,0 +1,180 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.biz.DateTag; +import com.casic.missiles.frame.tag.biz.SensorStateTag; +import com.casic.missiles.frame.tag.biz.UploadTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; +import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.BytesUtil; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Slf4j +public class SentinelTrapRequestFrame extends BirmmBaseFrame { + + private List bizDataList; + + private final String DEV_TYPE = "Sentinel"; + private final String MESSAGE_TYPE = "Data"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + body.put("cell", cellTag.getCellVal()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + body.put("pci", pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + body.put("rsrp", rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + body.put("snr", snrTag.getSnr()); + } + + // 业务数据 + if (bizDataList != null) { + JSONArray datas = new JSONArray(); + for (SentinelBizData bizData : bizDataList) { + datas.add(bizData.toJSON()); + } + body.put("datas", datas); + } + + json.put("mBody", body); + + return json; + } + + @Override + public boolean isBizDataFrame() { + return true; + } + + @Override + public List convertToBizDataList() { + List resultList = new ArrayList<>(); + if (bizDataList != null) { + for (SentinelBizData data : bizDataList) { + DeviceBizData bizData = new DeviceBizData(); + bizData.setBizType(String.valueOf(data.getBizType())); + bizData.setValue(String.format("%.3f", data.getValue())); + bizData.setUptime(data.getUptime()); + + // 电量 + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + bizData.setCell(cellTag.getCellVal()); + } + + // 信号质量 + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + bizData.setPci(pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + bizData.setRsrp(rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + bizData.setSnr(snrTag.getSnr()); + } + + resultList.add(bizData); + } + } + + return resultList; + } + + @Override + public void doParseBizTag() { + if (getTagList().containsKey(UploadTag.class.getSimpleName())) { + handleUploadTag(); + } + + if (getTagList().containsKey(SensorStateTag.class.getSimpleName())) { + handleSensorStateTag(); + } + } + + private void handleUploadTag() { + List tags = getTagList().get(UploadTag.class.getSimpleName()); + + bizDataList = new ArrayList<>(); + + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); + + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + SentinelBizData bizData = new SentinelBizData(); + + 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() { + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java new file mode 100644 index 0000000..2a87b3f --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java @@ -0,0 +1,20 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; + +public class SentinelTrapResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java new file mode 100644 index 0000000..8e40b85 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class NeedOTATag extends BirmmBaseTag { + + final String NEED_OTA_TAG_OID = "60000600"; + + boolean need; + + @Override + public String toString() { + return super.toString() + "[value: " + need + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength() * 2 + "x", need ? 1 : 0); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + need = Boolean.parseBoolean(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java deleted file mode 100644 index 884b44f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.frame.tag.ota; - -import com.casic.missiles.enums.BirmmTagTypeEnums; -import com.casic.missiles.frame.BirmmBaseTag; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -@Data -public class OTANeedTag extends BirmmBaseTag { - - final String OTA_NEED_TAG_OID = "60000600"; - - boolean need; - - @Override - public String toString() { - return super.toString() + "[value: " + need + "]"; - } - - @Override - public String toProtocolString() { - String result = ""; - result += BirmmTagTypeEnums.OTA_NEED_TAG.getName(); // OID - result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_TAG.getLength()); // 长度 - result += String.format("%02x", need ? 1 : 0); - - return result; - } - - @Override - public void setValueStr(String valueStr) { - super.setValueStr(valueStr); - need = Boolean.parseBoolean(valueStr); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java new file mode 100644 index 0000000..08dafcf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageCRCTag extends BirmmBaseTag { + + final String PACKAGE_CRC_TAG_OID = "60000603"; + + String packCRC; + + @Override + public String toString() { + return super.toString() + "[value: " + packCRC + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength() * 2 + "x", packCRC); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + packCRC = valueStr; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java new file mode 100644 index 0000000..f9801a2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.tomcat.util.buf.HexUtils; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageDataTag extends BirmmBaseTag { + + final String PACKAGE_DATA_TAG_OID = "60000601"; + + byte[] data; + + @Override + public String toString() { + return super.toString() + "[value: " + HexUtils.toHexString(data) + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_DATA_TAG.getName(); // OID + result += String.format("%04d", data.length); // 长度 + result += HexUtils.toHexString(data); + + return result; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java new file mode 100644 index 0000000..05ff3c1 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageSizeTag extends BirmmBaseTag { + + final String PACKAGE_SIZE_TAG_OID = "60000602"; + + int packSize; + + @Override + public String toString() { + return super.toString() + "[value: " + packSize + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength() * 2 + "x", packSize); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + packSize = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java new file mode 100644 index 0000000..bfc83dd --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java @@ -0,0 +1,37 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class RequestOffsetTag extends BirmmBaseTag { + + final String REQUEST_OFFSET_TAG_OID = "20000102"; + + // 本次请求的升级包偏移量 + int requestOffset; + + @Override + public String toString() { + return super.toString() + "[value: " + requestOffset + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength() * 2 + "x", requestOffset); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + requestOffset = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java new file mode 100644 index 0000000..6c096a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java @@ -0,0 +1,27 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class RequestSizeTag extends BirmmBaseTag { + + final String REQUEST_SIZE_TAG_OID = "20000100"; + + // 本次请求的升级包大小 + int requestSize; + + @Override + public String toString() { + return super.toString() + "[value: " + requestSize + "]"; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + requestSize = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 91c81d0..207eca2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -15,6 +15,7 @@ import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; +import javax.annotation.Resource; /** * SensorhubServer netty服务端 @@ -32,6 +33,9 @@ EventLoopGroup bossGroup = new NioEventLoopGroup(4); // boss EventLoopGroup workerGroup = new NioEventLoopGroup(32); // worker + @Resource + SensorhubServerChannelInitialHandler pipeLine; + /** * sensorhub属性参数 */ @@ -71,7 +75,7 @@ ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) // 设置EventLoopGroup .channel(NioServerSocketChannel.class) // 指明新的Channel的类型 - .childHandler(new SensorhubServerChannelInitialHandler()) // 指定ChannelHandler + .childHandler(pipeLine) // 指定ChannelHandler .option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) .childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) .option(ChannelOption.SO_BACKLOG, 1024) // 设置的ServerChannel的一些选项 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java index c3f82cc..02f1291 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java @@ -1,27 +1,38 @@ package com.casic.missiles.netty.handler; +import com.casic.missiles.parser.BirmmHexDecoder; import com.casic.missiles.parser.SensorhubDecoder; +import com.casic.missiles.parser.safe.impl.Sm4; +import com.casic.missiles.replier.CommonHexReplier; import com.casic.missiles.replier.SensorhubReplier; +import com.casic.missiles.util.SpringContextUtil; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; /** * @author cz * @date 2023-06-05 */ +@Component public class SensorhubServerChannelInitialHandler extends ChannelInitializer { - + @Resource + BirmmHexDecoder birmmHexDecoder; @Override protected void initChannel(SocketChannel socketChannel) { ChannelPipeline pipeline = socketChannel.pipeline(); pipeline.addLast(new LoggingHandler(LogLevel.INFO)); - pipeline.addLast(new SensorhubDecoder()); - pipeline.addLast(new SensorhubReplier()); +// pipeline.addLast(new SensorhubDecoder()); +// pipeline.addLast(birmmHexDecoder); + pipeline.addLast(new BirmmHexDecoder()); + pipeline.addLast(new CommonHexReplier()); // 心跳续约 // pipeline.addLast(this.heartBeatRespHandler); // pipeline.addLast(this.loginAuthRespHandler); 登录验证 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java new file mode 100644 index 0000000..6931af5 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -0,0 +1,106 @@ +package com.casic.missiles.parser; + +import cn.hutool.http.HttpUtil; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.model.DeviceFrameLog; +import com.casic.missiles.service.GeneralServiceImpl; +import com.casic.missiles.service.IDeviceBizDataService; +import com.casic.missiles.service.IDeviceFrameLogService; +import com.casic.missiles.service.IGeneralService; +import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; +import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; +import com.casic.missiles.util.SnowflakeUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author tanyue + * @date 2024-07 + * BirmmHexDecoder + */ +@Slf4j +@Component("BirmmHexDecoder") +public class BirmmHexDecoder extends ByteToMessageDecoder { + + IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); + + IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); + + IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + log.info("建立连接:{}", ctx.channel().id()); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.info("断开连接:{}", ctx.channel().id()); + } + + @Override + public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { + byte[] frameBytes = new byte[buffer.readableBytes()]; + buffer.readBytes(frameBytes); + log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + + // 工厂类创建frame对象 + BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); + if (birmmFrame != null) { + // 处理业务数据 + birmmFrame.doParseBizTag(); + + log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); + + // 保存日志 + DeviceFrameLog frameLog = new DeviceFrameLog(); + frameLog.setId(new SnowflakeUtil().nextId()); + frameLog.setDevcode(birmmFrame.getDevCode()); + frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase()); + frameLog.setRawBizFrame(birmmFrame.getRawBizFrameString()); + frameLog.setDataJson(birmmFrame.toJSON().toJSONString()); + frameLog.setLogtime(birmmFrame.getLogTime()); + frameLogService.save(frameLog); + + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + + // 保存业务数据 + if (birmmFrame.isBizDataFrame()) { + List bizDataList = birmmFrame.convertToBizDataList(); + for (DeviceBizData bizData : bizDataList) { + // 设置其他的属性 + bizData.setId(new SnowflakeUtil().nextId()); + bizData.setFrameLogId(frameLog.getId()); // 关联日志记录id + bizData.setDevcode(birmmFrame.getDevCode()); + bizData.setDeviceType(Integer.valueOf(birmmFrame.getDeviceType())); + bizData.setLogtime(birmmFrame.getLogTime()); + } + + // 批量保存 + bizDataService.saveBatch(bizDataList); + } + + // 创建回复消息 + BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + if (configFrame != null) { + // 根据协议进行封装 + String replyMessage = defaultService.replyMessage(configFrame); + log.info("下行HEX字节消息帧:{}", replyMessage); + + list.add(replyMessage); + } + } + } +} 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 2f90c5f..c79095b 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 @@ -36,9 +36,9 @@ String getSequence(byte[] frameBytes); String getTagListString(byte[] frameBytes); - Map getTagList(byte[] tagBytes); + Map> getTagList(byte[] tagBytes); - String buildTagListStr(Map tagList); + String buildTagListStr(Map> tagList); 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 8f0bd17..bda0040 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 @@ -1,6 +1,7 @@ package com.casic.missiles.parser.impl; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.frame.BirmmBaseTag; import com.casic.missiles.frame.BirmmTagBuilderFactory; import com.casic.missiles.parser.BirmmProtocolParser; @@ -10,7 +11,9 @@ import org.apache.tomcat.util.buf.HexUtils; import org.springframework.stereotype.Component; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; @Component @@ -129,12 +132,12 @@ } @Override - public Map getTagList(byte[] tagBytes) { + public Map> getTagList(byte[] tagBytes) { // 必须包含OID和长度 4 + 2 if (tagBytes.length < 6) { return null; } - Map tagList = new HashMap<>(); + Map> tagList = new HashMap<>(); int idx = 0; while (idx + 6 < tagBytes.length) { String oid = BytesUtil.extractHexString(tagBytes, idx, 4); @@ -149,7 +152,15 @@ log.debug("解析Tag:{}", tagBase); - tagList.put(tagBase.getClass().getSimpleName(), tagBase); + // 一包可能还有多个UploadTag 使用List + if (tagList.containsKey(tagBase.getClass().getSimpleName())) { + tagList.get(tagBase.getClass().getSimpleName()).add(tagBase); + } else { + List tags = new ArrayList<>(); + tags.add(tagBase); + tagList.put(tagBase.getClass().getSimpleName(), tags); + } + } } idx += tagLen; @@ -159,11 +170,13 @@ } @Override - public String buildTagListStr(Map tagList) { + public String buildTagListStr(Map> tagList) { StringBuilder result = new StringBuilder(); - for (BirmmBaseTag tag : tagList.values()) { - result.append(tag.toProtocolString()); + for (List tags : tagList.values()) { + for (BirmmBaseTag tag : tags) { + result.append(tag.toProtocolString()); + } } return result.toString().toUpperCase(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 4401a83..a0688c2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -45,7 +45,7 @@ }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); key.writeBytes(keyByte); - byte[] in = Hex.decode(cipher); + byte[] in = Hex.decode(fillFrameStructZero(cipher, 16)); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); return EcbEncrypt(in, keyBytes); } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 70596b6..3ac4de7 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -69,7 +69,7 @@ enable: true sensorhub: config: - port: 7091 + port: 22009 bean: "functionCallback" url: "http://127.0.0.1:7093/push/test" fileUrl: D:\casic\file\ diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 8dcc497..da561cd 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -49,6 +49,12 @@ + cn.hutool + hutool-all + 5.7.16 + + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} 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 32dfdf3..140ee01 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 @@ -1,6 +1,10 @@ package com.casic.missiles.controller; +import cn.hutool.Hutool; import cn.hutool.core.lang.generator.UUIDGenerator; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.model.DeviceBizData; @@ -76,6 +80,12 @@ frameLog.setLogtime(birmmFrame.getLogTime()); frameLogService.save(frameLog); + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + // 保存业务数据 if (birmmFrame.isBizDataFrame()) { List bizDataList = birmmFrame.convertToBizDataList(); @@ -105,13 +115,15 @@ if (dataMap.containsKey("profile")) { hasProfile = (Boolean) dataMap.get("profile"); } - aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); + aepCmdService.setDeviceId((String) dataMap.get("deviceId")); aepCmdService.setProductId((String) dataMap.get("productId")); if (hasProfile) { + aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); retCode = aepCmdService.handleSendCommandWithProfile(replyMessage); } else { - retCode = aepCmdService.handleSendCommand(replyMessage); + aepCmdService.setMasterApiKey("ee2f4011f0a04f28b1572967891b57d5"); + retCode = aepCmdService.handleSendCommand(replyMessage, 2); // 2=16进制 } if (retCode == 0) { 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 f934d86..e22284a 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 @@ -48,7 +48,7 @@ // 业务字段List String tagListString; - Map tagList; + Map> tagList; // CRC String crc; @@ -83,7 +83,9 @@ DateTimeTag dateTimeTag = new DateTimeTag(); dateTimeTag.setDateTime(LocalDateTime.now()); - tagList.put(DateTimeTag.class.getSimpleName(), dateTimeTag); + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); } } 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 ef031b8..772092d 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 @@ -2,6 +2,7 @@ import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; +import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; public class BirmmFrameBuilderFactory { @@ -12,6 +13,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); + case WELL: return null; @@ -31,6 +35,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); + case WELL: return null; 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 index 71023ee..3617ae7 100644 --- 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 @@ -9,6 +9,9 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + case UP_TRAP_REQUEST: return new MethaneTrapRequestFrame(); @@ -30,6 +33,10 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE return new MethaneTrapResponseFrame(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java new file mode 100644 index 0000000..a1fd8bc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java @@ -0,0 +1,43 @@ +package com.casic.missiles.frame.methane; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; +import com.casic.missiles.frame.tag.ota.RequestSizeTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; + +import java.time.format.DateTimeFormatter; + +public class MethaneGetRequestFrame extends BirmmBaseFrame { + + private final String DEV_TYPE = "Methane"; + private final String MESSAGE_TYPE = "GetRequest"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); + body.put("reqSize", tag.getRequestSize()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); + body.put("reqOffset", tag.getRequestOffset()); + } + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java new file mode 100644 index 0000000..5f49fe7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.ota.PackageDataTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MethaneGetResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.UP_GET_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } + + @Override + public void replyBizTag() { + // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) + // TODO-LIST + + Map> tagList = new HashMap<>(); + + RequestOffsetTag offsetTag = new RequestOffsetTag(); + offsetTag.setRequestOffset(0); + List offsetTags = new ArrayList<>(); + offsetTags.add(offsetTag); + tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); + + PackageDataTag dataTag = new PackageDataTag(); + dataTag.setData(new byte[] {0}); + List dataTags = new ArrayList<>(); + dataTags.add(dataTag); + tagList.put(PackageDataTag.class.getSimpleName(), dataTags); + + super.setTagList(tagList); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java index 37b7fc8..e936a9c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java @@ -22,7 +22,7 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()); + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); body.put("softwareVersion", tag.getVersion()); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java index cd62d6d..d478366 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java @@ -3,11 +3,11 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.frame.BirmmBaseTag; -import com.casic.missiles.frame.tag.config.DateTimeTag; -import com.casic.missiles.frame.tag.ota.OTANeedTag; +import com.casic.missiles.frame.tag.ota.NeedOTATag; -import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; public class MethaneOnlineResponseFrame extends BirmmBaseFrame { @@ -27,12 +27,16 @@ @Override public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map tagList = new HashMap<>(); - OTANeedTag needTag = new OTANeedTag(); + Map> tagList = new HashMap<>(); + NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); - tagList.put(OTANeedTag.class.getSimpleName(), needTag); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); super.setTagList(tagList); } } 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 690b9c5..6ba27f6 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 @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; import com.casic.missiles.frame.tag.biz.CellTag; import com.casic.missiles.frame.tag.biz.DateTag; import com.casic.missiles.frame.tag.biz.SensorStateTag; @@ -39,19 +40,19 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); body.put("cell", cellTag.getCellVal()); } if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); body.put("pci", pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); body.put("rsrp", rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); body.put("snr", snrTag.getSnr()); } @@ -86,21 +87,21 @@ // 电量 if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); bizData.setCell(cellTag.getCellVal()); } // 信号质量 if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); bizData.setPci(pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); bizData.setRsrp(rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); bizData.setSnr(snrTag.getSnr()); } @@ -123,47 +124,57 @@ } private void handleUploadTag() { - UploadTag uploadTag = (UploadTag) getTagList().get(UploadTag.class.getSimpleName()); + List tags = getTagList().get(UploadTag.class.getSimpleName()); - // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 - boolean isValid = uploadTag.checkOid(); - if (isValid) { - // 找到DateTag 取出其中的日期 - DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()); - uploadTag.setStartDate(dateTag.getDate()); + bizDataList = new ArrayList<>(); - 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(); + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); - 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)); // 转成浮点数 + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + MethaneBizData bizData = new MethaneBizData(); - bizDataList.add(bizData); + 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)); // 转成浮点数 - // 加上时间间隔 - start = start.plusMinutes(uploadTag.getInterval()); + bizDataList.add(bizData); + + // 加上时间间隔 + start = start.plusMinutes(uploadTag.getInterval()); + } } } } private void handleSensorStateTag() { - SensorStateTag sensorStateTag = (SensorStateTag) getTagList().get(SensorStateTag.class.getSimpleName()); - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { - // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { - // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - // TODO-LIST - // 传感器状态异常时需要上报异常事件 + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java new file mode 100644 index 0000000..458e393 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java @@ -0,0 +1,28 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class SentinelBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + "][" + value + "][" + bizType + "]"; + } + + public JSONObject toJSON() { + JSONObject json = new JSONObject(); + json.put(BirmmDataBizTypeEnums.toType(bizType).getName(), String.format("%.3f", value)); + json.put("uptime", uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java new file mode 100644 index 0000000..bafe173 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java @@ -0,0 +1,56 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.methane.*; + +public class SentinelFrameBuilderFactory { + + public static BirmmBaseFrame createSentinelFrameByOperation(String operaType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + + case UP_TRAP_REQUEST: + return new SentinelTrapRequestFrame(); + + case UP_ONLINE_REQUEST: + return new MethaneOnlineRequestFrame(); + + case UP_SET_RESPONSE: + return new MethaneSetResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } + + public static BirmmBaseFrame createSentinelReplyFrameByOperation(String uploadOperationType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + + case UP_TRAP_REQUEST: + // TRAP_REQUEST消息回复TRAP_RESPONSE + return new SentinelTrapResponseFrame(); + + case UP_ONLINE_REQUEST: + // ONLINE_REQUEST消息回复ONLINE_RESPONSE + return new MethaneOnlineResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java new file mode 100644 index 0000000..a36d243 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -0,0 +1,180 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.biz.DateTag; +import com.casic.missiles.frame.tag.biz.SensorStateTag; +import com.casic.missiles.frame.tag.biz.UploadTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; +import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.BytesUtil; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Slf4j +public class SentinelTrapRequestFrame extends BirmmBaseFrame { + + private List bizDataList; + + private final String DEV_TYPE = "Sentinel"; + private final String MESSAGE_TYPE = "Data"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + body.put("cell", cellTag.getCellVal()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + body.put("pci", pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + body.put("rsrp", rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + body.put("snr", snrTag.getSnr()); + } + + // 业务数据 + if (bizDataList != null) { + JSONArray datas = new JSONArray(); + for (SentinelBizData bizData : bizDataList) { + datas.add(bizData.toJSON()); + } + body.put("datas", datas); + } + + json.put("mBody", body); + + return json; + } + + @Override + public boolean isBizDataFrame() { + return true; + } + + @Override + public List convertToBizDataList() { + List resultList = new ArrayList<>(); + if (bizDataList != null) { + for (SentinelBizData data : bizDataList) { + DeviceBizData bizData = new DeviceBizData(); + bizData.setBizType(String.valueOf(data.getBizType())); + bizData.setValue(String.format("%.3f", data.getValue())); + bizData.setUptime(data.getUptime()); + + // 电量 + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + bizData.setCell(cellTag.getCellVal()); + } + + // 信号质量 + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + bizData.setPci(pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + bizData.setRsrp(rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + bizData.setSnr(snrTag.getSnr()); + } + + resultList.add(bizData); + } + } + + return resultList; + } + + @Override + public void doParseBizTag() { + if (getTagList().containsKey(UploadTag.class.getSimpleName())) { + handleUploadTag(); + } + + if (getTagList().containsKey(SensorStateTag.class.getSimpleName())) { + handleSensorStateTag(); + } + } + + private void handleUploadTag() { + List tags = getTagList().get(UploadTag.class.getSimpleName()); + + bizDataList = new ArrayList<>(); + + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); + + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + SentinelBizData bizData = new SentinelBizData(); + + 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() { + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java new file mode 100644 index 0000000..2a87b3f --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java @@ -0,0 +1,20 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; + +public class SentinelTrapResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java new file mode 100644 index 0000000..8e40b85 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class NeedOTATag extends BirmmBaseTag { + + final String NEED_OTA_TAG_OID = "60000600"; + + boolean need; + + @Override + public String toString() { + return super.toString() + "[value: " + need + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength() * 2 + "x", need ? 1 : 0); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + need = Boolean.parseBoolean(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java deleted file mode 100644 index 884b44f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.frame.tag.ota; - -import com.casic.missiles.enums.BirmmTagTypeEnums; -import com.casic.missiles.frame.BirmmBaseTag; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -@Data -public class OTANeedTag extends BirmmBaseTag { - - final String OTA_NEED_TAG_OID = "60000600"; - - boolean need; - - @Override - public String toString() { - return super.toString() + "[value: " + need + "]"; - } - - @Override - public String toProtocolString() { - String result = ""; - result += BirmmTagTypeEnums.OTA_NEED_TAG.getName(); // OID - result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_TAG.getLength()); // 长度 - result += String.format("%02x", need ? 1 : 0); - - return result; - } - - @Override - public void setValueStr(String valueStr) { - super.setValueStr(valueStr); - need = Boolean.parseBoolean(valueStr); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java new file mode 100644 index 0000000..08dafcf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageCRCTag extends BirmmBaseTag { + + final String PACKAGE_CRC_TAG_OID = "60000603"; + + String packCRC; + + @Override + public String toString() { + return super.toString() + "[value: " + packCRC + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength() * 2 + "x", packCRC); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + packCRC = valueStr; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java new file mode 100644 index 0000000..f9801a2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.tomcat.util.buf.HexUtils; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageDataTag extends BirmmBaseTag { + + final String PACKAGE_DATA_TAG_OID = "60000601"; + + byte[] data; + + @Override + public String toString() { + return super.toString() + "[value: " + HexUtils.toHexString(data) + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_DATA_TAG.getName(); // OID + result += String.format("%04d", data.length); // 长度 + result += HexUtils.toHexString(data); + + return result; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java new file mode 100644 index 0000000..05ff3c1 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageSizeTag extends BirmmBaseTag { + + final String PACKAGE_SIZE_TAG_OID = "60000602"; + + int packSize; + + @Override + public String toString() { + return super.toString() + "[value: " + packSize + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength() * 2 + "x", packSize); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + packSize = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java new file mode 100644 index 0000000..bfc83dd --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java @@ -0,0 +1,37 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class RequestOffsetTag extends BirmmBaseTag { + + final String REQUEST_OFFSET_TAG_OID = "20000102"; + + // 本次请求的升级包偏移量 + int requestOffset; + + @Override + public String toString() { + return super.toString() + "[value: " + requestOffset + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength() * 2 + "x", requestOffset); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + requestOffset = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java new file mode 100644 index 0000000..6c096a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java @@ -0,0 +1,27 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class RequestSizeTag extends BirmmBaseTag { + + final String REQUEST_SIZE_TAG_OID = "20000100"; + + // 本次请求的升级包大小 + int requestSize; + + @Override + public String toString() { + return super.toString() + "[value: " + requestSize + "]"; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + requestSize = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 91c81d0..207eca2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -15,6 +15,7 @@ import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; +import javax.annotation.Resource; /** * SensorhubServer netty服务端 @@ -32,6 +33,9 @@ EventLoopGroup bossGroup = new NioEventLoopGroup(4); // boss EventLoopGroup workerGroup = new NioEventLoopGroup(32); // worker + @Resource + SensorhubServerChannelInitialHandler pipeLine; + /** * sensorhub属性参数 */ @@ -71,7 +75,7 @@ ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) // 设置EventLoopGroup .channel(NioServerSocketChannel.class) // 指明新的Channel的类型 - .childHandler(new SensorhubServerChannelInitialHandler()) // 指定ChannelHandler + .childHandler(pipeLine) // 指定ChannelHandler .option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) .childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) .option(ChannelOption.SO_BACKLOG, 1024) // 设置的ServerChannel的一些选项 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java index c3f82cc..02f1291 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java @@ -1,27 +1,38 @@ package com.casic.missiles.netty.handler; +import com.casic.missiles.parser.BirmmHexDecoder; import com.casic.missiles.parser.SensorhubDecoder; +import com.casic.missiles.parser.safe.impl.Sm4; +import com.casic.missiles.replier.CommonHexReplier; import com.casic.missiles.replier.SensorhubReplier; +import com.casic.missiles.util.SpringContextUtil; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; /** * @author cz * @date 2023-06-05 */ +@Component public class SensorhubServerChannelInitialHandler extends ChannelInitializer { - + @Resource + BirmmHexDecoder birmmHexDecoder; @Override protected void initChannel(SocketChannel socketChannel) { ChannelPipeline pipeline = socketChannel.pipeline(); pipeline.addLast(new LoggingHandler(LogLevel.INFO)); - pipeline.addLast(new SensorhubDecoder()); - pipeline.addLast(new SensorhubReplier()); +// pipeline.addLast(new SensorhubDecoder()); +// pipeline.addLast(birmmHexDecoder); + pipeline.addLast(new BirmmHexDecoder()); + pipeline.addLast(new CommonHexReplier()); // 心跳续约 // pipeline.addLast(this.heartBeatRespHandler); // pipeline.addLast(this.loginAuthRespHandler); 登录验证 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java new file mode 100644 index 0000000..6931af5 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -0,0 +1,106 @@ +package com.casic.missiles.parser; + +import cn.hutool.http.HttpUtil; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.model.DeviceFrameLog; +import com.casic.missiles.service.GeneralServiceImpl; +import com.casic.missiles.service.IDeviceBizDataService; +import com.casic.missiles.service.IDeviceFrameLogService; +import com.casic.missiles.service.IGeneralService; +import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; +import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; +import com.casic.missiles.util.SnowflakeUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author tanyue + * @date 2024-07 + * BirmmHexDecoder + */ +@Slf4j +@Component("BirmmHexDecoder") +public class BirmmHexDecoder extends ByteToMessageDecoder { + + IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); + + IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); + + IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + log.info("建立连接:{}", ctx.channel().id()); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.info("断开连接:{}", ctx.channel().id()); + } + + @Override + public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { + byte[] frameBytes = new byte[buffer.readableBytes()]; + buffer.readBytes(frameBytes); + log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + + // 工厂类创建frame对象 + BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); + if (birmmFrame != null) { + // 处理业务数据 + birmmFrame.doParseBizTag(); + + log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); + + // 保存日志 + DeviceFrameLog frameLog = new DeviceFrameLog(); + frameLog.setId(new SnowflakeUtil().nextId()); + frameLog.setDevcode(birmmFrame.getDevCode()); + frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase()); + frameLog.setRawBizFrame(birmmFrame.getRawBizFrameString()); + frameLog.setDataJson(birmmFrame.toJSON().toJSONString()); + frameLog.setLogtime(birmmFrame.getLogTime()); + frameLogService.save(frameLog); + + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + + // 保存业务数据 + if (birmmFrame.isBizDataFrame()) { + List bizDataList = birmmFrame.convertToBizDataList(); + for (DeviceBizData bizData : bizDataList) { + // 设置其他的属性 + bizData.setId(new SnowflakeUtil().nextId()); + bizData.setFrameLogId(frameLog.getId()); // 关联日志记录id + bizData.setDevcode(birmmFrame.getDevCode()); + bizData.setDeviceType(Integer.valueOf(birmmFrame.getDeviceType())); + bizData.setLogtime(birmmFrame.getLogTime()); + } + + // 批量保存 + bizDataService.saveBatch(bizDataList); + } + + // 创建回复消息 + BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + if (configFrame != null) { + // 根据协议进行封装 + String replyMessage = defaultService.replyMessage(configFrame); + log.info("下行HEX字节消息帧:{}", replyMessage); + + list.add(replyMessage); + } + } + } +} 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 2f90c5f..c79095b 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 @@ -36,9 +36,9 @@ String getSequence(byte[] frameBytes); String getTagListString(byte[] frameBytes); - Map getTagList(byte[] tagBytes); + Map> getTagList(byte[] tagBytes); - String buildTagListStr(Map tagList); + String buildTagListStr(Map> tagList); 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 8f0bd17..bda0040 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 @@ -1,6 +1,7 @@ package com.casic.missiles.parser.impl; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.frame.BirmmBaseTag; import com.casic.missiles.frame.BirmmTagBuilderFactory; import com.casic.missiles.parser.BirmmProtocolParser; @@ -10,7 +11,9 @@ import org.apache.tomcat.util.buf.HexUtils; import org.springframework.stereotype.Component; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; @Component @@ -129,12 +132,12 @@ } @Override - public Map getTagList(byte[] tagBytes) { + public Map> getTagList(byte[] tagBytes) { // 必须包含OID和长度 4 + 2 if (tagBytes.length < 6) { return null; } - Map tagList = new HashMap<>(); + Map> tagList = new HashMap<>(); int idx = 0; while (idx + 6 < tagBytes.length) { String oid = BytesUtil.extractHexString(tagBytes, idx, 4); @@ -149,7 +152,15 @@ log.debug("解析Tag:{}", tagBase); - tagList.put(tagBase.getClass().getSimpleName(), tagBase); + // 一包可能还有多个UploadTag 使用List + if (tagList.containsKey(tagBase.getClass().getSimpleName())) { + tagList.get(tagBase.getClass().getSimpleName()).add(tagBase); + } else { + List tags = new ArrayList<>(); + tags.add(tagBase); + tagList.put(tagBase.getClass().getSimpleName(), tags); + } + } } idx += tagLen; @@ -159,11 +170,13 @@ } @Override - public String buildTagListStr(Map tagList) { + public String buildTagListStr(Map> tagList) { StringBuilder result = new StringBuilder(); - for (BirmmBaseTag tag : tagList.values()) { - result.append(tag.toProtocolString()); + for (List tags : tagList.values()) { + for (BirmmBaseTag tag : tags) { + result.append(tag.toProtocolString()); + } } return result.toString().toUpperCase(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 4401a83..a0688c2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -45,7 +45,7 @@ }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); key.writeBytes(keyByte); - byte[] in = Hex.decode(cipher); + byte[] in = Hex.decode(fillFrameStructZero(cipher, 16)); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); return EcbEncrypt(in, keyBytes); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java new file mode 100644 index 0000000..6fa8cce --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -0,0 +1,46 @@ +package com.casic.missiles.replier; + +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.replier.command.AbstractBuildReplyCommand; +import com.casic.missiles.util.BytesUtil; +import com.casic.missiles.util.ClazzUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; + +/** + * @author tanyue + */ +@Slf4j +public class CommonHexReplier extends SimpleChannelInboundHandler { + + /** + * 回复内容构建的流程入口方法 + * 1、通过有标准协议解析器传来的结果进行命令的构建 + * 2、构建命令有以下的命令内容 + * (1)成功返回时间,并进行下发配置操作 + * (2)版本升级 + * (3)下位机下发版本是否升级,是上版本,是升级,请求,回复升级等流程 + * (4)其他未知需求命令 + */ + @Override + public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { + System.out.println("Client->Server:" + obj); + byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); + ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); + //进行回复 + ctx.channel().writeAndFlush(replyByteBuf); + } + + @Override + public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { + ctx.fireChannelReadComplete(); + } + + +} diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 70596b6..3ac4de7 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -69,7 +69,7 @@ enable: true sensorhub: config: - port: 7091 + port: 22009 bean: "functionCallback" url: "http://127.0.0.1:7093/push/test" fileUrl: D:\casic\file\ diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 8dcc497..da561cd 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -49,6 +49,12 @@ + cn.hutool + hutool-all + 5.7.16 + + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} 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 32dfdf3..140ee01 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 @@ -1,6 +1,10 @@ package com.casic.missiles.controller; +import cn.hutool.Hutool; import cn.hutool.core.lang.generator.UUIDGenerator; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.model.DeviceBizData; @@ -76,6 +80,12 @@ frameLog.setLogtime(birmmFrame.getLogTime()); frameLogService.save(frameLog); + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + // 保存业务数据 if (birmmFrame.isBizDataFrame()) { List bizDataList = birmmFrame.convertToBizDataList(); @@ -105,13 +115,15 @@ if (dataMap.containsKey("profile")) { hasProfile = (Boolean) dataMap.get("profile"); } - aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); + aepCmdService.setDeviceId((String) dataMap.get("deviceId")); aepCmdService.setProductId((String) dataMap.get("productId")); if (hasProfile) { + aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); retCode = aepCmdService.handleSendCommandWithProfile(replyMessage); } else { - retCode = aepCmdService.handleSendCommand(replyMessage); + aepCmdService.setMasterApiKey("ee2f4011f0a04f28b1572967891b57d5"); + retCode = aepCmdService.handleSendCommand(replyMessage, 2); // 2=16进制 } if (retCode == 0) { 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 f934d86..e22284a 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 @@ -48,7 +48,7 @@ // 业务字段List String tagListString; - Map tagList; + Map> tagList; // CRC String crc; @@ -83,7 +83,9 @@ DateTimeTag dateTimeTag = new DateTimeTag(); dateTimeTag.setDateTime(LocalDateTime.now()); - tagList.put(DateTimeTag.class.getSimpleName(), dateTimeTag); + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); } } 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 ef031b8..772092d 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 @@ -2,6 +2,7 @@ import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; +import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; public class BirmmFrameBuilderFactory { @@ -12,6 +13,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); + case WELL: return null; @@ -31,6 +35,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); + case WELL: return null; 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 index 71023ee..3617ae7 100644 --- 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 @@ -9,6 +9,9 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + case UP_TRAP_REQUEST: return new MethaneTrapRequestFrame(); @@ -30,6 +33,10 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE return new MethaneTrapResponseFrame(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java new file mode 100644 index 0000000..a1fd8bc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java @@ -0,0 +1,43 @@ +package com.casic.missiles.frame.methane; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; +import com.casic.missiles.frame.tag.ota.RequestSizeTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; + +import java.time.format.DateTimeFormatter; + +public class MethaneGetRequestFrame extends BirmmBaseFrame { + + private final String DEV_TYPE = "Methane"; + private final String MESSAGE_TYPE = "GetRequest"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); + body.put("reqSize", tag.getRequestSize()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); + body.put("reqOffset", tag.getRequestOffset()); + } + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java new file mode 100644 index 0000000..5f49fe7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.ota.PackageDataTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MethaneGetResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.UP_GET_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } + + @Override + public void replyBizTag() { + // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) + // TODO-LIST + + Map> tagList = new HashMap<>(); + + RequestOffsetTag offsetTag = new RequestOffsetTag(); + offsetTag.setRequestOffset(0); + List offsetTags = new ArrayList<>(); + offsetTags.add(offsetTag); + tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); + + PackageDataTag dataTag = new PackageDataTag(); + dataTag.setData(new byte[] {0}); + List dataTags = new ArrayList<>(); + dataTags.add(dataTag); + tagList.put(PackageDataTag.class.getSimpleName(), dataTags); + + super.setTagList(tagList); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java index 37b7fc8..e936a9c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java @@ -22,7 +22,7 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()); + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); body.put("softwareVersion", tag.getVersion()); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java index cd62d6d..d478366 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java @@ -3,11 +3,11 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.frame.BirmmBaseTag; -import com.casic.missiles.frame.tag.config.DateTimeTag; -import com.casic.missiles.frame.tag.ota.OTANeedTag; +import com.casic.missiles.frame.tag.ota.NeedOTATag; -import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; public class MethaneOnlineResponseFrame extends BirmmBaseFrame { @@ -27,12 +27,16 @@ @Override public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map tagList = new HashMap<>(); - OTANeedTag needTag = new OTANeedTag(); + Map> tagList = new HashMap<>(); + NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); - tagList.put(OTANeedTag.class.getSimpleName(), needTag); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); super.setTagList(tagList); } } 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 690b9c5..6ba27f6 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 @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; import com.casic.missiles.frame.tag.biz.CellTag; import com.casic.missiles.frame.tag.biz.DateTag; import com.casic.missiles.frame.tag.biz.SensorStateTag; @@ -39,19 +40,19 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); body.put("cell", cellTag.getCellVal()); } if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); body.put("pci", pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); body.put("rsrp", rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); body.put("snr", snrTag.getSnr()); } @@ -86,21 +87,21 @@ // 电量 if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); bizData.setCell(cellTag.getCellVal()); } // 信号质量 if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); bizData.setPci(pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); bizData.setRsrp(rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); bizData.setSnr(snrTag.getSnr()); } @@ -123,47 +124,57 @@ } private void handleUploadTag() { - UploadTag uploadTag = (UploadTag) getTagList().get(UploadTag.class.getSimpleName()); + List tags = getTagList().get(UploadTag.class.getSimpleName()); - // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 - boolean isValid = uploadTag.checkOid(); - if (isValid) { - // 找到DateTag 取出其中的日期 - DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()); - uploadTag.setStartDate(dateTag.getDate()); + bizDataList = new ArrayList<>(); - 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(); + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); - 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)); // 转成浮点数 + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + MethaneBizData bizData = new MethaneBizData(); - bizDataList.add(bizData); + 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)); // 转成浮点数 - // 加上时间间隔 - start = start.plusMinutes(uploadTag.getInterval()); + bizDataList.add(bizData); + + // 加上时间间隔 + start = start.plusMinutes(uploadTag.getInterval()); + } } } } private void handleSensorStateTag() { - SensorStateTag sensorStateTag = (SensorStateTag) getTagList().get(SensorStateTag.class.getSimpleName()); - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { - // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { - // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - // TODO-LIST - // 传感器状态异常时需要上报异常事件 + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java new file mode 100644 index 0000000..458e393 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java @@ -0,0 +1,28 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class SentinelBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + "][" + value + "][" + bizType + "]"; + } + + public JSONObject toJSON() { + JSONObject json = new JSONObject(); + json.put(BirmmDataBizTypeEnums.toType(bizType).getName(), String.format("%.3f", value)); + json.put("uptime", uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java new file mode 100644 index 0000000..bafe173 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java @@ -0,0 +1,56 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.methane.*; + +public class SentinelFrameBuilderFactory { + + public static BirmmBaseFrame createSentinelFrameByOperation(String operaType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + + case UP_TRAP_REQUEST: + return new SentinelTrapRequestFrame(); + + case UP_ONLINE_REQUEST: + return new MethaneOnlineRequestFrame(); + + case UP_SET_RESPONSE: + return new MethaneSetResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } + + public static BirmmBaseFrame createSentinelReplyFrameByOperation(String uploadOperationType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + + case UP_TRAP_REQUEST: + // TRAP_REQUEST消息回复TRAP_RESPONSE + return new SentinelTrapResponseFrame(); + + case UP_ONLINE_REQUEST: + // ONLINE_REQUEST消息回复ONLINE_RESPONSE + return new MethaneOnlineResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java new file mode 100644 index 0000000..a36d243 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -0,0 +1,180 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.biz.DateTag; +import com.casic.missiles.frame.tag.biz.SensorStateTag; +import com.casic.missiles.frame.tag.biz.UploadTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; +import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.BytesUtil; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Slf4j +public class SentinelTrapRequestFrame extends BirmmBaseFrame { + + private List bizDataList; + + private final String DEV_TYPE = "Sentinel"; + private final String MESSAGE_TYPE = "Data"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + body.put("cell", cellTag.getCellVal()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + body.put("pci", pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + body.put("rsrp", rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + body.put("snr", snrTag.getSnr()); + } + + // 业务数据 + if (bizDataList != null) { + JSONArray datas = new JSONArray(); + for (SentinelBizData bizData : bizDataList) { + datas.add(bizData.toJSON()); + } + body.put("datas", datas); + } + + json.put("mBody", body); + + return json; + } + + @Override + public boolean isBizDataFrame() { + return true; + } + + @Override + public List convertToBizDataList() { + List resultList = new ArrayList<>(); + if (bizDataList != null) { + for (SentinelBizData data : bizDataList) { + DeviceBizData bizData = new DeviceBizData(); + bizData.setBizType(String.valueOf(data.getBizType())); + bizData.setValue(String.format("%.3f", data.getValue())); + bizData.setUptime(data.getUptime()); + + // 电量 + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + bizData.setCell(cellTag.getCellVal()); + } + + // 信号质量 + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + bizData.setPci(pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + bizData.setRsrp(rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + bizData.setSnr(snrTag.getSnr()); + } + + resultList.add(bizData); + } + } + + return resultList; + } + + @Override + public void doParseBizTag() { + if (getTagList().containsKey(UploadTag.class.getSimpleName())) { + handleUploadTag(); + } + + if (getTagList().containsKey(SensorStateTag.class.getSimpleName())) { + handleSensorStateTag(); + } + } + + private void handleUploadTag() { + List tags = getTagList().get(UploadTag.class.getSimpleName()); + + bizDataList = new ArrayList<>(); + + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); + + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + SentinelBizData bizData = new SentinelBizData(); + + 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() { + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java new file mode 100644 index 0000000..2a87b3f --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java @@ -0,0 +1,20 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; + +public class SentinelTrapResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java new file mode 100644 index 0000000..8e40b85 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class NeedOTATag extends BirmmBaseTag { + + final String NEED_OTA_TAG_OID = "60000600"; + + boolean need; + + @Override + public String toString() { + return super.toString() + "[value: " + need + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength() * 2 + "x", need ? 1 : 0); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + need = Boolean.parseBoolean(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java deleted file mode 100644 index 884b44f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.frame.tag.ota; - -import com.casic.missiles.enums.BirmmTagTypeEnums; -import com.casic.missiles.frame.BirmmBaseTag; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -@Data -public class OTANeedTag extends BirmmBaseTag { - - final String OTA_NEED_TAG_OID = "60000600"; - - boolean need; - - @Override - public String toString() { - return super.toString() + "[value: " + need + "]"; - } - - @Override - public String toProtocolString() { - String result = ""; - result += BirmmTagTypeEnums.OTA_NEED_TAG.getName(); // OID - result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_TAG.getLength()); // 长度 - result += String.format("%02x", need ? 1 : 0); - - return result; - } - - @Override - public void setValueStr(String valueStr) { - super.setValueStr(valueStr); - need = Boolean.parseBoolean(valueStr); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java new file mode 100644 index 0000000..08dafcf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageCRCTag extends BirmmBaseTag { + + final String PACKAGE_CRC_TAG_OID = "60000603"; + + String packCRC; + + @Override + public String toString() { + return super.toString() + "[value: " + packCRC + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength() * 2 + "x", packCRC); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + packCRC = valueStr; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java new file mode 100644 index 0000000..f9801a2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.tomcat.util.buf.HexUtils; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageDataTag extends BirmmBaseTag { + + final String PACKAGE_DATA_TAG_OID = "60000601"; + + byte[] data; + + @Override + public String toString() { + return super.toString() + "[value: " + HexUtils.toHexString(data) + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_DATA_TAG.getName(); // OID + result += String.format("%04d", data.length); // 长度 + result += HexUtils.toHexString(data); + + return result; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java new file mode 100644 index 0000000..05ff3c1 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageSizeTag extends BirmmBaseTag { + + final String PACKAGE_SIZE_TAG_OID = "60000602"; + + int packSize; + + @Override + public String toString() { + return super.toString() + "[value: " + packSize + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength() * 2 + "x", packSize); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + packSize = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java new file mode 100644 index 0000000..bfc83dd --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java @@ -0,0 +1,37 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class RequestOffsetTag extends BirmmBaseTag { + + final String REQUEST_OFFSET_TAG_OID = "20000102"; + + // 本次请求的升级包偏移量 + int requestOffset; + + @Override + public String toString() { + return super.toString() + "[value: " + requestOffset + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength() * 2 + "x", requestOffset); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + requestOffset = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java new file mode 100644 index 0000000..6c096a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java @@ -0,0 +1,27 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class RequestSizeTag extends BirmmBaseTag { + + final String REQUEST_SIZE_TAG_OID = "20000100"; + + // 本次请求的升级包大小 + int requestSize; + + @Override + public String toString() { + return super.toString() + "[value: " + requestSize + "]"; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + requestSize = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 91c81d0..207eca2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -15,6 +15,7 @@ import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; +import javax.annotation.Resource; /** * SensorhubServer netty服务端 @@ -32,6 +33,9 @@ EventLoopGroup bossGroup = new NioEventLoopGroup(4); // boss EventLoopGroup workerGroup = new NioEventLoopGroup(32); // worker + @Resource + SensorhubServerChannelInitialHandler pipeLine; + /** * sensorhub属性参数 */ @@ -71,7 +75,7 @@ ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) // 设置EventLoopGroup .channel(NioServerSocketChannel.class) // 指明新的Channel的类型 - .childHandler(new SensorhubServerChannelInitialHandler()) // 指定ChannelHandler + .childHandler(pipeLine) // 指定ChannelHandler .option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) .childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) .option(ChannelOption.SO_BACKLOG, 1024) // 设置的ServerChannel的一些选项 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java index c3f82cc..02f1291 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java @@ -1,27 +1,38 @@ package com.casic.missiles.netty.handler; +import com.casic.missiles.parser.BirmmHexDecoder; import com.casic.missiles.parser.SensorhubDecoder; +import com.casic.missiles.parser.safe.impl.Sm4; +import com.casic.missiles.replier.CommonHexReplier; import com.casic.missiles.replier.SensorhubReplier; +import com.casic.missiles.util.SpringContextUtil; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; /** * @author cz * @date 2023-06-05 */ +@Component public class SensorhubServerChannelInitialHandler extends ChannelInitializer { - + @Resource + BirmmHexDecoder birmmHexDecoder; @Override protected void initChannel(SocketChannel socketChannel) { ChannelPipeline pipeline = socketChannel.pipeline(); pipeline.addLast(new LoggingHandler(LogLevel.INFO)); - pipeline.addLast(new SensorhubDecoder()); - pipeline.addLast(new SensorhubReplier()); +// pipeline.addLast(new SensorhubDecoder()); +// pipeline.addLast(birmmHexDecoder); + pipeline.addLast(new BirmmHexDecoder()); + pipeline.addLast(new CommonHexReplier()); // 心跳续约 // pipeline.addLast(this.heartBeatRespHandler); // pipeline.addLast(this.loginAuthRespHandler); 登录验证 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java new file mode 100644 index 0000000..6931af5 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -0,0 +1,106 @@ +package com.casic.missiles.parser; + +import cn.hutool.http.HttpUtil; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.model.DeviceFrameLog; +import com.casic.missiles.service.GeneralServiceImpl; +import com.casic.missiles.service.IDeviceBizDataService; +import com.casic.missiles.service.IDeviceFrameLogService; +import com.casic.missiles.service.IGeneralService; +import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; +import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; +import com.casic.missiles.util.SnowflakeUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author tanyue + * @date 2024-07 + * BirmmHexDecoder + */ +@Slf4j +@Component("BirmmHexDecoder") +public class BirmmHexDecoder extends ByteToMessageDecoder { + + IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); + + IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); + + IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + log.info("建立连接:{}", ctx.channel().id()); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.info("断开连接:{}", ctx.channel().id()); + } + + @Override + public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { + byte[] frameBytes = new byte[buffer.readableBytes()]; + buffer.readBytes(frameBytes); + log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + + // 工厂类创建frame对象 + BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); + if (birmmFrame != null) { + // 处理业务数据 + birmmFrame.doParseBizTag(); + + log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); + + // 保存日志 + DeviceFrameLog frameLog = new DeviceFrameLog(); + frameLog.setId(new SnowflakeUtil().nextId()); + frameLog.setDevcode(birmmFrame.getDevCode()); + frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase()); + frameLog.setRawBizFrame(birmmFrame.getRawBizFrameString()); + frameLog.setDataJson(birmmFrame.toJSON().toJSONString()); + frameLog.setLogtime(birmmFrame.getLogTime()); + frameLogService.save(frameLog); + + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + + // 保存业务数据 + if (birmmFrame.isBizDataFrame()) { + List bizDataList = birmmFrame.convertToBizDataList(); + for (DeviceBizData bizData : bizDataList) { + // 设置其他的属性 + bizData.setId(new SnowflakeUtil().nextId()); + bizData.setFrameLogId(frameLog.getId()); // 关联日志记录id + bizData.setDevcode(birmmFrame.getDevCode()); + bizData.setDeviceType(Integer.valueOf(birmmFrame.getDeviceType())); + bizData.setLogtime(birmmFrame.getLogTime()); + } + + // 批量保存 + bizDataService.saveBatch(bizDataList); + } + + // 创建回复消息 + BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + if (configFrame != null) { + // 根据协议进行封装 + String replyMessage = defaultService.replyMessage(configFrame); + log.info("下行HEX字节消息帧:{}", replyMessage); + + list.add(replyMessage); + } + } + } +} 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 2f90c5f..c79095b 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 @@ -36,9 +36,9 @@ String getSequence(byte[] frameBytes); String getTagListString(byte[] frameBytes); - Map getTagList(byte[] tagBytes); + Map> getTagList(byte[] tagBytes); - String buildTagListStr(Map tagList); + String buildTagListStr(Map> tagList); 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 8f0bd17..bda0040 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 @@ -1,6 +1,7 @@ package com.casic.missiles.parser.impl; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.frame.BirmmBaseTag; import com.casic.missiles.frame.BirmmTagBuilderFactory; import com.casic.missiles.parser.BirmmProtocolParser; @@ -10,7 +11,9 @@ import org.apache.tomcat.util.buf.HexUtils; import org.springframework.stereotype.Component; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; @Component @@ -129,12 +132,12 @@ } @Override - public Map getTagList(byte[] tagBytes) { + public Map> getTagList(byte[] tagBytes) { // 必须包含OID和长度 4 + 2 if (tagBytes.length < 6) { return null; } - Map tagList = new HashMap<>(); + Map> tagList = new HashMap<>(); int idx = 0; while (idx + 6 < tagBytes.length) { String oid = BytesUtil.extractHexString(tagBytes, idx, 4); @@ -149,7 +152,15 @@ log.debug("解析Tag:{}", tagBase); - tagList.put(tagBase.getClass().getSimpleName(), tagBase); + // 一包可能还有多个UploadTag 使用List + if (tagList.containsKey(tagBase.getClass().getSimpleName())) { + tagList.get(tagBase.getClass().getSimpleName()).add(tagBase); + } else { + List tags = new ArrayList<>(); + tags.add(tagBase); + tagList.put(tagBase.getClass().getSimpleName(), tags); + } + } } idx += tagLen; @@ -159,11 +170,13 @@ } @Override - public String buildTagListStr(Map tagList) { + public String buildTagListStr(Map> tagList) { StringBuilder result = new StringBuilder(); - for (BirmmBaseTag tag : tagList.values()) { - result.append(tag.toProtocolString()); + for (List tags : tagList.values()) { + for (BirmmBaseTag tag : tags) { + result.append(tag.toProtocolString()); + } } return result.toString().toUpperCase(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 4401a83..a0688c2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -45,7 +45,7 @@ }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); key.writeBytes(keyByte); - byte[] in = Hex.decode(cipher); + byte[] in = Hex.decode(fillFrameStructZero(cipher, 16)); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); return EcbEncrypt(in, keyBytes); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java new file mode 100644 index 0000000..6fa8cce --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -0,0 +1,46 @@ +package com.casic.missiles.replier; + +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.replier.command.AbstractBuildReplyCommand; +import com.casic.missiles.util.BytesUtil; +import com.casic.missiles.util.ClazzUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; + +/** + * @author tanyue + */ +@Slf4j +public class CommonHexReplier extends SimpleChannelInboundHandler { + + /** + * 回复内容构建的流程入口方法 + * 1、通过有标准协议解析器传来的结果进行命令的构建 + * 2、构建命令有以下的命令内容 + * (1)成功返回时间,并进行下发配置操作 + * (2)版本升级 + * (3)下位机下发版本是否升级,是上版本,是升级,请求,回复升级等流程 + * (4)其他未知需求命令 + */ + @Override + public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { + System.out.println("Client->Server:" + obj); + byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); + ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); + //进行回复 + ctx.channel().writeAndFlush(replyByteBuf); + } + + @Override + public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { + ctx.fireChannelReadComplete(); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/AEPCommandServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/AEPCommandServiceImpl.java index d728e30..b71d831 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/AEPCommandServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/AEPCommandServiceImpl.java @@ -3,7 +3,10 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.util.BytesUtil; +import com.ctg.ag.sdk.biz.AepDeviceCommandClient; import com.ctg.ag.sdk.biz.AepDeviceCommandLwmProfileClient; +import com.ctg.ag.sdk.biz.aep_device_command.CreateCommandRequest; +import com.ctg.ag.sdk.biz.aep_device_command.CreateCommandResponse; import com.ctg.ag.sdk.biz.aep_device_command_lwm_profile.CreateCommandLwm2mProfileRequest; import com.ctg.ag.sdk.biz.aep_device_command_lwm_profile.CreateCommandLwm2mProfileResponse; import lombok.Data; @@ -12,7 +15,6 @@ import org.springframework.context.annotation.Configuration; import java.nio.charset.StandardCharsets; -import java.util.Base64; @Configuration @Slf4j @@ -38,8 +40,44 @@ private String productId; @Override - public int handleSendCommand(String command) { - return 0; + public int handleSendCommand(String command, int dataType) { + AepDeviceCommandClient client = AepDeviceCommandClient.newClient().appKey(key).appSecret(secret).build(); + + JSONObject body = new JSONObject(); + JSONObject content = new JSONObject(); + + int retCode = -1; + + try { + //组装请求返回的参数 + CreateCommandRequest request = new CreateCommandRequest(); + request.setParamMasterKey(masterApiKey); + + body.put("deviceId", deviceId); + body.put("operator", operator); + body.put("productId", productId); + + content.put("dataType", dataType); // 数据类型:1字符串,2十六进制 + content.put("payload", command); // 指令内容,数据格式为十六进制时需要填十六进制字符串 + body.put("content", content); + + request.setBody(body.toJSONString().getBytes()); + log.info("向AEP平台发送指令:{}", body.toJSONString()); + + //调用电信平台的客服端发送报文回复 + CreateCommandResponse msgResponse = client.CreateCommand(request); + JSONObject retObj = JSON.parseObject(new String(msgResponse.getBody(), StandardCharsets.UTF_8)); + retCode = (int) retObj.get("code"); + + log.info("AEP平台返回消息:{}", retObj.toJSONString()); + + } catch (Exception ex) { + log.error("电信平台发送失败,异常信息{}", ex.getMessage()); + } finally { + client.shutdown(); + } + + return retCode; } @Override diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 70596b6..3ac4de7 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -69,7 +69,7 @@ enable: true sensorhub: config: - port: 7091 + port: 22009 bean: "functionCallback" url: "http://127.0.0.1:7093/push/test" fileUrl: D:\casic\file\ diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 8dcc497..da561cd 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -49,6 +49,12 @@ + cn.hutool + hutool-all + 5.7.16 + + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} 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 32dfdf3..140ee01 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 @@ -1,6 +1,10 @@ package com.casic.missiles.controller; +import cn.hutool.Hutool; import cn.hutool.core.lang.generator.UUIDGenerator; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.model.DeviceBizData; @@ -76,6 +80,12 @@ frameLog.setLogtime(birmmFrame.getLogTime()); frameLogService.save(frameLog); + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + // 保存业务数据 if (birmmFrame.isBizDataFrame()) { List bizDataList = birmmFrame.convertToBizDataList(); @@ -105,13 +115,15 @@ if (dataMap.containsKey("profile")) { hasProfile = (Boolean) dataMap.get("profile"); } - aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); + aepCmdService.setDeviceId((String) dataMap.get("deviceId")); aepCmdService.setProductId((String) dataMap.get("productId")); if (hasProfile) { + aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); retCode = aepCmdService.handleSendCommandWithProfile(replyMessage); } else { - retCode = aepCmdService.handleSendCommand(replyMessage); + aepCmdService.setMasterApiKey("ee2f4011f0a04f28b1572967891b57d5"); + retCode = aepCmdService.handleSendCommand(replyMessage, 2); // 2=16进制 } if (retCode == 0) { 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 f934d86..e22284a 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 @@ -48,7 +48,7 @@ // 业务字段List String tagListString; - Map tagList; + Map> tagList; // CRC String crc; @@ -83,7 +83,9 @@ DateTimeTag dateTimeTag = new DateTimeTag(); dateTimeTag.setDateTime(LocalDateTime.now()); - tagList.put(DateTimeTag.class.getSimpleName(), dateTimeTag); + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); } } 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 ef031b8..772092d 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 @@ -2,6 +2,7 @@ import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; +import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; public class BirmmFrameBuilderFactory { @@ -12,6 +13,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); + case WELL: return null; @@ -31,6 +35,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); + case WELL: return null; 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 index 71023ee..3617ae7 100644 --- 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 @@ -9,6 +9,9 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + case UP_TRAP_REQUEST: return new MethaneTrapRequestFrame(); @@ -30,6 +33,10 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE return new MethaneTrapResponseFrame(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java new file mode 100644 index 0000000..a1fd8bc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java @@ -0,0 +1,43 @@ +package com.casic.missiles.frame.methane; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; +import com.casic.missiles.frame.tag.ota.RequestSizeTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; + +import java.time.format.DateTimeFormatter; + +public class MethaneGetRequestFrame extends BirmmBaseFrame { + + private final String DEV_TYPE = "Methane"; + private final String MESSAGE_TYPE = "GetRequest"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); + body.put("reqSize", tag.getRequestSize()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); + body.put("reqOffset", tag.getRequestOffset()); + } + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java new file mode 100644 index 0000000..5f49fe7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.ota.PackageDataTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MethaneGetResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.UP_GET_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } + + @Override + public void replyBizTag() { + // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) + // TODO-LIST + + Map> tagList = new HashMap<>(); + + RequestOffsetTag offsetTag = new RequestOffsetTag(); + offsetTag.setRequestOffset(0); + List offsetTags = new ArrayList<>(); + offsetTags.add(offsetTag); + tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); + + PackageDataTag dataTag = new PackageDataTag(); + dataTag.setData(new byte[] {0}); + List dataTags = new ArrayList<>(); + dataTags.add(dataTag); + tagList.put(PackageDataTag.class.getSimpleName(), dataTags); + + super.setTagList(tagList); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java index 37b7fc8..e936a9c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java @@ -22,7 +22,7 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()); + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); body.put("softwareVersion", tag.getVersion()); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java index cd62d6d..d478366 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java @@ -3,11 +3,11 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.frame.BirmmBaseTag; -import com.casic.missiles.frame.tag.config.DateTimeTag; -import com.casic.missiles.frame.tag.ota.OTANeedTag; +import com.casic.missiles.frame.tag.ota.NeedOTATag; -import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; public class MethaneOnlineResponseFrame extends BirmmBaseFrame { @@ -27,12 +27,16 @@ @Override public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map tagList = new HashMap<>(); - OTANeedTag needTag = new OTANeedTag(); + Map> tagList = new HashMap<>(); + NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); - tagList.put(OTANeedTag.class.getSimpleName(), needTag); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); super.setTagList(tagList); } } 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 690b9c5..6ba27f6 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 @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; import com.casic.missiles.frame.tag.biz.CellTag; import com.casic.missiles.frame.tag.biz.DateTag; import com.casic.missiles.frame.tag.biz.SensorStateTag; @@ -39,19 +40,19 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); body.put("cell", cellTag.getCellVal()); } if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); body.put("pci", pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); body.put("rsrp", rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); body.put("snr", snrTag.getSnr()); } @@ -86,21 +87,21 @@ // 电量 if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); bizData.setCell(cellTag.getCellVal()); } // 信号质量 if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); bizData.setPci(pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); bizData.setRsrp(rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); bizData.setSnr(snrTag.getSnr()); } @@ -123,47 +124,57 @@ } private void handleUploadTag() { - UploadTag uploadTag = (UploadTag) getTagList().get(UploadTag.class.getSimpleName()); + List tags = getTagList().get(UploadTag.class.getSimpleName()); - // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 - boolean isValid = uploadTag.checkOid(); - if (isValid) { - // 找到DateTag 取出其中的日期 - DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()); - uploadTag.setStartDate(dateTag.getDate()); + bizDataList = new ArrayList<>(); - 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(); + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); - 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)); // 转成浮点数 + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + MethaneBizData bizData = new MethaneBizData(); - bizDataList.add(bizData); + 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)); // 转成浮点数 - // 加上时间间隔 - start = start.plusMinutes(uploadTag.getInterval()); + bizDataList.add(bizData); + + // 加上时间间隔 + start = start.plusMinutes(uploadTag.getInterval()); + } } } } private void handleSensorStateTag() { - SensorStateTag sensorStateTag = (SensorStateTag) getTagList().get(SensorStateTag.class.getSimpleName()); - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { - // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { - // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - // TODO-LIST - // 传感器状态异常时需要上报异常事件 + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java new file mode 100644 index 0000000..458e393 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java @@ -0,0 +1,28 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class SentinelBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + "][" + value + "][" + bizType + "]"; + } + + public JSONObject toJSON() { + JSONObject json = new JSONObject(); + json.put(BirmmDataBizTypeEnums.toType(bizType).getName(), String.format("%.3f", value)); + json.put("uptime", uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java new file mode 100644 index 0000000..bafe173 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java @@ -0,0 +1,56 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.methane.*; + +public class SentinelFrameBuilderFactory { + + public static BirmmBaseFrame createSentinelFrameByOperation(String operaType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + + case UP_TRAP_REQUEST: + return new SentinelTrapRequestFrame(); + + case UP_ONLINE_REQUEST: + return new MethaneOnlineRequestFrame(); + + case UP_SET_RESPONSE: + return new MethaneSetResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } + + public static BirmmBaseFrame createSentinelReplyFrameByOperation(String uploadOperationType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + + case UP_TRAP_REQUEST: + // TRAP_REQUEST消息回复TRAP_RESPONSE + return new SentinelTrapResponseFrame(); + + case UP_ONLINE_REQUEST: + // ONLINE_REQUEST消息回复ONLINE_RESPONSE + return new MethaneOnlineResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java new file mode 100644 index 0000000..a36d243 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -0,0 +1,180 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.biz.DateTag; +import com.casic.missiles.frame.tag.biz.SensorStateTag; +import com.casic.missiles.frame.tag.biz.UploadTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; +import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.BytesUtil; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Slf4j +public class SentinelTrapRequestFrame extends BirmmBaseFrame { + + private List bizDataList; + + private final String DEV_TYPE = "Sentinel"; + private final String MESSAGE_TYPE = "Data"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + body.put("cell", cellTag.getCellVal()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + body.put("pci", pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + body.put("rsrp", rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + body.put("snr", snrTag.getSnr()); + } + + // 业务数据 + if (bizDataList != null) { + JSONArray datas = new JSONArray(); + for (SentinelBizData bizData : bizDataList) { + datas.add(bizData.toJSON()); + } + body.put("datas", datas); + } + + json.put("mBody", body); + + return json; + } + + @Override + public boolean isBizDataFrame() { + return true; + } + + @Override + public List convertToBizDataList() { + List resultList = new ArrayList<>(); + if (bizDataList != null) { + for (SentinelBizData data : bizDataList) { + DeviceBizData bizData = new DeviceBizData(); + bizData.setBizType(String.valueOf(data.getBizType())); + bizData.setValue(String.format("%.3f", data.getValue())); + bizData.setUptime(data.getUptime()); + + // 电量 + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + bizData.setCell(cellTag.getCellVal()); + } + + // 信号质量 + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + bizData.setPci(pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + bizData.setRsrp(rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + bizData.setSnr(snrTag.getSnr()); + } + + resultList.add(bizData); + } + } + + return resultList; + } + + @Override + public void doParseBizTag() { + if (getTagList().containsKey(UploadTag.class.getSimpleName())) { + handleUploadTag(); + } + + if (getTagList().containsKey(SensorStateTag.class.getSimpleName())) { + handleSensorStateTag(); + } + } + + private void handleUploadTag() { + List tags = getTagList().get(UploadTag.class.getSimpleName()); + + bizDataList = new ArrayList<>(); + + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); + + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + SentinelBizData bizData = new SentinelBizData(); + + 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() { + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java new file mode 100644 index 0000000..2a87b3f --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java @@ -0,0 +1,20 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; + +public class SentinelTrapResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java new file mode 100644 index 0000000..8e40b85 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class NeedOTATag extends BirmmBaseTag { + + final String NEED_OTA_TAG_OID = "60000600"; + + boolean need; + + @Override + public String toString() { + return super.toString() + "[value: " + need + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength() * 2 + "x", need ? 1 : 0); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + need = Boolean.parseBoolean(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java deleted file mode 100644 index 884b44f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.frame.tag.ota; - -import com.casic.missiles.enums.BirmmTagTypeEnums; -import com.casic.missiles.frame.BirmmBaseTag; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -@Data -public class OTANeedTag extends BirmmBaseTag { - - final String OTA_NEED_TAG_OID = "60000600"; - - boolean need; - - @Override - public String toString() { - return super.toString() + "[value: " + need + "]"; - } - - @Override - public String toProtocolString() { - String result = ""; - result += BirmmTagTypeEnums.OTA_NEED_TAG.getName(); // OID - result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_TAG.getLength()); // 长度 - result += String.format("%02x", need ? 1 : 0); - - return result; - } - - @Override - public void setValueStr(String valueStr) { - super.setValueStr(valueStr); - need = Boolean.parseBoolean(valueStr); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java new file mode 100644 index 0000000..08dafcf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageCRCTag extends BirmmBaseTag { + + final String PACKAGE_CRC_TAG_OID = "60000603"; + + String packCRC; + + @Override + public String toString() { + return super.toString() + "[value: " + packCRC + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength() * 2 + "x", packCRC); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + packCRC = valueStr; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java new file mode 100644 index 0000000..f9801a2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.tomcat.util.buf.HexUtils; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageDataTag extends BirmmBaseTag { + + final String PACKAGE_DATA_TAG_OID = "60000601"; + + byte[] data; + + @Override + public String toString() { + return super.toString() + "[value: " + HexUtils.toHexString(data) + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_DATA_TAG.getName(); // OID + result += String.format("%04d", data.length); // 长度 + result += HexUtils.toHexString(data); + + return result; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java new file mode 100644 index 0000000..05ff3c1 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageSizeTag extends BirmmBaseTag { + + final String PACKAGE_SIZE_TAG_OID = "60000602"; + + int packSize; + + @Override + public String toString() { + return super.toString() + "[value: " + packSize + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength() * 2 + "x", packSize); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + packSize = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java new file mode 100644 index 0000000..bfc83dd --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java @@ -0,0 +1,37 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class RequestOffsetTag extends BirmmBaseTag { + + final String REQUEST_OFFSET_TAG_OID = "20000102"; + + // 本次请求的升级包偏移量 + int requestOffset; + + @Override + public String toString() { + return super.toString() + "[value: " + requestOffset + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength() * 2 + "x", requestOffset); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + requestOffset = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java new file mode 100644 index 0000000..6c096a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java @@ -0,0 +1,27 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class RequestSizeTag extends BirmmBaseTag { + + final String REQUEST_SIZE_TAG_OID = "20000100"; + + // 本次请求的升级包大小 + int requestSize; + + @Override + public String toString() { + return super.toString() + "[value: " + requestSize + "]"; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + requestSize = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 91c81d0..207eca2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -15,6 +15,7 @@ import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; +import javax.annotation.Resource; /** * SensorhubServer netty服务端 @@ -32,6 +33,9 @@ EventLoopGroup bossGroup = new NioEventLoopGroup(4); // boss EventLoopGroup workerGroup = new NioEventLoopGroup(32); // worker + @Resource + SensorhubServerChannelInitialHandler pipeLine; + /** * sensorhub属性参数 */ @@ -71,7 +75,7 @@ ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) // 设置EventLoopGroup .channel(NioServerSocketChannel.class) // 指明新的Channel的类型 - .childHandler(new SensorhubServerChannelInitialHandler()) // 指定ChannelHandler + .childHandler(pipeLine) // 指定ChannelHandler .option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) .childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) .option(ChannelOption.SO_BACKLOG, 1024) // 设置的ServerChannel的一些选项 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java index c3f82cc..02f1291 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java @@ -1,27 +1,38 @@ package com.casic.missiles.netty.handler; +import com.casic.missiles.parser.BirmmHexDecoder; import com.casic.missiles.parser.SensorhubDecoder; +import com.casic.missiles.parser.safe.impl.Sm4; +import com.casic.missiles.replier.CommonHexReplier; import com.casic.missiles.replier.SensorhubReplier; +import com.casic.missiles.util.SpringContextUtil; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; /** * @author cz * @date 2023-06-05 */ +@Component public class SensorhubServerChannelInitialHandler extends ChannelInitializer { - + @Resource + BirmmHexDecoder birmmHexDecoder; @Override protected void initChannel(SocketChannel socketChannel) { ChannelPipeline pipeline = socketChannel.pipeline(); pipeline.addLast(new LoggingHandler(LogLevel.INFO)); - pipeline.addLast(new SensorhubDecoder()); - pipeline.addLast(new SensorhubReplier()); +// pipeline.addLast(new SensorhubDecoder()); +// pipeline.addLast(birmmHexDecoder); + pipeline.addLast(new BirmmHexDecoder()); + pipeline.addLast(new CommonHexReplier()); // 心跳续约 // pipeline.addLast(this.heartBeatRespHandler); // pipeline.addLast(this.loginAuthRespHandler); 登录验证 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java new file mode 100644 index 0000000..6931af5 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -0,0 +1,106 @@ +package com.casic.missiles.parser; + +import cn.hutool.http.HttpUtil; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.model.DeviceFrameLog; +import com.casic.missiles.service.GeneralServiceImpl; +import com.casic.missiles.service.IDeviceBizDataService; +import com.casic.missiles.service.IDeviceFrameLogService; +import com.casic.missiles.service.IGeneralService; +import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; +import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; +import com.casic.missiles.util.SnowflakeUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author tanyue + * @date 2024-07 + * BirmmHexDecoder + */ +@Slf4j +@Component("BirmmHexDecoder") +public class BirmmHexDecoder extends ByteToMessageDecoder { + + IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); + + IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); + + IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + log.info("建立连接:{}", ctx.channel().id()); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.info("断开连接:{}", ctx.channel().id()); + } + + @Override + public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { + byte[] frameBytes = new byte[buffer.readableBytes()]; + buffer.readBytes(frameBytes); + log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + + // 工厂类创建frame对象 + BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); + if (birmmFrame != null) { + // 处理业务数据 + birmmFrame.doParseBizTag(); + + log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); + + // 保存日志 + DeviceFrameLog frameLog = new DeviceFrameLog(); + frameLog.setId(new SnowflakeUtil().nextId()); + frameLog.setDevcode(birmmFrame.getDevCode()); + frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase()); + frameLog.setRawBizFrame(birmmFrame.getRawBizFrameString()); + frameLog.setDataJson(birmmFrame.toJSON().toJSONString()); + frameLog.setLogtime(birmmFrame.getLogTime()); + frameLogService.save(frameLog); + + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + + // 保存业务数据 + if (birmmFrame.isBizDataFrame()) { + List bizDataList = birmmFrame.convertToBizDataList(); + for (DeviceBizData bizData : bizDataList) { + // 设置其他的属性 + bizData.setId(new SnowflakeUtil().nextId()); + bizData.setFrameLogId(frameLog.getId()); // 关联日志记录id + bizData.setDevcode(birmmFrame.getDevCode()); + bizData.setDeviceType(Integer.valueOf(birmmFrame.getDeviceType())); + bizData.setLogtime(birmmFrame.getLogTime()); + } + + // 批量保存 + bizDataService.saveBatch(bizDataList); + } + + // 创建回复消息 + BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + if (configFrame != null) { + // 根据协议进行封装 + String replyMessage = defaultService.replyMessage(configFrame); + log.info("下行HEX字节消息帧:{}", replyMessage); + + list.add(replyMessage); + } + } + } +} 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 2f90c5f..c79095b 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 @@ -36,9 +36,9 @@ String getSequence(byte[] frameBytes); String getTagListString(byte[] frameBytes); - Map getTagList(byte[] tagBytes); + Map> getTagList(byte[] tagBytes); - String buildTagListStr(Map tagList); + String buildTagListStr(Map> tagList); 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 8f0bd17..bda0040 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 @@ -1,6 +1,7 @@ package com.casic.missiles.parser.impl; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.frame.BirmmBaseTag; import com.casic.missiles.frame.BirmmTagBuilderFactory; import com.casic.missiles.parser.BirmmProtocolParser; @@ -10,7 +11,9 @@ import org.apache.tomcat.util.buf.HexUtils; import org.springframework.stereotype.Component; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; @Component @@ -129,12 +132,12 @@ } @Override - public Map getTagList(byte[] tagBytes) { + public Map> getTagList(byte[] tagBytes) { // 必须包含OID和长度 4 + 2 if (tagBytes.length < 6) { return null; } - Map tagList = new HashMap<>(); + Map> tagList = new HashMap<>(); int idx = 0; while (idx + 6 < tagBytes.length) { String oid = BytesUtil.extractHexString(tagBytes, idx, 4); @@ -149,7 +152,15 @@ log.debug("解析Tag:{}", tagBase); - tagList.put(tagBase.getClass().getSimpleName(), tagBase); + // 一包可能还有多个UploadTag 使用List + if (tagList.containsKey(tagBase.getClass().getSimpleName())) { + tagList.get(tagBase.getClass().getSimpleName()).add(tagBase); + } else { + List tags = new ArrayList<>(); + tags.add(tagBase); + tagList.put(tagBase.getClass().getSimpleName(), tags); + } + } } idx += tagLen; @@ -159,11 +170,13 @@ } @Override - public String buildTagListStr(Map tagList) { + public String buildTagListStr(Map> tagList) { StringBuilder result = new StringBuilder(); - for (BirmmBaseTag tag : tagList.values()) { - result.append(tag.toProtocolString()); + for (List tags : tagList.values()) { + for (BirmmBaseTag tag : tags) { + result.append(tag.toProtocolString()); + } } return result.toString().toUpperCase(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 4401a83..a0688c2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -45,7 +45,7 @@ }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); key.writeBytes(keyByte); - byte[] in = Hex.decode(cipher); + byte[] in = Hex.decode(fillFrameStructZero(cipher, 16)); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); return EcbEncrypt(in, keyBytes); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java new file mode 100644 index 0000000..6fa8cce --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -0,0 +1,46 @@ +package com.casic.missiles.replier; + +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.replier.command.AbstractBuildReplyCommand; +import com.casic.missiles.util.BytesUtil; +import com.casic.missiles.util.ClazzUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; + +/** + * @author tanyue + */ +@Slf4j +public class CommonHexReplier extends SimpleChannelInboundHandler { + + /** + * 回复内容构建的流程入口方法 + * 1、通过有标准协议解析器传来的结果进行命令的构建 + * 2、构建命令有以下的命令内容 + * (1)成功返回时间,并进行下发配置操作 + * (2)版本升级 + * (3)下位机下发版本是否升级,是上版本,是升级,请求,回复升级等流程 + * (4)其他未知需求命令 + */ + @Override + public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { + System.out.println("Client->Server:" + obj); + byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); + ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); + //进行回复 + ctx.channel().writeAndFlush(replyByteBuf); + } + + @Override + public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { + ctx.fireChannelReadComplete(); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/AEPCommandServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/AEPCommandServiceImpl.java index d728e30..b71d831 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/AEPCommandServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/AEPCommandServiceImpl.java @@ -3,7 +3,10 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.util.BytesUtil; +import com.ctg.ag.sdk.biz.AepDeviceCommandClient; import com.ctg.ag.sdk.biz.AepDeviceCommandLwmProfileClient; +import com.ctg.ag.sdk.biz.aep_device_command.CreateCommandRequest; +import com.ctg.ag.sdk.biz.aep_device_command.CreateCommandResponse; import com.ctg.ag.sdk.biz.aep_device_command_lwm_profile.CreateCommandLwm2mProfileRequest; import com.ctg.ag.sdk.biz.aep_device_command_lwm_profile.CreateCommandLwm2mProfileResponse; import lombok.Data; @@ -12,7 +15,6 @@ import org.springframework.context.annotation.Configuration; import java.nio.charset.StandardCharsets; -import java.util.Base64; @Configuration @Slf4j @@ -38,8 +40,44 @@ private String productId; @Override - public int handleSendCommand(String command) { - return 0; + public int handleSendCommand(String command, int dataType) { + AepDeviceCommandClient client = AepDeviceCommandClient.newClient().appKey(key).appSecret(secret).build(); + + JSONObject body = new JSONObject(); + JSONObject content = new JSONObject(); + + int retCode = -1; + + try { + //组装请求返回的参数 + CreateCommandRequest request = new CreateCommandRequest(); + request.setParamMasterKey(masterApiKey); + + body.put("deviceId", deviceId); + body.put("operator", operator); + body.put("productId", productId); + + content.put("dataType", dataType); // 数据类型:1字符串,2十六进制 + content.put("payload", command); // 指令内容,数据格式为十六进制时需要填十六进制字符串 + body.put("content", content); + + request.setBody(body.toJSONString().getBytes()); + log.info("向AEP平台发送指令:{}", body.toJSONString()); + + //调用电信平台的客服端发送报文回复 + CreateCommandResponse msgResponse = client.CreateCommand(request); + JSONObject retObj = JSON.parseObject(new String(msgResponse.getBody(), StandardCharsets.UTF_8)); + retCode = (int) retObj.get("code"); + + log.info("AEP平台返回消息:{}", retObj.toJSONString()); + + } catch (Exception ex) { + log.error("电信平台发送失败,异常信息{}", ex.getMessage()); + } finally { + client.shutdown(); + } + + return retCode; } @Override 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 006c51d..da20a28 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 @@ -1,5 +1,6 @@ package com.casic.missiles.service; +import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; @@ -8,6 +9,8 @@ import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.parser.safe.impl.Sm4; +import com.casic.missiles.parser.safe.impl.TeaUtilsX; +import com.casic.missiles.parser.safe.impl.Teas; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.tomcat.util.buf.HexUtils; @@ -63,14 +66,20 @@ // 解密 // TODO-LIST // 密钥根据设备编号获取 - SafeStrategy safeStrategy = SpringContextUtil.getBean(Sm4.class); - byte[] plainBytes = safeStrategy.decryption(tagListStr, keyByte); + SafeStrategy safeStrategy; + if (deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue())) { + safeStrategy = SpringContextUtil.getBean(Sm4.class); + } else { + safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); + } + + byte[] plainBytes = safeStrategy.decryption(tagListStr); String plainTagListStr = HexUtils.toHexString(plainBytes).toUpperCase(); log.info("上行业务字段:{}", plainTagListStr); // 获得业务字段tagList - Map tagList = protocol.getTagList(plainBytes); + Map> tagList = protocol.getTagList(plainBytes); // 创建Frame BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); @@ -147,8 +156,14 @@ // 加密 // TODO-LIST // 密钥根据设备编号获取 - SafeStrategy safeStrategy = SpringContextUtil.getBean(Sm4.class); - byte[] tagBytes = safeStrategy.encryption(plainTagListStr, keyByte); + SafeStrategy safeStrategy; + if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue())) { + safeStrategy = SpringContextUtil.getBean(Sm4.class); + } else { + safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); + } + + byte[] tagBytes = safeStrategy.encryption(plainTagListStr); frame.append(HexUtils.toHexString(tagBytes).toUpperCase()); // 计算CRC校验码 diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 70596b6..3ac4de7 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -69,7 +69,7 @@ enable: true sensorhub: config: - port: 7091 + port: 22009 bean: "functionCallback" url: "http://127.0.0.1:7093/push/test" fileUrl: D:\casic\file\ diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 8dcc497..da561cd 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -49,6 +49,12 @@ + cn.hutool + hutool-all + 5.7.16 + + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} 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 32dfdf3..140ee01 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 @@ -1,6 +1,10 @@ package com.casic.missiles.controller; +import cn.hutool.Hutool; import cn.hutool.core.lang.generator.UUIDGenerator; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.model.DeviceBizData; @@ -76,6 +80,12 @@ frameLog.setLogtime(birmmFrame.getLogTime()); frameLogService.save(frameLog); + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + // 保存业务数据 if (birmmFrame.isBizDataFrame()) { List bizDataList = birmmFrame.convertToBizDataList(); @@ -105,13 +115,15 @@ if (dataMap.containsKey("profile")) { hasProfile = (Boolean) dataMap.get("profile"); } - aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); + aepCmdService.setDeviceId((String) dataMap.get("deviceId")); aepCmdService.setProductId((String) dataMap.get("productId")); if (hasProfile) { + aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); retCode = aepCmdService.handleSendCommandWithProfile(replyMessage); } else { - retCode = aepCmdService.handleSendCommand(replyMessage); + aepCmdService.setMasterApiKey("ee2f4011f0a04f28b1572967891b57d5"); + retCode = aepCmdService.handleSendCommand(replyMessage, 2); // 2=16进制 } if (retCode == 0) { 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 f934d86..e22284a 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 @@ -48,7 +48,7 @@ // 业务字段List String tagListString; - Map tagList; + Map> tagList; // CRC String crc; @@ -83,7 +83,9 @@ DateTimeTag dateTimeTag = new DateTimeTag(); dateTimeTag.setDateTime(LocalDateTime.now()); - tagList.put(DateTimeTag.class.getSimpleName(), dateTimeTag); + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); } } 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 ef031b8..772092d 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 @@ -2,6 +2,7 @@ import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; +import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; public class BirmmFrameBuilderFactory { @@ -12,6 +13,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); + case WELL: return null; @@ -31,6 +35,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); + case WELL: return null; 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 index 71023ee..3617ae7 100644 --- 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 @@ -9,6 +9,9 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + case UP_TRAP_REQUEST: return new MethaneTrapRequestFrame(); @@ -30,6 +33,10 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE return new MethaneTrapResponseFrame(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java new file mode 100644 index 0000000..a1fd8bc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java @@ -0,0 +1,43 @@ +package com.casic.missiles.frame.methane; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; +import com.casic.missiles.frame.tag.ota.RequestSizeTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; + +import java.time.format.DateTimeFormatter; + +public class MethaneGetRequestFrame extends BirmmBaseFrame { + + private final String DEV_TYPE = "Methane"; + private final String MESSAGE_TYPE = "GetRequest"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); + body.put("reqSize", tag.getRequestSize()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); + body.put("reqOffset", tag.getRequestOffset()); + } + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java new file mode 100644 index 0000000..5f49fe7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.ota.PackageDataTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MethaneGetResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.UP_GET_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } + + @Override + public void replyBizTag() { + // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) + // TODO-LIST + + Map> tagList = new HashMap<>(); + + RequestOffsetTag offsetTag = new RequestOffsetTag(); + offsetTag.setRequestOffset(0); + List offsetTags = new ArrayList<>(); + offsetTags.add(offsetTag); + tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); + + PackageDataTag dataTag = new PackageDataTag(); + dataTag.setData(new byte[] {0}); + List dataTags = new ArrayList<>(); + dataTags.add(dataTag); + tagList.put(PackageDataTag.class.getSimpleName(), dataTags); + + super.setTagList(tagList); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java index 37b7fc8..e936a9c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java @@ -22,7 +22,7 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()); + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); body.put("softwareVersion", tag.getVersion()); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java index cd62d6d..d478366 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java @@ -3,11 +3,11 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.frame.BirmmBaseTag; -import com.casic.missiles.frame.tag.config.DateTimeTag; -import com.casic.missiles.frame.tag.ota.OTANeedTag; +import com.casic.missiles.frame.tag.ota.NeedOTATag; -import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; public class MethaneOnlineResponseFrame extends BirmmBaseFrame { @@ -27,12 +27,16 @@ @Override public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map tagList = new HashMap<>(); - OTANeedTag needTag = new OTANeedTag(); + Map> tagList = new HashMap<>(); + NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); - tagList.put(OTANeedTag.class.getSimpleName(), needTag); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); super.setTagList(tagList); } } 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 690b9c5..6ba27f6 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 @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; import com.casic.missiles.frame.tag.biz.CellTag; import com.casic.missiles.frame.tag.biz.DateTag; import com.casic.missiles.frame.tag.biz.SensorStateTag; @@ -39,19 +40,19 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); body.put("cell", cellTag.getCellVal()); } if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); body.put("pci", pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); body.put("rsrp", rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); body.put("snr", snrTag.getSnr()); } @@ -86,21 +87,21 @@ // 电量 if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); bizData.setCell(cellTag.getCellVal()); } // 信号质量 if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); bizData.setPci(pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); bizData.setRsrp(rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); bizData.setSnr(snrTag.getSnr()); } @@ -123,47 +124,57 @@ } private void handleUploadTag() { - UploadTag uploadTag = (UploadTag) getTagList().get(UploadTag.class.getSimpleName()); + List tags = getTagList().get(UploadTag.class.getSimpleName()); - // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 - boolean isValid = uploadTag.checkOid(); - if (isValid) { - // 找到DateTag 取出其中的日期 - DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()); - uploadTag.setStartDate(dateTag.getDate()); + bizDataList = new ArrayList<>(); - 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(); + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); - 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)); // 转成浮点数 + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + MethaneBizData bizData = new MethaneBizData(); - bizDataList.add(bizData); + 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)); // 转成浮点数 - // 加上时间间隔 - start = start.plusMinutes(uploadTag.getInterval()); + bizDataList.add(bizData); + + // 加上时间间隔 + start = start.plusMinutes(uploadTag.getInterval()); + } } } } private void handleSensorStateTag() { - SensorStateTag sensorStateTag = (SensorStateTag) getTagList().get(SensorStateTag.class.getSimpleName()); - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { - // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { - // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - // TODO-LIST - // 传感器状态异常时需要上报异常事件 + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java new file mode 100644 index 0000000..458e393 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java @@ -0,0 +1,28 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class SentinelBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + "][" + value + "][" + bizType + "]"; + } + + public JSONObject toJSON() { + JSONObject json = new JSONObject(); + json.put(BirmmDataBizTypeEnums.toType(bizType).getName(), String.format("%.3f", value)); + json.put("uptime", uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java new file mode 100644 index 0000000..bafe173 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java @@ -0,0 +1,56 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.methane.*; + +public class SentinelFrameBuilderFactory { + + public static BirmmBaseFrame createSentinelFrameByOperation(String operaType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + + case UP_TRAP_REQUEST: + return new SentinelTrapRequestFrame(); + + case UP_ONLINE_REQUEST: + return new MethaneOnlineRequestFrame(); + + case UP_SET_RESPONSE: + return new MethaneSetResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } + + public static BirmmBaseFrame createSentinelReplyFrameByOperation(String uploadOperationType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + + case UP_TRAP_REQUEST: + // TRAP_REQUEST消息回复TRAP_RESPONSE + return new SentinelTrapResponseFrame(); + + case UP_ONLINE_REQUEST: + // ONLINE_REQUEST消息回复ONLINE_RESPONSE + return new MethaneOnlineResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java new file mode 100644 index 0000000..a36d243 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -0,0 +1,180 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.biz.DateTag; +import com.casic.missiles.frame.tag.biz.SensorStateTag; +import com.casic.missiles.frame.tag.biz.UploadTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; +import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.BytesUtil; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Slf4j +public class SentinelTrapRequestFrame extends BirmmBaseFrame { + + private List bizDataList; + + private final String DEV_TYPE = "Sentinel"; + private final String MESSAGE_TYPE = "Data"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + body.put("cell", cellTag.getCellVal()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + body.put("pci", pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + body.put("rsrp", rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + body.put("snr", snrTag.getSnr()); + } + + // 业务数据 + if (bizDataList != null) { + JSONArray datas = new JSONArray(); + for (SentinelBizData bizData : bizDataList) { + datas.add(bizData.toJSON()); + } + body.put("datas", datas); + } + + json.put("mBody", body); + + return json; + } + + @Override + public boolean isBizDataFrame() { + return true; + } + + @Override + public List convertToBizDataList() { + List resultList = new ArrayList<>(); + if (bizDataList != null) { + for (SentinelBizData data : bizDataList) { + DeviceBizData bizData = new DeviceBizData(); + bizData.setBizType(String.valueOf(data.getBizType())); + bizData.setValue(String.format("%.3f", data.getValue())); + bizData.setUptime(data.getUptime()); + + // 电量 + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + bizData.setCell(cellTag.getCellVal()); + } + + // 信号质量 + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + bizData.setPci(pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + bizData.setRsrp(rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + bizData.setSnr(snrTag.getSnr()); + } + + resultList.add(bizData); + } + } + + return resultList; + } + + @Override + public void doParseBizTag() { + if (getTagList().containsKey(UploadTag.class.getSimpleName())) { + handleUploadTag(); + } + + if (getTagList().containsKey(SensorStateTag.class.getSimpleName())) { + handleSensorStateTag(); + } + } + + private void handleUploadTag() { + List tags = getTagList().get(UploadTag.class.getSimpleName()); + + bizDataList = new ArrayList<>(); + + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); + + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + SentinelBizData bizData = new SentinelBizData(); + + 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() { + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java new file mode 100644 index 0000000..2a87b3f --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java @@ -0,0 +1,20 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; + +public class SentinelTrapResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java new file mode 100644 index 0000000..8e40b85 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class NeedOTATag extends BirmmBaseTag { + + final String NEED_OTA_TAG_OID = "60000600"; + + boolean need; + + @Override + public String toString() { + return super.toString() + "[value: " + need + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength() * 2 + "x", need ? 1 : 0); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + need = Boolean.parseBoolean(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java deleted file mode 100644 index 884b44f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.frame.tag.ota; - -import com.casic.missiles.enums.BirmmTagTypeEnums; -import com.casic.missiles.frame.BirmmBaseTag; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -@Data -public class OTANeedTag extends BirmmBaseTag { - - final String OTA_NEED_TAG_OID = "60000600"; - - boolean need; - - @Override - public String toString() { - return super.toString() + "[value: " + need + "]"; - } - - @Override - public String toProtocolString() { - String result = ""; - result += BirmmTagTypeEnums.OTA_NEED_TAG.getName(); // OID - result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_TAG.getLength()); // 长度 - result += String.format("%02x", need ? 1 : 0); - - return result; - } - - @Override - public void setValueStr(String valueStr) { - super.setValueStr(valueStr); - need = Boolean.parseBoolean(valueStr); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java new file mode 100644 index 0000000..08dafcf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageCRCTag extends BirmmBaseTag { + + final String PACKAGE_CRC_TAG_OID = "60000603"; + + String packCRC; + + @Override + public String toString() { + return super.toString() + "[value: " + packCRC + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength() * 2 + "x", packCRC); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + packCRC = valueStr; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java new file mode 100644 index 0000000..f9801a2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.tomcat.util.buf.HexUtils; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageDataTag extends BirmmBaseTag { + + final String PACKAGE_DATA_TAG_OID = "60000601"; + + byte[] data; + + @Override + public String toString() { + return super.toString() + "[value: " + HexUtils.toHexString(data) + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_DATA_TAG.getName(); // OID + result += String.format("%04d", data.length); // 长度 + result += HexUtils.toHexString(data); + + return result; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java new file mode 100644 index 0000000..05ff3c1 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageSizeTag extends BirmmBaseTag { + + final String PACKAGE_SIZE_TAG_OID = "60000602"; + + int packSize; + + @Override + public String toString() { + return super.toString() + "[value: " + packSize + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength() * 2 + "x", packSize); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + packSize = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java new file mode 100644 index 0000000..bfc83dd --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java @@ -0,0 +1,37 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class RequestOffsetTag extends BirmmBaseTag { + + final String REQUEST_OFFSET_TAG_OID = "20000102"; + + // 本次请求的升级包偏移量 + int requestOffset; + + @Override + public String toString() { + return super.toString() + "[value: " + requestOffset + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength() * 2 + "x", requestOffset); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + requestOffset = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java new file mode 100644 index 0000000..6c096a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java @@ -0,0 +1,27 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class RequestSizeTag extends BirmmBaseTag { + + final String REQUEST_SIZE_TAG_OID = "20000100"; + + // 本次请求的升级包大小 + int requestSize; + + @Override + public String toString() { + return super.toString() + "[value: " + requestSize + "]"; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + requestSize = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 91c81d0..207eca2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -15,6 +15,7 @@ import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; +import javax.annotation.Resource; /** * SensorhubServer netty服务端 @@ -32,6 +33,9 @@ EventLoopGroup bossGroup = new NioEventLoopGroup(4); // boss EventLoopGroup workerGroup = new NioEventLoopGroup(32); // worker + @Resource + SensorhubServerChannelInitialHandler pipeLine; + /** * sensorhub属性参数 */ @@ -71,7 +75,7 @@ ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) // 设置EventLoopGroup .channel(NioServerSocketChannel.class) // 指明新的Channel的类型 - .childHandler(new SensorhubServerChannelInitialHandler()) // 指定ChannelHandler + .childHandler(pipeLine) // 指定ChannelHandler .option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) .childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) .option(ChannelOption.SO_BACKLOG, 1024) // 设置的ServerChannel的一些选项 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java index c3f82cc..02f1291 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java @@ -1,27 +1,38 @@ package com.casic.missiles.netty.handler; +import com.casic.missiles.parser.BirmmHexDecoder; import com.casic.missiles.parser.SensorhubDecoder; +import com.casic.missiles.parser.safe.impl.Sm4; +import com.casic.missiles.replier.CommonHexReplier; import com.casic.missiles.replier.SensorhubReplier; +import com.casic.missiles.util.SpringContextUtil; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; /** * @author cz * @date 2023-06-05 */ +@Component public class SensorhubServerChannelInitialHandler extends ChannelInitializer { - + @Resource + BirmmHexDecoder birmmHexDecoder; @Override protected void initChannel(SocketChannel socketChannel) { ChannelPipeline pipeline = socketChannel.pipeline(); pipeline.addLast(new LoggingHandler(LogLevel.INFO)); - pipeline.addLast(new SensorhubDecoder()); - pipeline.addLast(new SensorhubReplier()); +// pipeline.addLast(new SensorhubDecoder()); +// pipeline.addLast(birmmHexDecoder); + pipeline.addLast(new BirmmHexDecoder()); + pipeline.addLast(new CommonHexReplier()); // 心跳续约 // pipeline.addLast(this.heartBeatRespHandler); // pipeline.addLast(this.loginAuthRespHandler); 登录验证 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java new file mode 100644 index 0000000..6931af5 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -0,0 +1,106 @@ +package com.casic.missiles.parser; + +import cn.hutool.http.HttpUtil; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.model.DeviceFrameLog; +import com.casic.missiles.service.GeneralServiceImpl; +import com.casic.missiles.service.IDeviceBizDataService; +import com.casic.missiles.service.IDeviceFrameLogService; +import com.casic.missiles.service.IGeneralService; +import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; +import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; +import com.casic.missiles.util.SnowflakeUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author tanyue + * @date 2024-07 + * BirmmHexDecoder + */ +@Slf4j +@Component("BirmmHexDecoder") +public class BirmmHexDecoder extends ByteToMessageDecoder { + + IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); + + IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); + + IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + log.info("建立连接:{}", ctx.channel().id()); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.info("断开连接:{}", ctx.channel().id()); + } + + @Override + public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { + byte[] frameBytes = new byte[buffer.readableBytes()]; + buffer.readBytes(frameBytes); + log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + + // 工厂类创建frame对象 + BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); + if (birmmFrame != null) { + // 处理业务数据 + birmmFrame.doParseBizTag(); + + log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); + + // 保存日志 + DeviceFrameLog frameLog = new DeviceFrameLog(); + frameLog.setId(new SnowflakeUtil().nextId()); + frameLog.setDevcode(birmmFrame.getDevCode()); + frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase()); + frameLog.setRawBizFrame(birmmFrame.getRawBizFrameString()); + frameLog.setDataJson(birmmFrame.toJSON().toJSONString()); + frameLog.setLogtime(birmmFrame.getLogTime()); + frameLogService.save(frameLog); + + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + + // 保存业务数据 + if (birmmFrame.isBizDataFrame()) { + List bizDataList = birmmFrame.convertToBizDataList(); + for (DeviceBizData bizData : bizDataList) { + // 设置其他的属性 + bizData.setId(new SnowflakeUtil().nextId()); + bizData.setFrameLogId(frameLog.getId()); // 关联日志记录id + bizData.setDevcode(birmmFrame.getDevCode()); + bizData.setDeviceType(Integer.valueOf(birmmFrame.getDeviceType())); + bizData.setLogtime(birmmFrame.getLogTime()); + } + + // 批量保存 + bizDataService.saveBatch(bizDataList); + } + + // 创建回复消息 + BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + if (configFrame != null) { + // 根据协议进行封装 + String replyMessage = defaultService.replyMessage(configFrame); + log.info("下行HEX字节消息帧:{}", replyMessage); + + list.add(replyMessage); + } + } + } +} 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 2f90c5f..c79095b 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 @@ -36,9 +36,9 @@ String getSequence(byte[] frameBytes); String getTagListString(byte[] frameBytes); - Map getTagList(byte[] tagBytes); + Map> getTagList(byte[] tagBytes); - String buildTagListStr(Map tagList); + String buildTagListStr(Map> tagList); 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 8f0bd17..bda0040 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 @@ -1,6 +1,7 @@ package com.casic.missiles.parser.impl; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.frame.BirmmBaseTag; import com.casic.missiles.frame.BirmmTagBuilderFactory; import com.casic.missiles.parser.BirmmProtocolParser; @@ -10,7 +11,9 @@ import org.apache.tomcat.util.buf.HexUtils; import org.springframework.stereotype.Component; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; @Component @@ -129,12 +132,12 @@ } @Override - public Map getTagList(byte[] tagBytes) { + public Map> getTagList(byte[] tagBytes) { // 必须包含OID和长度 4 + 2 if (tagBytes.length < 6) { return null; } - Map tagList = new HashMap<>(); + Map> tagList = new HashMap<>(); int idx = 0; while (idx + 6 < tagBytes.length) { String oid = BytesUtil.extractHexString(tagBytes, idx, 4); @@ -149,7 +152,15 @@ log.debug("解析Tag:{}", tagBase); - tagList.put(tagBase.getClass().getSimpleName(), tagBase); + // 一包可能还有多个UploadTag 使用List + if (tagList.containsKey(tagBase.getClass().getSimpleName())) { + tagList.get(tagBase.getClass().getSimpleName()).add(tagBase); + } else { + List tags = new ArrayList<>(); + tags.add(tagBase); + tagList.put(tagBase.getClass().getSimpleName(), tags); + } + } } idx += tagLen; @@ -159,11 +170,13 @@ } @Override - public String buildTagListStr(Map tagList) { + public String buildTagListStr(Map> tagList) { StringBuilder result = new StringBuilder(); - for (BirmmBaseTag tag : tagList.values()) { - result.append(tag.toProtocolString()); + for (List tags : tagList.values()) { + for (BirmmBaseTag tag : tags) { + result.append(tag.toProtocolString()); + } } return result.toString().toUpperCase(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 4401a83..a0688c2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -45,7 +45,7 @@ }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); key.writeBytes(keyByte); - byte[] in = Hex.decode(cipher); + byte[] in = Hex.decode(fillFrameStructZero(cipher, 16)); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); return EcbEncrypt(in, keyBytes); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java new file mode 100644 index 0000000..6fa8cce --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -0,0 +1,46 @@ +package com.casic.missiles.replier; + +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.replier.command.AbstractBuildReplyCommand; +import com.casic.missiles.util.BytesUtil; +import com.casic.missiles.util.ClazzUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; + +/** + * @author tanyue + */ +@Slf4j +public class CommonHexReplier extends SimpleChannelInboundHandler { + + /** + * 回复内容构建的流程入口方法 + * 1、通过有标准协议解析器传来的结果进行命令的构建 + * 2、构建命令有以下的命令内容 + * (1)成功返回时间,并进行下发配置操作 + * (2)版本升级 + * (3)下位机下发版本是否升级,是上版本,是升级,请求,回复升级等流程 + * (4)其他未知需求命令 + */ + @Override + public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { + System.out.println("Client->Server:" + obj); + byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); + ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); + //进行回复 + ctx.channel().writeAndFlush(replyByteBuf); + } + + @Override + public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { + ctx.fireChannelReadComplete(); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/AEPCommandServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/AEPCommandServiceImpl.java index d728e30..b71d831 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/AEPCommandServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/AEPCommandServiceImpl.java @@ -3,7 +3,10 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.util.BytesUtil; +import com.ctg.ag.sdk.biz.AepDeviceCommandClient; import com.ctg.ag.sdk.biz.AepDeviceCommandLwmProfileClient; +import com.ctg.ag.sdk.biz.aep_device_command.CreateCommandRequest; +import com.ctg.ag.sdk.biz.aep_device_command.CreateCommandResponse; import com.ctg.ag.sdk.biz.aep_device_command_lwm_profile.CreateCommandLwm2mProfileRequest; import com.ctg.ag.sdk.biz.aep_device_command_lwm_profile.CreateCommandLwm2mProfileResponse; import lombok.Data; @@ -12,7 +15,6 @@ import org.springframework.context.annotation.Configuration; import java.nio.charset.StandardCharsets; -import java.util.Base64; @Configuration @Slf4j @@ -38,8 +40,44 @@ private String productId; @Override - public int handleSendCommand(String command) { - return 0; + public int handleSendCommand(String command, int dataType) { + AepDeviceCommandClient client = AepDeviceCommandClient.newClient().appKey(key).appSecret(secret).build(); + + JSONObject body = new JSONObject(); + JSONObject content = new JSONObject(); + + int retCode = -1; + + try { + //组装请求返回的参数 + CreateCommandRequest request = new CreateCommandRequest(); + request.setParamMasterKey(masterApiKey); + + body.put("deviceId", deviceId); + body.put("operator", operator); + body.put("productId", productId); + + content.put("dataType", dataType); // 数据类型:1字符串,2十六进制 + content.put("payload", command); // 指令内容,数据格式为十六进制时需要填十六进制字符串 + body.put("content", content); + + request.setBody(body.toJSONString().getBytes()); + log.info("向AEP平台发送指令:{}", body.toJSONString()); + + //调用电信平台的客服端发送报文回复 + CreateCommandResponse msgResponse = client.CreateCommand(request); + JSONObject retObj = JSON.parseObject(new String(msgResponse.getBody(), StandardCharsets.UTF_8)); + retCode = (int) retObj.get("code"); + + log.info("AEP平台返回消息:{}", retObj.toJSONString()); + + } catch (Exception ex) { + log.error("电信平台发送失败,异常信息{}", ex.getMessage()); + } finally { + client.shutdown(); + } + + return retCode; } @Override 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 006c51d..da20a28 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 @@ -1,5 +1,6 @@ package com.casic.missiles.service; +import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; @@ -8,6 +9,8 @@ import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.parser.safe.impl.Sm4; +import com.casic.missiles.parser.safe.impl.TeaUtilsX; +import com.casic.missiles.parser.safe.impl.Teas; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.tomcat.util.buf.HexUtils; @@ -63,14 +66,20 @@ // 解密 // TODO-LIST // 密钥根据设备编号获取 - SafeStrategy safeStrategy = SpringContextUtil.getBean(Sm4.class); - byte[] plainBytes = safeStrategy.decryption(tagListStr, keyByte); + SafeStrategy safeStrategy; + if (deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue())) { + safeStrategy = SpringContextUtil.getBean(Sm4.class); + } else { + safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); + } + + byte[] plainBytes = safeStrategy.decryption(tagListStr); String plainTagListStr = HexUtils.toHexString(plainBytes).toUpperCase(); log.info("上行业务字段:{}", plainTagListStr); // 获得业务字段tagList - Map tagList = protocol.getTagList(plainBytes); + Map> tagList = protocol.getTagList(plainBytes); // 创建Frame BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); @@ -147,8 +156,14 @@ // 加密 // TODO-LIST // 密钥根据设备编号获取 - SafeStrategy safeStrategy = SpringContextUtil.getBean(Sm4.class); - byte[] tagBytes = safeStrategy.encryption(plainTagListStr, keyByte); + SafeStrategy safeStrategy; + if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue())) { + safeStrategy = SpringContextUtil.getBean(Sm4.class); + } else { + safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); + } + + byte[] tagBytes = safeStrategy.encryption(plainTagListStr); frame.append(HexUtils.toHexString(tagBytes).toUpperCase()); // 计算CRC校验码 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IAEPCommandService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IAEPCommandService.java index 14736e1..49ab7ad 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IAEPCommandService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IAEPCommandService.java @@ -2,7 +2,7 @@ public interface IAEPCommandService { - int handleSendCommand(String command); + int handleSendCommand(String command, int dataType); int handleSendCommandWithProfile(String command); diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 70596b6..3ac4de7 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -69,7 +69,7 @@ enable: true sensorhub: config: - port: 7091 + port: 22009 bean: "functionCallback" url: "http://127.0.0.1:7093/push/test" fileUrl: D:\casic\file\ diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 8dcc497..da561cd 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -49,6 +49,12 @@ + cn.hutool + hutool-all + 5.7.16 + + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} 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 32dfdf3..140ee01 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 @@ -1,6 +1,10 @@ package com.casic.missiles.controller; +import cn.hutool.Hutool; import cn.hutool.core.lang.generator.UUIDGenerator; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.model.DeviceBizData; @@ -76,6 +80,12 @@ frameLog.setLogtime(birmmFrame.getLogTime()); frameLogService.save(frameLog); + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + // 保存业务数据 if (birmmFrame.isBizDataFrame()) { List bizDataList = birmmFrame.convertToBizDataList(); @@ -105,13 +115,15 @@ if (dataMap.containsKey("profile")) { hasProfile = (Boolean) dataMap.get("profile"); } - aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); + aepCmdService.setDeviceId((String) dataMap.get("deviceId")); aepCmdService.setProductId((String) dataMap.get("productId")); if (hasProfile) { + aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); retCode = aepCmdService.handleSendCommandWithProfile(replyMessage); } else { - retCode = aepCmdService.handleSendCommand(replyMessage); + aepCmdService.setMasterApiKey("ee2f4011f0a04f28b1572967891b57d5"); + retCode = aepCmdService.handleSendCommand(replyMessage, 2); // 2=16进制 } if (retCode == 0) { 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 f934d86..e22284a 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 @@ -48,7 +48,7 @@ // 业务字段List String tagListString; - Map tagList; + Map> tagList; // CRC String crc; @@ -83,7 +83,9 @@ DateTimeTag dateTimeTag = new DateTimeTag(); dateTimeTag.setDateTime(LocalDateTime.now()); - tagList.put(DateTimeTag.class.getSimpleName(), dateTimeTag); + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); } } 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 ef031b8..772092d 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 @@ -2,6 +2,7 @@ import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; +import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; public class BirmmFrameBuilderFactory { @@ -12,6 +13,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); + case WELL: return null; @@ -31,6 +35,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); + case WELL: return null; 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 index 71023ee..3617ae7 100644 --- 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 @@ -9,6 +9,9 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + case UP_TRAP_REQUEST: return new MethaneTrapRequestFrame(); @@ -30,6 +33,10 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE return new MethaneTrapResponseFrame(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java new file mode 100644 index 0000000..a1fd8bc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java @@ -0,0 +1,43 @@ +package com.casic.missiles.frame.methane; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; +import com.casic.missiles.frame.tag.ota.RequestSizeTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; + +import java.time.format.DateTimeFormatter; + +public class MethaneGetRequestFrame extends BirmmBaseFrame { + + private final String DEV_TYPE = "Methane"; + private final String MESSAGE_TYPE = "GetRequest"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); + body.put("reqSize", tag.getRequestSize()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); + body.put("reqOffset", tag.getRequestOffset()); + } + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java new file mode 100644 index 0000000..5f49fe7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.ota.PackageDataTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MethaneGetResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.UP_GET_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } + + @Override + public void replyBizTag() { + // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) + // TODO-LIST + + Map> tagList = new HashMap<>(); + + RequestOffsetTag offsetTag = new RequestOffsetTag(); + offsetTag.setRequestOffset(0); + List offsetTags = new ArrayList<>(); + offsetTags.add(offsetTag); + tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); + + PackageDataTag dataTag = new PackageDataTag(); + dataTag.setData(new byte[] {0}); + List dataTags = new ArrayList<>(); + dataTags.add(dataTag); + tagList.put(PackageDataTag.class.getSimpleName(), dataTags); + + super.setTagList(tagList); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java index 37b7fc8..e936a9c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java @@ -22,7 +22,7 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()); + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); body.put("softwareVersion", tag.getVersion()); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java index cd62d6d..d478366 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java @@ -3,11 +3,11 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.frame.BirmmBaseTag; -import com.casic.missiles.frame.tag.config.DateTimeTag; -import com.casic.missiles.frame.tag.ota.OTANeedTag; +import com.casic.missiles.frame.tag.ota.NeedOTATag; -import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; public class MethaneOnlineResponseFrame extends BirmmBaseFrame { @@ -27,12 +27,16 @@ @Override public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map tagList = new HashMap<>(); - OTANeedTag needTag = new OTANeedTag(); + Map> tagList = new HashMap<>(); + NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); - tagList.put(OTANeedTag.class.getSimpleName(), needTag); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); super.setTagList(tagList); } } 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 690b9c5..6ba27f6 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 @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; import com.casic.missiles.frame.tag.biz.CellTag; import com.casic.missiles.frame.tag.biz.DateTag; import com.casic.missiles.frame.tag.biz.SensorStateTag; @@ -39,19 +40,19 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); body.put("cell", cellTag.getCellVal()); } if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); body.put("pci", pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); body.put("rsrp", rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); body.put("snr", snrTag.getSnr()); } @@ -86,21 +87,21 @@ // 电量 if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); bizData.setCell(cellTag.getCellVal()); } // 信号质量 if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); bizData.setPci(pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); bizData.setRsrp(rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); bizData.setSnr(snrTag.getSnr()); } @@ -123,47 +124,57 @@ } private void handleUploadTag() { - UploadTag uploadTag = (UploadTag) getTagList().get(UploadTag.class.getSimpleName()); + List tags = getTagList().get(UploadTag.class.getSimpleName()); - // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 - boolean isValid = uploadTag.checkOid(); - if (isValid) { - // 找到DateTag 取出其中的日期 - DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()); - uploadTag.setStartDate(dateTag.getDate()); + bizDataList = new ArrayList<>(); - 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(); + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); - 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)); // 转成浮点数 + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + MethaneBizData bizData = new MethaneBizData(); - bizDataList.add(bizData); + 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)); // 转成浮点数 - // 加上时间间隔 - start = start.plusMinutes(uploadTag.getInterval()); + bizDataList.add(bizData); + + // 加上时间间隔 + start = start.plusMinutes(uploadTag.getInterval()); + } } } } private void handleSensorStateTag() { - SensorStateTag sensorStateTag = (SensorStateTag) getTagList().get(SensorStateTag.class.getSimpleName()); - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { - // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { - // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - // TODO-LIST - // 传感器状态异常时需要上报异常事件 + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java new file mode 100644 index 0000000..458e393 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java @@ -0,0 +1,28 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class SentinelBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + "][" + value + "][" + bizType + "]"; + } + + public JSONObject toJSON() { + JSONObject json = new JSONObject(); + json.put(BirmmDataBizTypeEnums.toType(bizType).getName(), String.format("%.3f", value)); + json.put("uptime", uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java new file mode 100644 index 0000000..bafe173 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java @@ -0,0 +1,56 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.methane.*; + +public class SentinelFrameBuilderFactory { + + public static BirmmBaseFrame createSentinelFrameByOperation(String operaType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + + case UP_TRAP_REQUEST: + return new SentinelTrapRequestFrame(); + + case UP_ONLINE_REQUEST: + return new MethaneOnlineRequestFrame(); + + case UP_SET_RESPONSE: + return new MethaneSetResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } + + public static BirmmBaseFrame createSentinelReplyFrameByOperation(String uploadOperationType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + + case UP_TRAP_REQUEST: + // TRAP_REQUEST消息回复TRAP_RESPONSE + return new SentinelTrapResponseFrame(); + + case UP_ONLINE_REQUEST: + // ONLINE_REQUEST消息回复ONLINE_RESPONSE + return new MethaneOnlineResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java new file mode 100644 index 0000000..a36d243 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -0,0 +1,180 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.biz.DateTag; +import com.casic.missiles.frame.tag.biz.SensorStateTag; +import com.casic.missiles.frame.tag.biz.UploadTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; +import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.BytesUtil; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Slf4j +public class SentinelTrapRequestFrame extends BirmmBaseFrame { + + private List bizDataList; + + private final String DEV_TYPE = "Sentinel"; + private final String MESSAGE_TYPE = "Data"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + body.put("cell", cellTag.getCellVal()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + body.put("pci", pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + body.put("rsrp", rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + body.put("snr", snrTag.getSnr()); + } + + // 业务数据 + if (bizDataList != null) { + JSONArray datas = new JSONArray(); + for (SentinelBizData bizData : bizDataList) { + datas.add(bizData.toJSON()); + } + body.put("datas", datas); + } + + json.put("mBody", body); + + return json; + } + + @Override + public boolean isBizDataFrame() { + return true; + } + + @Override + public List convertToBizDataList() { + List resultList = new ArrayList<>(); + if (bizDataList != null) { + for (SentinelBizData data : bizDataList) { + DeviceBizData bizData = new DeviceBizData(); + bizData.setBizType(String.valueOf(data.getBizType())); + bizData.setValue(String.format("%.3f", data.getValue())); + bizData.setUptime(data.getUptime()); + + // 电量 + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + bizData.setCell(cellTag.getCellVal()); + } + + // 信号质量 + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + bizData.setPci(pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + bizData.setRsrp(rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + bizData.setSnr(snrTag.getSnr()); + } + + resultList.add(bizData); + } + } + + return resultList; + } + + @Override + public void doParseBizTag() { + if (getTagList().containsKey(UploadTag.class.getSimpleName())) { + handleUploadTag(); + } + + if (getTagList().containsKey(SensorStateTag.class.getSimpleName())) { + handleSensorStateTag(); + } + } + + private void handleUploadTag() { + List tags = getTagList().get(UploadTag.class.getSimpleName()); + + bizDataList = new ArrayList<>(); + + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); + + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + SentinelBizData bizData = new SentinelBizData(); + + 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() { + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java new file mode 100644 index 0000000..2a87b3f --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java @@ -0,0 +1,20 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; + +public class SentinelTrapResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java new file mode 100644 index 0000000..8e40b85 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class NeedOTATag extends BirmmBaseTag { + + final String NEED_OTA_TAG_OID = "60000600"; + + boolean need; + + @Override + public String toString() { + return super.toString() + "[value: " + need + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength() * 2 + "x", need ? 1 : 0); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + need = Boolean.parseBoolean(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java deleted file mode 100644 index 884b44f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.frame.tag.ota; - -import com.casic.missiles.enums.BirmmTagTypeEnums; -import com.casic.missiles.frame.BirmmBaseTag; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -@Data -public class OTANeedTag extends BirmmBaseTag { - - final String OTA_NEED_TAG_OID = "60000600"; - - boolean need; - - @Override - public String toString() { - return super.toString() + "[value: " + need + "]"; - } - - @Override - public String toProtocolString() { - String result = ""; - result += BirmmTagTypeEnums.OTA_NEED_TAG.getName(); // OID - result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_TAG.getLength()); // 长度 - result += String.format("%02x", need ? 1 : 0); - - return result; - } - - @Override - public void setValueStr(String valueStr) { - super.setValueStr(valueStr); - need = Boolean.parseBoolean(valueStr); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java new file mode 100644 index 0000000..08dafcf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageCRCTag extends BirmmBaseTag { + + final String PACKAGE_CRC_TAG_OID = "60000603"; + + String packCRC; + + @Override + public String toString() { + return super.toString() + "[value: " + packCRC + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength() * 2 + "x", packCRC); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + packCRC = valueStr; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java new file mode 100644 index 0000000..f9801a2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.tomcat.util.buf.HexUtils; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageDataTag extends BirmmBaseTag { + + final String PACKAGE_DATA_TAG_OID = "60000601"; + + byte[] data; + + @Override + public String toString() { + return super.toString() + "[value: " + HexUtils.toHexString(data) + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_DATA_TAG.getName(); // OID + result += String.format("%04d", data.length); // 长度 + result += HexUtils.toHexString(data); + + return result; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java new file mode 100644 index 0000000..05ff3c1 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageSizeTag extends BirmmBaseTag { + + final String PACKAGE_SIZE_TAG_OID = "60000602"; + + int packSize; + + @Override + public String toString() { + return super.toString() + "[value: " + packSize + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength() * 2 + "x", packSize); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + packSize = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java new file mode 100644 index 0000000..bfc83dd --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java @@ -0,0 +1,37 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class RequestOffsetTag extends BirmmBaseTag { + + final String REQUEST_OFFSET_TAG_OID = "20000102"; + + // 本次请求的升级包偏移量 + int requestOffset; + + @Override + public String toString() { + return super.toString() + "[value: " + requestOffset + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength() * 2 + "x", requestOffset); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + requestOffset = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java new file mode 100644 index 0000000..6c096a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java @@ -0,0 +1,27 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class RequestSizeTag extends BirmmBaseTag { + + final String REQUEST_SIZE_TAG_OID = "20000100"; + + // 本次请求的升级包大小 + int requestSize; + + @Override + public String toString() { + return super.toString() + "[value: " + requestSize + "]"; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + requestSize = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 91c81d0..207eca2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -15,6 +15,7 @@ import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; +import javax.annotation.Resource; /** * SensorhubServer netty服务端 @@ -32,6 +33,9 @@ EventLoopGroup bossGroup = new NioEventLoopGroup(4); // boss EventLoopGroup workerGroup = new NioEventLoopGroup(32); // worker + @Resource + SensorhubServerChannelInitialHandler pipeLine; + /** * sensorhub属性参数 */ @@ -71,7 +75,7 @@ ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) // 设置EventLoopGroup .channel(NioServerSocketChannel.class) // 指明新的Channel的类型 - .childHandler(new SensorhubServerChannelInitialHandler()) // 指定ChannelHandler + .childHandler(pipeLine) // 指定ChannelHandler .option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) .childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) .option(ChannelOption.SO_BACKLOG, 1024) // 设置的ServerChannel的一些选项 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java index c3f82cc..02f1291 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java @@ -1,27 +1,38 @@ package com.casic.missiles.netty.handler; +import com.casic.missiles.parser.BirmmHexDecoder; import com.casic.missiles.parser.SensorhubDecoder; +import com.casic.missiles.parser.safe.impl.Sm4; +import com.casic.missiles.replier.CommonHexReplier; import com.casic.missiles.replier.SensorhubReplier; +import com.casic.missiles.util.SpringContextUtil; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; /** * @author cz * @date 2023-06-05 */ +@Component public class SensorhubServerChannelInitialHandler extends ChannelInitializer { - + @Resource + BirmmHexDecoder birmmHexDecoder; @Override protected void initChannel(SocketChannel socketChannel) { ChannelPipeline pipeline = socketChannel.pipeline(); pipeline.addLast(new LoggingHandler(LogLevel.INFO)); - pipeline.addLast(new SensorhubDecoder()); - pipeline.addLast(new SensorhubReplier()); +// pipeline.addLast(new SensorhubDecoder()); +// pipeline.addLast(birmmHexDecoder); + pipeline.addLast(new BirmmHexDecoder()); + pipeline.addLast(new CommonHexReplier()); // 心跳续约 // pipeline.addLast(this.heartBeatRespHandler); // pipeline.addLast(this.loginAuthRespHandler); 登录验证 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java new file mode 100644 index 0000000..6931af5 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -0,0 +1,106 @@ +package com.casic.missiles.parser; + +import cn.hutool.http.HttpUtil; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.model.DeviceFrameLog; +import com.casic.missiles.service.GeneralServiceImpl; +import com.casic.missiles.service.IDeviceBizDataService; +import com.casic.missiles.service.IDeviceFrameLogService; +import com.casic.missiles.service.IGeneralService; +import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; +import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; +import com.casic.missiles.util.SnowflakeUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author tanyue + * @date 2024-07 + * BirmmHexDecoder + */ +@Slf4j +@Component("BirmmHexDecoder") +public class BirmmHexDecoder extends ByteToMessageDecoder { + + IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); + + IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); + + IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + log.info("建立连接:{}", ctx.channel().id()); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.info("断开连接:{}", ctx.channel().id()); + } + + @Override + public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { + byte[] frameBytes = new byte[buffer.readableBytes()]; + buffer.readBytes(frameBytes); + log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + + // 工厂类创建frame对象 + BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); + if (birmmFrame != null) { + // 处理业务数据 + birmmFrame.doParseBizTag(); + + log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); + + // 保存日志 + DeviceFrameLog frameLog = new DeviceFrameLog(); + frameLog.setId(new SnowflakeUtil().nextId()); + frameLog.setDevcode(birmmFrame.getDevCode()); + frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase()); + frameLog.setRawBizFrame(birmmFrame.getRawBizFrameString()); + frameLog.setDataJson(birmmFrame.toJSON().toJSONString()); + frameLog.setLogtime(birmmFrame.getLogTime()); + frameLogService.save(frameLog); + + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + + // 保存业务数据 + if (birmmFrame.isBizDataFrame()) { + List bizDataList = birmmFrame.convertToBizDataList(); + for (DeviceBizData bizData : bizDataList) { + // 设置其他的属性 + bizData.setId(new SnowflakeUtil().nextId()); + bizData.setFrameLogId(frameLog.getId()); // 关联日志记录id + bizData.setDevcode(birmmFrame.getDevCode()); + bizData.setDeviceType(Integer.valueOf(birmmFrame.getDeviceType())); + bizData.setLogtime(birmmFrame.getLogTime()); + } + + // 批量保存 + bizDataService.saveBatch(bizDataList); + } + + // 创建回复消息 + BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + if (configFrame != null) { + // 根据协议进行封装 + String replyMessage = defaultService.replyMessage(configFrame); + log.info("下行HEX字节消息帧:{}", replyMessage); + + list.add(replyMessage); + } + } + } +} 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 2f90c5f..c79095b 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 @@ -36,9 +36,9 @@ String getSequence(byte[] frameBytes); String getTagListString(byte[] frameBytes); - Map getTagList(byte[] tagBytes); + Map> getTagList(byte[] tagBytes); - String buildTagListStr(Map tagList); + String buildTagListStr(Map> tagList); 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 8f0bd17..bda0040 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 @@ -1,6 +1,7 @@ package com.casic.missiles.parser.impl; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.frame.BirmmBaseTag; import com.casic.missiles.frame.BirmmTagBuilderFactory; import com.casic.missiles.parser.BirmmProtocolParser; @@ -10,7 +11,9 @@ import org.apache.tomcat.util.buf.HexUtils; import org.springframework.stereotype.Component; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; @Component @@ -129,12 +132,12 @@ } @Override - public Map getTagList(byte[] tagBytes) { + public Map> getTagList(byte[] tagBytes) { // 必须包含OID和长度 4 + 2 if (tagBytes.length < 6) { return null; } - Map tagList = new HashMap<>(); + Map> tagList = new HashMap<>(); int idx = 0; while (idx + 6 < tagBytes.length) { String oid = BytesUtil.extractHexString(tagBytes, idx, 4); @@ -149,7 +152,15 @@ log.debug("解析Tag:{}", tagBase); - tagList.put(tagBase.getClass().getSimpleName(), tagBase); + // 一包可能还有多个UploadTag 使用List + if (tagList.containsKey(tagBase.getClass().getSimpleName())) { + tagList.get(tagBase.getClass().getSimpleName()).add(tagBase); + } else { + List tags = new ArrayList<>(); + tags.add(tagBase); + tagList.put(tagBase.getClass().getSimpleName(), tags); + } + } } idx += tagLen; @@ -159,11 +170,13 @@ } @Override - public String buildTagListStr(Map tagList) { + public String buildTagListStr(Map> tagList) { StringBuilder result = new StringBuilder(); - for (BirmmBaseTag tag : tagList.values()) { - result.append(tag.toProtocolString()); + for (List tags : tagList.values()) { + for (BirmmBaseTag tag : tags) { + result.append(tag.toProtocolString()); + } } return result.toString().toUpperCase(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 4401a83..a0688c2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -45,7 +45,7 @@ }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); key.writeBytes(keyByte); - byte[] in = Hex.decode(cipher); + byte[] in = Hex.decode(fillFrameStructZero(cipher, 16)); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); return EcbEncrypt(in, keyBytes); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java new file mode 100644 index 0000000..6fa8cce --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -0,0 +1,46 @@ +package com.casic.missiles.replier; + +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.replier.command.AbstractBuildReplyCommand; +import com.casic.missiles.util.BytesUtil; +import com.casic.missiles.util.ClazzUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; + +/** + * @author tanyue + */ +@Slf4j +public class CommonHexReplier extends SimpleChannelInboundHandler { + + /** + * 回复内容构建的流程入口方法 + * 1、通过有标准协议解析器传来的结果进行命令的构建 + * 2、构建命令有以下的命令内容 + * (1)成功返回时间,并进行下发配置操作 + * (2)版本升级 + * (3)下位机下发版本是否升级,是上版本,是升级,请求,回复升级等流程 + * (4)其他未知需求命令 + */ + @Override + public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { + System.out.println("Client->Server:" + obj); + byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); + ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); + //进行回复 + ctx.channel().writeAndFlush(replyByteBuf); + } + + @Override + public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { + ctx.fireChannelReadComplete(); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/AEPCommandServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/AEPCommandServiceImpl.java index d728e30..b71d831 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/AEPCommandServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/AEPCommandServiceImpl.java @@ -3,7 +3,10 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.util.BytesUtil; +import com.ctg.ag.sdk.biz.AepDeviceCommandClient; import com.ctg.ag.sdk.biz.AepDeviceCommandLwmProfileClient; +import com.ctg.ag.sdk.biz.aep_device_command.CreateCommandRequest; +import com.ctg.ag.sdk.biz.aep_device_command.CreateCommandResponse; import com.ctg.ag.sdk.biz.aep_device_command_lwm_profile.CreateCommandLwm2mProfileRequest; import com.ctg.ag.sdk.biz.aep_device_command_lwm_profile.CreateCommandLwm2mProfileResponse; import lombok.Data; @@ -12,7 +15,6 @@ import org.springframework.context.annotation.Configuration; import java.nio.charset.StandardCharsets; -import java.util.Base64; @Configuration @Slf4j @@ -38,8 +40,44 @@ private String productId; @Override - public int handleSendCommand(String command) { - return 0; + public int handleSendCommand(String command, int dataType) { + AepDeviceCommandClient client = AepDeviceCommandClient.newClient().appKey(key).appSecret(secret).build(); + + JSONObject body = new JSONObject(); + JSONObject content = new JSONObject(); + + int retCode = -1; + + try { + //组装请求返回的参数 + CreateCommandRequest request = new CreateCommandRequest(); + request.setParamMasterKey(masterApiKey); + + body.put("deviceId", deviceId); + body.put("operator", operator); + body.put("productId", productId); + + content.put("dataType", dataType); // 数据类型:1字符串,2十六进制 + content.put("payload", command); // 指令内容,数据格式为十六进制时需要填十六进制字符串 + body.put("content", content); + + request.setBody(body.toJSONString().getBytes()); + log.info("向AEP平台发送指令:{}", body.toJSONString()); + + //调用电信平台的客服端发送报文回复 + CreateCommandResponse msgResponse = client.CreateCommand(request); + JSONObject retObj = JSON.parseObject(new String(msgResponse.getBody(), StandardCharsets.UTF_8)); + retCode = (int) retObj.get("code"); + + log.info("AEP平台返回消息:{}", retObj.toJSONString()); + + } catch (Exception ex) { + log.error("电信平台发送失败,异常信息{}", ex.getMessage()); + } finally { + client.shutdown(); + } + + return retCode; } @Override 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 006c51d..da20a28 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 @@ -1,5 +1,6 @@ package com.casic.missiles.service; +import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; @@ -8,6 +9,8 @@ import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.parser.safe.impl.Sm4; +import com.casic.missiles.parser.safe.impl.TeaUtilsX; +import com.casic.missiles.parser.safe.impl.Teas; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.tomcat.util.buf.HexUtils; @@ -63,14 +66,20 @@ // 解密 // TODO-LIST // 密钥根据设备编号获取 - SafeStrategy safeStrategy = SpringContextUtil.getBean(Sm4.class); - byte[] plainBytes = safeStrategy.decryption(tagListStr, keyByte); + SafeStrategy safeStrategy; + if (deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue())) { + safeStrategy = SpringContextUtil.getBean(Sm4.class); + } else { + safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); + } + + byte[] plainBytes = safeStrategy.decryption(tagListStr); String plainTagListStr = HexUtils.toHexString(plainBytes).toUpperCase(); log.info("上行业务字段:{}", plainTagListStr); // 获得业务字段tagList - Map tagList = protocol.getTagList(plainBytes); + Map> tagList = protocol.getTagList(plainBytes); // 创建Frame BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); @@ -147,8 +156,14 @@ // 加密 // TODO-LIST // 密钥根据设备编号获取 - SafeStrategy safeStrategy = SpringContextUtil.getBean(Sm4.class); - byte[] tagBytes = safeStrategy.encryption(plainTagListStr, keyByte); + SafeStrategy safeStrategy; + if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue())) { + safeStrategy = SpringContextUtil.getBean(Sm4.class); + } else { + safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); + } + + byte[] tagBytes = safeStrategy.encryption(plainTagListStr); frame.append(HexUtils.toHexString(tagBytes).toUpperCase()); // 计算CRC校验码 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IAEPCommandService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IAEPCommandService.java index 14736e1..49ab7ad 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IAEPCommandService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IAEPCommandService.java @@ -2,7 +2,7 @@ public interface IAEPCommandService { - int handleSendCommand(String command); + int handleSendCommand(String command, int dataType); int handleSendCommandWithProfile(String command); 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 index e1eac2d..f05c3c3 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmDeviceTypeEnums.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmDeviceTypeEnums.java @@ -12,6 +12,7 @@ METHANE("4", "BIRMM-RTU100N", "31"), WELL("6", "BIRMM-WELL100N", "41"), LIQUID_GAS("25", "", "32"), + SENTINEL("28", "", "34"), METHANE_BIZ("32", "", "33"), DEFAULT("", "", ""); diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 70596b6..3ac4de7 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -69,7 +69,7 @@ enable: true sensorhub: config: - port: 7091 + port: 22009 bean: "functionCallback" url: "http://127.0.0.1:7093/push/test" fileUrl: D:\casic\file\ diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 8dcc497..da561cd 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -49,6 +49,12 @@ + cn.hutool + hutool-all + 5.7.16 + + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} 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 32dfdf3..140ee01 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 @@ -1,6 +1,10 @@ package com.casic.missiles.controller; +import cn.hutool.Hutool; import cn.hutool.core.lang.generator.UUIDGenerator; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.model.DeviceBizData; @@ -76,6 +80,12 @@ frameLog.setLogtime(birmmFrame.getLogTime()); frameLogService.save(frameLog); + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + // 保存业务数据 if (birmmFrame.isBizDataFrame()) { List bizDataList = birmmFrame.convertToBizDataList(); @@ -105,13 +115,15 @@ if (dataMap.containsKey("profile")) { hasProfile = (Boolean) dataMap.get("profile"); } - aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); + aepCmdService.setDeviceId((String) dataMap.get("deviceId")); aepCmdService.setProductId((String) dataMap.get("productId")); if (hasProfile) { + aepCmdService.setMasterApiKey("d3f49d576baf4112b5e48f41c148e89b"); retCode = aepCmdService.handleSendCommandWithProfile(replyMessage); } else { - retCode = aepCmdService.handleSendCommand(replyMessage); + aepCmdService.setMasterApiKey("ee2f4011f0a04f28b1572967891b57d5"); + retCode = aepCmdService.handleSendCommand(replyMessage, 2); // 2=16进制 } if (retCode == 0) { 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 f934d86..e22284a 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 @@ -48,7 +48,7 @@ // 业务字段List String tagListString; - Map tagList; + Map> tagList; // CRC String crc; @@ -83,7 +83,9 @@ DateTimeTag dateTimeTag = new DateTimeTag(); dateTimeTag.setDateTime(LocalDateTime.now()); - tagList.put(DateTimeTag.class.getSimpleName(), dateTimeTag); + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); } } 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 ef031b8..772092d 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 @@ -2,6 +2,7 @@ import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; +import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; public class BirmmFrameBuilderFactory { @@ -12,6 +13,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); + case WELL: return null; @@ -31,6 +35,9 @@ case METHANE: return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); + case SENTINEL: + return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); + case WELL: return null; 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 index 71023ee..3617ae7 100644 --- 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 @@ -9,6 +9,9 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + case UP_TRAP_REQUEST: return new MethaneTrapRequestFrame(); @@ -30,6 +33,10 @@ BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); if (operation != null) { switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE return new MethaneTrapResponseFrame(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java new file mode 100644 index 0000000..a1fd8bc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java @@ -0,0 +1,43 @@ +package com.casic.missiles.frame.methane; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; +import com.casic.missiles.frame.tag.ota.RequestSizeTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; + +import java.time.format.DateTimeFormatter; + +public class MethaneGetRequestFrame extends BirmmBaseFrame { + + private final String DEV_TYPE = "Methane"; + private final String MESSAGE_TYPE = "GetRequest"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { + RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); + body.put("reqSize", tag.getRequestSize()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); + body.put("reqOffset", tag.getRequestOffset()); + } + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java new file mode 100644 index 0000000..5f49fe7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseFrame.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.methane; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.ota.PackageDataTag; +import com.casic.missiles.frame.tag.ota.RequestOffsetTag; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MethaneGetResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.UP_GET_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } + + @Override + public void replyBizTag() { + // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) + // TODO-LIST + + Map> tagList = new HashMap<>(); + + RequestOffsetTag offsetTag = new RequestOffsetTag(); + offsetTag.setRequestOffset(0); + List offsetTags = new ArrayList<>(); + offsetTags.add(offsetTag); + tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); + + PackageDataTag dataTag = new PackageDataTag(); + dataTag.setData(new byte[] {0}); + List dataTags = new ArrayList<>(); + dataTags.add(dataTag); + tagList.put(PackageDataTag.class.getSimpleName(), dataTags); + + super.setTagList(tagList); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java index 37b7fc8..e936a9c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java @@ -22,7 +22,7 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()); + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); body.put("softwareVersion", tag.getVersion()); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java index cd62d6d..d478366 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseFrame.java @@ -3,11 +3,11 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.frame.BirmmBaseTag; -import com.casic.missiles.frame.tag.config.DateTimeTag; -import com.casic.missiles.frame.tag.ota.OTANeedTag; +import com.casic.missiles.frame.tag.ota.NeedOTATag; -import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; public class MethaneOnlineResponseFrame extends BirmmBaseFrame { @@ -27,12 +27,16 @@ @Override public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map tagList = new HashMap<>(); - OTANeedTag needTag = new OTANeedTag(); + Map> tagList = new HashMap<>(); + NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); - tagList.put(OTANeedTag.class.getSimpleName(), needTag); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); super.setTagList(tagList); } } 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 690b9c5..6ba27f6 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 @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; import com.casic.missiles.frame.tag.biz.CellTag; import com.casic.missiles.frame.tag.biz.DateTag; import com.casic.missiles.frame.tag.biz.SensorStateTag; @@ -39,19 +40,19 @@ body.put("bType", BIZ_TYPE); body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); body.put("cell", cellTag.getCellVal()); } if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); body.put("pci", pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); body.put("rsrp", rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); body.put("snr", snrTag.getSnr()); } @@ -86,21 +87,21 @@ // 电量 if (getTagList().containsKey(CellTag.class.getSimpleName())) { - CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()); + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); bizData.setCell(cellTag.getCellVal()); } // 信号质量 if (getTagList().containsKey(PCITag.class.getSimpleName())) { - PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()); + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); bizData.setPci(pciTag.getPci()); } if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { - RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()); + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); bizData.setRsrp(rsrpTag.getRsrp()); } if (getTagList().containsKey(SNRTag.class.getSimpleName())) { - SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()); + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); bizData.setSnr(snrTag.getSnr()); } @@ -123,47 +124,57 @@ } private void handleUploadTag() { - UploadTag uploadTag = (UploadTag) getTagList().get(UploadTag.class.getSimpleName()); + List tags = getTagList().get(UploadTag.class.getSimpleName()); - // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 - boolean isValid = uploadTag.checkOid(); - if (isValid) { - // 找到DateTag 取出其中的日期 - DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()); - uploadTag.setStartDate(dateTag.getDate()); + bizDataList = new ArrayList<>(); - 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(); + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); - 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)); // 转成浮点数 + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + MethaneBizData bizData = new MethaneBizData(); - bizDataList.add(bizData); + 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)); // 转成浮点数 - // 加上时间间隔 - start = start.plusMinutes(uploadTag.getInterval()); + bizDataList.add(bizData); + + // 加上时间间隔 + start = start.plusMinutes(uploadTag.getInterval()); + } } } } private void handleSensorStateTag() { - SensorStateTag sensorStateTag = (SensorStateTag) getTagList().get(SensorStateTag.class.getSimpleName()); - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { - // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { - // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); - } + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } - // TODO-LIST - // 传感器状态异常时需要上报异常事件 + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java new file mode 100644 index 0000000..458e393 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelBizData.java @@ -0,0 +1,28 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +public class SentinelBizData { + + LocalDateTime uptime; + int bizType; + float value; + + @Override + public String toString() { + return "[" + uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + "][" + value + "][" + bizType + "]"; + } + + public JSONObject toJSON() { + JSONObject json = new JSONObject(); + json.put(BirmmDataBizTypeEnums.toType(bizType).getName(), String.format("%.3f", value)); + json.put("uptime", uptime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + return json; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java new file mode 100644 index 0000000..bafe173 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java @@ -0,0 +1,56 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.methane.*; + +public class SentinelFrameBuilderFactory { + + public static BirmmBaseFrame createSentinelFrameByOperation(String operaType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + return new MethaneGetRequestFrame(); + + case UP_TRAP_REQUEST: + return new SentinelTrapRequestFrame(); + + case UP_ONLINE_REQUEST: + return new MethaneOnlineRequestFrame(); + + case UP_SET_RESPONSE: + return new MethaneSetResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } + + public static BirmmBaseFrame createSentinelReplyFrameByOperation(String uploadOperationType) { + BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); + if (operation != null) { + switch (operation) { + case DOWN_GET_REQUEST: + // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 + return new MethaneGetResponseFrame(); + + case UP_TRAP_REQUEST: + // TRAP_REQUEST消息回复TRAP_RESPONSE + return new SentinelTrapResponseFrame(); + + case UP_ONLINE_REQUEST: + // ONLINE_REQUEST消息回复ONLINE_RESPONSE + return new MethaneOnlineResponseFrame(); + + default: + return null; + } + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java new file mode 100644 index 0000000..a36d243 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -0,0 +1,180 @@ +package com.casic.missiles.frame.sentinel; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.frame.BirmmBaseTag; +import com.casic.missiles.frame.tag.biz.CellTag; +import com.casic.missiles.frame.tag.biz.DateTag; +import com.casic.missiles.frame.tag.biz.SensorStateTag; +import com.casic.missiles.frame.tag.biz.UploadTag; +import com.casic.missiles.frame.tag.signal.PCITag; +import com.casic.missiles.frame.tag.signal.RSRPTag; +import com.casic.missiles.frame.tag.signal.SNRTag; +import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.BytesUtil; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Slf4j +public class SentinelTrapRequestFrame extends BirmmBaseFrame { + + private List bizDataList; + + private final String DEV_TYPE = "Sentinel"; + private final String MESSAGE_TYPE = "Data"; + private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("devType", DEV_TYPE); + json.put("mType", MESSAGE_TYPE); + + JSONObject body = new JSONObject(); + body.put("bType", BIZ_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + body.put("cell", cellTag.getCellVal()); + } + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + body.put("pci", pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + body.put("rsrp", rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + body.put("snr", snrTag.getSnr()); + } + + // 业务数据 + if (bizDataList != null) { + JSONArray datas = new JSONArray(); + for (SentinelBizData bizData : bizDataList) { + datas.add(bizData.toJSON()); + } + body.put("datas", datas); + } + + json.put("mBody", body); + + return json; + } + + @Override + public boolean isBizDataFrame() { + return true; + } + + @Override + public List convertToBizDataList() { + List resultList = new ArrayList<>(); + if (bizDataList != null) { + for (SentinelBizData data : bizDataList) { + DeviceBizData bizData = new DeviceBizData(); + bizData.setBizType(String.valueOf(data.getBizType())); + bizData.setValue(String.format("%.3f", data.getValue())); + bizData.setUptime(data.getUptime()); + + // 电量 + if (getTagList().containsKey(CellTag.class.getSimpleName())) { + CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0); + bizData.setCell(cellTag.getCellVal()); + } + + // 信号质量 + if (getTagList().containsKey(PCITag.class.getSimpleName())) { + PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0); + bizData.setPci(pciTag.getPci()); + } + if (getTagList().containsKey(RSRPTag.class.getSimpleName())) { + RSRPTag rsrpTag = (RSRPTag) getTagList().get(RSRPTag.class.getSimpleName()).get(0); + bizData.setRsrp(rsrpTag.getRsrp()); + } + if (getTagList().containsKey(SNRTag.class.getSimpleName())) { + SNRTag snrTag = (SNRTag) getTagList().get(SNRTag.class.getSimpleName()).get(0); + bizData.setSnr(snrTag.getSnr()); + } + + resultList.add(bizData); + } + } + + return resultList; + } + + @Override + public void doParseBizTag() { + if (getTagList().containsKey(UploadTag.class.getSimpleName())) { + handleUploadTag(); + } + + if (getTagList().containsKey(SensorStateTag.class.getSimpleName())) { + handleSensorStateTag(); + } + } + + private void handleUploadTag() { + List tags = getTagList().get(UploadTag.class.getSimpleName()); + + bizDataList = new ArrayList<>(); + + for (BirmmBaseTag tag : tags) { + UploadTag uploadTag = (UploadTag) tag; + // 检查oid是否符合要求 能取到bizType 采集周期 采集开始时间 + boolean isValid = uploadTag.checkOid(); + if (isValid) { + // 找到DateTag 取出其中的日期 + if ( !getTagList().containsKey(DateTag.class.getSimpleName()) ) { + continue; + } + DateTag dateTag = (DateTag) getTagList().get(DateTag.class.getSimpleName()).get(0); + uploadTag.setStartDate(dateTag.getDate()); + + int count = uploadTag.getValueStr().length() / (4 * 2); // 4个字节一个数据 单精度浮点数 + LocalDateTime start = uploadTag.getStartTime(); + for (int i = 0; i < count; i++) { + SentinelBizData bizData = new SentinelBizData(); + + 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() { + List tags = getTagList().get(SensorStateTag.class.getSimpleName()); + for (BirmmBaseTag tag : tags) { + SensorStateTag sensorStateTag = (SensorStateTag) tag; + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + // 甲烷传感器状态 + log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + // 甲烷传感器状态 + log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + } + + // TODO-LIST + // 传感器状态异常时需要上报异常事件 + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java new file mode 100644 index 0000000..2a87b3f --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java @@ -0,0 +1,20 @@ +package com.casic.missiles.frame.sentinel; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; + +public class SentinelTrapResponseFrame extends BirmmBaseFrame { + + @Override + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString()); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java new file mode 100644 index 0000000..8e40b85 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class NeedOTATag extends BirmmBaseTag { + + final String NEED_OTA_TAG_OID = "60000600"; + + boolean need; + + @Override + public String toString() { + return super.toString() + "[value: " + need + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength() * 2 + "x", need ? 1 : 0); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + need = Boolean.parseBoolean(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java deleted file mode 100644 index 884b44f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/OTANeedTag.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.frame.tag.ota; - -import com.casic.missiles.enums.BirmmTagTypeEnums; -import com.casic.missiles.frame.BirmmBaseTag; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -@Data -public class OTANeedTag extends BirmmBaseTag { - - final String OTA_NEED_TAG_OID = "60000600"; - - boolean need; - - @Override - public String toString() { - return super.toString() + "[value: " + need + "]"; - } - - @Override - public String toProtocolString() { - String result = ""; - result += BirmmTagTypeEnums.OTA_NEED_TAG.getName(); // OID - result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_TAG.getLength()); // 长度 - result += String.format("%02x", need ? 1 : 0); - - return result; - } - - @Override - public void setValueStr(String valueStr) { - super.setValueStr(valueStr); - need = Boolean.parseBoolean(valueStr); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java new file mode 100644 index 0000000..08dafcf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageCRCTag extends BirmmBaseTag { + + final String PACKAGE_CRC_TAG_OID = "60000603"; + + String packCRC; + + @Override + public String toString() { + return super.toString() + "[value: " + packCRC + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength() * 2 + "x", packCRC); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + packCRC = valueStr; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java new file mode 100644 index 0000000..f9801a2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.tomcat.util.buf.HexUtils; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageDataTag extends BirmmBaseTag { + + final String PACKAGE_DATA_TAG_OID = "60000601"; + + byte[] data; + + @Override + public String toString() { + return super.toString() + "[value: " + HexUtils.toHexString(data) + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_DATA_TAG.getName(); // OID + result += String.format("%04d", data.length); // 长度 + result += HexUtils.toHexString(data); + + return result; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java new file mode 100644 index 0000000..05ff3c1 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java @@ -0,0 +1,36 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PackageSizeTag extends BirmmBaseTag { + + final String PACKAGE_SIZE_TAG_OID = "60000602"; + + int packSize; + + @Override + public String toString() { + return super.toString() + "[value: " + packSize + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength() * 2 + "x", packSize); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + packSize = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java new file mode 100644 index 0000000..bfc83dd --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java @@ -0,0 +1,37 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class RequestOffsetTag extends BirmmBaseTag { + + final String REQUEST_OFFSET_TAG_OID = "20000102"; + + // 本次请求的升级包偏移量 + int requestOffset; + + @Override + public String toString() { + return super.toString() + "[value: " + requestOffset + "]"; + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getName(); // OID + result += String.format("%04d", BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength() * 2 + "x", requestOffset); + + return result; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + requestOffset = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java new file mode 100644 index 0000000..6c096a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/frame/tag/ota/RequestSizeTag.java @@ -0,0 +1,27 @@ +package com.casic.missiles.frame.tag.ota; + +import com.casic.missiles.enums.BirmmTagTypeEnums; +import com.casic.missiles.frame.BirmmBaseTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class RequestSizeTag extends BirmmBaseTag { + + final String REQUEST_SIZE_TAG_OID = "20000100"; + + // 本次请求的升级包大小 + int requestSize; + + @Override + public String toString() { + return super.toString() + "[value: " + requestSize + "]"; + } + + @Override + public void setValueStr(String valueStr) { + super.setValueStr(valueStr); + requestSize = Integer.parseInt(valueStr); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 91c81d0..207eca2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -15,6 +15,7 @@ import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; +import javax.annotation.Resource; /** * SensorhubServer netty服务端 @@ -32,6 +33,9 @@ EventLoopGroup bossGroup = new NioEventLoopGroup(4); // boss EventLoopGroup workerGroup = new NioEventLoopGroup(32); // worker + @Resource + SensorhubServerChannelInitialHandler pipeLine; + /** * sensorhub属性参数 */ @@ -71,7 +75,7 @@ ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) // 设置EventLoopGroup .channel(NioServerSocketChannel.class) // 指明新的Channel的类型 - .childHandler(new SensorhubServerChannelInitialHandler()) // 指定ChannelHandler + .childHandler(pipeLine) // 指定ChannelHandler .option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) .childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) .option(ChannelOption.SO_BACKLOG, 1024) // 设置的ServerChannel的一些选项 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java index c3f82cc..02f1291 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java @@ -1,27 +1,38 @@ package com.casic.missiles.netty.handler; +import com.casic.missiles.parser.BirmmHexDecoder; import com.casic.missiles.parser.SensorhubDecoder; +import com.casic.missiles.parser.safe.impl.Sm4; +import com.casic.missiles.replier.CommonHexReplier; import com.casic.missiles.replier.SensorhubReplier; +import com.casic.missiles.util.SpringContextUtil; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; /** * @author cz * @date 2023-06-05 */ +@Component public class SensorhubServerChannelInitialHandler extends ChannelInitializer { - + @Resource + BirmmHexDecoder birmmHexDecoder; @Override protected void initChannel(SocketChannel socketChannel) { ChannelPipeline pipeline = socketChannel.pipeline(); pipeline.addLast(new LoggingHandler(LogLevel.INFO)); - pipeline.addLast(new SensorhubDecoder()); - pipeline.addLast(new SensorhubReplier()); +// pipeline.addLast(new SensorhubDecoder()); +// pipeline.addLast(birmmHexDecoder); + pipeline.addLast(new BirmmHexDecoder()); + pipeline.addLast(new CommonHexReplier()); // 心跳续约 // pipeline.addLast(this.heartBeatRespHandler); // pipeline.addLast(this.loginAuthRespHandler); 登录验证 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java new file mode 100644 index 0000000..6931af5 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -0,0 +1,106 @@ +package com.casic.missiles.parser; + +import cn.hutool.http.HttpUtil; +import com.casic.missiles.frame.BirmmBaseFrame; +import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.model.DeviceFrameLog; +import com.casic.missiles.service.GeneralServiceImpl; +import com.casic.missiles.service.IDeviceBizDataService; +import com.casic.missiles.service.IDeviceFrameLogService; +import com.casic.missiles.service.IGeneralService; +import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; +import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; +import com.casic.missiles.util.SnowflakeUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author tanyue + * @date 2024-07 + * BirmmHexDecoder + */ +@Slf4j +@Component("BirmmHexDecoder") +public class BirmmHexDecoder extends ByteToMessageDecoder { + + IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); + + IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); + + IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + log.info("建立连接:{}", ctx.channel().id()); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.info("断开连接:{}", ctx.channel().id()); + } + + @Override + public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { + byte[] frameBytes = new byte[buffer.readableBytes()]; + buffer.readBytes(frameBytes); + log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + + // 工厂类创建frame对象 + BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); + if (birmmFrame != null) { + // 处理业务数据 + birmmFrame.doParseBizTag(); + + log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); + + // 保存日志 + DeviceFrameLog frameLog = new DeviceFrameLog(); + frameLog.setId(new SnowflakeUtil().nextId()); + frameLog.setDevcode(birmmFrame.getDevCode()); + frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase()); + frameLog.setRawBizFrame(birmmFrame.getRawBizFrameString()); + frameLog.setDataJson(birmmFrame.toJSON().toJSONString()); + frameLog.setLogtime(birmmFrame.getLogTime()); + frameLogService.save(frameLog); + + String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv") + .contentType("application/json") + .body(birmmFrame.toJSON().toJSONString()) + .execute().body(); + log.info("发送到接口:{}", body); + + // 保存业务数据 + if (birmmFrame.isBizDataFrame()) { + List bizDataList = birmmFrame.convertToBizDataList(); + for (DeviceBizData bizData : bizDataList) { + // 设置其他的属性 + bizData.setId(new SnowflakeUtil().nextId()); + bizData.setFrameLogId(frameLog.getId()); // 关联日志记录id + bizData.setDevcode(birmmFrame.getDevCode()); + bizData.setDeviceType(Integer.valueOf(birmmFrame.getDeviceType())); + bizData.setLogtime(birmmFrame.getLogTime()); + } + + // 批量保存 + bizDataService.saveBatch(bizDataList); + } + + // 创建回复消息 + BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + if (configFrame != null) { + // 根据协议进行封装 + String replyMessage = defaultService.replyMessage(configFrame); + log.info("下行HEX字节消息帧:{}", replyMessage); + + list.add(replyMessage); + } + } + } +} 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 2f90c5f..c79095b 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 @@ -36,9 +36,9 @@ String getSequence(byte[] frameBytes); String getTagListString(byte[] frameBytes); - Map getTagList(byte[] tagBytes); + Map> getTagList(byte[] tagBytes); - String buildTagListStr(Map tagList); + String buildTagListStr(Map> tagList); 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 8f0bd17..bda0040 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 @@ -1,6 +1,7 @@ package com.casic.missiles.parser.impl; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.frame.BirmmBaseFrame; import com.casic.missiles.frame.BirmmBaseTag; import com.casic.missiles.frame.BirmmTagBuilderFactory; import com.casic.missiles.parser.BirmmProtocolParser; @@ -10,7 +11,9 @@ import org.apache.tomcat.util.buf.HexUtils; import org.springframework.stereotype.Component; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; @Component @@ -129,12 +132,12 @@ } @Override - public Map getTagList(byte[] tagBytes) { + public Map> getTagList(byte[] tagBytes) { // 必须包含OID和长度 4 + 2 if (tagBytes.length < 6) { return null; } - Map tagList = new HashMap<>(); + Map> tagList = new HashMap<>(); int idx = 0; while (idx + 6 < tagBytes.length) { String oid = BytesUtil.extractHexString(tagBytes, idx, 4); @@ -149,7 +152,15 @@ log.debug("解析Tag:{}", tagBase); - tagList.put(tagBase.getClass().getSimpleName(), tagBase); + // 一包可能还有多个UploadTag 使用List + if (tagList.containsKey(tagBase.getClass().getSimpleName())) { + tagList.get(tagBase.getClass().getSimpleName()).add(tagBase); + } else { + List tags = new ArrayList<>(); + tags.add(tagBase); + tagList.put(tagBase.getClass().getSimpleName(), tags); + } + } } idx += tagLen; @@ -159,11 +170,13 @@ } @Override - public String buildTagListStr(Map tagList) { + public String buildTagListStr(Map> tagList) { StringBuilder result = new StringBuilder(); - for (BirmmBaseTag tag : tagList.values()) { - result.append(tag.toProtocolString()); + for (List tags : tagList.values()) { + for (BirmmBaseTag tag : tags) { + result.append(tag.toProtocolString()); + } } return result.toString().toUpperCase(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 4401a83..a0688c2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -45,7 +45,7 @@ }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); key.writeBytes(keyByte); - byte[] in = Hex.decode(cipher); + byte[] in = Hex.decode(fillFrameStructZero(cipher, 16)); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); return EcbEncrypt(in, keyBytes); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java new file mode 100644 index 0000000..6fa8cce --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -0,0 +1,46 @@ +package com.casic.missiles.replier; + +import com.casic.missiles.pojo.ParseResult; +import com.casic.missiles.replier.command.AbstractBuildReplyCommand; +import com.casic.missiles.util.BytesUtil; +import com.casic.missiles.util.ClazzUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; + +/** + * @author tanyue + */ +@Slf4j +public class CommonHexReplier extends SimpleChannelInboundHandler { + + /** + * 回复内容构建的流程入口方法 + * 1、通过有标准协议解析器传来的结果进行命令的构建 + * 2、构建命令有以下的命令内容 + * (1)成功返回时间,并进行下发配置操作 + * (2)版本升级 + * (3)下位机下发版本是否升级,是上版本,是升级,请求,回复升级等流程 + * (4)其他未知需求命令 + */ + @Override + public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { + System.out.println("Client->Server:" + obj); + byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); + ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); + //进行回复 + ctx.channel().writeAndFlush(replyByteBuf); + } + + @Override + public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { + ctx.fireChannelReadComplete(); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/AEPCommandServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/AEPCommandServiceImpl.java index d728e30..b71d831 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/AEPCommandServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/AEPCommandServiceImpl.java @@ -3,7 +3,10 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.util.BytesUtil; +import com.ctg.ag.sdk.biz.AepDeviceCommandClient; import com.ctg.ag.sdk.biz.AepDeviceCommandLwmProfileClient; +import com.ctg.ag.sdk.biz.aep_device_command.CreateCommandRequest; +import com.ctg.ag.sdk.biz.aep_device_command.CreateCommandResponse; import com.ctg.ag.sdk.biz.aep_device_command_lwm_profile.CreateCommandLwm2mProfileRequest; import com.ctg.ag.sdk.biz.aep_device_command_lwm_profile.CreateCommandLwm2mProfileResponse; import lombok.Data; @@ -12,7 +15,6 @@ import org.springframework.context.annotation.Configuration; import java.nio.charset.StandardCharsets; -import java.util.Base64; @Configuration @Slf4j @@ -38,8 +40,44 @@ private String productId; @Override - public int handleSendCommand(String command) { - return 0; + public int handleSendCommand(String command, int dataType) { + AepDeviceCommandClient client = AepDeviceCommandClient.newClient().appKey(key).appSecret(secret).build(); + + JSONObject body = new JSONObject(); + JSONObject content = new JSONObject(); + + int retCode = -1; + + try { + //组装请求返回的参数 + CreateCommandRequest request = new CreateCommandRequest(); + request.setParamMasterKey(masterApiKey); + + body.put("deviceId", deviceId); + body.put("operator", operator); + body.put("productId", productId); + + content.put("dataType", dataType); // 数据类型:1字符串,2十六进制 + content.put("payload", command); // 指令内容,数据格式为十六进制时需要填十六进制字符串 + body.put("content", content); + + request.setBody(body.toJSONString().getBytes()); + log.info("向AEP平台发送指令:{}", body.toJSONString()); + + //调用电信平台的客服端发送报文回复 + CreateCommandResponse msgResponse = client.CreateCommand(request); + JSONObject retObj = JSON.parseObject(new String(msgResponse.getBody(), StandardCharsets.UTF_8)); + retCode = (int) retObj.get("code"); + + log.info("AEP平台返回消息:{}", retObj.toJSONString()); + + } catch (Exception ex) { + log.error("电信平台发送失败,异常信息{}", ex.getMessage()); + } finally { + client.shutdown(); + } + + return retCode; } @Override 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 006c51d..da20a28 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 @@ -1,5 +1,6 @@ package com.casic.missiles.service; +import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.BirmmBaseFrame; @@ -8,6 +9,8 @@ import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.parser.safe.impl.Sm4; +import com.casic.missiles.parser.safe.impl.TeaUtilsX; +import com.casic.missiles.parser.safe.impl.Teas; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.tomcat.util.buf.HexUtils; @@ -63,14 +66,20 @@ // 解密 // TODO-LIST // 密钥根据设备编号获取 - SafeStrategy safeStrategy = SpringContextUtil.getBean(Sm4.class); - byte[] plainBytes = safeStrategy.decryption(tagListStr, keyByte); + SafeStrategy safeStrategy; + if (deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue())) { + safeStrategy = SpringContextUtil.getBean(Sm4.class); + } else { + safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); + } + + byte[] plainBytes = safeStrategy.decryption(tagListStr); String plainTagListStr = HexUtils.toHexString(plainBytes).toUpperCase(); log.info("上行业务字段:{}", plainTagListStr); // 获得业务字段tagList - Map tagList = protocol.getTagList(plainBytes); + Map> tagList = protocol.getTagList(plainBytes); // 创建Frame BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); @@ -147,8 +156,14 @@ // 加密 // TODO-LIST // 密钥根据设备编号获取 - SafeStrategy safeStrategy = SpringContextUtil.getBean(Sm4.class); - byte[] tagBytes = safeStrategy.encryption(plainTagListStr, keyByte); + SafeStrategy safeStrategy; + if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue())) { + safeStrategy = SpringContextUtil.getBean(Sm4.class); + } else { + safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); + } + + byte[] tagBytes = safeStrategy.encryption(plainTagListStr); frame.append(HexUtils.toHexString(tagBytes).toUpperCase()); // 计算CRC校验码 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IAEPCommandService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IAEPCommandService.java index 14736e1..49ab7ad 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IAEPCommandService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IAEPCommandService.java @@ -2,7 +2,7 @@ public interface IAEPCommandService { - int handleSendCommand(String command); + int handleSendCommand(String command, int dataType); int handleSendCommandWithProfile(String command); 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 index e1eac2d..f05c3c3 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmDeviceTypeEnums.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmDeviceTypeEnums.java @@ -12,6 +12,7 @@ METHANE("4", "BIRMM-RTU100N", "31"), WELL("6", "BIRMM-WELL100N", "41"), LIQUID_GAS("25", "", "32"), + SENTINEL("28", "", "34"), METHANE_BIZ("32", "", "33"), DEFAULT("", "", ""); diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmTagTypeEnums.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmTagTypeEnums.java index 911ff57..02d7888 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmTagTypeEnums.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmTagTypeEnums.java @@ -21,8 +21,8 @@ LOWER_LIMIT_TAG("10000900", 4), UPPER_LIMIT_TAG("10000901", 4), - OTA_SIZE_TAG("20000100", 4), - OTA_OFFSET_TAG("20000102", 4), + OTA_REQUEST_SIZE_TAG("20000100", 4), + OTA_REQUEST_OFFSET_TAG("20000102", 4), SENSOR_STATE_1_TAG("60000009", 1), SENSOR_STATE_2_TAG("6000000A", 1), @@ -35,7 +35,7 @@ RSRP_TAG("60000513", 2), SNR_TAG("60000516", 2), - OTA_NEED_TAG("60000600", 1), + OTA_NEED_OTA_TAG("60000600", 1), OTA_PACKAGE_DATA_TAG("60000601", -1), OTA_PACKAGE_SIZE_TAG("60000602", 4), OTA_PACKAGE_CRC_TAG("60000603", 2)