Browse Source

无人机对接接口

S0025136190 1 year ago
parent
commit
9abba36186

+ 31 - 15
Backend/sample/src/main/java/com/dji/sample/component/AuthInterceptor.java

@@ -8,9 +8,11 @@ import com.dji.sample.common.error.CommonErrorEnum;
 import com.dji.sample.common.model.CustomClaim;
 import com.dji.sample.common.util.JwtUtil;
 import com.dji.sample.component.mqtt.config.MqttPropertyConfiguration;
+import com.dji.sample.component.redis.RedisOpsUtils;
 import com.dji.sample.configuration.CustomConfiguration;
 import com.dji.sample.manage.model.entity.UserEntity;
 import com.dji.sample.manage.service.IUserService;
+import com.dji.sample.manage.service.IWhiteListService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpMethod;
@@ -46,7 +48,7 @@ public class AuthInterceptor implements HandlerInterceptor {
     public static final String USER_CODE = "userCode";
 
     @Autowired
-    private IUserService userService;
+    private IWhiteListService whiteListService;
 
 
     @Override
@@ -58,23 +60,37 @@ public class AuthInterceptor implements HandlerInterceptor {
             response.setStatus(HttpStatus.OK.value());
             return false;
         }
-        String token = request.getHeader(PARAM_TOKEN);
-        if (!StringUtils.hasText(token)) {
-            response.setStatus(HttpStatus.UNAUTHORIZED.value());
-            log.error(CommonErrorEnum.NO_TOKEN.getMessage());
-            return false;
-        }
+        String ip = request.getRemoteAddr();
+
+        Boolean check = RedisOpsUtils.checkExist(ip);
+        if(!check) {
+            Boolean flg =  whiteListService.selIp(ip);
+            if(flg) {
+                RedisOpsUtils.set(ip,ip);
+                return true;
+            } else {
+                String token = request.getHeader(PARAM_TOKEN);
+                if (!StringUtils.hasText(token)) {
+                    response.setStatus(HttpStatus.UNAUTHORIZED.value());
+                    log.error(CommonErrorEnum.NO_TOKEN.getMessage());
+                    return false;
+                }
+
+                // Check if the current token is valid.
+                Optional<CustomClaim> customClaimOpt = JwtUtil.parseToken(token);
+                if (customClaimOpt.isEmpty()) {
+                    response.setStatus(HttpStatus.UNAUTHORIZED.value());
+                    return false;
+                }
+
+                // Put the custom data from the token into the request.
+                request.setAttribute(TOKEN_CLAIM, customClaimOpt.get());
+                return true;
+            }
 
-        // Check if the current token is valid.
-        Optional<CustomClaim> customClaimOpt = JwtUtil.parseToken(token);
-        if (customClaimOpt.isEmpty()) {
-            response.setStatus(HttpStatus.UNAUTHORIZED.value());
-            return false;
         }
-
-        // Put the custom data from the token into the request.
-        request.setAttribute(TOKEN_CLAIM, customClaimOpt.get());
         return true;
+
     }
 
     @Override

+ 87 - 0
Backend/sample/src/main/java/com/dji/sample/manage/controller/UpstreamController.java

@@ -0,0 +1,87 @@
+package com.dji.sample.manage.controller;
+
+import com.dji.sample.manage.model.dto.*;
+import com.dji.sample.manage.service.IDeviceDictionaryService;
+import com.dji.sample.manage.service.IDevicePayloadService;
+import com.dji.sample.manage.service.IDeviceService;
+import com.dji.sample.manage.service.IManageDeviceLivestreamUrlService;
+import com.dji.sample.media.model.UpstreamMediaFileDTO;
+import com.dji.sample.media.service.IFileService;
+import com.dji.sample.media.service.IMediaDirService;
+import com.dji.sdk.common.HttpResultResponse;
+import com.dji.sdk.common.PaginationData;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author sean.zhou
+ * @version 0.1
+ * @date 2021/11/15
+ */
+@RestController
+@Slf4j
+@RequestMapping("${url.manage.prefix}${url.manage.version}/upstream")
+public class UpstreamController {
+
+    @Autowired
+    private IDeviceService deviceService;
+
+    @Autowired
+    private IDevicePayloadService devicePayloadService;
+
+    @Autowired
+    private IManageDeviceLivestreamUrlService livestreamUrlService;
+
+    @Autowired
+    private IFileService fileService;
+
+    @Autowired
+    private IMediaDirService dirService;
+
+    /**
+     * 上游系统获取设备列表信息
+     * @param searchInfo
+     * @param status
+     * @return
+     */
+    @GetMapping("/devicesList")
+    public HttpResultResponse<List<UpstreamDeviceDTO>> getDevicesList(String searchInfo,
+                                                                      Integer status) {
+        List<UpstreamDeviceDTO> devices = deviceService.selUpstreamDeviceList(searchInfo, status);
+        return HttpResultResponse.success(devices);
+    }
+
+    /**
+     * 上游系统获取图片文件信息
+     * @param workspaceName
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    @GetMapping("/files")
+    public HttpResultResponse<PaginationData<UpstreamMediaFileDTO>> getFilesList(@RequestParam(defaultValue = "1") Long page,
+                                                                                @RequestParam(name = "page_size", defaultValue = "10") Long pageSize,
+                                                                                String workspaceName,
+                                                                                Long startTime,
+                                                                                Long endTime ) {
+        PaginationData<UpstreamMediaFileDTO> filesList = fileService.getMediaFilesPagination(workspaceName, startTime,endTime, page, pageSize);
+        return HttpResultResponse.success(filesList);
+    }
+
+    /**
+     * 上游系统获取直播地址
+     * @param payload
+     * @param deviceSn
+     * @return
+     */
+    @GetMapping("/webRtc")
+    public HttpResultResponse<List<String>> getWebRtc(String payload,
+                                                                 String deviceSn) {
+        List<String> url = livestreamUrlService.selWebRtc(payload, deviceSn);
+        return HttpResultResponse.success(url);
+    }
+
+}

+ 13 - 0
Backend/sample/src/main/java/com/dji/sample/manage/dao/IWhiteListMapper.java

@@ -0,0 +1,13 @@
+package com.dji.sample.manage.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dji.sample.manage.model.entity.WhiteListEntity;
+
+/**
+ *
+ * @author huiqing.jiang
+ * @date 2024/8/30
+ * @version 0.1
+ */
+public interface IWhiteListMapper extends BaseMapper<WhiteListEntity> {
+}

+ 42 - 0
Backend/sample/src/main/java/com/dji/sample/manage/model/dto/UpstreamDeviceDTO.java

@@ -0,0 +1,42 @@
+package com.dji.sample.manage.model.dto;
+
+import com.dji.sample.manage.model.enums.DeviceFirmwareStatusEnum;
+import com.dji.sdk.cloudapi.device.ControlSourceEnum;
+import com.dji.sdk.cloudapi.device.DeviceDomainEnum;
+import com.dji.sdk.cloudapi.device.DeviceSubTypeEnum;
+import com.dji.sdk.cloudapi.device.DeviceTypeEnum;
+import com.dji.sdk.cloudapi.tsa.DeviceIconUrl;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * @author sean.zhou
+ * @date 2021/11/19
+ * @version 0.1
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class UpstreamDeviceDTO {
+
+    private String deviceSn;
+
+    private String deviceName;
+
+    private String nickName;
+
+    private String workspaceId;
+
+    private Integer status;
+
+    private String payload;
+
+    private String statusText;
+
+}

+ 24 - 0
Backend/sample/src/main/java/com/dji/sample/manage/model/entity/WhiteListEntity.java

@@ -0,0 +1,24 @@
+package com.dji.sample.manage.model.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@TableName(value = "white_list")
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class WhiteListEntity implements Serializable {
+
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    @TableField(value = "ip")
+    private String ip;
+
+}

+ 3 - 0
Backend/sample/src/main/java/com/dji/sample/manage/service/IDeviceService.java

@@ -2,6 +2,7 @@ package com.dji.sample.manage.service;
 
 import com.dji.sample.common.model.CustomClaim;
 import com.dji.sample.component.websocket.model.BizCodeEnum;
+import com.dji.sample.manage.model.dto.UpstreamDeviceDTO;
 import com.dji.sample.manage.model.param.DeviceBoundQueryParam;
 import com.dji.sdk.cloudapi.device.*;
 import com.dji.sdk.common.AMap;
@@ -214,4 +215,6 @@ public interface IDeviceService {
     void updateFlightControl(DeviceDTO gateway, ControlSourceEnum controlSource, ModeCodeReasonEnum modeCodeReason);
 
     void updateHome(DeviceDTO drone, AMap homePoint);
+
+    List<UpstreamDeviceDTO> selUpstreamDeviceList(String searchInfo, Integer status);
 }

+ 6 - 0
Backend/sample/src/main/java/com/dji/sample/manage/service/IManageDeviceLivestreamUrlService.java

@@ -14,4 +14,10 @@ public interface IManageDeviceLivestreamUrlService {
      * @return
      */
     ManageDeviceLivestreamUrlDTO getUrl(ManageDeviceLivestreamUrlDTO deviceLivestreamUrlDTO,String protocol);
+
+    /**
+     * 上游系统获取webRtc地址
+     * @return
+     */
+    List<String> selWebRtc(String payload,String deviceSn);
 }

+ 14 - 0
Backend/sample/src/main/java/com/dji/sample/manage/service/IWhiteListService.java

@@ -0,0 +1,14 @@
+package com.dji.sample.manage.service;
+
+import com.dji.sample.manage.model.dto.CapacityVideoDTO;
+import com.dji.sample.manage.model.receiver.CapacityVideoReceiver;
+
+/**
+ * @author huiqing.jiang
+ * @date 2024/8/30
+ * @version 0.1
+ */
+public interface IWhiteListService {
+
+    Boolean selIp(String ip);
+}

+ 42 - 0
Backend/sample/src/main/java/com/dji/sample/manage/service/impl/DeviceServiceImpl.java

@@ -776,6 +776,48 @@ public class DeviceServiceImpl implements IDeviceService {
                 homePoint);
     }
 
