大疆上云API源码解析(态势感知)

功能概述

服务端推送设备坐标信息到pilot端,pilot会把推送过来的信息显示在地图中。实现了同一工作空间下的所有设备之间的拓扑结构,实现设备间的态势信息分享。

执行步骤

  1. Pilot2成功上云后,通过接口GET: /manage/api/v1/workspaces/{workspace_id}/devices/topologies获取同一个工作空间下的所有设备列表和拓扑结构。
@GetMapping(PREFIX + "/workspaces/{workspace_id}/devices/topologies")
    HttpResultResponse<TopologyResponse> obtainDeviceTopologyList(
            @PathVariable(name = "workspace_id") String workspaceId,
            HttpServletRequest req, HttpServletResponse rsp);
// 对应实现
 @Override
    public HttpResultResponse<TopologyResponse> obtainDeviceTopologyList(String workspaceId, HttpServletRequest req, HttpServletResponse rsp) {
        List<TopologyList> topologyList = topologyService.getDeviceTopology(workspaceId);
        return HttpResultResponse.success(new TopologyResponse().setList(topologyList));
    }
 // 查询逻辑
 @Override
    public List<TopologyList> getDeviceTopology(String workspaceId) {
        // 查询同一工作空间下的网关设备
        List<DeviceDTO> gatewayList = deviceService.getDevicesByParams(
                DeviceQueryParam.builder()
                        .workspaceId(workspaceId)
                        .domains(List.of(DeviceDomainEnum.REMOTER_CONTROL.getDomain()))
                        .build());

        List<TopologyList> topologyList = new ArrayList<>();
        // 获取网关设备下的设备拓扑
        gatewayList.forEach(device -> this.getDeviceTopologyByGatewaySn(device.getDeviceSn())
                .ifPresent(topologyList::add));

        return topologyList;
    }

    public Optional<TopologyList> getDeviceTopologyByGatewaySn(String gatewaySn) {
        Optional<DeviceDTO> dtoOptional = deviceService.getDeviceBySn(gatewaySn);
        if (dtoOptional.isEmpty()) {
            return Optional.empty();
        }
        List<DeviceTopology> parents = new ArrayList<>();
        DeviceDTO device = dtoOptional.get();
        DeviceTopology gateway = deviceService.deviceConvertToTopologyDTO(device);
        parents.add(gateway);

        // 根据飞行器sn查询拓扑数据。
        Optional<TopologyDeviceDTO> deviceTopo = deviceService.getDeviceTopoForPilot(device.getChildDeviceSn());
        List<DeviceTopology> deviceTopoList = new ArrayList<>();
        deviceTopo.ifPresent(deviceTopoList::add);

        return Optional.ofNullable(new TopologyList().setParents(parents).setHosts(deviceTopoList));
    }

  1. 在设备上下线时,云端收到设备上下线消息,会通过websocket协议推送给同一工作空间下的所有设备,Pilot2 上处于同一工作空间下的设备会收到设备上下线消息。
  2. Pilot2内部会再次通过GET: /manage/api/v1/workspaces/{workspace_id}/devices/topologies请求后端获取设备列表拓扑。更新pilot2上的拓扑信息
  3. 设备收到上报的osd信息会通过websocket协议传给同一工作空间下的所有设备,pilot2收到消息后,会在地图上实时展示设备的位置信息,设备朝向等。osd处理后的消息根据设备类型不同,会交给不同的通道进行处理,通道可能如下:ChannelName.INBOUND_OSD_RC、ChannelName.INBOUND_OSD_DOCK、ChannelName.INBOUND_OSD_RC_DRONE、ChannelName.INBOUND_OSD_DOCK_DRONE。此处以ChannelName.INBOUND_OSD_RC为例,消息会交给osd封装的接口处理:AbstractDeviceService#osdRemoteControl
@ServiceActivator(inputChannel = ChannelName.INBOUND_OSD_RC)
public void osdRemoteControl(TopicOsdRequest<OsdRemoteControl> request, MessageHeaders headers) {
   throw new UnsupportedOperationException("osdRemoteControl not implemented");
}
// 实现
@Override
   public void osdRemoteControl(TopicOsdRequest<OsdRemoteControl> request, MessageHeaders headers) {
       String from = request.getFrom();
       // 查询redis中设备是否存在
       Optional<DeviceDTO> deviceOpt = deviceRedisService.getDeviceOnline(from);
       if (deviceOpt.isEmpty()) {
           // 数据库是否存在
           deviceOpt = deviceService.getDeviceBySn(from);
           if (deviceOpt.isEmpty()) {
               log.error("Please restart the drone.");
               return;
           }
       }
       DeviceDTO device = deviceOpt.get();
       if (StringUtils.hasText(device.getChildDeviceSn())) {
           deviceRedisService.getDeviceOnline(device.getChildDeviceSn()).ifPresent(device::setChildren);
       }
       // 设置设备上线
       deviceRedisService.setDeviceOnline(device);

       OsdRemoteControl data = request.getData();
       // 推送数据到pilot ws
       deviceService.pushOsdDataToPilot(device.getWorkspaceId(), from,
               new DeviceOsdHost()
                       .setLatitude(data.getLatitude())
                       .setLongitude(data.getLongitude())
                       .setHeight(data.getHeight()));
       // 推送数据到web ws
       deviceService.pushOsdDataToWeb(device.getWorkspaceId(), BizCodeEnum.RC_OSD, from, data);

   }
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值