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
+ 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
+ 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
+ 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
+ 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
+ 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)