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>()