diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java index f79daf8..5cefd90 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java @@ -2,12 +2,12 @@ public class MyUtils { - public static int[] byteToInt(byte[] Mybytes, int len) { - int[] RetInt = new int[len / 4]; + public static long[] byteToInt(byte[] Mybytes, int len) { + long[] RetInt = new long[len / 4]; int i32Count = len / 4; int i32Index = 0; for (int i32Increase = 0; i32Increase < i32Count; i32Increase++) { - RetInt[i32Increase] = (int)( + RetInt[i32Increase] = (long)( Mybytes[3 + i32Index] <<24 | Mybytes[2 + i32Index] << 16 | Mybytes[1 + i32Index] << 8 @@ -26,7 +26,7 @@ return tempInt; } - public static byte[] IntToBytes(int[] MyInts, int len) { + public static byte[] IntToBytes(long[] MyInts, int len) { byte[] RetBytes = new byte[len * 4]; for (int i32Index = 0; i32Index < len; i32Index++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java index f79daf8..5cefd90 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java @@ -2,12 +2,12 @@ public class MyUtils { - public static int[] byteToInt(byte[] Mybytes, int len) { - int[] RetInt = new int[len / 4]; + public static long[] byteToInt(byte[] Mybytes, int len) { + long[] RetInt = new long[len / 4]; int i32Count = len / 4; int i32Index = 0; for (int i32Increase = 0; i32Increase < i32Count; i32Increase++) { - RetInt[i32Increase] = (int)( + RetInt[i32Increase] = (long)( Mybytes[3 + i32Index] <<24 | Mybytes[2 + i32Index] << 16 | Mybytes[1 + i32Index] << 8 @@ -26,7 +26,7 @@ return tempInt; } - public static byte[] IntToBytes(int[] MyInts, int len) { + public static byte[] IntToBytes(long[] MyInts, int len) { byte[] RetBytes = new byte[len * 4]; for (int i32Index = 0; i32Index < len; i32Index++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/SenderSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/SenderSupport.java index 7d50f79..4c737d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/SenderSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/SenderSupport.java @@ -2,6 +2,8 @@ import cn.hutool.core.date.DateUtil; import com.casic.missiles.enums.subscribe.DeviceSenderEnum; +import com.casic.missiles.pojo.MBody; +import com.casic.missiles.pojo.Message; import org.springframework.util.CollectionUtils; import java.util.Date; @@ -21,51 +23,52 @@ * * @param bizDataMapList 构建数据的初始化结果集 */ - protected Map buildTypeDeviceData(List> bizDataMapList) { - Map contentMap = new HashMap(), mBody = new HashMap(); + protected Message buildTypeDeviceData(List> bizDataMapList) { + Message message = new Message(); + MBody mBody = new MBody(); Map bizDataMap = bizDataMapList.get(0); switch ((Integer) bizDataMap.get(DEVICE_TYPE)) { case 32: //构建不同类型的下发配置事件 - contentMap.put("devType", "GasDetector"); - setEventType(bizDataMap, contentMap, mBody, "GasConfigSuccess", "GasConfigFail"); + message.setDevType("GasDetector"); + setEventType(bizDataMap, message, mBody, "GasConfigSuccess", "GasConfigFail"); break; case 31: - contentMap.put("devType", "Pressure"); - setEventType(bizDataMap, contentMap, mBody, "PressureConfigSuccess", "PressureConfigFail"); + message.setDevType("Pressure"); + setEventType(bizDataMap, message, mBody, "PressureConfigSuccess", "PressureConfigFail"); } //构建值回复的类型 if (bizDataMap.containsKey("dataValue")) { - contentMap.put("mType", "Data"); + message.setMType("Data"); if (bizDataMap.containsKey("cell")) { - mBody.put("cell", bizDataMap.get("cell")); + mBody.setCell((Integer) bizDataMap.get("cell")); } - mBody.put("datas", bizDataMapList); + mBody.setDatas(bizDataMapList); } //构建三码上数的结构 if (bizDataMap.containsKey("imei")) { - contentMap.put("mType", "StartupRequest"); - mBody.put("iccid", bizDataMap.get("iccid")); - mBody.put("imei", bizDataMap.get("imei")); + message.setMType("StartupRequest"); + mBody.setIccid(bizDataMap.get("iccid")); + mBody.setImei(bizDataMap.get("imei")); } if (bizDataMap.containsKey("devcode")) { - contentMap.put("devCode", bizDataMap.get("devcode")); + message.setDevCode((String) bizDataMap.get("devcode")); } - contentMap.put("mBody", mBody); - return contentMap; + message.setMBody(mBody); + return message; } /** * 设置下发配置回复 */ - private void setEventType(Map bizDataMap, Map contentMap, Map mBody, String bTypeSuccess, String bTypeFail) { + private void setEventType(Map bizDataMap, Message message, MBody mBody, String bTypeSuccess, String bTypeFail) { if (bizDataMap.containsKey("config")) { - contentMap.put("mType", "SetResponse"); - contentMap.put("ts", DateUtil.format(new Date(), "yyyyMMddHHmmss")); + message.setMType("SetResponse"); + message.setTs(DateUtil.format(new Date(), "yyyyMMddHHmmss")); if ("1".equals(bizDataMap.get("config"))) { - mBody.put("bType", bTypeSuccess); + mBody.setBType(bTypeSuccess); } else { - mBody.put("bType", bTypeFail); + mBody.setBType(bTypeFail); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java index f79daf8..5cefd90 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java @@ -2,12 +2,12 @@ public class MyUtils { - public static int[] byteToInt(byte[] Mybytes, int len) { - int[] RetInt = new int[len / 4]; + public static long[] byteToInt(byte[] Mybytes, int len) { + long[] RetInt = new long[len / 4]; int i32Count = len / 4; int i32Index = 0; for (int i32Increase = 0; i32Increase < i32Count; i32Increase++) { - RetInt[i32Increase] = (int)( + RetInt[i32Increase] = (long)( Mybytes[3 + i32Index] <<24 | Mybytes[2 + i32Index] << 16 | Mybytes[1 + i32Index] << 8 @@ -26,7 +26,7 @@ return tempInt; } - public static byte[] IntToBytes(int[] MyInts, int len) { + public static byte[] IntToBytes(long[] MyInts, int len) { byte[] RetBytes = new byte[len * 4]; for (int i32Index = 0; i32Index < len; i32Index++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/SenderSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/SenderSupport.java index 7d50f79..4c737d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/SenderSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/SenderSupport.java @@ -2,6 +2,8 @@ import cn.hutool.core.date.DateUtil; import com.casic.missiles.enums.subscribe.DeviceSenderEnum; +import com.casic.missiles.pojo.MBody; +import com.casic.missiles.pojo.Message; import org.springframework.util.CollectionUtils; import java.util.Date; @@ -21,51 +23,52 @@ * * @param bizDataMapList 构建数据的初始化结果集 */ - protected Map buildTypeDeviceData(List> bizDataMapList) { - Map contentMap = new HashMap(), mBody = new HashMap(); + protected Message buildTypeDeviceData(List> bizDataMapList) { + Message message = new Message(); + MBody mBody = new MBody(); Map bizDataMap = bizDataMapList.get(0); switch ((Integer) bizDataMap.get(DEVICE_TYPE)) { case 32: //构建不同类型的下发配置事件 - contentMap.put("devType", "GasDetector"); - setEventType(bizDataMap, contentMap, mBody, "GasConfigSuccess", "GasConfigFail"); + message.setDevType("GasDetector"); + setEventType(bizDataMap, message, mBody, "GasConfigSuccess", "GasConfigFail"); break; case 31: - contentMap.put("devType", "Pressure"); - setEventType(bizDataMap, contentMap, mBody, "PressureConfigSuccess", "PressureConfigFail"); + message.setDevType("Pressure"); + setEventType(bizDataMap, message, mBody, "PressureConfigSuccess", "PressureConfigFail"); } //构建值回复的类型 if (bizDataMap.containsKey("dataValue")) { - contentMap.put("mType", "Data"); + message.setMType("Data"); if (bizDataMap.containsKey("cell")) { - mBody.put("cell", bizDataMap.get("cell")); + mBody.setCell((Integer) bizDataMap.get("cell")); } - mBody.put("datas", bizDataMapList); + mBody.setDatas(bizDataMapList); } //构建三码上数的结构 if (bizDataMap.containsKey("imei")) { - contentMap.put("mType", "StartupRequest"); - mBody.put("iccid", bizDataMap.get("iccid")); - mBody.put("imei", bizDataMap.get("imei")); + message.setMType("StartupRequest"); + mBody.setIccid(bizDataMap.get("iccid")); + mBody.setImei(bizDataMap.get("imei")); } if (bizDataMap.containsKey("devcode")) { - contentMap.put("devCode", bizDataMap.get("devcode")); + message.setDevCode((String) bizDataMap.get("devcode")); } - contentMap.put("mBody", mBody); - return contentMap; + message.setMBody(mBody); + return message; } /** * 设置下发配置回复 */ - private void setEventType(Map bizDataMap, Map contentMap, Map mBody, String bTypeSuccess, String bTypeFail) { + private void setEventType(Map bizDataMap, Message message, MBody mBody, String bTypeSuccess, String bTypeFail) { if (bizDataMap.containsKey("config")) { - contentMap.put("mType", "SetResponse"); - contentMap.put("ts", DateUtil.format(new Date(), "yyyyMMddHHmmss")); + message.setMType("SetResponse"); + message.setTs(DateUtil.format(new Date(), "yyyyMMddHHmmss")); if ("1".equals(bizDataMap.get("config"))) { - mBody.put("bType", bTypeSuccess); + mBody.setBType(bTypeSuccess); } else { - mBody.put("bType", bTypeFail); + mBody.setBType(bTypeFail); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bbc6184..78f62ff 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -4,6 +4,7 @@ import com.casic.missiles.config.SensorhubProperties; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; +import com.casic.missiles.pojo.Message; import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; @@ -37,12 +38,12 @@ if (StringUtils.isEmpty(sensorhubProperties.getUrl())) { return; } - Map contentMap = this.buildTypeDeviceData(bizDataMapList); - if (!contentMap.containsKey("mType")) { + Message message = this.buildTypeDeviceData(bizDataMapList); + if (StringUtils.isEmpty(message.getMType())) { return; } - log.info("发送到地址{},内容是{}", sensorhubProperties.getUrl(), JSON.toJSONString(contentMap)); - doPublishDataSubscribe(JSON.toJSONString(contentMap), sensorhubProperties.getUrl()); + log.info("发送到地址{},内容是{}", sensorhubProperties.getUrl(), JSON.toJSONString(message)); + doPublishDataSubscribe(JSON.toJSONString(message), sensorhubProperties.getUrl()); } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java index f79daf8..5cefd90 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java @@ -2,12 +2,12 @@ public class MyUtils { - public static int[] byteToInt(byte[] Mybytes, int len) { - int[] RetInt = new int[len / 4]; + public static long[] byteToInt(byte[] Mybytes, int len) { + long[] RetInt = new long[len / 4]; int i32Count = len / 4; int i32Index = 0; for (int i32Increase = 0; i32Increase < i32Count; i32Increase++) { - RetInt[i32Increase] = (int)( + RetInt[i32Increase] = (long)( Mybytes[3 + i32Index] <<24 | Mybytes[2 + i32Index] << 16 | Mybytes[1 + i32Index] << 8 @@ -26,7 +26,7 @@ return tempInt; } - public static byte[] IntToBytes(int[] MyInts, int len) { + public static byte[] IntToBytes(long[] MyInts, int len) { byte[] RetBytes = new byte[len * 4]; for (int i32Index = 0; i32Index < len; i32Index++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/SenderSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/SenderSupport.java index 7d50f79..4c737d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/SenderSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/SenderSupport.java @@ -2,6 +2,8 @@ import cn.hutool.core.date.DateUtil; import com.casic.missiles.enums.subscribe.DeviceSenderEnum; +import com.casic.missiles.pojo.MBody; +import com.casic.missiles.pojo.Message; import org.springframework.util.CollectionUtils; import java.util.Date; @@ -21,51 +23,52 @@ * * @param bizDataMapList 构建数据的初始化结果集 */ - protected Map buildTypeDeviceData(List> bizDataMapList) { - Map contentMap = new HashMap(), mBody = new HashMap(); + protected Message buildTypeDeviceData(List> bizDataMapList) { + Message message = new Message(); + MBody mBody = new MBody(); Map bizDataMap = bizDataMapList.get(0); switch ((Integer) bizDataMap.get(DEVICE_TYPE)) { case 32: //构建不同类型的下发配置事件 - contentMap.put("devType", "GasDetector"); - setEventType(bizDataMap, contentMap, mBody, "GasConfigSuccess", "GasConfigFail"); + message.setDevType("GasDetector"); + setEventType(bizDataMap, message, mBody, "GasConfigSuccess", "GasConfigFail"); break; case 31: - contentMap.put("devType", "Pressure"); - setEventType(bizDataMap, contentMap, mBody, "PressureConfigSuccess", "PressureConfigFail"); + message.setDevType("Pressure"); + setEventType(bizDataMap, message, mBody, "PressureConfigSuccess", "PressureConfigFail"); } //构建值回复的类型 if (bizDataMap.containsKey("dataValue")) { - contentMap.put("mType", "Data"); + message.setMType("Data"); if (bizDataMap.containsKey("cell")) { - mBody.put("cell", bizDataMap.get("cell")); + mBody.setCell((Integer) bizDataMap.get("cell")); } - mBody.put("datas", bizDataMapList); + mBody.setDatas(bizDataMapList); } //构建三码上数的结构 if (bizDataMap.containsKey("imei")) { - contentMap.put("mType", "StartupRequest"); - mBody.put("iccid", bizDataMap.get("iccid")); - mBody.put("imei", bizDataMap.get("imei")); + message.setMType("StartupRequest"); + mBody.setIccid(bizDataMap.get("iccid")); + mBody.setImei(bizDataMap.get("imei")); } if (bizDataMap.containsKey("devcode")) { - contentMap.put("devCode", bizDataMap.get("devcode")); + message.setDevCode((String) bizDataMap.get("devcode")); } - contentMap.put("mBody", mBody); - return contentMap; + message.setMBody(mBody); + return message; } /** * 设置下发配置回复 */ - private void setEventType(Map bizDataMap, Map contentMap, Map mBody, String bTypeSuccess, String bTypeFail) { + private void setEventType(Map bizDataMap, Message message, MBody mBody, String bTypeSuccess, String bTypeFail) { if (bizDataMap.containsKey("config")) { - contentMap.put("mType", "SetResponse"); - contentMap.put("ts", DateUtil.format(new Date(), "yyyyMMddHHmmss")); + message.setMType("SetResponse"); + message.setTs(DateUtil.format(new Date(), "yyyyMMddHHmmss")); if ("1".equals(bizDataMap.get("config"))) { - mBody.put("bType", bTypeSuccess); + mBody.setBType(bTypeSuccess); } else { - mBody.put("bType", bTypeFail); + mBody.setBType(bTypeFail); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bbc6184..78f62ff 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -4,6 +4,7 @@ import com.casic.missiles.config.SensorhubProperties; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; +import com.casic.missiles.pojo.Message; import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; @@ -37,12 +38,12 @@ if (StringUtils.isEmpty(sensorhubProperties.getUrl())) { return; } - Map contentMap = this.buildTypeDeviceData(bizDataMapList); - if (!contentMap.containsKey("mType")) { + Message message = this.buildTypeDeviceData(bizDataMapList); + if (StringUtils.isEmpty(message.getMType())) { return; } - log.info("发送到地址{},内容是{}", sensorhubProperties.getUrl(), JSON.toJSONString(contentMap)); - doPublishDataSubscribe(JSON.toJSONString(contentMap), sensorhubProperties.getUrl()); + log.info("发送到地址{},内容是{}", sensorhubProperties.getUrl(), JSON.toJSONString(message)); + doPublishDataSubscribe(JSON.toJSONString(message), sensorhubProperties.getUrl()); } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java index 288ed52..95494eb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java @@ -5,6 +5,7 @@ import com.casic.missiles.autoconfig.KafkaSendResultHandler; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; +import com.casic.missiles.pojo.Message; import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; @@ -21,7 +22,7 @@ * @date 2023-11-10 */ @Component("kafka") -public class KafkaSubscribe extends SenderSupport implements DataSubscribeProvider { +public class KafkaSubscribe extends SenderSupport implements DataSubscribeProvider { private KafkaTemplate kafkaTemplate; @@ -37,8 +38,8 @@ if (CollectionUtils.isEmpty(bizDataMapList)) { return; } - Map contentMap=this.buildTypeDeviceData(bizDataMapList); - kafkaTemplate.send("pressure", JSON.toJSONString(contentMap)); + Message message = this.buildTypeDeviceData(bizDataMapList); + kafkaTemplate.send("pressure", JSON.toJSONString(message)); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java index f79daf8..5cefd90 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java @@ -2,12 +2,12 @@ public class MyUtils { - public static int[] byteToInt(byte[] Mybytes, int len) { - int[] RetInt = new int[len / 4]; + public static long[] byteToInt(byte[] Mybytes, int len) { + long[] RetInt = new long[len / 4]; int i32Count = len / 4; int i32Index = 0; for (int i32Increase = 0; i32Increase < i32Count; i32Increase++) { - RetInt[i32Increase] = (int)( + RetInt[i32Increase] = (long)( Mybytes[3 + i32Index] <<24 | Mybytes[2 + i32Index] << 16 | Mybytes[1 + i32Index] << 8 @@ -26,7 +26,7 @@ return tempInt; } - public static byte[] IntToBytes(int[] MyInts, int len) { + public static byte[] IntToBytes(long[] MyInts, int len) { byte[] RetBytes = new byte[len * 4]; for (int i32Index = 0; i32Index < len; i32Index++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/SenderSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/SenderSupport.java index 7d50f79..4c737d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/SenderSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/SenderSupport.java @@ -2,6 +2,8 @@ import cn.hutool.core.date.DateUtil; import com.casic.missiles.enums.subscribe.DeviceSenderEnum; +import com.casic.missiles.pojo.MBody; +import com.casic.missiles.pojo.Message; import org.springframework.util.CollectionUtils; import java.util.Date; @@ -21,51 +23,52 @@ * * @param bizDataMapList 构建数据的初始化结果集 */ - protected Map buildTypeDeviceData(List> bizDataMapList) { - Map contentMap = new HashMap(), mBody = new HashMap(); + protected Message buildTypeDeviceData(List> bizDataMapList) { + Message message = new Message(); + MBody mBody = new MBody(); Map bizDataMap = bizDataMapList.get(0); switch ((Integer) bizDataMap.get(DEVICE_TYPE)) { case 32: //构建不同类型的下发配置事件 - contentMap.put("devType", "GasDetector"); - setEventType(bizDataMap, contentMap, mBody, "GasConfigSuccess", "GasConfigFail"); + message.setDevType("GasDetector"); + setEventType(bizDataMap, message, mBody, "GasConfigSuccess", "GasConfigFail"); break; case 31: - contentMap.put("devType", "Pressure"); - setEventType(bizDataMap, contentMap, mBody, "PressureConfigSuccess", "PressureConfigFail"); + message.setDevType("Pressure"); + setEventType(bizDataMap, message, mBody, "PressureConfigSuccess", "PressureConfigFail"); } //构建值回复的类型 if (bizDataMap.containsKey("dataValue")) { - contentMap.put("mType", "Data"); + message.setMType("Data"); if (bizDataMap.containsKey("cell")) { - mBody.put("cell", bizDataMap.get("cell")); + mBody.setCell((Integer) bizDataMap.get("cell")); } - mBody.put("datas", bizDataMapList); + mBody.setDatas(bizDataMapList); } //构建三码上数的结构 if (bizDataMap.containsKey("imei")) { - contentMap.put("mType", "StartupRequest"); - mBody.put("iccid", bizDataMap.get("iccid")); - mBody.put("imei", bizDataMap.get("imei")); + message.setMType("StartupRequest"); + mBody.setIccid(bizDataMap.get("iccid")); + mBody.setImei(bizDataMap.get("imei")); } if (bizDataMap.containsKey("devcode")) { - contentMap.put("devCode", bizDataMap.get("devcode")); + message.setDevCode((String) bizDataMap.get("devcode")); } - contentMap.put("mBody", mBody); - return contentMap; + message.setMBody(mBody); + return message; } /** * 设置下发配置回复 */ - private void setEventType(Map bizDataMap, Map contentMap, Map mBody, String bTypeSuccess, String bTypeFail) { + private void setEventType(Map bizDataMap, Message message, MBody mBody, String bTypeSuccess, String bTypeFail) { if (bizDataMap.containsKey("config")) { - contentMap.put("mType", "SetResponse"); - contentMap.put("ts", DateUtil.format(new Date(), "yyyyMMddHHmmss")); + message.setMType("SetResponse"); + message.setTs(DateUtil.format(new Date(), "yyyyMMddHHmmss")); if ("1".equals(bizDataMap.get("config"))) { - mBody.put("bType", bTypeSuccess); + mBody.setBType(bTypeSuccess); } else { - mBody.put("bType", bTypeFail); + mBody.setBType(bTypeFail); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bbc6184..78f62ff 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -4,6 +4,7 @@ import com.casic.missiles.config.SensorhubProperties; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; +import com.casic.missiles.pojo.Message; import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; @@ -37,12 +38,12 @@ if (StringUtils.isEmpty(sensorhubProperties.getUrl())) { return; } - Map contentMap = this.buildTypeDeviceData(bizDataMapList); - if (!contentMap.containsKey("mType")) { + Message message = this.buildTypeDeviceData(bizDataMapList); + if (StringUtils.isEmpty(message.getMType())) { return; } - log.info("发送到地址{},内容是{}", sensorhubProperties.getUrl(), JSON.toJSONString(contentMap)); - doPublishDataSubscribe(JSON.toJSONString(contentMap), sensorhubProperties.getUrl()); + log.info("发送到地址{},内容是{}", sensorhubProperties.getUrl(), JSON.toJSONString(message)); + doPublishDataSubscribe(JSON.toJSONString(message), sensorhubProperties.getUrl()); } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java index 288ed52..95494eb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java @@ -5,6 +5,7 @@ import com.casic.missiles.autoconfig.KafkaSendResultHandler; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; +import com.casic.missiles.pojo.Message; import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; @@ -21,7 +22,7 @@ * @date 2023-11-10 */ @Component("kafka") -public class KafkaSubscribe extends SenderSupport implements DataSubscribeProvider { +public class KafkaSubscribe extends SenderSupport implements DataSubscribeProvider { private KafkaTemplate kafkaTemplate; @@ -37,8 +38,8 @@ if (CollectionUtils.isEmpty(bizDataMapList)) { return; } - Map contentMap=this.buildTypeDeviceData(bizDataMapList); - kafkaTemplate.send("pressure", JSON.toJSONString(contentMap)); + Message message = this.buildTypeDeviceData(bizDataMapList); + kafkaTemplate.send("pressure", JSON.toJSONString(message)); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/MBody.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/MBody.java new file mode 100644 index 0000000..08aa95f --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/MBody.java @@ -0,0 +1,22 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2024-04-24 + */ +@Data +public class MBody { + + private String bType; + private Integer cell; + private List> datas; + private String logTime; + private Object iccid; + private Object imei; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java index f79daf8..5cefd90 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java @@ -2,12 +2,12 @@ public class MyUtils { - public static int[] byteToInt(byte[] Mybytes, int len) { - int[] RetInt = new int[len / 4]; + public static long[] byteToInt(byte[] Mybytes, int len) { + long[] RetInt = new long[len / 4]; int i32Count = len / 4; int i32Index = 0; for (int i32Increase = 0; i32Increase < i32Count; i32Increase++) { - RetInt[i32Increase] = (int)( + RetInt[i32Increase] = (long)( Mybytes[3 + i32Index] <<24 | Mybytes[2 + i32Index] << 16 | Mybytes[1 + i32Index] << 8 @@ -26,7 +26,7 @@ return tempInt; } - public static byte[] IntToBytes(int[] MyInts, int len) { + public static byte[] IntToBytes(long[] MyInts, int len) { byte[] RetBytes = new byte[len * 4]; for (int i32Index = 0; i32Index < len; i32Index++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/SenderSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/SenderSupport.java index 7d50f79..4c737d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/SenderSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/SenderSupport.java @@ -2,6 +2,8 @@ import cn.hutool.core.date.DateUtil; import com.casic.missiles.enums.subscribe.DeviceSenderEnum; +import com.casic.missiles.pojo.MBody; +import com.casic.missiles.pojo.Message; import org.springframework.util.CollectionUtils; import java.util.Date; @@ -21,51 +23,52 @@ * * @param bizDataMapList 构建数据的初始化结果集 */ - protected Map buildTypeDeviceData(List> bizDataMapList) { - Map contentMap = new HashMap(), mBody = new HashMap(); + protected Message buildTypeDeviceData(List> bizDataMapList) { + Message message = new Message(); + MBody mBody = new MBody(); Map bizDataMap = bizDataMapList.get(0); switch ((Integer) bizDataMap.get(DEVICE_TYPE)) { case 32: //构建不同类型的下发配置事件 - contentMap.put("devType", "GasDetector"); - setEventType(bizDataMap, contentMap, mBody, "GasConfigSuccess", "GasConfigFail"); + message.setDevType("GasDetector"); + setEventType(bizDataMap, message, mBody, "GasConfigSuccess", "GasConfigFail"); break; case 31: - contentMap.put("devType", "Pressure"); - setEventType(bizDataMap, contentMap, mBody, "PressureConfigSuccess", "PressureConfigFail"); + message.setDevType("Pressure"); + setEventType(bizDataMap, message, mBody, "PressureConfigSuccess", "PressureConfigFail"); } //构建值回复的类型 if (bizDataMap.containsKey("dataValue")) { - contentMap.put("mType", "Data"); + message.setMType("Data"); if (bizDataMap.containsKey("cell")) { - mBody.put("cell", bizDataMap.get("cell")); + mBody.setCell((Integer) bizDataMap.get("cell")); } - mBody.put("datas", bizDataMapList); + mBody.setDatas(bizDataMapList); } //构建三码上数的结构 if (bizDataMap.containsKey("imei")) { - contentMap.put("mType", "StartupRequest"); - mBody.put("iccid", bizDataMap.get("iccid")); - mBody.put("imei", bizDataMap.get("imei")); + message.setMType("StartupRequest"); + mBody.setIccid(bizDataMap.get("iccid")); + mBody.setImei(bizDataMap.get("imei")); } if (bizDataMap.containsKey("devcode")) { - contentMap.put("devCode", bizDataMap.get("devcode")); + message.setDevCode((String) bizDataMap.get("devcode")); } - contentMap.put("mBody", mBody); - return contentMap; + message.setMBody(mBody); + return message; } /** * 设置下发配置回复 */ - private void setEventType(Map bizDataMap, Map contentMap, Map mBody, String bTypeSuccess, String bTypeFail) { + private void setEventType(Map bizDataMap, Message message, MBody mBody, String bTypeSuccess, String bTypeFail) { if (bizDataMap.containsKey("config")) { - contentMap.put("mType", "SetResponse"); - contentMap.put("ts", DateUtil.format(new Date(), "yyyyMMddHHmmss")); + message.setMType("SetResponse"); + message.setTs(DateUtil.format(new Date(), "yyyyMMddHHmmss")); if ("1".equals(bizDataMap.get("config"))) { - mBody.put("bType", bTypeSuccess); + mBody.setBType(bTypeSuccess); } else { - mBody.put("bType", bTypeFail); + mBody.setBType(bTypeFail); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bbc6184..78f62ff 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -4,6 +4,7 @@ import com.casic.missiles.config.SensorhubProperties; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; +import com.casic.missiles.pojo.Message; import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; @@ -37,12 +38,12 @@ if (StringUtils.isEmpty(sensorhubProperties.getUrl())) { return; } - Map contentMap = this.buildTypeDeviceData(bizDataMapList); - if (!contentMap.containsKey("mType")) { + Message message = this.buildTypeDeviceData(bizDataMapList); + if (StringUtils.isEmpty(message.getMType())) { return; } - log.info("发送到地址{},内容是{}", sensorhubProperties.getUrl(), JSON.toJSONString(contentMap)); - doPublishDataSubscribe(JSON.toJSONString(contentMap), sensorhubProperties.getUrl()); + log.info("发送到地址{},内容是{}", sensorhubProperties.getUrl(), JSON.toJSONString(message)); + doPublishDataSubscribe(JSON.toJSONString(message), sensorhubProperties.getUrl()); } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java index 288ed52..95494eb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java @@ -5,6 +5,7 @@ import com.casic.missiles.autoconfig.KafkaSendResultHandler; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; +import com.casic.missiles.pojo.Message; import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; @@ -21,7 +22,7 @@ * @date 2023-11-10 */ @Component("kafka") -public class KafkaSubscribe extends SenderSupport implements DataSubscribeProvider { +public class KafkaSubscribe extends SenderSupport implements DataSubscribeProvider { private KafkaTemplate kafkaTemplate; @@ -37,8 +38,8 @@ if (CollectionUtils.isEmpty(bizDataMapList)) { return; } - Map contentMap=this.buildTypeDeviceData(bizDataMapList); - kafkaTemplate.send("pressure", JSON.toJSONString(contentMap)); + Message message = this.buildTypeDeviceData(bizDataMapList); + kafkaTemplate.send("pressure", JSON.toJSONString(message)); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/MBody.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/MBody.java new file mode 100644 index 0000000..08aa95f --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/MBody.java @@ -0,0 +1,22 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2024-04-24 + */ +@Data +public class MBody { + + private String bType; + private Integer cell; + private List> datas; + private String logTime; + private Object iccid; + private Object imei; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Message.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Message.java new file mode 100644 index 0000000..33875b7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Message.java @@ -0,0 +1,18 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * @author cz + * @date 2024-04-24 + */ +@Data +public class Message { + + private String mType; + private String devType; + private String devCode; + private MBody mBody; + private String ts; + +} \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java index f79daf8..5cefd90 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java @@ -2,12 +2,12 @@ public class MyUtils { - public static int[] byteToInt(byte[] Mybytes, int len) { - int[] RetInt = new int[len / 4]; + public static long[] byteToInt(byte[] Mybytes, int len) { + long[] RetInt = new long[len / 4]; int i32Count = len / 4; int i32Index = 0; for (int i32Increase = 0; i32Increase < i32Count; i32Increase++) { - RetInt[i32Increase] = (int)( + RetInt[i32Increase] = (long)( Mybytes[3 + i32Index] <<24 | Mybytes[2 + i32Index] << 16 | Mybytes[1 + i32Index] << 8 @@ -26,7 +26,7 @@ return tempInt; } - public static byte[] IntToBytes(int[] MyInts, int len) { + public static byte[] IntToBytes(long[] MyInts, int len) { byte[] RetBytes = new byte[len * 4]; for (int i32Index = 0; i32Index < len; i32Index++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/SenderSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/SenderSupport.java index 7d50f79..4c737d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/SenderSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/SenderSupport.java @@ -2,6 +2,8 @@ import cn.hutool.core.date.DateUtil; import com.casic.missiles.enums.subscribe.DeviceSenderEnum; +import com.casic.missiles.pojo.MBody; +import com.casic.missiles.pojo.Message; import org.springframework.util.CollectionUtils; import java.util.Date; @@ -21,51 +23,52 @@ * * @param bizDataMapList 构建数据的初始化结果集 */ - protected Map buildTypeDeviceData(List> bizDataMapList) { - Map contentMap = new HashMap(), mBody = new HashMap(); + protected Message buildTypeDeviceData(List> bizDataMapList) { + Message message = new Message(); + MBody mBody = new MBody(); Map bizDataMap = bizDataMapList.get(0); switch ((Integer) bizDataMap.get(DEVICE_TYPE)) { case 32: //构建不同类型的下发配置事件 - contentMap.put("devType", "GasDetector"); - setEventType(bizDataMap, contentMap, mBody, "GasConfigSuccess", "GasConfigFail"); + message.setDevType("GasDetector"); + setEventType(bizDataMap, message, mBody, "GasConfigSuccess", "GasConfigFail"); break; case 31: - contentMap.put("devType", "Pressure"); - setEventType(bizDataMap, contentMap, mBody, "PressureConfigSuccess", "PressureConfigFail"); + message.setDevType("Pressure"); + setEventType(bizDataMap, message, mBody, "PressureConfigSuccess", "PressureConfigFail"); } //构建值回复的类型 if (bizDataMap.containsKey("dataValue")) { - contentMap.put("mType", "Data"); + message.setMType("Data"); if (bizDataMap.containsKey("cell")) { - mBody.put("cell", bizDataMap.get("cell")); + mBody.setCell((Integer) bizDataMap.get("cell")); } - mBody.put("datas", bizDataMapList); + mBody.setDatas(bizDataMapList); } //构建三码上数的结构 if (bizDataMap.containsKey("imei")) { - contentMap.put("mType", "StartupRequest"); - mBody.put("iccid", bizDataMap.get("iccid")); - mBody.put("imei", bizDataMap.get("imei")); + message.setMType("StartupRequest"); + mBody.setIccid(bizDataMap.get("iccid")); + mBody.setImei(bizDataMap.get("imei")); } if (bizDataMap.containsKey("devcode")) { - contentMap.put("devCode", bizDataMap.get("devcode")); + message.setDevCode((String) bizDataMap.get("devcode")); } - contentMap.put("mBody", mBody); - return contentMap; + message.setMBody(mBody); + return message; } /** * 设置下发配置回复 */ - private void setEventType(Map bizDataMap, Map contentMap, Map mBody, String bTypeSuccess, String bTypeFail) { + private void setEventType(Map bizDataMap, Message message, MBody mBody, String bTypeSuccess, String bTypeFail) { if (bizDataMap.containsKey("config")) { - contentMap.put("mType", "SetResponse"); - contentMap.put("ts", DateUtil.format(new Date(), "yyyyMMddHHmmss")); + message.setMType("SetResponse"); + message.setTs(DateUtil.format(new Date(), "yyyyMMddHHmmss")); if ("1".equals(bizDataMap.get("config"))) { - mBody.put("bType", bTypeSuccess); + mBody.setBType(bTypeSuccess); } else { - mBody.put("bType", bTypeFail); + mBody.setBType(bTypeFail); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bbc6184..78f62ff 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -4,6 +4,7 @@ import com.casic.missiles.config.SensorhubProperties; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; +import com.casic.missiles.pojo.Message; import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; @@ -37,12 +38,12 @@ if (StringUtils.isEmpty(sensorhubProperties.getUrl())) { return; } - Map contentMap = this.buildTypeDeviceData(bizDataMapList); - if (!contentMap.containsKey("mType")) { + Message message = this.buildTypeDeviceData(bizDataMapList); + if (StringUtils.isEmpty(message.getMType())) { return; } - log.info("发送到地址{},内容是{}", sensorhubProperties.getUrl(), JSON.toJSONString(contentMap)); - doPublishDataSubscribe(JSON.toJSONString(contentMap), sensorhubProperties.getUrl()); + log.info("发送到地址{},内容是{}", sensorhubProperties.getUrl(), JSON.toJSONString(message)); + doPublishDataSubscribe(JSON.toJSONString(message), sensorhubProperties.getUrl()); } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java index 288ed52..95494eb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java @@ -5,6 +5,7 @@ import com.casic.missiles.autoconfig.KafkaSendResultHandler; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; +import com.casic.missiles.pojo.Message; import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; @@ -21,7 +22,7 @@ * @date 2023-11-10 */ @Component("kafka") -public class KafkaSubscribe extends SenderSupport implements DataSubscribeProvider { +public class KafkaSubscribe extends SenderSupport implements DataSubscribeProvider { private KafkaTemplate kafkaTemplate; @@ -37,8 +38,8 @@ if (CollectionUtils.isEmpty(bizDataMapList)) { return; } - Map contentMap=this.buildTypeDeviceData(bizDataMapList); - kafkaTemplate.send("pressure", JSON.toJSONString(contentMap)); + Message message = this.buildTypeDeviceData(bizDataMapList); + kafkaTemplate.send("pressure", JSON.toJSONString(message)); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/MBody.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/MBody.java new file mode 100644 index 0000000..08aa95f --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/MBody.java @@ -0,0 +1,22 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2024-04-24 + */ +@Data +public class MBody { + + private String bType; + private Integer cell; + private List> datas; + private String logTime; + private Object iccid; + private Object imei; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Message.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Message.java new file mode 100644 index 0000000..33875b7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Message.java @@ -0,0 +1,18 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * @author cz + * @date 2024-04-24 + */ +@Data +public class Message { + + private String mType; + private String devType; + private String devCode; + private MBody mBody; + private String ts; + +} \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java deleted file mode 100644 index 68818cf..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java +++ /dev/null @@ -1,216 +0,0 @@ -package com.casic.missiles.provider; - -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.config.SensorhubProperties; -import com.casic.missiles.enums.reply.DeviceTypesEnums; -import com.casic.missiles.util.SpringContextUtil; -import org.apache.commons.lang3.StringUtils; -import com.casic.missiles.parser.crc.CRC16; -import com.casic.missiles.pojo.UpgradeFileResult; -import com.casic.missiles.replier.store.UpgradeFileStore; -import lombok.extern.slf4j.Slf4j; - -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.Arrays; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * @author cz - * 升级文件工具 - */ -@Slf4j -public class UpgradeFileProvider { - - /** - * 判断是否升级阶段,执行文件信息存储 - * 1、 第一次,通过设备类型和版本号获取bytes - * 2、获取bytes失败,则升级失败 - * 3、否则返回升级文件的总长度、crc信息 - * deviceType,version: 设备类型+版本号,当前升级文件信息,永久保存,只保留最新版本 - * - * @return 文件信息 - */ - public static UpgradeFileResult intendUpgradeFile(String deviceType, String version) { - UpgradeFileResult upgradeFileResult = new UpgradeFileResult(); - UpgradeFileStore.deviceTypeVersionFileBytes typeVersionFileBytes = getCurrentFileBytes(deviceType, version); - //没有获取到,直接返回失败 - if (typeVersionFileBytes == null || typeVersionFileBytes.getBytes() == null) { - return null; - } - upgradeFileResult.setTotalLength(typeVersionFileBytes.getTotalLength()); - upgradeFileResult.setCrcStrBit(typeVersionFileBytes.getCrcCheckBit()); - upgradeFileResult.setIsUpgrade(1); - return upgradeFileResult; - } - - /** - * 获取对应设备编号的升级文件配置 - * 1、 第一次,通过设备编号和线程名称从缓存获取文件,同时返回校验码; - * 如果获取不到,进行读取文件,如果没有文件,则抛出异常, - * 2、如果不是第一次进行发送升级内容,则从缓存中进行读取 - * 3、以上每次取数据的时候进行判断是否读取完毕 - * (1)未读完毕,则保留当前标记的偏移量,并进行缓存存储 - * (2)读取完毕,判断如果有缓存,则清除环境,防止内存泄漏,没有则不进行操作返回当前实际的偏移量 - * - * @param key : devcode+threadName,当前设备的存储信息,过期失效,需要重新生成 - * deviceTypeVersion: 设备类型+版本号,当前升级文件信息,永久保存,只保留最新版本 - * @return 文件信息 - */ - public static UpgradeFileResult upgradeFile(String key, Integer startPoint, Integer offsetLength, String deviceType) { - UpgradeFileResult upgradeFileResult = new UpgradeFileResult(); - Integer currentPointIndex = offsetLength; - UpgradeFileStore.deviceTypeVersionFileBytes typeVersionFileBytes = getCurrentFileBytes(deviceType, null); - - upgradeFileResult.setHistoryOffsetLength(typeVersionFileBytes.getBytes().length - 1 >= startPoint + offsetLength ? - offsetLength : typeVersionFileBytes.getBytes().length - offsetLength); - //没有获取到,直接返回失败 - if (typeVersionFileBytes == null || typeVersionFileBytes.getBytes() == null) { - return null; - } - upgradeFileResult.setBytes(getCurrentFileFragmentBytes(typeVersionFileBytes.getBytes(), startPoint, currentPointIndex)); - upgradeFileResult.setSeq(startPoint / offsetLength + 1); - //更新缓存 - UpgradeFileStore.storeMap.put(key, currentPointIndex); - return upgradeFileResult; - } - - - /** - * 通过设备类型获取升级文件信息,并判断是否为当前升级版本 - * (1)获取成功,直接返回 - * (2)获取失败,则寻找配置,进行文件的读取,加了锁,防止文件被重入读,引起线程安全问题 - * 读取完毕,则进行相关文件信息的保存 - * - * @param deviceType 这里key只用了设备类型,而不是设备类型+版本号,是为了防止内存泄漏,及时清理相关的内存 - * @param version - * @return - */ - private static UpgradeFileStore.deviceTypeVersionFileBytes getCurrentFileBytes(String deviceType, String version) { - UpgradeFileStore.deviceTypeVersionFileBytes typeVersionFileBytes = null; - String findFileName = DeviceTypesEnums.DEVICE_TYPES.getFileNameMap().get(deviceType); - SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); - String fileUrl = sensorhubProperties.getFileUrl(); - //路径暂定 - String filePathName = fileUrl + findFileName; - File file = new File(filePathName); - System.out.println("--------------------------" + findFileName); - if (!file.exists()) { - return null; - } - if (StringUtils.isNotEmpty(version) && compareVersion(version, findFileName)) { - return null; - } - byte[] bytes = null; - //查询当前设备类型,并且版本号对应,否则重新读取,获取最新的版本号,读取不到则读取失败 - if (UpgradeFileStore.versionFileStoreMap.containsKey(deviceType) - && (StringUtils.isEmpty(version) || version.equals(UpgradeFileStore.versionFileStoreMap.get(deviceType).getVersion()))) { - typeVersionFileBytes = UpgradeFileStore.versionFileStoreMap.get(deviceType); - } else { - //线程读取安全问题 - synchronized (deviceType + version) { - if (UpgradeFileStore.versionFileStoreMap.containsKey(deviceType) - && (StringUtils.isEmpty(version) || version.equals(UpgradeFileStore.versionFileStoreMap.get(deviceType).getVersion()))) { - typeVersionFileBytes = UpgradeFileStore.versionFileStoreMap.get(deviceType); - } else { - //读取文件 - bytes = readUpgradeFile(fileUrl + findFileName); - //crc校验 - String crcCheckStr = CRC16.getCrcByByte(bytes); - //获取总长度 - Integer totalLength = bytes.length; - typeVersionFileBytes = UpgradeFileStore.deviceTypeVersionFileBytes.builder() - .bytes(bytes) - .totalLength(totalLength) - .crcCheckBit(crcCheckStr) - .deviceType(deviceType) - .version(version) - .build(); - //读取文件,进行缓存 - UpgradeFileStore.versionFileStoreMap.put(deviceType, typeVersionFileBytes); - } - } - } - return typeVersionFileBytes; - } - - /** - * 版本号比较,传入的版本号,上传文件的版本号 - */ - private static Boolean compareVersion(String version, String findFileName) { - Float findFileVersion = getVersion(findFileName); - Float oldVersion = getVersion(version); - if (ObjectUtils.isNotEmpty(findFileVersion) && ObjectUtils.isNotEmpty(oldVersion)) { - return findFileVersion <= oldVersion; - } else if (ObjectUtils.isNotEmpty(findFileVersion)) { - return true; - } else { - return false; - } - } - - /** - * 通过名称,根据正则表达式小数点为获取版本号 - * 注:用小数点区分与其他数字的区别 - */ - private static Float getVersion(String fileName) { - String pattern = "\\d+(\\.\\d+)+"; - Pattern p = Pattern.compile(pattern); - Matcher m = p.matcher(fileName); - if (m.find()) { - return Float.valueOf(m.group()); - } else { - return null; - } - } - - /** - * 获取升级文件内容 - *

- * 通过list 及偏移坐标 获取升级内容 - * - * @return - */ - private static byte[] getCurrentFileFragmentBytes(byte[] bytes, Integer startPointIndex, Integer currentPointIndex) { - if (currentPointIndex > bytes.length || startPointIndex < 0) { - return null; - } - return Arrays.copyOfRange(bytes, startPointIndex, startPointIndex + currentPointIndex); - } - - /** - * 获取文件流 - * - * @param filePathName - * @return - */ - private static byte[] readUpgradeFile(String filePathName) { - //路径暂定 - File file = new File(filePathName); - // 创建文件字节输入流对象 - FileInputStream fis = null; - BufferedInputStream bis = null; - byte[] buf = new byte[Integer.valueOf(String.valueOf(file.length()))];//缓冲区4096字节 - try { - fis = new FileInputStream(file); - bis = new BufferedInputStream(fis); - //直接进行读取byte数据,进行数据存储,因为需要进行crc整体校验,所以文件并不是特别大 - bis.read(buf); - } catch (IOException ioex) { - log.error("读取文件失败,文件路径是{},异常信息为{}", filePathName, ioex); - } finally { - try { - bis.close(); - fis.close(); - return buf; - } catch (IOException ioex) { - log.error("读取升级文件异常,异常信息{}", ioex); - return null; - } - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java index f79daf8..5cefd90 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java @@ -2,12 +2,12 @@ public class MyUtils { - public static int[] byteToInt(byte[] Mybytes, int len) { - int[] RetInt = new int[len / 4]; + public static long[] byteToInt(byte[] Mybytes, int len) { + long[] RetInt = new long[len / 4]; int i32Count = len / 4; int i32Index = 0; for (int i32Increase = 0; i32Increase < i32Count; i32Increase++) { - RetInt[i32Increase] = (int)( + RetInt[i32Increase] = (long)( Mybytes[3 + i32Index] <<24 | Mybytes[2 + i32Index] << 16 | Mybytes[1 + i32Index] << 8 @@ -26,7 +26,7 @@ return tempInt; } - public static byte[] IntToBytes(int[] MyInts, int len) { + public static byte[] IntToBytes(long[] MyInts, int len) { byte[] RetBytes = new byte[len * 4]; for (int i32Index = 0; i32Index < len; i32Index++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/SenderSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/SenderSupport.java index 7d50f79..4c737d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/SenderSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/SenderSupport.java @@ -2,6 +2,8 @@ import cn.hutool.core.date.DateUtil; import com.casic.missiles.enums.subscribe.DeviceSenderEnum; +import com.casic.missiles.pojo.MBody; +import com.casic.missiles.pojo.Message; import org.springframework.util.CollectionUtils; import java.util.Date; @@ -21,51 +23,52 @@ * * @param bizDataMapList 构建数据的初始化结果集 */ - protected Map buildTypeDeviceData(List> bizDataMapList) { - Map contentMap = new HashMap(), mBody = new HashMap(); + protected Message buildTypeDeviceData(List> bizDataMapList) { + Message message = new Message(); + MBody mBody = new MBody(); Map bizDataMap = bizDataMapList.get(0); switch ((Integer) bizDataMap.get(DEVICE_TYPE)) { case 32: //构建不同类型的下发配置事件 - contentMap.put("devType", "GasDetector"); - setEventType(bizDataMap, contentMap, mBody, "GasConfigSuccess", "GasConfigFail"); + message.setDevType("GasDetector"); + setEventType(bizDataMap, message, mBody, "GasConfigSuccess", "GasConfigFail"); break; case 31: - contentMap.put("devType", "Pressure"); - setEventType(bizDataMap, contentMap, mBody, "PressureConfigSuccess", "PressureConfigFail"); + message.setDevType("Pressure"); + setEventType(bizDataMap, message, mBody, "PressureConfigSuccess", "PressureConfigFail"); } //构建值回复的类型 if (bizDataMap.containsKey("dataValue")) { - contentMap.put("mType", "Data"); + message.setMType("Data"); if (bizDataMap.containsKey("cell")) { - mBody.put("cell", bizDataMap.get("cell")); + mBody.setCell((Integer) bizDataMap.get("cell")); } - mBody.put("datas", bizDataMapList); + mBody.setDatas(bizDataMapList); } //构建三码上数的结构 if (bizDataMap.containsKey("imei")) { - contentMap.put("mType", "StartupRequest"); - mBody.put("iccid", bizDataMap.get("iccid")); - mBody.put("imei", bizDataMap.get("imei")); + message.setMType("StartupRequest"); + mBody.setIccid(bizDataMap.get("iccid")); + mBody.setImei(bizDataMap.get("imei")); } if (bizDataMap.containsKey("devcode")) { - contentMap.put("devCode", bizDataMap.get("devcode")); + message.setDevCode((String) bizDataMap.get("devcode")); } - contentMap.put("mBody", mBody); - return contentMap; + message.setMBody(mBody); + return message; } /** * 设置下发配置回复 */ - private void setEventType(Map bizDataMap, Map contentMap, Map mBody, String bTypeSuccess, String bTypeFail) { + private void setEventType(Map bizDataMap, Message message, MBody mBody, String bTypeSuccess, String bTypeFail) { if (bizDataMap.containsKey("config")) { - contentMap.put("mType", "SetResponse"); - contentMap.put("ts", DateUtil.format(new Date(), "yyyyMMddHHmmss")); + message.setMType("SetResponse"); + message.setTs(DateUtil.format(new Date(), "yyyyMMddHHmmss")); if ("1".equals(bizDataMap.get("config"))) { - mBody.put("bType", bTypeSuccess); + mBody.setBType(bTypeSuccess); } else { - mBody.put("bType", bTypeFail); + mBody.setBType(bTypeFail); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bbc6184..78f62ff 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -4,6 +4,7 @@ import com.casic.missiles.config.SensorhubProperties; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; +import com.casic.missiles.pojo.Message; import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; @@ -37,12 +38,12 @@ if (StringUtils.isEmpty(sensorhubProperties.getUrl())) { return; } - Map contentMap = this.buildTypeDeviceData(bizDataMapList); - if (!contentMap.containsKey("mType")) { + Message message = this.buildTypeDeviceData(bizDataMapList); + if (StringUtils.isEmpty(message.getMType())) { return; } - log.info("发送到地址{},内容是{}", sensorhubProperties.getUrl(), JSON.toJSONString(contentMap)); - doPublishDataSubscribe(JSON.toJSONString(contentMap), sensorhubProperties.getUrl()); + log.info("发送到地址{},内容是{}", sensorhubProperties.getUrl(), JSON.toJSONString(message)); + doPublishDataSubscribe(JSON.toJSONString(message), sensorhubProperties.getUrl()); } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java index 288ed52..95494eb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java @@ -5,6 +5,7 @@ import com.casic.missiles.autoconfig.KafkaSendResultHandler; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; +import com.casic.missiles.pojo.Message; import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; @@ -21,7 +22,7 @@ * @date 2023-11-10 */ @Component("kafka") -public class KafkaSubscribe extends SenderSupport implements DataSubscribeProvider { +public class KafkaSubscribe extends SenderSupport implements DataSubscribeProvider { private KafkaTemplate kafkaTemplate; @@ -37,8 +38,8 @@ if (CollectionUtils.isEmpty(bizDataMapList)) { return; } - Map contentMap=this.buildTypeDeviceData(bizDataMapList); - kafkaTemplate.send("pressure", JSON.toJSONString(contentMap)); + Message message = this.buildTypeDeviceData(bizDataMapList); + kafkaTemplate.send("pressure", JSON.toJSONString(message)); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/MBody.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/MBody.java new file mode 100644 index 0000000..08aa95f --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/MBody.java @@ -0,0 +1,22 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2024-04-24 + */ +@Data +public class MBody { + + private String bType; + private Integer cell; + private List> datas; + private String logTime; + private Object iccid; + private Object imei; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Message.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Message.java new file mode 100644 index 0000000..33875b7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Message.java @@ -0,0 +1,18 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * @author cz + * @date 2024-04-24 + */ +@Data +public class Message { + + private String mType; + private String devType; + private String devCode; + private MBody mBody; + private String ts; + +} \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java deleted file mode 100644 index 68818cf..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java +++ /dev/null @@ -1,216 +0,0 @@ -package com.casic.missiles.provider; - -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.config.SensorhubProperties; -import com.casic.missiles.enums.reply.DeviceTypesEnums; -import com.casic.missiles.util.SpringContextUtil; -import org.apache.commons.lang3.StringUtils; -import com.casic.missiles.parser.crc.CRC16; -import com.casic.missiles.pojo.UpgradeFileResult; -import com.casic.missiles.replier.store.UpgradeFileStore; -import lombok.extern.slf4j.Slf4j; - -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.Arrays; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * @author cz - * 升级文件工具 - */ -@Slf4j -public class UpgradeFileProvider { - - /** - * 判断是否升级阶段,执行文件信息存储 - * 1、 第一次,通过设备类型和版本号获取bytes - * 2、获取bytes失败,则升级失败 - * 3、否则返回升级文件的总长度、crc信息 - * deviceType,version: 设备类型+版本号,当前升级文件信息,永久保存,只保留最新版本 - * - * @return 文件信息 - */ - public static UpgradeFileResult intendUpgradeFile(String deviceType, String version) { - UpgradeFileResult upgradeFileResult = new UpgradeFileResult(); - UpgradeFileStore.deviceTypeVersionFileBytes typeVersionFileBytes = getCurrentFileBytes(deviceType, version); - //没有获取到,直接返回失败 - if (typeVersionFileBytes == null || typeVersionFileBytes.getBytes() == null) { - return null; - } - upgradeFileResult.setTotalLength(typeVersionFileBytes.getTotalLength()); - upgradeFileResult.setCrcStrBit(typeVersionFileBytes.getCrcCheckBit()); - upgradeFileResult.setIsUpgrade(1); - return upgradeFileResult; - } - - /** - * 获取对应设备编号的升级文件配置 - * 1、 第一次,通过设备编号和线程名称从缓存获取文件,同时返回校验码; - * 如果获取不到,进行读取文件,如果没有文件,则抛出异常, - * 2、如果不是第一次进行发送升级内容,则从缓存中进行读取 - * 3、以上每次取数据的时候进行判断是否读取完毕 - * (1)未读完毕,则保留当前标记的偏移量,并进行缓存存储 - * (2)读取完毕,判断如果有缓存,则清除环境,防止内存泄漏,没有则不进行操作返回当前实际的偏移量 - * - * @param key : devcode+threadName,当前设备的存储信息,过期失效,需要重新生成 - * deviceTypeVersion: 设备类型+版本号,当前升级文件信息,永久保存,只保留最新版本 - * @return 文件信息 - */ - public static UpgradeFileResult upgradeFile(String key, Integer startPoint, Integer offsetLength, String deviceType) { - UpgradeFileResult upgradeFileResult = new UpgradeFileResult(); - Integer currentPointIndex = offsetLength; - UpgradeFileStore.deviceTypeVersionFileBytes typeVersionFileBytes = getCurrentFileBytes(deviceType, null); - - upgradeFileResult.setHistoryOffsetLength(typeVersionFileBytes.getBytes().length - 1 >= startPoint + offsetLength ? - offsetLength : typeVersionFileBytes.getBytes().length - offsetLength); - //没有获取到,直接返回失败 - if (typeVersionFileBytes == null || typeVersionFileBytes.getBytes() == null) { - return null; - } - upgradeFileResult.setBytes(getCurrentFileFragmentBytes(typeVersionFileBytes.getBytes(), startPoint, currentPointIndex)); - upgradeFileResult.setSeq(startPoint / offsetLength + 1); - //更新缓存 - UpgradeFileStore.storeMap.put(key, currentPointIndex); - return upgradeFileResult; - } - - - /** - * 通过设备类型获取升级文件信息,并判断是否为当前升级版本 - * (1)获取成功,直接返回 - * (2)获取失败,则寻找配置,进行文件的读取,加了锁,防止文件被重入读,引起线程安全问题 - * 读取完毕,则进行相关文件信息的保存 - * - * @param deviceType 这里key只用了设备类型,而不是设备类型+版本号,是为了防止内存泄漏,及时清理相关的内存 - * @param version - * @return - */ - private static UpgradeFileStore.deviceTypeVersionFileBytes getCurrentFileBytes(String deviceType, String version) { - UpgradeFileStore.deviceTypeVersionFileBytes typeVersionFileBytes = null; - String findFileName = DeviceTypesEnums.DEVICE_TYPES.getFileNameMap().get(deviceType); - SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); - String fileUrl = sensorhubProperties.getFileUrl(); - //路径暂定 - String filePathName = fileUrl + findFileName; - File file = new File(filePathName); - System.out.println("--------------------------" + findFileName); - if (!file.exists()) { - return null; - } - if (StringUtils.isNotEmpty(version) && compareVersion(version, findFileName)) { - return null; - } - byte[] bytes = null; - //查询当前设备类型,并且版本号对应,否则重新读取,获取最新的版本号,读取不到则读取失败 - if (UpgradeFileStore.versionFileStoreMap.containsKey(deviceType) - && (StringUtils.isEmpty(version) || version.equals(UpgradeFileStore.versionFileStoreMap.get(deviceType).getVersion()))) { - typeVersionFileBytes = UpgradeFileStore.versionFileStoreMap.get(deviceType); - } else { - //线程读取安全问题 - synchronized (deviceType + version) { - if (UpgradeFileStore.versionFileStoreMap.containsKey(deviceType) - && (StringUtils.isEmpty(version) || version.equals(UpgradeFileStore.versionFileStoreMap.get(deviceType).getVersion()))) { - typeVersionFileBytes = UpgradeFileStore.versionFileStoreMap.get(deviceType); - } else { - //读取文件 - bytes = readUpgradeFile(fileUrl + findFileName); - //crc校验 - String crcCheckStr = CRC16.getCrcByByte(bytes); - //获取总长度 - Integer totalLength = bytes.length; - typeVersionFileBytes = UpgradeFileStore.deviceTypeVersionFileBytes.builder() - .bytes(bytes) - .totalLength(totalLength) - .crcCheckBit(crcCheckStr) - .deviceType(deviceType) - .version(version) - .build(); - //读取文件,进行缓存 - UpgradeFileStore.versionFileStoreMap.put(deviceType, typeVersionFileBytes); - } - } - } - return typeVersionFileBytes; - } - - /** - * 版本号比较,传入的版本号,上传文件的版本号 - */ - private static Boolean compareVersion(String version, String findFileName) { - Float findFileVersion = getVersion(findFileName); - Float oldVersion = getVersion(version); - if (ObjectUtils.isNotEmpty(findFileVersion) && ObjectUtils.isNotEmpty(oldVersion)) { - return findFileVersion <= oldVersion; - } else if (ObjectUtils.isNotEmpty(findFileVersion)) { - return true; - } else { - return false; - } - } - - /** - * 通过名称,根据正则表达式小数点为获取版本号 - * 注:用小数点区分与其他数字的区别 - */ - private static Float getVersion(String fileName) { - String pattern = "\\d+(\\.\\d+)+"; - Pattern p = Pattern.compile(pattern); - Matcher m = p.matcher(fileName); - if (m.find()) { - return Float.valueOf(m.group()); - } else { - return null; - } - } - - /** - * 获取升级文件内容 - *

- * 通过list 及偏移坐标 获取升级内容 - * - * @return - */ - private static byte[] getCurrentFileFragmentBytes(byte[] bytes, Integer startPointIndex, Integer currentPointIndex) { - if (currentPointIndex > bytes.length || startPointIndex < 0) { - return null; - } - return Arrays.copyOfRange(bytes, startPointIndex, startPointIndex + currentPointIndex); - } - - /** - * 获取文件流 - * - * @param filePathName - * @return - */ - private static byte[] readUpgradeFile(String filePathName) { - //路径暂定 - File file = new File(filePathName); - // 创建文件字节输入流对象 - FileInputStream fis = null; - BufferedInputStream bis = null; - byte[] buf = new byte[Integer.valueOf(String.valueOf(file.length()))];//缓冲区4096字节 - try { - fis = new FileInputStream(file); - bis = new BufferedInputStream(fis); - //直接进行读取byte数据,进行数据存储,因为需要进行crc整体校验,所以文件并不是特别大 - bis.read(buf); - } catch (IOException ioex) { - log.error("读取文件失败,文件路径是{},异常信息为{}", filePathName, ioex); - } finally { - try { - bis.close(); - fis.close(); - return buf; - } catch (IOException ioex) { - log.error("读取升级文件异常,异常信息{}", ioex); - return null; - } - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java index e159c33..4dca86e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java @@ -11,8 +11,8 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.pojo.*; -import com.casic.missiles.provider.UpgradeFileProvider; import com.casic.missiles.replier.decorator.FieldReverseDecorator; +import com.casic.missiles.replier.upgrade.UpgradeFileProvider; import com.casic.missiles.util.ProtocolFieldConfigUtil; import com.casic.missiles.util.RedisCommon; import com.casic.missiles.util.SpringContextUtil; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java index f79daf8..5cefd90 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/MyUtils.java @@ -2,12 +2,12 @@ public class MyUtils { - public static int[] byteToInt(byte[] Mybytes, int len) { - int[] RetInt = new int[len / 4]; + public static long[] byteToInt(byte[] Mybytes, int len) { + long[] RetInt = new long[len / 4]; int i32Count = len / 4; int i32Index = 0; for (int i32Increase = 0; i32Increase < i32Count; i32Increase++) { - RetInt[i32Increase] = (int)( + RetInt[i32Increase] = (long)( Mybytes[3 + i32Index] <<24 | Mybytes[2 + i32Index] << 16 | Mybytes[1 + i32Index] << 8 @@ -26,7 +26,7 @@ return tempInt; } - public static byte[] IntToBytes(int[] MyInts, int len) { + public static byte[] IntToBytes(long[] MyInts, int len) { byte[] RetBytes = new byte[len * 4]; for (int i32Index = 0; i32Index < len; i32Index++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/SenderSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/SenderSupport.java index 7d50f79..4c737d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/SenderSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/SenderSupport.java @@ -2,6 +2,8 @@ import cn.hutool.core.date.DateUtil; import com.casic.missiles.enums.subscribe.DeviceSenderEnum; +import com.casic.missiles.pojo.MBody; +import com.casic.missiles.pojo.Message; import org.springframework.util.CollectionUtils; import java.util.Date; @@ -21,51 +23,52 @@ * * @param bizDataMapList 构建数据的初始化结果集 */ - protected Map buildTypeDeviceData(List> bizDataMapList) { - Map contentMap = new HashMap(), mBody = new HashMap(); + protected Message buildTypeDeviceData(List> bizDataMapList) { + Message message = new Message(); + MBody mBody = new MBody(); Map bizDataMap = bizDataMapList.get(0); switch ((Integer) bizDataMap.get(DEVICE_TYPE)) { case 32: //构建不同类型的下发配置事件 - contentMap.put("devType", "GasDetector"); - setEventType(bizDataMap, contentMap, mBody, "GasConfigSuccess", "GasConfigFail"); + message.setDevType("GasDetector"); + setEventType(bizDataMap, message, mBody, "GasConfigSuccess", "GasConfigFail"); break; case 31: - contentMap.put("devType", "Pressure"); - setEventType(bizDataMap, contentMap, mBody, "PressureConfigSuccess", "PressureConfigFail"); + message.setDevType("Pressure"); + setEventType(bizDataMap, message, mBody, "PressureConfigSuccess", "PressureConfigFail"); } //构建值回复的类型 if (bizDataMap.containsKey("dataValue")) { - contentMap.put("mType", "Data"); + message.setMType("Data"); if (bizDataMap.containsKey("cell")) { - mBody.put("cell", bizDataMap.get("cell")); + mBody.setCell((Integer) bizDataMap.get("cell")); } - mBody.put("datas", bizDataMapList); + mBody.setDatas(bizDataMapList); } //构建三码上数的结构 if (bizDataMap.containsKey("imei")) { - contentMap.put("mType", "StartupRequest"); - mBody.put("iccid", bizDataMap.get("iccid")); - mBody.put("imei", bizDataMap.get("imei")); + message.setMType("StartupRequest"); + mBody.setIccid(bizDataMap.get("iccid")); + mBody.setImei(bizDataMap.get("imei")); } if (bizDataMap.containsKey("devcode")) { - contentMap.put("devCode", bizDataMap.get("devcode")); + message.setDevCode((String) bizDataMap.get("devcode")); } - contentMap.put("mBody", mBody); - return contentMap; + message.setMBody(mBody); + return message; } /** * 设置下发配置回复 */ - private void setEventType(Map bizDataMap, Map contentMap, Map mBody, String bTypeSuccess, String bTypeFail) { + private void setEventType(Map bizDataMap, Message message, MBody mBody, String bTypeSuccess, String bTypeFail) { if (bizDataMap.containsKey("config")) { - contentMap.put("mType", "SetResponse"); - contentMap.put("ts", DateUtil.format(new Date(), "yyyyMMddHHmmss")); + message.setMType("SetResponse"); + message.setTs(DateUtil.format(new Date(), "yyyyMMddHHmmss")); if ("1".equals(bizDataMap.get("config"))) { - mBody.put("bType", bTypeSuccess); + mBody.setBType(bTypeSuccess); } else { - mBody.put("bType", bTypeFail); + mBody.setBType(bTypeFail); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bbc6184..78f62ff 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -4,6 +4,7 @@ import com.casic.missiles.config.SensorhubProperties; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; +import com.casic.missiles.pojo.Message; import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; @@ -37,12 +38,12 @@ if (StringUtils.isEmpty(sensorhubProperties.getUrl())) { return; } - Map contentMap = this.buildTypeDeviceData(bizDataMapList); - if (!contentMap.containsKey("mType")) { + Message message = this.buildTypeDeviceData(bizDataMapList); + if (StringUtils.isEmpty(message.getMType())) { return; } - log.info("发送到地址{},内容是{}", sensorhubProperties.getUrl(), JSON.toJSONString(contentMap)); - doPublishDataSubscribe(JSON.toJSONString(contentMap), sensorhubProperties.getUrl()); + log.info("发送到地址{},内容是{}", sensorhubProperties.getUrl(), JSON.toJSONString(message)); + doPublishDataSubscribe(JSON.toJSONString(message), sensorhubProperties.getUrl()); } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java index 288ed52..95494eb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java @@ -5,6 +5,7 @@ import com.casic.missiles.autoconfig.KafkaSendResultHandler; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; +import com.casic.missiles.pojo.Message; import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; @@ -21,7 +22,7 @@ * @date 2023-11-10 */ @Component("kafka") -public class KafkaSubscribe extends SenderSupport implements DataSubscribeProvider { +public class KafkaSubscribe extends SenderSupport implements DataSubscribeProvider { private KafkaTemplate kafkaTemplate; @@ -37,8 +38,8 @@ if (CollectionUtils.isEmpty(bizDataMapList)) { return; } - Map contentMap=this.buildTypeDeviceData(bizDataMapList); - kafkaTemplate.send("pressure", JSON.toJSONString(contentMap)); + Message message = this.buildTypeDeviceData(bizDataMapList); + kafkaTemplate.send("pressure", JSON.toJSONString(message)); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/MBody.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/MBody.java new file mode 100644 index 0000000..08aa95f --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/MBody.java @@ -0,0 +1,22 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2024-04-24 + */ +@Data +public class MBody { + + private String bType; + private Integer cell; + private List> datas; + private String logTime; + private Object iccid; + private Object imei; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Message.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Message.java new file mode 100644 index 0000000..33875b7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Message.java @@ -0,0 +1,18 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * @author cz + * @date 2024-04-24 + */ +@Data +public class Message { + + private String mType; + private String devType; + private String devCode; + private MBody mBody; + private String ts; + +} \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java deleted file mode 100644 index 68818cf..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/UpgradeFileProvider.java +++ /dev/null @@ -1,216 +0,0 @@ -package com.casic.missiles.provider; - -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.config.SensorhubProperties; -import com.casic.missiles.enums.reply.DeviceTypesEnums; -import com.casic.missiles.util.SpringContextUtil; -import org.apache.commons.lang3.StringUtils; -import com.casic.missiles.parser.crc.CRC16; -import com.casic.missiles.pojo.UpgradeFileResult; -import com.casic.missiles.replier.store.UpgradeFileStore; -import lombok.extern.slf4j.Slf4j; - -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.Arrays; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * @author cz - * 升级文件工具 - */ -@Slf4j -public class UpgradeFileProvider { - - /** - * 判断是否升级阶段,执行文件信息存储 - * 1、 第一次,通过设备类型和版本号获取bytes - * 2、获取bytes失败,则升级失败 - * 3、否则返回升级文件的总长度、crc信息 - * deviceType,version: 设备类型+版本号,当前升级文件信息,永久保存,只保留最新版本 - * - * @return 文件信息 - */ - public static UpgradeFileResult intendUpgradeFile(String deviceType, String version) { - UpgradeFileResult upgradeFileResult = new UpgradeFileResult(); - UpgradeFileStore.deviceTypeVersionFileBytes typeVersionFileBytes = getCurrentFileBytes(deviceType, version); - //没有获取到,直接返回失败 - if (typeVersionFileBytes == null || typeVersionFileBytes.getBytes() == null) { - return null; - } - upgradeFileResult.setTotalLength(typeVersionFileBytes.getTotalLength()); - upgradeFileResult.setCrcStrBit(typeVersionFileBytes.getCrcCheckBit()); - upgradeFileResult.setIsUpgrade(1); - return upgradeFileResult; - } - - /** - * 获取对应设备编号的升级文件配置 - * 1、 第一次,通过设备编号和线程名称从缓存获取文件,同时返回校验码; - * 如果获取不到,进行读取文件,如果没有文件,则抛出异常, - * 2、如果不是第一次进行发送升级内容,则从缓存中进行读取 - * 3、以上每次取数据的时候进行判断是否读取完毕 - * (1)未读完毕,则保留当前标记的偏移量,并进行缓存存储 - * (2)读取完毕,判断如果有缓存,则清除环境,防止内存泄漏,没有则不进行操作返回当前实际的偏移量 - * - * @param key : devcode+threadName,当前设备的存储信息,过期失效,需要重新生成 - * deviceTypeVersion: 设备类型+版本号,当前升级文件信息,永久保存,只保留最新版本 - * @return 文件信息 - */ - public static UpgradeFileResult upgradeFile(String key, Integer startPoint, Integer offsetLength, String deviceType) { - UpgradeFileResult upgradeFileResult = new UpgradeFileResult(); - Integer currentPointIndex = offsetLength; - UpgradeFileStore.deviceTypeVersionFileBytes typeVersionFileBytes = getCurrentFileBytes(deviceType, null); - - upgradeFileResult.setHistoryOffsetLength(typeVersionFileBytes.getBytes().length - 1 >= startPoint + offsetLength ? - offsetLength : typeVersionFileBytes.getBytes().length - offsetLength); - //没有获取到,直接返回失败 - if (typeVersionFileBytes == null || typeVersionFileBytes.getBytes() == null) { - return null; - } - upgradeFileResult.setBytes(getCurrentFileFragmentBytes(typeVersionFileBytes.getBytes(), startPoint, currentPointIndex)); - upgradeFileResult.setSeq(startPoint / offsetLength + 1); - //更新缓存 - UpgradeFileStore.storeMap.put(key, currentPointIndex); - return upgradeFileResult; - } - - - /** - * 通过设备类型获取升级文件信息,并判断是否为当前升级版本 - * (1)获取成功,直接返回 - * (2)获取失败,则寻找配置,进行文件的读取,加了锁,防止文件被重入读,引起线程安全问题 - * 读取完毕,则进行相关文件信息的保存 - * - * @param deviceType 这里key只用了设备类型,而不是设备类型+版本号,是为了防止内存泄漏,及时清理相关的内存 - * @param version - * @return - */ - private static UpgradeFileStore.deviceTypeVersionFileBytes getCurrentFileBytes(String deviceType, String version) { - UpgradeFileStore.deviceTypeVersionFileBytes typeVersionFileBytes = null; - String findFileName = DeviceTypesEnums.DEVICE_TYPES.getFileNameMap().get(deviceType); - SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); - String fileUrl = sensorhubProperties.getFileUrl(); - //路径暂定 - String filePathName = fileUrl + findFileName; - File file = new File(filePathName); - System.out.println("--------------------------" + findFileName); - if (!file.exists()) { - return null; - } - if (StringUtils.isNotEmpty(version) && compareVersion(version, findFileName)) { - return null; - } - byte[] bytes = null; - //查询当前设备类型,并且版本号对应,否则重新读取,获取最新的版本号,读取不到则读取失败 - if (UpgradeFileStore.versionFileStoreMap.containsKey(deviceType) - && (StringUtils.isEmpty(version) || version.equals(UpgradeFileStore.versionFileStoreMap.get(deviceType).getVersion()))) { - typeVersionFileBytes = UpgradeFileStore.versionFileStoreMap.get(deviceType); - } else { - //线程读取安全问题 - synchronized (deviceType + version) { - if (UpgradeFileStore.versionFileStoreMap.containsKey(deviceType) - && (StringUtils.isEmpty(version) || version.equals(UpgradeFileStore.versionFileStoreMap.get(deviceType).getVersion()))) { - typeVersionFileBytes = UpgradeFileStore.versionFileStoreMap.get(deviceType); - } else { - //读取文件 - bytes = readUpgradeFile(fileUrl + findFileName); - //crc校验 - String crcCheckStr = CRC16.getCrcByByte(bytes); - //获取总长度 - Integer totalLength = bytes.length; - typeVersionFileBytes = UpgradeFileStore.deviceTypeVersionFileBytes.builder() - .bytes(bytes) - .totalLength(totalLength) - .crcCheckBit(crcCheckStr) - .deviceType(deviceType) - .version(version) - .build(); - //读取文件,进行缓存 - UpgradeFileStore.versionFileStoreMap.put(deviceType, typeVersionFileBytes); - } - } - } - return typeVersionFileBytes; - } - - /** - * 版本号比较,传入的版本号,上传文件的版本号 - */ - private static Boolean compareVersion(String version, String findFileName) { - Float findFileVersion = getVersion(findFileName); - Float oldVersion = getVersion(version); - if (ObjectUtils.isNotEmpty(findFileVersion) && ObjectUtils.isNotEmpty(oldVersion)) { - return findFileVersion <= oldVersion; - } else if (ObjectUtils.isNotEmpty(findFileVersion)) { - return true; - } else { - return false; - } - } - - /** - * 通过名称,根据正则表达式小数点为获取版本号 - * 注:用小数点区分与其他数字的区别 - */ - private static Float getVersion(String fileName) { - String pattern = "\\d+(\\.\\d+)+"; - Pattern p = Pattern.compile(pattern); - Matcher m = p.matcher(fileName); - if (m.find()) { - return Float.valueOf(m.group()); - } else { - return null; - } - } - - /** - * 获取升级文件内容 - *

- * 通过list 及偏移坐标 获取升级内容 - * - * @return - */ - private static byte[] getCurrentFileFragmentBytes(byte[] bytes, Integer startPointIndex, Integer currentPointIndex) { - if (currentPointIndex > bytes.length || startPointIndex < 0) { - return null; - } - return Arrays.copyOfRange(bytes, startPointIndex, startPointIndex + currentPointIndex); - } - - /** - * 获取文件流 - * - * @param filePathName - * @return - */ - private static byte[] readUpgradeFile(String filePathName) { - //路径暂定 - File file = new File(filePathName); - // 创建文件字节输入流对象 - FileInputStream fis = null; - BufferedInputStream bis = null; - byte[] buf = new byte[Integer.valueOf(String.valueOf(file.length()))];//缓冲区4096字节 - try { - fis = new FileInputStream(file); - bis = new BufferedInputStream(fis); - //直接进行读取byte数据,进行数据存储,因为需要进行crc整体校验,所以文件并不是特别大 - bis.read(buf); - } catch (IOException ioex) { - log.error("读取文件失败,文件路径是{},异常信息为{}", filePathName, ioex); - } finally { - try { - bis.close(); - fis.close(); - return buf; - } catch (IOException ioex) { - log.error("读取升级文件异常,异常信息{}", ioex); - return null; - } - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java index e159c33..4dca86e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java @@ -11,8 +11,8 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.pojo.*; -import com.casic.missiles.provider.UpgradeFileProvider; import com.casic.missiles.replier.decorator.FieldReverseDecorator; +import com.casic.missiles.replier.upgrade.UpgradeFileProvider; import com.casic.missiles.util.ProtocolFieldConfigUtil; import com.casic.missiles.util.RedisCommon; import com.casic.missiles.util.SpringContextUtil; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/upgrade/UpgradeFileProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/upgrade/UpgradeFileProvider.java new file mode 100644 index 0000000..e3ef470 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/upgrade/UpgradeFileProvider.java @@ -0,0 +1,216 @@ +package com.casic.missiles.replier.upgrade; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.config.SensorhubProperties; +import com.casic.missiles.enums.reply.DeviceTypesEnums; +import com.casic.missiles.parser.crc.CRC16; +import com.casic.missiles.pojo.UpgradeFileResult; +import com.casic.missiles.replier.store.UpgradeFileStore; +import com.casic.missiles.util.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @author cz + * 升级文件工具 + */ +@Slf4j +public class UpgradeFileProvider { + + /** + * 判断是否升级阶段,执行文件信息存储 + * 1、 第一次,通过设备类型和版本号获取bytes + * 2、获取bytes失败,则升级失败 + * 3、否则返回升级文件的总长度、crc信息 + * deviceType,version: 设备类型+版本号,当前升级文件信息,永久保存,只保留最新版本 + * + * @return 文件信息 + */ + public static UpgradeFileResult intendUpgradeFile(String deviceType, String version) { + UpgradeFileResult upgradeFileResult = new UpgradeFileResult(); + UpgradeFileStore.deviceTypeVersionFileBytes typeVersionFileBytes = getCurrentFileBytes(deviceType, version); + //没有获取到,直接返回失败 + if (typeVersionFileBytes == null || typeVersionFileBytes.getBytes() == null) { + return null; + } + upgradeFileResult.setTotalLength(typeVersionFileBytes.getTotalLength()); + upgradeFileResult.setCrcStrBit(typeVersionFileBytes.getCrcCheckBit()); + upgradeFileResult.setIsUpgrade(1); + return upgradeFileResult; + } + + /** + * 获取对应设备编号的升级文件配置 + * 1、 第一次,通过设备编号和线程名称从缓存获取文件,同时返回校验码; + * 如果获取不到,进行读取文件,如果没有文件,则抛出异常, + * 2、如果不是第一次进行发送升级内容,则从缓存中进行读取 + * 3、以上每次取数据的时候进行判断是否读取完毕 + * (1)未读完毕,则保留当前标记的偏移量,并进行缓存存储 + * (2)读取完毕,判断如果有缓存,则清除环境,防止内存泄漏,没有则不进行操作返回当前实际的偏移量 + * + * @param key : devcode+threadName,当前设备的存储信息,过期失效,需要重新生成 + * deviceTypeVersion: 设备类型+版本号,当前升级文件信息,永久保存,只保留最新版本 + * @return 文件信息 + */ + public static UpgradeFileResult upgradeFile(String key, Integer startPoint, Integer offsetLength, String deviceType) { + UpgradeFileResult upgradeFileResult = new UpgradeFileResult(); + Integer currentPointIndex = offsetLength; + UpgradeFileStore.deviceTypeVersionFileBytes typeVersionFileBytes = getCurrentFileBytes(deviceType, null); + + upgradeFileResult.setHistoryOffsetLength(typeVersionFileBytes.getBytes().length - 1 >= startPoint + offsetLength ? + offsetLength : typeVersionFileBytes.getBytes().length - offsetLength); + //没有获取到,直接返回失败 + if (typeVersionFileBytes == null || typeVersionFileBytes.getBytes() == null) { + return null; + } + upgradeFileResult.setBytes(getCurrentFileFragmentBytes(typeVersionFileBytes.getBytes(), startPoint, currentPointIndex)); + upgradeFileResult.setSeq(startPoint / offsetLength + 1); + //更新缓存 + UpgradeFileStore.storeMap.put(key, currentPointIndex); + return upgradeFileResult; + } + + + /** + * 通过设备类型获取升级文件信息,并判断是否为当前升级版本 + * (1)获取成功,直接返回 + * (2)获取失败,则寻找配置,进行文件的读取,加了锁,防止文件被重入读,引起线程安全问题 + * 读取完毕,则进行相关文件信息的保存 + * + * @param deviceType 这里key只用了设备类型,而不是设备类型+版本号,是为了防止内存泄漏,及时清理相关的内存 + * @param version + * @return + */ + private static UpgradeFileStore.deviceTypeVersionFileBytes getCurrentFileBytes(String deviceType, String version) { + UpgradeFileStore.deviceTypeVersionFileBytes typeVersionFileBytes = null; + String findFileName = DeviceTypesEnums.DEVICE_TYPES.getFileNameMap().get(deviceType); + SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); + String fileUrl = sensorhubProperties.getFileUrl(); + //路径暂定 + String filePathName = fileUrl + findFileName; + File file = new File(filePathName); + System.out.println("--------------------------" + findFileName); + if (!file.exists()) { + return null; + } + if (StringUtils.isNotEmpty(version) && compareVersion(version, findFileName)) { + return null; + } + byte[] bytes = null; + //查询当前设备类型,并且版本号对应,否则重新读取,获取最新的版本号,读取不到则读取失败 + if (UpgradeFileStore.versionFileStoreMap.containsKey(deviceType) + && (StringUtils.isEmpty(version) || version.equals(UpgradeFileStore.versionFileStoreMap.get(deviceType).getVersion()))) { + typeVersionFileBytes = UpgradeFileStore.versionFileStoreMap.get(deviceType); + } else { + //线程读取安全问题 + synchronized (deviceType + version) { + if (UpgradeFileStore.versionFileStoreMap.containsKey(deviceType) + && (StringUtils.isEmpty(version) || version.equals(UpgradeFileStore.versionFileStoreMap.get(deviceType).getVersion()))) { + typeVersionFileBytes = UpgradeFileStore.versionFileStoreMap.get(deviceType); + } else { + //读取文件 + bytes = readUpgradeFile(fileUrl + findFileName); + //crc校验 + String crcCheckStr = CRC16.getCrcByByte(bytes); + //获取总长度 + Integer totalLength = bytes.length; + typeVersionFileBytes = UpgradeFileStore.deviceTypeVersionFileBytes.builder() + .bytes(bytes) + .totalLength(totalLength) + .crcCheckBit(crcCheckStr) + .deviceType(deviceType) + .version(version) + .build(); + //读取文件,进行缓存 + UpgradeFileStore.versionFileStoreMap.put(deviceType, typeVersionFileBytes); + } + } + } + return typeVersionFileBytes; + } + + /** + * 版本号比较,传入的版本号,上传文件的版本号 + */ + private static Boolean compareVersion(String version, String findFileName) { + Float findFileVersion = getVersion(findFileName); + Float oldVersion = getVersion(version); + if (ObjectUtils.isNotEmpty(findFileVersion) && ObjectUtils.isNotEmpty(oldVersion)) { + return findFileVersion <= oldVersion; + } else if (ObjectUtils.isNotEmpty(findFileVersion)) { + return true; + } else { + return false; + } + } + + /** + * 通过名称,根据正则表达式小数点为获取版本号 + * 注:用小数点区分与其他数字的区别 + */ + private static Float getVersion(String fileName) { + String pattern = "\\d+(\\.\\d+)+"; + Pattern p = Pattern.compile(pattern); + Matcher m = p.matcher(fileName); + if (m.find()) { + return Float.valueOf(m.group()); + } else { + return null; + } + } + + /** + * 获取升级文件内容 + *

+ * 通过list 及偏移坐标 获取升级内容 + * + * @return + */ + private static byte[] getCurrentFileFragmentBytes(byte[] bytes, Integer startPointIndex, Integer currentPointIndex) { + if (currentPointIndex > bytes.length || startPointIndex < 0) { + return null; + } + return Arrays.copyOfRange(bytes, startPointIndex, startPointIndex + currentPointIndex); + } + + /** + * 获取文件流 + * + * @param filePathName + * @return + */ + private static byte[] readUpgradeFile(String filePathName) { + //路径暂定 + File file = new File(filePathName); + // 创建文件字节输入流对象 + FileInputStream fis = null; + BufferedInputStream bis = null; + byte[] buf = new byte[Integer.valueOf(String.valueOf(file.length()))];//缓冲区4096字节 + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + //直接进行读取byte数据,进行数据存储,因为需要进行crc整体校验,所以文件并不是特别大 + bis.read(buf); + } catch (IOException ioex) { + log.error("读取文件失败,文件路径是{},异常信息为{}", filePathName, ioex); + } finally { + try { + bis.close(); + fis.close(); + return buf; + } catch (IOException ioex) { + log.error("读取升级文件异常,异常信息{}", ioex); + return null; + } + } + } + +}