| | |
| | | import com.dji.sample.manage.model.param.DeviceQueryParam; |
| | | import com.dji.sample.manage.model.receiver.*; |
| | | import com.dji.sample.manage.service.*; |
| | | import com.dji.sample.wayline.model.entity.WaylineJobEntity; |
| | | import com.dji.sample.wayline.model.param.WaylineJobQueryParam; |
| | | import com.dji.sample.wayline.service.IWaylineJobService; |
| | | import com.fasterxml.jackson.core.type.TypeReference; |
| | | import com.fasterxml.jackson.databind.JsonNode; |
| | | import com.fasterxml.jackson.databind.ObjectMapper; |
| | |
| | | |
| | | @Autowired |
| | | private IDeviceRedisService deviceRedisService; |
| | | |
| | | @Autowired |
| | | private IWaylineJobService waylineJobService; |
| | | |
| | | @Autowired |
| | | @Qualifier("gatewayOSDServiceImpl") |
| | |
| | | .eq(StringUtils.hasText(param.getWorkspaceId()), |
| | | DeviceEntity::getWorkspaceId, param.getWorkspaceId()) |
| | | .eq(param.getBoundStatus() != null, DeviceEntity::getBoundStatus, param.getBoundStatus()) |
| | | .eq(param.getReserveId() != null, DeviceEntity::getReserveId, param.getReserveId()) |
| | | .orderBy(param.isOrderBy(), |
| | | param.isAsc(), DeviceEntity::getId)) |
| | | .stream() |
| | |
| | | } |
| | | |
| | | @Override |
| | | public List<DeviceDTO> getDevicesTopoForWeb(String workspaceId) { |
| | | public List<DeviceDTO> getDevicesTopoForWeb(String workspaceId, String reserveId) { |
| | | List<DeviceDTO> devicesList = this.getDevicesByParams( |
| | | DeviceQueryParam.builder() |
| | | .workspaceId(workspaceId) |
| | | .reserveId(reserveId) |
| | | .domains(List.of(DeviceDomainEnum.GATEWAY.getVal(), DeviceDomainEnum.DOCK.getVal())) |
| | | .build()); |
| | | |
| | |
| | | .filter(gateway -> DeviceDomainEnum.DOCK.getVal() == gateway.getDomain() || |
| | | deviceRedisService.checkDeviceOnline(gateway.getDeviceSn())) |
| | | .forEach(this::spliceDeviceTopo); |
| | | |
| | | devicesList.forEach(deviceDTO -> { |
| | | WaylineJobQueryParam waylineJobQueryParam = new WaylineJobQueryParam(); |
| | | waylineJobQueryParam.setDockSn(deviceDTO.getDeviceSn()); |
| | | WaylineJobEntity latestJob = waylineJobService.getLatestJob(workspaceId, waylineJobQueryParam); |
| | | deviceDTO.setLatestWaylineJob(latestJob); |
| | | deviceDTO.setOnlineStatus(true); |
| | | OsdDockReceiver osdDockReceiver = (OsdDockReceiver) RedisOpsUtils.get("osd:" + deviceDTO.getDeviceSn()); |
| | | deviceDTO.setLatitude(osdDockReceiver!=null? osdDockReceiver.getLatitude():null); |
| | | deviceDTO.setLongitude(osdDockReceiver!=null? osdDockReceiver.getLongitude():null); |
| | | }); |
| | | |
| | | return devicesList; |
| | | } |
| | |
| | | if (deviceOpt.isEmpty()) { |
| | | deviceOpt = this.getDeviceBySn(from); |
| | | if (deviceOpt.isEmpty()) { |
| | | log.error("Please restart the drone."); |
| | | log.error("请重新启动无人机."); |
| | | return; |
| | | } |
| | | |
| | |
| | | |
| | | Optional<DeviceDTO> deviceOpt = deviceRedisService.getDeviceOnline(deviceOtaFirmwares.get(0).getSn()); |
| | | if (deviceOpt.isEmpty()) { |
| | | throw new RuntimeException("Device is offline."); |
| | | throw new RuntimeException("设备离线"); |
| | | } |
| | | DeviceDTO device = deviceOpt.get(); |
| | | String gatewaySn = DeviceDomainEnum.DOCK.getVal() == device.getDomain() ? device.getDeviceSn() : device.getParentSn(); |
| | |
| | | ServiceReply serviceReply = messageSender.publishServicesTopic( |
| | | gatewaySn, FirmwareMethodEnum.OTA_CREATE.getMethod(), Map.of(MapKeyConst.DEVICES, deviceOtaFirmwares), bid); |
| | | if (serviceReply.getResult() != ResponseResult.CODE_SUCCESS) { |
| | | return ResponseResult.error(serviceReply.getResult(), "Firmware Error Code: " + serviceReply.getResult()); |
| | | return ResponseResult.error(serviceReply.getResult(), "硬件错误码 " + serviceReply.getResult()); |
| | | } |
| | | |
| | | // Record the device state that needs to be updated. |
| | |
| | | private void checkOtaConditions(String dockSn) { |
| | | Optional<OsdDockReceiver> deviceOpt = deviceRedisService.getDeviceOsd(dockSn, OsdDockReceiver.class); |
| | | if (deviceOpt.isEmpty()) { |
| | | throw new RuntimeException("Dock is offline."); |
| | | throw new RuntimeException("机场离线"); |
| | | } |
| | | boolean emergencyStopState = deviceOpt.get().getEmergencyStopState(); |
| | | if (emergencyStopState) { |
| | | throw new RuntimeException("The emergency stop button of the dock is pressed and can't be upgraded."); |
| | | // throw new RuntimeException("The emergency stop button of the dock is pressed and can't be upgraded."); |
| | | throw new RuntimeException("机场急停按钮被按下,无法升级"); |
| | | } |
| | | |
| | | DockModeCodeEnum dockMode = this.getDockMode(dockSn); |
| | | if (DockModeCodeEnum.IDLE != dockMode) { |
| | | throw new RuntimeException("The current status of the dock can't be upgraded."); |
| | | throw new RuntimeException("当前机场状态无法升级"); |
| | | } |
| | | } |
| | | |
| | |
| | | public void devicePropertySet(String workspaceId, String dockSn, DeviceSetPropertyEnum propertyEnum, JsonNode param) { |
| | | Optional<DeviceDTO> dockOpt = deviceRedisService.getDeviceOnline(dockSn); |
| | | if (dockOpt.isEmpty()) { |
| | | throw new RuntimeException("Dock is offline."); |
| | | throw new RuntimeException("机场离线"); |
| | | } |
| | | String childSn = dockOpt.get().getChildDeviceSn(); |
| | | boolean deviceOnline = deviceRedisService.checkDeviceOnline(childSn); |
| | | Optional<OsdSubDeviceReceiver> osdOpt = deviceRedisService.getDeviceOsd(childSn, OsdSubDeviceReceiver.class); |
| | | if (!deviceOnline || osdOpt.isEmpty()) { |
| | | throw new RuntimeException("Device is offline."); |
| | | throw new RuntimeException("设备离线"); |
| | | } |
| | | |
| | | // Make sure the data is valid. |
| | |
| | | } |
| | | |
| | | @Override |
| | | public int devicePropertySet(String workspaceId, String dockSn, JsonNode value) { |
| | | |
| | | Optional<DeviceDTO> dockOpt = deviceRedisService.getDeviceOnline(dockSn); |
| | | if (dockOpt.isEmpty()) { |
| | | throw new RuntimeException("机场离线"); |
| | | } |
| | | String childSn = dockOpt.get().getChildDeviceSn(); |
| | | boolean deviceOnline = deviceRedisService.checkDeviceOnline(childSn); |
| | | Optional<OsdSubDeviceReceiver> osdOpt = deviceRedisService.getDeviceOsd(childSn, OsdSubDeviceReceiver.class); |
| | | if (!deviceOnline || osdOpt.isEmpty()) { |
| | | throw new RuntimeException("设备离线"); |
| | | } |
| | | |
| | | |
| | | String topic = THING_MODEL_PRE + PRODUCT + dockSn + PROPERTY_SUF + SET_SUF; |
| | | |
| | | Map reply = messageSender.publishWithReply( |
| | | Map.class, topic, |
| | | CommonTopicResponse.builder() |
| | | .bid(UUID.randomUUID().toString()) |
| | | .tid(UUID.randomUUID().toString()) |
| | | .timestamp(System.currentTimeMillis()) |
| | | .data(value) |
| | | .build()); |
| | | |
| | | |
| | | SetReply setReply = objectMapper.convertValue(reply, SetReply.class); |
| | | if (SetReplyStatusResultEnum.SUCCESS.getVal() != setReply.getResult()) { |
| | | throw new RuntimeException("设置失败" + reply + "; 错误码: " + setReply.getResult()); |
| | | } |
| | | |
| | | return ResponseResult.success().getCode(); |
| | | } |
| | | |
| | | @Override |
| | | public void deviceOnePropertySet(String topic, DeviceSetPropertyEnum propertyEnum, Map.Entry<String, Object> value) { |
| | | if (Objects.isNull(value) || Objects.isNull(value.getValue())) { |
| | | throw new IllegalArgumentException(CommonErrorEnum.ILLEGAL_ARGUMENT.getErrorMsg()); |
| | |
| | | |
| | | SetReply setReply = objectMapper.convertValue(reply, SetReply.class); |
| | | if (SetReplyStatusResultEnum.SUCCESS.getVal() != setReply.getResult()) { |
| | | throw new RuntimeException("Failed to set " + value.getKey() + "; Error Code: " + setReply.getResult()); |
| | | throw new RuntimeException("设置失败" + value.getKey() + "; 错误码: " + setReply.getResult()); |
| | | } |
| | | |
| | | } |
| | |
| | | } |
| | | |
| | | /** |
| | | * Handles messages in the state topic about basic drone data. |
| | | * |
| | | * Note: Only the data of the drone payload is handled here. You can handle other data from the drone |
| | | * according to your business needs. |
| | | * @param deviceBasic basic drone data |
| | | * 处理关于基本无人机数据的状态主题的消息。 |
| | | * 注:这里只处理无人机有效载荷的数据。你可以处理无人机的其他数据 |
| | | * *根据您的业务需要。 |
| | | * @param deviceBasic 无人机基本数据 |
| | | */ |
| | | @ServiceActivator(inputChannel = ChannelName.INBOUND_STATE_BASIC, outputChannel = ChannelName.INBOUND_STATE_PAYLOAD) |
| | | public List<DevicePayloadReceiver> stateBasic(DeviceBasicReceiver deviceBasic) { |
| | | log.info("无人机数据的状态主题的消息--DeviceBasicReceiver:{}",deviceBasic); |
| | | Optional<DeviceDTO> deviceOpt = deviceRedisService.getDeviceOnline(deviceBasic.getDeviceSn()); |
| | | if (deviceOpt.isEmpty()) { |
| | | return deviceBasic.getPayloads(); |
| | |
| | | return deviceBasic.getPayloads(); |
| | | } |
| | | DeviceDTO dock = dockOpt.get(); |
| | | log.info("redis dockOpt:{}",dockOpt); |
| | | if (!deviceBasic.getControlSource().equals(dock.getControlSource())) { |
| | | dock.setControlSource(deviceBasic.getControlSource()); |
| | | deviceRedisService.setDeviceOnline(dock); |