+    @Override
+    public List<UpstreamDeviceDTO> selUpstreamDeviceList(String searchInfo, Integer status) {
+        List<UpstreamDeviceDTO> resultList = new ArrayList<>();
+        LambdaQueryWrapper<DeviceEntity> wrapper = new LambdaQueryWrapper<>();
+        if(searchInfo != null) {
+            wrapper.like( DeviceEntity::getDeviceSn, searchInfo)
+                    .or().like( DeviceEntity::getNickname, searchInfo);
+        }
+        List<DeviceEntity> list = mapper.selectList(wrapper);
+        if(list.size() > 0) {
+            for(DeviceEntity device : list) {
+                UpstreamDeviceDTO upstreamDeviceDTO = new UpstreamDeviceDTO();
+                upstreamDeviceDTO.setDeviceSn(device.getDeviceSn());
+                upstreamDeviceDTO.setWorkspaceId(device.getWorkspaceId());
+                upstreamDeviceDTO.setNickName(device.getNickname());
+                upstreamDeviceDTO.setDeviceName(device.getDeviceName());
+                upstreamDeviceDTO.setPayload(device.getDomain()+"-"+device.getDeviceType()+"-"+device.getSubType());
+
+                DeviceDTO deviceDTO = new DeviceDTO();
+                deviceDTO.setDeviceSn(device.getDeviceSn());
+                getDeviceStatus(deviceDTO);
+                upstreamDeviceDTO.setStatusText(deviceDTO.getStatusText());
+                if(status == null) {
+                    if(deviceDTO.getStatusText().equals("离线")) {
+                        upstreamDeviceDTO.setStatus(1);
+                    } else {
+                        upstreamDeviceDTO.setStatus(2);
+                    }
+                    resultList.add(upstreamDeviceDTO);
+                } else if(status == 1  && deviceDTO.getStatusText().equals("离线")) {
+                    upstreamDeviceDTO.setStatus(1);
+                    resultList.add(upstreamDeviceDTO);
+                } else if (status == 2  && !deviceDTO.getStatusText().equals("离线")) {
+                    upstreamDeviceDTO.setStatus(2);
+                    resultList.add(upstreamDeviceDTO);
+                }
+                //upstreamDeviceDTO.setDeviceSn(device.getDeviceSn());
+            }
+        }
+        return resultList;
+    }
+
     /**
      * Convert device data transfer object into database entity object.
      * @param dto

+ 17 - 0
Backend/sample/src/main/java/com/dji/sample/manage/service/impl/ManageDeviceLivestreamUrlServiceImpl.java

@@ -1,5 +1,6 @@
 package com.dji.sample.manage.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.dji.sample.common.smsp.CallSmsp;
 import com.dji.sample.common.util.DesUtil;
@@ -148,6 +149,22 @@ public class ManageDeviceLivestreamUrlServiceImpl implements IManageDeviceLivest
         return rtmpDto;
     }
 
+    @Override
+    public List<String> selWebRtc(String payload, String deviceSn) {
+        List<String> resultList = new ArrayList<>();
+        LambdaQueryWrapper<ManageDeviceLivestreamUrlEntity> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(ManageDeviceLivestreamUrlEntity::getUrlType,LiveUrlTypeEnum.WEBRTC.getVal())
+                .eq(null!= payload,ManageDeviceLivestreamUrlEntity::getPayloadIndex,payload)
+                .eq(null!= deviceSn,ManageDeviceLivestreamUrlEntity::getDeviceSn,deviceSn);
+        List<ManageDeviceLivestreamUrlEntity> result = mapper.selectList(wrapper);
+        if(result.size() > 0 ) {
+            for(ManageDeviceLivestreamUrlEntity entity :result) {
+                resultList.add(entity.getUrl());
+            }
+        }
+        return resultList;
+    }
+
     private void update(List<ManageDeviceLivestreamUrlEntity> entitys,List<ManageDeviceLivestreamUrlDTO> dtos) {
         for(ManageDeviceLivestreamUrlEntity url : entitys) {
             url.setChannelId(dtos.get(0).getChannelId());

+ 38 - 0
Backend/sample/src/main/java/com/dji/sample/manage/service/impl/WhiteListServiceImpl.java

@@ -0,0 +1,38 @@
+package com.dji.sample.manage.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.dji.sample.manage.dao.IWhiteListMapper;
+import com.dji.sample.manage.model.dto.CapacityVideoDTO;
+import com.dji.sample.manage.model.entity.WhiteListEntity;
+import com.dji.sample.manage.model.receiver.CapacityVideoReceiver;
+import com.dji.sample.manage.service.IWhiteListService;
+import com.dji.sdk.cloudapi.livestream.VideoTypeEnum;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+/**
+ * @author huiqing.jiang
+ * @version 0.1
+ * @date 2024/8/30
+ */
+@Service
+public class WhiteListServiceImpl implements IWhiteListService {
+
+    @Autowired
+    private IWhiteListMapper mapper;
+
+    @Override
+    public Boolean selIp(String ip) {
+        LambdaQueryWrapper<WhiteListEntity> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(WhiteListEntity::getIp,ip);
+        List<WhiteListEntity> list = mapper.selectList(wrapper);
+        if(list.size() > 0) {
+            return true;
+        }
+        return false;
+    }
+}

