From 589ff1b4b598f2f763eb421da960d5550e719144 Mon Sep 17 00:00:00 2001
From: rain <167982779@qq.com>
Date: Fri, 16 Aug 2024 16:38:51 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/ht-dev' into ht-dev
---
src/main/java/com/dji/sample/component/mqtt/model/ChannelName.java | 4 +
src/main/java/com/dji/sample/component/mqtt/model/RequestsMethodEnum.java | 4 +
src/main/java/com/dji/sample/media/service/impl/MediaServiceImpl.java | 2
src/main/java/com/dji/sample/droneairport/utils/AuthUtil.java | 47 ++++++++++-----
src/main/java/com/dji/sample/wayline/service/impl/WaylineJobServiceImpl.java | 76 +++++++++++++++++++++++++
pom.xml | 2
src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java | 5 -
src/main/java/com/dji/sample/droneairport/controller/MediaApiController.java | 22 +++++--
8 files changed, 133 insertions(+), 29 deletions(-)
diff --git a/pom.xml b/pom.xml
index d349227..6852052 100644
--- a/pom.xml
+++ b/pom.xml
@@ -227,7 +227,7 @@
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
- <version>5.4.0</version>
+ <version>5.5.9</version>
<scope>compile</scope>
</dependency>
diff --git a/src/main/java/com/dji/sample/component/mqtt/model/ChannelName.java b/src/main/java/com/dji/sample/component/mqtt/model/ChannelName.java
index cf0ef71..27ef204 100644
--- a/src/main/java/com/dji/sample/component/mqtt/model/ChannelName.java
+++ b/src/main/java/com/dji/sample/component/mqtt/model/ChannelName.java
@@ -88,4 +88,8 @@
public static final String INBOUND_EVENTS_DRC_STATUS_NOTIFY = "inboundDrcStatusNotify";
public static final String INBOUND_EVENTS_DRC_MODE_EXIT_NOTIFY = "inboundDrcModeExitNotify";
+
+ public static final String INBOUND_REQUESTS_FLIGHT_AREAS_GET = "inboundRequestsFlightAreasGet";
+
+ public static final String INBOUND_REQUESTS_OFFLINE_MAP_GET = "inboundRequestsOfflineMapGet";
}
diff --git a/src/main/java/com/dji/sample/component/mqtt/model/RequestsMethodEnum.java b/src/main/java/com/dji/sample/component/mqtt/model/RequestsMethodEnum.java
index 8d04ceb..5e00fbe 100644
--- a/src/main/java/com/dji/sample/component/mqtt/model/RequestsMethodEnum.java
+++ b/src/main/java/com/dji/sample/component/mqtt/model/RequestsMethodEnum.java
@@ -22,6 +22,10 @@
FLIGHT_TASK_RESOURCE_GET("flighttask_resource_get", ChannelName.INBOUND_REQUESTS_FLIGHT_TASK_RESOURCE_GET),
+ FLIGHT_AREAS_GET("flight_areas_get", ChannelName.INBOUND_REQUESTS_FLIGHT_AREAS_GET),
+
+ OFFLINE_MAP_GET("offline_map_get", ChannelName.INBOUND_REQUESTS_OFFLINE_MAP_GET),
+
CONFIG("config", ChannelName.INBOUND_REQUESTS_CONFIG),
UNKNOWN("Unknown", ChannelName.DEFAULT);
diff --git a/src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java b/src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java
index d9d039c..322dc99 100644
--- a/src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java
+++ b/src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java
@@ -423,9 +423,6 @@
.newInstance(param.getData())
.checkCondition(param.getSn());
- ResponseResult result = ResponseResult.success();
- result.setTraceid(bid);
-
Long timestamp = System.currentTimeMillis();
//拍照事件存redis
@@ -434,7 +431,7 @@
ServiceReply serviceReply = messageSenderService.publishServicesTopic(param.getSn(), param.getCmd().getCmd(), param.getData(),bid,timestamp);
return ResponseResult.CODE_SUCCESS != serviceReply.getResult() ?
ResponseResult.error(serviceReply.getResult(), "错误码:" + serviceReply.getResult())
- : result;
+ : ResponseResult.success(bid);
}
@Override
diff --git a/src/main/java/com/dji/sample/droneairport/controller/MediaApiController.java b/src/main/java/com/dji/sample/droneairport/controller/MediaApiController.java
index 5413184..0dea669 100644
--- a/src/main/java/com/dji/sample/droneairport/controller/MediaApiController.java
+++ b/src/main/java/com/dji/sample/droneairport/controller/MediaApiController.java
@@ -25,13 +25,21 @@
@GetMapping("{sn}/getMedia/{traceid}")
public ResponseResult getMedia(@PathVariable String sn, @PathVariable String traceid) {
- String timestamp = (Long)RedisOpsUtils.hashGet(RedisConst.COMMANDS_PREFIX + sn + RedisConst.DELIMITER + traceid,traceid) / 1000 * 1000 + "";
- MediaFileEntity entity = mediaService.getMediaFieByTid(timestamp);
- String url = "https://wrj.shuixiongit.com/minio/cloud-bucket" + entity.getObjectKey();
- Map ret = new HashMap();
- ret.put("url", url);
- ret.put("metadata", JSONObject.parseObject(entity.getMetadata().toString()));
- return ResponseResult.success(ret);
+ try{
+ String timestamp = (Long)RedisOpsUtils.hashGet(RedisConst.COMMANDS_PREFIX + sn + RedisConst.DELIMITER + traceid,traceid) / 1000 * 1000 + "";
+ MediaFileEntity entity = mediaService.getMediaFieByTid(timestamp);
+ if (null == entity) {
+ return ResponseResult.error(-1,"等待媒体文件上传中");
+ }
+ String url = "https://wrj.shuixiongit.com/minio/cloud-bucket" + entity.getObjectKey();
+ Map ret = new HashMap();
+ ret.put("url", url);
+ ret.put("metadata", JSONObject.parseObject(entity.getMetadata().toString()));
+ return ResponseResult.success(ret);
+ } catch (Exception e) {
+ return ResponseResult.error(-1,"拍摄未完成或者媒体文件未上传");
+ }
+
}
}
diff --git a/src/main/java/com/dji/sample/droneairport/utils/AuthUtil.java b/src/main/java/com/dji/sample/droneairport/utils/AuthUtil.java
index eaa1306..1276210 100644
--- a/src/main/java/com/dji/sample/droneairport/utils/AuthUtil.java
+++ b/src/main/java/com/dji/sample/droneairport/utils/AuthUtil.java
@@ -1,15 +1,12 @@
package com.dji.sample.droneairport.utils;
-import com.dji.sample.droneairport.utils.SM2.ModeTypeEnum;
-import com.dji.sample.droneairport.utils.SM2.Utils;
-import com.dji.sample.territory.utils.SM2SignUtil;
-import com.dji.sample.territory.utils.jym.SM2SignVO;
-import com.dji.sample.territory.utils.jym.SM2SignVerUtils;
-import com.dji.sample.territory.utils.jym.Util;
-import lombok.SneakyThrows;
+import cn.hutool.core.codec.Base64;
+import cn.hutool.core.util.HexUtil;
+import cn.hutool.crypto.asymmetric.SM2;
+
import java.nio.charset.StandardCharsets;
-import java.util.Base64;
+
public class AuthUtil {
@@ -23,16 +20,34 @@
* 6、组装得到token:{B}.{A}.{F}
* @return
*/
- @SneakyThrows
public static String getToken() {
+ String privateKey = "00D631FD5615416EAB63D33A9E66E801F95DE840567504210080006081DE877AE3";
+ String publicKey = "04225AACF606D800EA3C2C31FCF8FB161B15F7A8D0460DEB91013D4F228C455E76A2ED8D71BC6525B5DC5CC015C155479D8839950344AEE438A3A6305C90F8269F";
+ SM2 sm2 = new SM2(privateKey, publicKey);
+ sm2.usePlainEncoding();
+ //SM2 token生成
+ String certCode = "UAV32_WHR4E3UAJZTE3KE5IZFDGL7CBU";
long timestamp = System.currentTimeMillis();
- String certificateB = "5DED9AC421AC4FD8B03C5E7236A9A201"; // 示例证书信息
- String C = certificateB + timestamp;
- byte[] D = C.getBytes(StandardCharsets.UTF_8);
- SM2SignVO sm2signv0 = SM2SignVerUtils.Sign2SM2(Util.hexStringToBytes("23E57DA1E4AB865CCBC325B668762207DEF74345B782237808AE0BABDF26734D"), D);
- byte[] E = sm2signv0.getSm2_signForHard().getBytes();
- String F = Base64.getEncoder().encodeToString(E);
- return certificateB + "." + timestamp + "." + F;
+ //拼接待签名数据
+ String needSignData = certCode + timestamp;
+ byte[] needSignDataByte = needSignData.getBytes(StandardCharsets.UTF_8);
+ //签名
+ byte[] signData = sm2.sign(needSignDataByte);
+ String signDataHex = HexUtil.encodeHexStr(signData);
+ System.out.println("sign Hex:" + signDataHex);
+ String signDataBase64 = Base64.encode(signData);
+ System.out.println("sign Base64:" + signDataBase64);
+ //生成token
+ String token = certCode + "." + timestamp + "." + signDataBase64;
+ System.out.println("token:" + token);
+ //SM2 token验证
+ boolean rst1 = sm2.verify(needSignDataByte, signData);
+ System.out.println("verify result:" + rst1);
+ boolean rst2 = sm2.verify(needSignDataByte, HexUtil.decodeHex(signDataHex));
+ System.out.println("verify result:" + rst2);
+ boolean rst3 = sm2.verify(needSignDataByte, Base64.decode(signDataBase64));
+ System.out.println("verify result:" + rst3);
+ return certCode + "." + timestamp + "." + signDataBase64;
}
public static void main(String[] args) {
diff --git a/src/main/java/com/dji/sample/media/service/impl/MediaServiceImpl.java b/src/main/java/com/dji/sample/media/service/impl/MediaServiceImpl.java
index 2ca1a5c..15b4c9e 100644
--- a/src/main/java/com/dji/sample/media/service/impl/MediaServiceImpl.java
+++ b/src/main/java/com/dji/sample/media/service/impl/MediaServiceImpl.java
@@ -234,7 +234,7 @@
/**
* Handles the highest priority message about media uploads.
- *
+ * 处理有关媒体上传的最高优先级消息。
* @param receiver
* @param headers
* @return
diff --git a/src/main/java/com/dji/sample/wayline/service/impl/WaylineJobServiceImpl.java b/src/main/java/com/dji/sample/wayline/service/impl/WaylineJobServiceImpl.java
index 9eafe2b..310c1c9 100644
--- a/src/main/java/com/dji/sample/wayline/service/impl/WaylineJobServiceImpl.java
+++ b/src/main/java/com/dji/sample/wayline/service/impl/WaylineJobServiceImpl.java
@@ -67,7 +67,11 @@
import java.sql.SQLException;
import java.time.*;
import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
+
+import static com.dji.sample.component.mqtt.model.TopicConst.*;
+import static com.dji.sample.component.mqtt.model.TopicConst._REPLY_SUF;
/**
* @author sean
@@ -679,6 +683,78 @@
}
+ /**
+ * 机场的获取离线地图协议请求回复
+ * @param receiver
+ */
+ @ServiceActivator(inputChannel = ChannelName.INBOUND_REQUESTS_OFFLINE_MAP_GET, outputChannel = ChannelName.OUTBOUND)
+ public void offlineMapGet(CommonTopicReceiver receiver) {
+ log.info("接收到机场的获取离线地图协议消息,编号:{}",receiver.getGateway());
+ // 查询在线设备,不存在就不发送了
+ Optional<DeviceDTO> deviceOpt = deviceRedisService.getDeviceOnline(receiver.getGateway());
+ if (deviceOpt.isEmpty()) {
+ return;
+ }
+ // 组装数据
+ CommonTopicResponse<Object> builder = CommonTopicResponse.builder()
+ .tid(receiver.getTid())
+ .bid(receiver.getBid())
+ .method(RequestsMethodEnum.OFFLINE_MAP_GET.getMethod())
+ .timestamp(System.currentTimeMillis())
+ .build();
+ // 组装 data 数据
+ Map<String, Integer> result = new ConcurrentHashMap<>(1);
+ result.put("result", 0);
+ builder.setData(result);
+ log.info("回复机场的获取离线地图协议消息:{},{}",BASIC_PRE + PRODUCT +receiver.getGateway() + REQUESTS_SUF + _REPLY_SUF, builder );
+ // 回复消息
+ messageSender.publish(
+ new StringBuilder()
+ .append(BASIC_PRE)
+ .append(PRODUCT)
+ .append(receiver.getGateway())
+ .append(REQUESTS_SUF)
+ .append(_REPLY_SUF)
+ .toString(),
+ builder);
+ }
+
+ /**
+ * 自定义飞行区文件获取协议请求回复
+ * @param receiver
+ */
+ @ServiceActivator(inputChannel = ChannelName.INBOUND_REQUESTS_FLIGHT_AREAS_GET, outputChannel = ChannelName.OUTBOUND)
+ public void flightAreasGet(CommonTopicReceiver receiver) {
+ log.info("接收到自定义飞行区文件获取消息,编号:{}",receiver.getGateway());
+ // 查询在线设备,不存在就不发送了
+ Optional<DeviceDTO> deviceOpt = deviceRedisService.getDeviceOnline(receiver.getGateway());
+ if (deviceOpt.isEmpty()) {
+ return;
+ }
+ // 组装数据
+ CommonTopicResponse<Object> builder = CommonTopicResponse.builder()
+ .tid(receiver.getTid())
+ .bid(receiver.getBid())
+ .method(RequestsMethodEnum.FLIGHT_AREAS_GET.getMethod())
+ .timestamp(System.currentTimeMillis())
+ .build();
+ // 组装 data 数据
+ Map<String, Integer> result = new ConcurrentHashMap<>(1);
+ result.put("result", 0);
+ builder.setData(result);
+ log.info("回复自定义飞行区文件获取消息:{},{}",BASIC_PRE + PRODUCT +receiver.getGateway() + REQUESTS_SUF + _REPLY_SUF, builder );
+ // 回复消息
+ messageSender.publish(
+ new StringBuilder()
+ .append(BASIC_PRE)
+ .append(PRODUCT)
+ .append(receiver.getGateway())
+ .append(REQUESTS_SUF)
+ .append(_REPLY_SUF)
+ .toString(),
+ builder);
+ }
+
@Override
public List<String> selectJobIdByName(String name) {
List<WaylineJobEntity> waylineJobs = mapper.selectList(new LambdaQueryWrapper<WaylineJobEntity>()
--
Gitblit v1.9.3