大疆上云API源码解析(航线管理)

本文详细描述了Pilot2的航线管理功能,包括文件的上传、下载、编辑、列表展示以及与云端同步。介绍了获取临时凭证、文件列表获取、下载地址获取、重复名称检查和文件上传结果上报等关键接口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

航线管理

Pilot2

功能概述

主要是提供同一个工作空间下的航线文件下载上传,用户通过Pilot2登录到服务端后,可以拉取航线列表,显示在Pilot2的航线库中,Pilot2 可以直接查看云端的航线,如果要修改航线,需要先将航线下载到本地,然后进行编辑,本地编辑不影响云端航线,如果需要将修改后的航线共享,则需要将航线重新命名,然后再次上传。

接口说明
  1. 获取上传临时凭证
    每次航线文件上传时,需要向服务端获取临时文件上传凭证,Pilot2在上传时会带上该凭证用于校验
    com.zdjjrj.storage.controller.StorageController#getTemporaryCredential
	@Override
    public HttpResultResponse<StsCredentialsResponse> getTemporaryCredential(String workspaceId, HttpServletRequest req, HttpServletResponse rsp) {
        StsCredentialsResponse stsCredentials = storageService.getSTSCredentials();
        return HttpResultResponse.success(stsCredentials);
    }

com.zdjjrj.storage.service.impl.StorageServiceImpl#getSTSCredentials

@Service
public class StorageServiceImpl extends AbstractMediaService implements IStorageService {

    @Autowired
    private OssServiceContext ossService;

    @Override
    public StsCredentialsResponse getSTSCredentials() {
        return new StsCredentialsResponse()
                .setEndpoint(OssConfiguration.endpoint)
                .setBucket(OssConfiguration.bucket)
                .setCredentials(ossService.getCredentials())
                .setProvider(OssConfiguration.provider)
                .setObjectKeyPrefix(OssConfiguration.objectDirPrefix)
                .setRegion(OssConfiguration.region);
    }