+ 51 - 0
Backend/sample/src/main/java/com/dji/sample/media/dao/IFileMapper.java

@@ -2,6 +2,11 @@ package com.dji.sample.media.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.dji.sample.media.model.MediaFileEntity;
+import com.dji.sample.media.model.UpstreamMediaFileDTO;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
 
 /**
  * @author sean
@@ -9,4 +14,50 @@ import com.dji.sample.media.model.MediaFileEntity;
  * @date 2021/12/9
  */
 public interface IFileMapper extends BaseMapper<MediaFileEntity> {
+
+    @Select("<script> " +
+            "SELECT MF.workspace_id workspaceId " +
+            ",MW.workspace_name workspaceName " +
+            ",MF.drone deviceNo " +
+            ",DE.nickname nickName " +
+            ",MD.dir_name dirName " +
+            ",MF.size fileSize " +
+            ",MF.picture_time pictureTime " +
+            ",MF.picture_type pictureType " +
+            "FROM MEDIA_FILE MF " +
+            "LEFT JOIN MEDIA_DIR MD ON MF.DIR_ID = MD.ID " +
+            "LEFT JOIN MANAGE_DEVICE DE ON MF.DRONE = DE.DEVICE_SN " +
+            "LEFT JOIN MANAGE_WORKSPACE MW ON MF.workspace_id = MW.workspace_id " +
+            "WHERE 1 = 1 " +
+            "<if test= 'null != workspaceName  '>" +
+            "    AND MW.workspace_name LIKE CONCAT('%', #{workspaceName},'%') " +
+            "</if>" +
+            "<if test= 'null != startTime'  >" +
+            "    AND MF.create_time &gt; #{startTime}  " +
+            "</if>" +
+            "<if test= 'endTime != null' >" +
+            "    AND MF.create_time &lt; #{endTime}  " +
+            "</if>" +
+            "LIMIT #{page},#{pageSize} " +
+            "</script>")
+    List<UpstreamMediaFileDTO> getMediaFiles(@Param("startTime") Long startTime, @Param("endTime") Long endTime, @Param("workspaceName") String workspaceName,@Param("page") long page,@Param("pageSize") long pageSize);
+    @Select("<script> " +
+            "SELECT count(*) total " +
+            "FROM MEDIA_FILE MF " +
+            "LEFT JOIN MEDIA_DIR MD ON MF.DIR_ID = MD.ID " +
+            "LEFT JOIN MANAGE_DEVICE DE ON MF.DRONE = DE.DEVICE_SN " +
+            "LEFT JOIN MANAGE_WORKSPACE MW ON MF.workspace_id = MW.workspace_id " +
+            "WHERE 1 = 1 " +
+            "<if test= 'null != workspaceName  '>" +
+            "    AND MW.workspace_name LIKE CONCAT('%', #{workspaceName},'%') " +
+            "</if>" +
+            "<if test= 'null != startTime'  >" +
+            "    AND MF.create_time &gt; #{startTime}  " +
+            "</if>" +
+            "<if test= 'endTime != null' >" +
+            "    AND MF.create_time &lt; #{endTime}  " +
+            "</if>" +
+            "</script>")
+    long getMediaFilesCount(@Param("startTime") Long startTime, @Param("endTime") Long endTime, @Param("workspaceName") String workspaceName);
+
 }

