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