    @Override
    public TopicRequestsResponse<MqttReply<StsCredentialsResponse>> storageConfigGet(TopicRequestsRequest<StorageConfigGet> response, MessageHeaders headers) {
        return new TopicRequestsResponse<MqttReply<StsCredentialsResponse>>().setData(MqttReply.success(getSTSCredentials()));
    }
}
  1. 获取航线文件列表
    DJI Pilot 2通过http向服务端拉取航线文件列表,并显示在DJI Pilot 2航线库中
    com.zdjjrj.sdk.cloudapi.wayline.api.IHttpWaylineService.getWaylineList

    @Override
    public HttpResultResponse<PaginationData<GetWaylineListResponse>> getWaylineList(@Valid GetWaylineListRequest request, String workspaceId, HttpServletRequest req, HttpServletResponse rsp) {
        PaginationData<GetWaylineListResponse> data = waylineFileService.getWaylinesByParam(workspaceId, request);
        return HttpResultResponse.success(data);
    }
    

    com.zdjjrj.wayline.service.impl.WaylineFileServiceImpl#getWaylinesByParam

    @Override
    public PaginationData<GetWaylineListResponse> getWaylinesByParam(String workspaceId, GetWaylineListRequest param) {
        // Paging Query
        Page<WaylineFileEntity> page = mapper.selectPage(
                new Page<WaylineFileEntity>(param.getPage(), param.getPageSize()),
                new LambdaQueryWrapper<WaylineFileEntity>()
                        .eq(WaylineFileEntity::getWorkspaceId, workspaceId)
                        .eq(Objects.nonNull(param.getFavorited()), WaylineFileEntity::getFavorited, param.getFavorited())
                        .like(Objects.nonNull(param.getJobName()), WaylineFileEntity::getName, param.getJobName())
                        .ge(Objects.nonNull(param.getStartTime()), WaylineFileEntity::getCreateTime, param.getStartTime())
                        .le(Objects.nonNull(param.getEndTime()), WaylineFileEntity::getCreateTime, param.getEndTime())
                        .and(param.getTemplateType() != null, wrapper ->  {
                                for (WaylineTypeEnum type : param.getTemplateType()) {
                                    wrapper.like(WaylineFileEntity::getTemplateTypes, type.getValue()).or();
                                }
                        })
                        // There is a risk of SQL injection
                        .last(StringUtils.hasText(param.getOrderBy()), " order by " + param.getOrderBy()));
    
        // Wrap the results of a paging query into a custom paging object.
        List<GetWaylineListResponse> records = page.getRecords()
                .stream()
                .map(this::entityConvertToDTO)
                .collect(Collectors.toList());
    
        return new PaginationData<>(records, new Pagination(page));
    }
    
  2. 获取航线文件下载地址
    当用户点击下载DJI Pilot 2中航线列表的某个航线时,DJI Pilot 2会发起获取航线下载地址的请求。
    com.zdjjrj.wayline.controller.WaylineFileController#getWaylineFileDownloadAddress

    @Override
    public void getWaylineFileDownloadAddress(String workspaceId, String waylineId, HttpServletRequest req, HttpServletResponse rsp) {
        try {
            URL url = waylineFileService.getObjectUrl(workspaceId, waylineId);
            rsp.sendRedirect(url.toString());
    
        } catch (IOException | SQLException e) {
            e.printStackTrace();
        }
    }
    

    com.zdjjrj.wayline.service.impl.WaylineFileServiceImpl#getObjectUrl

     @Override
    public URL getObjectUrl(String workspaceId, String waylineId) throws SQLException {
        Optional<GetWaylineListResponse> waylineOpt = this.getWaylineByWaylineId(workspaceId, waylineId);
        if (waylineOpt.isEmpty()) {
            throw new SQLException(waylineId + " does not exist.");
        }
        return ossService.getObjectUrl(OssConfiguration.bucket, waylineOpt.get().getObjectKey());
    }
     @Override
        public Optional<GetWaylineListResponse> getWaylineByWaylineId(String workspaceId, String waylineId) {
            return Optional.ofNullable(
                    this.entityConvertToDTO(
                            mapper.selectOne(
                                    new LambdaQueryWrapper<WaylineFileEntity>()
                                        .eq(WaylineFileEntity::getWorkspaceId, workspaceId)
                                        .eq(WaylineFileEntity::getWaylineId, waylineId))));
        }
    
  3. 获取重复的航线文件名称
    DJI Pilot 2在本地编辑和上传的航线文件中,不允许有重复的航线名称存在,所以在上传航线文件时,需要先调用该接口,检查是否存在重复的航线文件名称,如果存在重复的航线文件名称,则会弹窗提示用户重命名航线文件名称。
    com.zdjjrj.wayline.controller.WaylineFileController#getDuplicatedWaylineName

     @Override
    public HttpResultResponse<List<String>> getDuplicatedWaylineName(String workspaceId, @NotNull @Size(min = 1) List<String> names, HttpServletRequest req, HttpServletResponse rsp) {
        List<String> existNamesList = waylineFileService.getDuplicateNames(workspaceId, names);
    
        return HttpResultResponse.success(existNamesList);
    }
    

    com.zdjjrj.wayline.service.impl.WaylineFileServiceImpl#getDuplicateNames

    @Override
    public List<String> getDuplicateNames(String workspaceId, List<String> names) {
        return mapper.selectList(new LambdaQueryWrapper<WaylineFileEntity>()
                .eq(WaylineFileEntity::getWorkspaceId, workspaceId)
                .in(WaylineFileEntity::getName, names))
                .stream()
                .map(WaylineFileEntity::getName)
                .collect(Collectors.toList());
    }
    
    
  4. 航线文件上传结果上报
    航线文件上传到对象存储服务以后,DJI Pilot 2会把上传结果上报给服务端,服务端对该结果进行相应的业务操作。
    com.zdjjrj.wayline.controller.WaylineFileController#fileUploadResultReport

    @Override
    public HttpResultResponse fileUploadResultReport(String workspaceId, @Valid WaylineUploadCallbackRequest request, HttpServletRequest req, HttpServletResponse rsp) {
        CustomClaim customClaim = (CustomClaim)req.getAttribute(TOKEN_CLAIM);
    
        WaylineUploadCallbackMetadata metadata = request.getMetadata();
    
        WaylineFileDTO file = WaylineFileDTO.builder()
                .username(customClaim.getUsername())
                .objectKey(request.getObjectKey())
                .name(request.getName())
                .templateTypes(metadata.getTemplateTypes().stream().map(WaylineTypeEnum::getValue).collect(Collectors.toList()))
                .payloadModelKeys(metadata.getPayloadModelKeys().stream().map(DeviceEnum::getDevice).collect(Collectors.toList()))
                .droneModelKey(metadata.getDroneModelKey().getDevice())
                .build();
    
        int id = waylineFileService.saveWaylineFile(workspaceId, file);
    
        return id <= 0 ? HttpResultResponse.error() : HttpResultResponse.success();
    }
    
  5. 批量收藏航线文件

    当用户需要特别关注某几个航线文件时,可以点击收藏,同时,通过该接口可以标记需要收藏的航线文件与该用户的绑定关系。
    com.zdjjrj.wayline.controller.WaylineFileController#batchFavoritesWayline

    @Override
    public HttpResultResponse batchFavoritesWayline(String workspaceId, @NotNull @Size(min = 1) List<String> ids, HttpServletRequest req, HttpServletResponse rsp) {
        boolean isMark = waylineFileService.markFavorite(workspaceId, ids, true);
    
        return isMark ? HttpResultResponse.success() : HttpResultResponse.error();
    }
    
    
  6. 批量取消收藏航线文件
    同上功能,取消航线文件与用户的收藏绑定关系。
    com.zdjjrj.wayline.controller.WaylineFileController#batchUnfavoritesWayline

     @Override
    public HttpResultResponse batchUnfavoritesWayline(String workspaceId, @NotNull @Size(min = 1) List<String> ids, HttpServletRequest req, HttpServletResponse rsp) {
        boolean isMark = waylineFileService.markFavorite(workspaceId, ids, false);
    
        return isMark ? HttpResultResponse.success() : HttpResultResponse.error();
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值