+ 44 - 0
Backend/sample/src/main/java/com/dji/sample/media/model/UpstreamMediaFileDTO.java

@@ -0,0 +1,44 @@
+package com.dji.sample.media.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * @author sean
+ * @version 0.2
+ * @date 2021/12/9
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UpstreamMediaFileDTO {
+
+    private String fileSize;
+
+    private String workspaceId;
+
+    private String filePath;
+
+    private String workspaceName;
+
+    private Long pictureTime;
+
+    private String pictureType;
+
+    private String deviceNo;
+
+    private String nickName;
+
+    private String dirName;
+
+
+
+
+
+}

+ 3 - 0
Backend/sample/src/main/java/com/dji/sample/media/service/IFileService.java

@@ -3,6 +3,7 @@ package com.dji.sample.media.service;
 import com.dji.sample.map.model.param.MediaFileQueryParam;
 import com.dji.sample.media.model.MediaFileDTO;
 import com.dji.sample.media.model.MediaFileEntity;
+import com.dji.sample.media.model.UpstreamMediaFileDTO;
 import com.dji.sdk.cloudapi.map.ElementPicture;
 import com.dji.sdk.cloudapi.media.MediaUploadCallbackRequest;
 import com.dji.sdk.common.PaginationData;
@@ -105,4 +106,6 @@ public interface IFileService {
     boolean createMediaElement(String workspaceId, Integer elementFrom, MediaFileDTO mediaFileDTO);
 
     boolean deleteMediaElement(String workspaceId, MediaFileDTO mediaFileDTO);
+
+    PaginationData<UpstreamMediaFileDTO> getMediaFilesPagination(String workspaceName, Long startTime, Long endTime, long page, long pageSize);
 }

