rain
2024-08-16 589ff1b4b598f2f763eb421da960d5550e719144
Merge remote-tracking branch 'origin/ht-dev' into ht-dev
8 files modified
148 ■■■■ changed files
pom.xml 2 ●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/component/mqtt/model/ChannelName.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/component/mqtt/model/RequestsMethodEnum.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java 5 ●●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/droneairport/controller/MediaApiController.java 8 ●●●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/droneairport/utils/AuthUtil.java 47 ●●●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/media/service/impl/MediaServiceImpl.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/wayline/service/impl/WaylineJobServiceImpl.java 76 ●●●●● patch | view | raw | blame | history
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>
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";
}
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);
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
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) {
        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,"拍摄未完成或者媒体文件未上传");
        }
    }
}
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) {
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
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>()