From e33ff7aa7143edb02e9df88faf74a25ce65a0ce6 Mon Sep 17 00:00:00 2001 From: weidong Date: Fri, 20 Jun 2025 09:09:46 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E6=8E=A8=E9=80=81=E6=89=93=E5=8D=B0?= =?UTF-8?q?=E6=94=B9=E4=B8=BAdebug=E7=BA=A7=E5=88=AB=202=E3=80=81=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E4=B8=AD=E5=8D=97=E9=99=A2MQTT=E6=8E=A8=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../beidou_fwd/entity/ZNYMQTTData.java | 19 +++ .../imdroid/beidou_fwd/task/Forwarder.java | 6 +- .../beidou_fwd/task/GXJKForwarder.java | 6 +- .../beidou_fwd/task/GXXfzForwarder.java | 10 +- .../imdroid/beidou_fwd/task/GZYForwarder.java | 6 +- .../beidou_fwd/task/GZYMQTTForwarder.java | 8 +- .../beidou_fwd/task/KingMaForwarder.java | 12 +- .../beidou_fwd/task/SaasForwarder.java | 6 +- .../imdroid/beidou_fwd/task/ZNYForwarder.java | 8 +- .../beidou_fwd/task/ZNYForwarder2.java | 8 +- .../beidou_fwd/task/ZNYMQTTForwarder.java | 75 +++--------- .../src/main/resources/application.properties | 8 +- .../beidou/controller/VersionController.java | 67 +++++++++-- .../com/imdroid/common/util/Des3Utils.java | 109 ++++++++++++++++++ .../java/com/imdroid/vermgr/VerMgrApp.java | 25 ++++ .../vermgr/service/UpgradeManager.java | 2 +- .../vermgr/service/UpgradeSession.java | 2 +- 17 files changed, 275 insertions(+), 102 deletions(-) create mode 100644 sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/entity/ZNYMQTTData.java create mode 100644 sec-common/src/main/java/com/imdroid/common/util/Des3Utils.java create mode 100644 sec-vermgr/src/main/java/com/imdroid/vermgr/VerMgrApp.java diff --git a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/entity/ZNYMQTTData.java b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/entity/ZNYMQTTData.java new file mode 100644 index 00000000..c8bbbba6 --- /dev/null +++ b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/entity/ZNYMQTTData.java @@ -0,0 +1,19 @@ +package com.imdroid.beidou_fwd.entity; + + +import lombok.Data; + + +/** + * MQTT数据推送 api + * + * @author LiGang + */ +@Data +public class ZNYMQTTData { + private String timestamp; + // gnss数据 + private double rpose; + private double rposn; + private double rposu; +} diff --git a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/Forwarder.java b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/Forwarder.java index fd7dc642..0c936ec5 100644 --- a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/Forwarder.java +++ b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/Forwarder.java @@ -266,11 +266,11 @@ public class Forwarder { updateWrapper.ge("createtime", LocalDateTime.now().minusDays(30)); updateWrapper.set("state",ResendRecord.STATE_FWDING); int updateNum = resendRecordMapper.update(null, updateWrapper); - logger.info("{} forward history records: {}, update {}",fwdGroupId, resendRecordsList.size(),updateNum); + logger.debug("{} forward history records: {}, update {}",fwdGroupId, resendRecordsList.size(),updateNum); // 2.检索这个这个时间段的解算结果,如果有数据则单个终端转发,标志记录为已补传 for(ResendRecord record:resendRecordsList){ if(record.getProjectid()!=null) - logger.info("{} forward history {}",fwdGroupId, record.getProjectid()); + logger.debug("{} forward history {}",fwdGroupId, record.getProjectid()); forwardBatchGnssRecords(record); } } @@ -404,7 +404,7 @@ public class Forwarder { tranData.setDeviceType(2); tranData.setDeviceSn(locationRecord.getDeviceid()); String json = GsonUtil.toJson(tranData); - logger.info("forward to GZY mqtt: {}",json); + logger.debug("forward to GZY mqtt: {}",json); sendNum++; } diff --git a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GXJKForwarder.java b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GXJKForwarder.java index 8855f14a..55abb893 100644 --- a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GXJKForwarder.java +++ b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GXJKForwarder.java @@ -46,7 +46,7 @@ public class GXJKForwarder extends Forwarder { */ @Scheduled(cron = "0 0/10 * * * ?") // 每30分钟执行一次 private void forwardGnss() { - logger.info("gxjk forwardGnss"); + logger.debug("gxjk forwardGnss"); forwardCurrentGnss(); } @@ -76,8 +76,8 @@ public class GXJKForwarder extends Forwarder { sendNum++; } String json = "#" + GsonUtil.toJson(sendData) + "!"; - logger.info("project " + projectId + ": push calculation result to GXJK"); - logger.info(json); + logger.debug("project " + projectId + ": push calculation result to GXJK"); + logger.debug(json); // /slope/项目号-all/gnss/all/publish String topic = "/slope/"+projectId+"-all/gnss/all/publish"; try { diff --git a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GXXfzForwarder.java b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GXXfzForwarder.java index e185a2fd..ab6897fc 100644 --- a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GXXfzForwarder.java +++ b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GXXfzForwarder.java @@ -21,7 +21,7 @@ import java.util.List; @Configuration @EnableScheduling public class GXXfzForwarder extends Forwarder{ - private String FORWARDER_NAME = "广西新发展"; + private final String FORWARDER_NAME = "广西新发展"; @Value("${xfz.server.host}") private String host; @@ -69,13 +69,13 @@ public class GXXfzForwarder extends Forwarder{ */ @Scheduled(cron = "0 0/30 * * * ?") // 每30分钟执行一次 private void forwardGnss() { - logger.info("xfz forwardGnss"); + logger.debug("xfz forwardGnss"); forwardCurrentGnss(); } /* @Scheduled(cron = "0 0/10 * * * ?") // 每30分钟执行一次 private void checkDevice() { - //logger.info("zny checkDevice"); + //logger.debug("zny checkDevice"); checkOfflineDevice("2345053","2350106","2350124"); }*/ @@ -107,8 +107,8 @@ public class GXXfzForwarder extends Forwarder{ sendNum++; } String json = "#" + GsonUtil.toJson(xfzTcpMessage) + "!"; - logger.info("project " + projectId + ": push calculation result to XFZ"); - logger.info(json); + logger.debug("project " + projectId + ": push calculation result to XFZ"); + logger.debug(json); try { listener.clear(); xfzTcpClient.writeAndFlush(json); diff --git a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GZYForwarder.java b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GZYForwarder.java index 73ff9a26..44c2495e 100644 --- a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GZYForwarder.java +++ b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GZYForwarder.java @@ -40,7 +40,7 @@ public class GZYForwarder extends Forwarder{ @Scheduled(cron = "0 0 0/1 * * ?") // 每小时执行一次 // @Scheduled(cron = "0 0/30 * * * ?") // 每30分钟执行一次 private void forwardGnss() { - logger.info("gzy UDP forwardGnss"); + logger.debug("gzy UDP forwardGnss"); forwardCurrentGnss(); } @@ -62,8 +62,8 @@ public class GZYForwarder extends Forwarder{ tranData.setZ(d); gzyData.setTranData(tranData); String msg = "JGKJ" + GsonUtil.toJson(gzyData) + "#!"; - logger.info("forward to GZY"); - logger.info(msg); + logger.debug("forward to GZY"); + logger.debug(msg); udpClient.sendMessage(msg); sendNum++; } diff --git a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GZYMQTTForwarder.java b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GZYMQTTForwarder.java index 9b95def6..642e6477 100644 --- a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GZYMQTTForwarder.java +++ b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GZYMQTTForwarder.java @@ -56,7 +56,7 @@ public class GZYMQTTForwarder extends Forwarder { @Scheduled(cron = "0 0 0/1 * * ?") // 每小时执行一次 //@Scheduled(cron = "0 0/5 * * * ?") // 每30分钟执行一次 private void forwardGnss() { - logger.info("gzy mqtt forwardGnss"); + logger.debug("gzy mqtt forwardGnss"); forwardCurrentGnss(); //forwardAngleData(); } @@ -77,7 +77,7 @@ public class GZYMQTTForwarder extends Forwarder { tranData.setDeviceType(2); tranData.setDeviceSn(locationRecord.getDeviceid()); String json = GsonUtil.toJson(tranData); - logger.info("forward to GZY mqtt: {}",json); + logger.debug("forward to GZY mqtt: {}",json); try { if(!mqttClient.publish(topic, json)) break; Thread.sleep(50); @@ -116,7 +116,7 @@ public class GZYMQTTForwarder extends Forwarder { tranData.setAngleAz(NumberUtils.scale((double) az,2)); String json = GsonUtil.toJson(tranData); - logger.info("forward to GZY mqtt angles: {}",json); + logger.debug("forward to GZY mqtt angles: {}",json); try { if(!mqttClient.publish(topic, json)) break; Thread.sleep(10); @@ -125,7 +125,7 @@ public class GZYMQTTForwarder extends Forwarder { } sendNum++; } - logger.info("total number of angles sent to GZY: {}",sendNum); + logger.debug("total number of angles sent to GZY: {}",sendNum); } diff --git a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/KingMaForwarder.java b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/KingMaForwarder.java index 6579bf09..c7013ade 100644 --- a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/KingMaForwarder.java +++ b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/KingMaForwarder.java @@ -55,7 +55,7 @@ public class KingMaForwarder extends Forwarder{ @Scheduled(cron = "0 0 0/1 * * ?") // 每小时执行一次 //@Scheduled(cron = "0 0/5 * * * ?") // 每30分钟执行一次 private void forwardGnss() { - logger.info("kingma forwardGnss"); + logger.debug("kingma forwardGnss"); forwardCurrentGnss(); } @@ -88,12 +88,12 @@ public class KingMaForwarder extends Forwarder{ if(header == null || nowTime.isAfter(lastTokenTime.plusMinutes(59))){ try { if (!updateToken()) { - logger.info("update token failed!"); + logger.debug("update token failed!"); return 0; } } catch (Exception e){ - logger.info("update token failed!"); + logger.debug("update token failed!"); return 0; } lastTokenTime = nowTime; @@ -135,10 +135,10 @@ public class KingMaForwarder extends Forwarder{ sendNum++; } String json = GsonUtil.toJson(dataList); - logger.info(json); + logger.debug(json); String result = HttpUtils.postJson(data_host,header,json); - logger.info("project " + projectId + ": push calculation result to Kingma"); - logger.info("result: "+result); + logger.debug("project " + projectId + ": push calculation result to Kingma"); + logger.debug("result: "+result); JSONObject obj = (JSONObject) JSONObject.parse(result); String msg = obj.getString("message"); if(msg.equals("Success")) return sendNum; diff --git a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/SaasForwarder.java b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/SaasForwarder.java index b7867729..44cef682 100644 --- a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/SaasForwarder.java +++ b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/SaasForwarder.java @@ -75,7 +75,7 @@ public class SaasForwarder extends Forwarder{ @Scheduled(cron = "0 20,50 * * * ?") // 每30分钟执行一次 private void forwardGnss() { if(enabled) { - logger.info("saas forwardGnss"); + logger.debug("saas forwardGnss"); forwardCurrentGnss(); } } @@ -107,8 +107,8 @@ public class SaasForwarder extends Forwarder{ sendNum++; } String json = "#" + GsonUtil.toJson(tcpMessage) + "!"; - logger.info("project " + projectId + ": push calculation result to SAAS"); - logger.info(json); + logger.debug("project " + projectId + ": push calculation result to SAAS"); + logger.debug(json); try { listener.clear(); tcpClient.writeAndFlush(json); diff --git a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/ZNYForwarder.java b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/ZNYForwarder.java index d48fd7bd..745f5b7f 100644 --- a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/ZNYForwarder.java +++ b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/ZNYForwarder.java @@ -34,14 +34,14 @@ public class ZNYForwarder extends Forwarder{ */ @Scheduled(cron = "0 0/10 * * * ?") // 每30分钟执行一次 private void checkDevice() { - //logger.info("zny checkDevice"); + //logger.debug("zny checkDevice"); //checkNoDataDevice("2345078","2345065","2345073"); //checkNoDataDevice("2345085","2345068","2345075"); } @Scheduled(cron = "0 0/30 * * * ?") // 每30分钟执行一次 private void forwardGnss() { - logger.info("zny forwardGnss"); + logger.debug("zny forwardGnss"); forwardCurrentGnss(); } @@ -60,12 +60,12 @@ public class ZNYForwarder extends Forwarder{ sendNum++; } String json = GsonUtil.toJson(defoData); - logger.info("发送数据到武汉中南设计院平台:{}", json); + logger.debug("发送数据到武汉中南设计院平台:{}", json); //return sendNum; try { String result = HttpUtils.postJson(data_host, json); - logger.info("发送数据到武汉中南设计院平台返回结果:{}", result); + logger.debug("发送数据到武汉中南设计院平台返回结果:{}", result); JSONObject obj = (JSONObject) JSONObject.parse(result); String msg = obj.getString("msg"); if (msg.contains("成功")) return sendNum; diff --git a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/ZNYForwarder2.java b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/ZNYForwarder2.java index f31357bc..c644d73f 100644 --- a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/ZNYForwarder2.java +++ b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/ZNYForwarder2.java @@ -34,12 +34,12 @@ public class ZNYForwarder2 extends Forwarder{ */ @Scheduled(cron = "0 0/30 * * * ?") // 每30分钟执行一次 private void forwardGnss() { - logger.info("zny2 forwardGnss"); + logger.debug("zny2 forwardGnss"); forwardCurrentGnss(); } @Scheduled(cron = "0 0/10 * * * ?") // 每30分钟执行一次 private void checkDevice() { - //logger.info("zny checkDevice"); + //logger.debug("zny checkDevice"); //checkOfflineDevice("2419374","2410188","2410194"); //checkOfflineDevice("2419350","2410232","2410232"); //checkOfflineDevice("2345074","2345065","2345089"); @@ -59,12 +59,12 @@ public class ZNYForwarder2 extends Forwarder{ sendNum++; } String json = GsonUtil.toJson(defoData); - logger.info("发送数据到武汉中南设计院2.0平台:{}", json); + logger.debug("发送数据到武汉中南设计院2.0平台:{}", json); //return sendNum; try { String result = HttpUtils.postJson(data_host, json); - logger.info("武汉中南设计院2.0平台返回结果:{}", result); + logger.debug("武汉中南设计院2.0平台返回结果:{}", result); JSONObject obj = (JSONObject) JSONObject.parse(result); String msg = obj.getString("msg"); if (msg.contains("成功")) return sendNum; diff --git a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/ZNYMQTTForwarder.java b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/ZNYMQTTForwarder.java index 9c2f1157..55c580b3 100644 --- a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/ZNYMQTTForwarder.java +++ b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/ZNYMQTTForwarder.java @@ -1,14 +1,12 @@ package com.imdroid.beidou_fwd.task; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.imdroid.beidou_fwd.entity.GZYMQTTAngle; -import com.imdroid.beidou_fwd.entity.GZYMQTTData; +import com.imdroid.beidou_fwd.entity.ZNYMQTTData; import com.imdroid.beidou_fwd.service.MQTTClient; +import com.imdroid.common.util.Des3Utils; import com.imdroid.common.util.GsonUtil; import com.imdroid.common.util.NumberUtils; import com.imdroid.secapi.dto.GnssCalcData; -import com.imdroid.secapi.dto.GnssStatusMsg; import com.imdroid.secapi.dto.GnssStatusMsgMapper; import org.eclipse.paho.client.mqttv3.MqttException; import org.springframework.beans.factory.annotation.Autowired; @@ -20,7 +18,6 @@ import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import java.time.LocalDateTime; -import java.util.HashMap; import java.util.List; @Component @@ -28,6 +25,10 @@ import java.util.List; @EnableScheduling public class ZNYMQTTForwarder extends Forwarder { static final String FORWARDER_NAME = "中南院MQTT"; + static byte[] key = new byte[] { (byte) 0x8c, (byte) 0xc7, 0x2b, 0x05, 0x70, 0x5d, 0x5c, 0x46, (byte) 0xf4, 0x12, (byte) 0xaf, (byte) 0x8c, (byte) 0xbe, + (byte) 0xd5, 0x5a, (byte) 0xad, (byte) 0x8c, (byte) 0xc7, 0x2b, 0x05, 0x70, 0x5d, 0x5c, 0x46 }; + static byte[] iv = new byte[] { 0x66, 0x7b, 0x02, (byte) 0xa8, 0x5c, 0x61, (byte) 0xc7, (byte) 0x86 }; + @Value("${zny.mqtt.brokerUrl}") private String brokerUrl; @Value("${zny.mqtt.username}") @@ -36,8 +37,6 @@ public class ZNYMQTTForwarder extends Forwarder { private String password; @Value("${zny.mqtt.clientid}") private String clientid; - @Value("${mqtt.server.topic}") - private String topic; @Autowired GnssStatusMsgMapper statusMsgMapper; @@ -45,7 +44,7 @@ public class ZNYMQTTForwarder extends Forwarder { @PostConstruct void registerMe() throws MqttException { - //init(FORWARDER_NAME, "MQTT "+brokerUrl,4,FWD_DEVICE_ALIAS_NAME,30); + init(FORWARDER_NAME, "MQTT "+brokerUrl,4,FWD_DEVICE_ALIAS_NAME,30); mqttClient = new MQTTClient(brokerUrl, username, password,clientid); //mqttClient.connect(); } @@ -54,9 +53,9 @@ public class ZNYMQTTForwarder extends Forwarder { * 每半小时转发GNSS解算结果 */ //@Scheduled(cron = "0 0 0/1 * * ?") // 每小时执行一次 - //@Scheduled(cron = "0 0/5 * * * ?") // 每30分钟执行一次 + @Scheduled(cron = "0 0/30 * * * ?") // 每30分钟执行一次 private void forwardGnss() { - logger.info("gzy mqtt forwardGnss"); + logger.debug("zny mqtt forwardGnss"); forwardCurrentGnss(); //forwardAngleData(); } @@ -66,20 +65,20 @@ public class ZNYMQTTForwarder extends Forwarder { int sendNum = 0; for (GnssCalcData locationRecord : records) { - GZYMQTTData tranData = new GZYMQTTData(); - tranData.setCollectTime(locationRecord.getCreatetime().format(formatter)); + ZNYMQTTData tranData = new ZNYMQTTData(); + tranData.setTimestamp(locationRecord.getCreatetime().format(formatter)); double n = NumberUtils.scale(locationRecord.getRposn(), 2); double e = NumberUtils.scale(locationRecord.getRpose(), 2); double d = NumberUtils.scale(locationRecord.getRposd(), 2); - tranData.setX(n); - tranData.setY(e); - tranData.setZ(d); - tranData.setDeviceType(2); - tranData.setDeviceSn(locationRecord.getDeviceid()); + tranData.setRposn(n); + tranData.setRpose(e); + tranData.setRposu(d); String json = GsonUtil.toJson(tranData); - logger.info("forward to GZY mqtt: {}",json); + String cryptJson = Des3Utils.encrypt(json,key,iv); + logger.debug("forward to ZNY mqtt: {}, {}",json, cryptJson); + String topic = "/GnssData/"+locationRecord.getDeviceid()+"/Increment"; try { - if(!mqttClient.publish(topic, json)) break; + if(!mqttClient.publish(topic, cryptJson)) break; Thread.sleep(20); } catch (Exception e1) { e1.printStackTrace(); @@ -90,43 +89,5 @@ public class ZNYMQTTForwarder extends Forwarder { return sendNum; } - void forwardAngleData() { - // 获取最近半小时的状态消息 - LocalDateTime sentTime = LocalDateTime.now(); - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("tenantid",tenantId); - queryWrapper.le("createtime",sentTime); - queryWrapper.ge("createtime",sentTime.minusMinutes(fwdCycleMinutes)); - queryWrapper.orderByDesc("createtime"); - HashMap sendDeviceMap = new HashMap<>(); - List statusMsgs = statusMsgMapper.selectList(queryWrapper); - int sendNum = 0; - for(GnssStatusMsg msg:statusMsgs){ - if(sendDeviceMap.get(msg.getDeviceid())!=null) continue; - sendDeviceMap.put(msg.getDeviceid(),msg.getDeviceid()); - - GZYMQTTAngle tranData = new GZYMQTTAngle(); - tranData.setDeviceSn(msg.getDeviceid()); - tranData.setCollectTime(msg.getCreatetime().format(formatter)); - float x = msg.getRoll()==null?0:msg.getRoll(); - float y = msg.getPitch()==null?0:msg.getPitch(); - float az = msg.getYaw()==null?0:msg.getYaw(); - tranData.setAngleX(NumberUtils.scale((double) x,2)); - tranData.setAngleY(NumberUtils.scale((double) y,2)); - tranData.setAngleAz(NumberUtils.scale((double) az,2)); - - String json = GsonUtil.toJson(tranData); - logger.info("forward to GZY mqtt angles: {}",json); - try { - if(!mqttClient.publish(topic, json)) break; - Thread.sleep(20); - } catch (Exception e1) { - e1.printStackTrace(); - } - sendNum++; - } - logger.info("total number of angles sent to GZY: {}",sendNum); - - } } diff --git a/sec-beidou-fwd/src/main/resources/application.properties b/sec-beidou-fwd/src/main/resources/application.properties index e1bf8846..9a7f8418 100644 --- a/sec-beidou-fwd/src/main/resources/application.properties +++ b/sec-beidou-fwd/src/main/resources/application.properties @@ -59,4 +59,10 @@ gxjk.mqtt.server.clientid = GXJK_client sass.server.host = 127.0.0.1 sass.server.port = 9933 -sass.server.enabled = false \ No newline at end of file +sass.server.enabled = false + +zny.mqtt.brokerUrl=42.194.196.91:51883 +zny.mqtt.username=testuser +zny.mqtt.password=Test@20b39# +zny.mqtt.clientid = ZNY_client +zny.mqtt.topic = /GnssData/testgnss/Increment diff --git a/sec-beidou/src/main/java/com/imdroid/beidou/controller/VersionController.java b/sec-beidou/src/main/java/com/imdroid/beidou/controller/VersionController.java index 3aa00460..2992a6a9 100644 --- a/sec-beidou/src/main/java/com/imdroid/beidou/controller/VersionController.java +++ b/sec-beidou/src/main/java/com/imdroid/beidou/controller/VersionController.java @@ -2,9 +2,11 @@ package com.imdroid.beidou.controller; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.imdroid.beidou.common.HttpResult; +import com.imdroid.common.util.HexUtil; import com.imdroid.secapi.client.HttpResp; import com.imdroid.secapi.client.RtcmClient; import com.imdroid.secapi.client.VersionClient; @@ -17,6 +19,7 @@ import org.springframework.ui.Model; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.PostConstruct; import javax.servlet.http.HttpSession; import java.io.File; import java.util.*; @@ -39,6 +42,8 @@ public class VersionController extends BasicController{ TenantMapper tenantMapper; @Autowired VersionClient versionClient; + @Value("${ver_server.connect.cmd}") + String verServerConnectCmd; @Data public class FirmwareInfo{ @@ -54,8 +59,33 @@ public class VersionController extends BasicController{ } // 正在升级的设备map,deviceId <-> UpgradeInfo(高字节:升级结果;低字节:进度) - final ConcurrentHashMap upgradingDeviceList = new ConcurrentHashMap<>(); + final Map upgradingDeviceList = new ConcurrentHashMap<>(); + final Map deviceSNtoFirmwareMap=new HashMap<>(); + @PostConstruct + public void init(){ + deviceSNtoFirmwareMap.put("2353","2353"); + deviceSNtoFirmwareMap.put("2410","2410"); + deviceSNtoFirmwareMap.put("2412","2410"); + deviceSNtoFirmwareMap.put("2415","2415"); + deviceSNtoFirmwareMap.put("2419","2415"); + deviceSNtoFirmwareMap.put("2421","2421"); + deviceSNtoFirmwareMap.put("2435","2421"); + deviceSNtoFirmwareMap.put("2439","2439"); + deviceSNtoFirmwareMap.put("2445","2439"); + deviceSNtoFirmwareMap.put("8450","8450"); + deviceSNtoFirmwareMap.put("8507","8450"); + deviceSNtoFirmwareMap.put("8512","8450"); + deviceSNtoFirmwareMap.put("8513","8450"); + deviceSNtoFirmwareMap.put("8516","8515"); + deviceSNtoFirmwareMap.put("8522","8515"); + deviceSNtoFirmwareMap.put("9450","9450"); + deviceSNtoFirmwareMap.put("9513","9450"); + deviceSNtoFirmwareMap.put("9522","9515"); + deviceSNtoFirmwareMap.put("6516","6515"); + deviceSNtoFirmwareMap.put("6521","6515"); + deviceSNtoFirmwareMap.put("6522","6515"); + } /**** 推送页面 *****/ @RequestMapping("/sys/ver_mgr") public String gnssDevCfg(Model m, HttpSession session) { @@ -150,17 +180,22 @@ public class VersionController extends BasicController{ public HttpResult upgradeApp(@RequestParam String firmware, @RequestParam String id_list) throws Exception { HttpResp rsp; if(firmware!=null && !firmware.equals("undefined")) { + String[] deviceList = id_list.split(";"); //请求版本服务升级 try { - rsp = versionClient.upgrade(id_list, firmware); - System.out.println(id_list); + String invalidId = checkUpgradeList(deviceList, firmware); + if(invalidId==null) { + rsp = versionClient.upgrade(id_list, firmware); + } + else return HttpResult.fail("设备型号和固件不匹配:"+invalidId); + //System.out.println(id_list); } catch (Exception e){ return HttpResult.fail("版本服务未启动"); } if(rsp.getCode() == HttpResp.HTTP_RSP_OK){ //设置设备的使用状态为升级,下发连接版本服务器指令 - + startUpgrade(deviceList); return HttpResult.success("开始升级"); } else{ @@ -204,11 +239,29 @@ public class VersionController extends BasicController{ return files.length; } - void startUpgrade(String id_list){ - String[] deviceList = id_list.split(","); + String checkUpgradeList(String[] deviceList, String firmware){ for(String deviceId:deviceList){ - + String snHigh = deviceId.substring(0,4); + if(!firmware.contains(deviceSNtoFirmwareMap.get(snHigh))){ + return deviceId; + } + } + return null; + } + void startUpgrade(String[] deviceList){ + for(String deviceId:deviceList){ + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("deviceid",deviceId).set("opmode",GnssDevice.OP_MODE_UPGRADING); + gnssDeviceMapper.update(null, updateWrapper); + rtcmClient.config(deviceId,getConnectVerServerCmd(deviceId)); } } + String getConnectVerServerCmd(String deviceId){ + short len = (short) (verServerConnectCmd.length() + 5); + return "d31a" + HexUtil.Short2HexString(len)+ + HexUtil.Int2HexString(Integer.parseInt(deviceId))+ + "01"+HexUtil.String2HexString(verServerConnectCmd); + } + } diff --git a/sec-common/src/main/java/com/imdroid/common/util/Des3Utils.java b/sec-common/src/main/java/com/imdroid/common/util/Des3Utils.java new file mode 100644 index 00000000..13ad4f6d --- /dev/null +++ b/sec-common/src/main/java/com/imdroid/common/util/Des3Utils.java @@ -0,0 +1,109 @@ +package com.imdroid.common.util; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import org.apache.commons.codec.binary.Base64; + +import javax.crypto.Cipher; +import javax.crypto.SecretKeyFactory; +import javax.crypto.spec.DESedeKeySpec; +import javax.crypto.spec.IvParameterSpec; +import java.nio.charset.StandardCharsets; +import java.security.Key; + +public class Des3Utils { + private static final String KEY_ALGORITHM = "DESede"; + private static final String CIPHER_ALGORITHM_CBC = "DESede/CBC/PKCS5Padding"; + private static final String CIPHER_ALGORITHM_ECB = "DESede/ECB/PKCS5Padding"; + + + static String mode = "DESede/CFB/NoPadding"; + + public static byte[] encrypt(Key deskey, IvParameterSpec desiv, String mode, byte[] data) { + byte[] res = null; + + Cipher cipher; + try { + cipher = Cipher.getInstance(mode); + cipher.init(Cipher.ENCRYPT_MODE, deskey, desiv); + res = cipher.doFinal(data); + } catch (Exception e) { + e.printStackTrace(); + } + return res; + } + + public static String encrypt(String data, byte[] key, byte[] iv) { + String res = ""; + + ByteBuf buf = Unpooled.buffer(256); + byte[] databyte = data.getBytes(StandardCharsets.UTF_8); + buf.writeBytes(databyte); + int a = (8 - databyte.length % 8); + for (int c = 0; c < a; c++) { + buf.writeByte(0x00); + } + databyte = new byte[buf.readableBytes()]; + buf.readBytes(databyte); + + DESedeKeySpec spec; + SecretKeyFactory keyfactory; + Key deskey; + try { + keyfactory = SecretKeyFactory.getInstance("DESede"); + spec = new DESedeKeySpec(key); + deskey = keyfactory.generateSecret(spec); + IvParameterSpec desiv = new IvParameterSpec(iv); + + byte[] encryptbyte = encrypt(deskey, desiv, mode, databyte); + res = Base64.encodeBase64String(encryptbyte); + } catch (Exception e) { + e.printStackTrace(); + } + + return res; + + } + + public static String encryptCBC(byte[] key, byte[] iv, String data) throws Exception { + DESedeKeySpec spec = new DESedeKeySpec(key); + SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(KEY_ALGORITHM); + Key desKey = keyFactory.generateSecret(spec); + Cipher cipher = Cipher.getInstance(mode); + IvParameterSpec ips = new IvParameterSpec(iv); + cipher.init(Cipher.ENCRYPT_MODE, desKey, ips); + byte[] encryptedData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8)); + return Base64.encodeBase64String(encryptedData); + } + + public static String decryptCBC(byte[] key, byte[] iv, String data) throws Exception { + DESedeKeySpec spec = new DESedeKeySpec(key); + SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(KEY_ALGORITHM); + Key desKey = keyFactory.generateSecret(spec); + Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM_CBC); + IvParameterSpec ips = new IvParameterSpec(iv); + cipher.init(Cipher.DECRYPT_MODE, desKey, ips); + byte[] decryptedData = cipher.doFinal(Base64.decodeBase64(data)); + return new String(decryptedData, StandardCharsets.UTF_8); + } + + public static String encryptECB(byte[] key, String data) throws Exception { + DESedeKeySpec spec = new DESedeKeySpec(key); + SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(KEY_ALGORITHM); + Key desKey = keyFactory.generateSecret(spec); + Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM_ECB); + cipher.init(Cipher.ENCRYPT_MODE, desKey); + byte[] encryptedData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8)); + return Base64.encodeBase64String(encryptedData); + } + + public static String decryptECB(byte[] key, String data) throws Exception { + DESedeKeySpec spec = new DESedeKeySpec(key); + SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(KEY_ALGORITHM); + Key desKey = keyFactory.generateSecret(spec); + Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM_ECB); + cipher.init(Cipher.DECRYPT_MODE, desKey); + byte[] decryptedData = cipher.doFinal(Base64.decodeBase64(data)); + return new String(decryptedData, StandardCharsets.UTF_8); + } +} diff --git a/sec-vermgr/src/main/java/com/imdroid/vermgr/VerMgrApp.java b/sec-vermgr/src/main/java/com/imdroid/vermgr/VerMgrApp.java new file mode 100644 index 00000000..98a72ed3 --- /dev/null +++ b/sec-vermgr/src/main/java/com/imdroid/vermgr/VerMgrApp.java @@ -0,0 +1,25 @@ +package com.imdroid.vermgr; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.ComponentScan; + + +/** + * @author Layton + * @date 2023/1/31 20:33 + */ +@SpringBootApplication(scanBasePackages = {"com.imdroid"}) +@MapperScan({"com.imdroid.secapi","com.imdroid.beidou.entity"}) +@ComponentScan({"com.imdroid.*"}) +@EntityScan({"com.imdroid.*"}) +@EnableFeignClients(basePackages = "com.imdroid.*") +public class VerMgrApp { + + public static void main(String[] args) { + SpringApplication.run(VerMgrApp.class, args); + } +} diff --git a/sec-vermgr/src/main/java/com/imdroid/vermgr/service/UpgradeManager.java b/sec-vermgr/src/main/java/com/imdroid/vermgr/service/UpgradeManager.java index 20b7a77a..69ffad5c 100644 --- a/sec-vermgr/src/main/java/com/imdroid/vermgr/service/UpgradeManager.java +++ b/sec-vermgr/src/main/java/com/imdroid/vermgr/service/UpgradeManager.java @@ -56,7 +56,7 @@ public class UpgradeManager { @PostMapping("/upgrade_cmd") HttpResp upgrade(@RequestParam(name = "deviceList") String deviceList, @RequestParam(name = "verFile") String verFile){ HttpResp resp = new HttpResp(); - if(onRxUpgradeDeviceList(deviceList.split(","),verFile)){ + if(onRxUpgradeDeviceList(deviceList.split(";"),verFile)){ resp.setCode(HttpResp.HTTP_RSP_OK); } else{ diff --git a/sec-vermgr/src/main/java/com/imdroid/vermgr/service/UpgradeSession.java b/sec-vermgr/src/main/java/com/imdroid/vermgr/service/UpgradeSession.java index 8afcdb21..398bd64e 100644 --- a/sec-vermgr/src/main/java/com/imdroid/vermgr/service/UpgradeSession.java +++ b/sec-vermgr/src/main/java/com/imdroid/vermgr/service/UpgradeSession.java @@ -127,7 +127,7 @@ public class UpgradeSession { else { long sn = deviceApp.getDevice_sn(); byte[] ind_msg = new byte[5]; - ind_msg[0] = VerManager.UPGRADE_IND; + ind_msg[0] = UpgradeManager.UPGRADE_IND; ind_msg[1] = (byte) (sn >> 24); ind_msg[2] = (byte) (sn >> 16); ind_msg[3] = (byte) (sn >> 8);