+ 7 - 2
Backend/sample/src/main/java/com/dji/sample/media/service/impl/FileServiceImpl.java

@@ -20,10 +20,8 @@ import com.dji.sample.media.model.*;
 import com.dji.sample.media.service.IFileService;
 import com.dji.sample.media.service.IMediaDirService;
 import com.dji.sample.wayline.dao.IWaylineJobMapper;
-import com.dji.sample.wayline.model.dto.WaylineJobDTO;
 import com.dji.sample.wayline.model.entity.WaylineJobEntity;
 import com.dji.sample.wayline.service.IWaylineFileService;
-import com.dji.sample.wayline.service.IWaylineJobService;
 import com.dji.sdk.cloudapi.device.DeviceEnum;
 import com.dji.sdk.cloudapi.map.*;
 import com.dji.sdk.cloudapi.media.MediaSubFileTypeEnum;
@@ -847,4 +845,11 @@ public class FileServiceImpl implements IFileService {
         return builder.build();
     }
 
+    @Override
+    public PaginationData<UpstreamMediaFileDTO> getMediaFilesPagination(String workspaceName, Long startTime, Long endTime, long page, long pageSize) {
+        List<UpstreamMediaFileDTO> respData = mapper.getMediaFiles(startTime,endTime,workspaceName, page-1,  pageSize);
+        long total = mapper.getMediaFilesCount(startTime,endTime,workspaceName);
+        return new PaginationData<UpstreamMediaFileDTO>(respData, new Pagination(page, pageSize, total));
+    }
+
 }