| | |
| | | package com.ard.work.service.impl; |
| | | |
| | | import com.ard.common.utils.ByteUtils; |
| | | import com.ard.work.aspect.annotation.CheckTakeoffAltitude; |
| | | import com.ard.work.aspect.annotation.CheckControlRight; |
| | | import com.ard.work.aspect.annotation.CheckTakeoffAltitude; |
| | | import com.ard.work.component.forest.TyClient; |
| | | import com.ard.work.component.netty.TcpClientUtil; |
| | | import com.ard.work.component.netty.command.BaseCmd; |
| | | import com.ard.work.component.netty.command.camera.*; |
| | | import com.ard.work.component.netty.command.manual.*; |
| | | import com.ard.work.component.netty.command.register.*; |
| | | import com.ard.work.component.netty.command.settings.*; |
| | | import com.ard.work.component.netty.command.speaker.*; |
| | | import com.ard.work.component.netty.command.wayline.*; |
| | | import com.ard.work.domain.dto.camera.*; |
| | | import com.ard.work.domain.dto.manual.*; |
| | | import com.ard.work.domain.dto.speaker.*; |
| | | import com.ard.work.domain.dto.wayline.*; |
| | | import com.ard.work.domain.entity.ArdDroneInfo; |
| | | import com.ard.work.domain.entity.ArdServerInfo; |
| | | import com.ard.work.domain.receiver.*; |
| | | import com.ard.work.component.forest.TyClient; |
| | | import com.ard.work.domain.cache.UavSignalInfoCache; |
| | | import com.ard.work.domain.cache.UavStateCache; |
| | | import com.ard.work.domain.cache.UavTelemetryDataCache; |
| | | import com.ard.work.domain.dto.BoxHistoryDTO; |
| | | import com.ard.work.domain.dto.BoxPhotosDTO; |
| | | import com.ard.work.domain.dto.BoxSettingsDTO; |
| | | import com.ard.work.domain.dto.control.AbsAngleControlDTO; |
| | | import com.ard.work.domain.dto.control.AngleControlDTO; |
| | | import com.ard.work.domain.dto.control.SpeedControlDTO; |
| | | import com.ard.work.domain.dto.converter.wayline.PlanLineDataConverter; |
| | | import com.ard.work.domain.dto.settings.ReturnHeightSettingDTO; |
| | | import com.ard.work.domain.dto.settings.ReturnPointSettingDTO; |
| | | import com.ard.work.domain.dto.settings.VideoStreamSettingDTO; |
| | | import com.ard.work.domain.dto.signal.SignalInfo; |
| | | import com.ard.work.domain.dto.state.UavState; |
| | | import com.ard.work.domain.dto.telemetry.TelemetryData; |
| | | import com.ard.work.component.netty.command.control.AbsAngleControlCmd; |
| | | import com.ard.work.component.netty.command.control.AngleControlCmd; |
| | | import com.ard.work.component.netty.command.control.SpeedControlCmd; |
| | | import com.ard.work.component.netty.command.manual.*; |
| | | import com.ard.work.component.netty.command.notice.BoxPowerStatusReplyCmd; |
| | | import com.ard.work.component.netty.command.notice.FlyWayEndReplyCmd; |
| | | import com.ard.work.component.netty.command.notice.UavReadyReplyCmd; |
| | | import com.ard.work.component.netty.command.real.SignalInfoCmd; |
| | | import com.ard.work.component.netty.command.real.UavStateCmd; |
| | | import com.ard.work.component.netty.command.real.UavTelemetryDataCmd; |
| | | import com.ard.work.component.netty.command.register.*; |
| | | import com.ard.work.component.netty.command.settings.*; |
| | | import com.ard.work.component.netty.command.speaker.*; |
| | | import com.ard.work.component.netty.command.wayline.*; |
| | | import com.ard.work.component.netty.handler.ErrorCodeEnum; |
| | | import com.ard.work.component.netty.protobuf.TelemetryDataPB; |
| | | import com.ard.work.component.websocket.utils.WebSocketUtil; |
| | | import com.ard.work.domain.cache.UavSignalInfoCache; |
| | | import com.ard.work.domain.cache.UavStateCache; |
| | | import com.ard.work.domain.cache.UavTelemetryDataCache; |
| | | import com.ard.work.domain.dto.BoxHistoryDTO; |
| | | import com.ard.work.domain.dto.BoxPhotosDTO; |
| | | import com.ard.work.domain.dto.BoxSettingsDTO; |
| | | import com.ard.work.domain.dto.camera.*; |
| | | import com.ard.work.domain.dto.control.AbsAngleControlDTO; |
| | | import com.ard.work.domain.dto.control.AngleControlDTO; |
| | | import com.ard.work.domain.dto.control.SpeedControlDTO; |
| | | import com.ard.work.domain.dto.converter.wayline.PlanLineDataConverter; |
| | | import com.ard.work.domain.dto.manual.*; |
| | | import com.ard.work.domain.dto.settings.ReturnHeightSettingDTO; |
| | | import com.ard.work.domain.dto.settings.ReturnPointSettingDTO; |
| | | import com.ard.work.domain.dto.settings.VideoStreamSettingDTO; |
| | | import com.ard.work.domain.dto.signal.SignalInfo; |
| | | import com.ard.work.domain.dto.speaker.*; |
| | | import com.ard.work.domain.dto.state.UavState; |
| | | import com.ard.work.domain.dto.telemetry.TelemetryData; |
| | | import com.ard.work.domain.dto.wayline.*; |
| | | import com.ard.work.domain.entity.ArdDroneInfo; |
| | | import com.ard.work.domain.entity.ArdServerInfo; |
| | | import com.ard.work.domain.message.BaseMessage; |
| | | import com.ard.work.domain.message.ServerReplyMessage; |
| | | import com.ard.work.domain.message.UavControlType; |
| | | import com.ard.work.domain.receiver.*; |
| | | import com.ard.work.service.IArdDroneInfoService; |
| | | import com.ard.work.service.IArdServerInfoService; |
| | | import com.ard.work.service.ITyService; |
| | | import com.ard.work.domain.message.UavControlType; |
| | | import io.netty.channel.Channel; |
| | | import io.netty.channel.ChannelFuture; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.net.InetSocketAddress; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | import java.util.stream.Stream; |
| | | |
| | | import static com.ard.work.component.netty.TyTcpClientManager.channels; |
| | | |
| | | /** |
| | | * TyServiceImpl |
| | |
| | | private TyClient tyClient; |
| | | |
| | | /** |
| | | * 获取六合token信息 |
| | | * 获取边缘服务器token信息 |
| | | * |
| | | * @return AccessTokenReceiver |
| | | */ |
| | |
| | | } |
| | | |
| | | /** |
| | | * 获取云盒列表 |
| | | * 获取全部云盒列表 |
| | | * |
| | | * @return List<BoxInfoReceiver> |
| | | */ |
| | | @Override |
| | | public List<BoxInfoReceiver> getBoxList() { |
| | | List<ArdServerInfo> ardServerInfos = ardServerService.selectArdServerInfoList(new ArdServerInfo()); |
| | | List<ArdServerInfo> ardServerInfos = ardServerService.getServerLsNoPermission(new ArdServerInfo()); |
| | | return getBoxList(ardServerInfos); |
| | | } |
| | | |
| | | /** |
| | | * 获取指定服务器云盒列表 |
| | | * |
| | | * @return List<BoxInfoReceiver> |
| | | */ |
| | | @Override |
| | | public List<BoxInfoReceiver> getBoxList(String serverId) { |
| | | TyHttpCommonReceiver<List<BoxInfoReceiver>> boxList = tyClient.getBoxList(serverId); |
| | | return boxList == null ? null : boxList.getContent(); |
| | | } |
| | | |
| | | /** |
| | |
| | | @Override |
| | | public BoxStreamUrlReceiver getBoxLiveUrl(String boxSn) { |
| | | ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(boxSn); |
| | | TyHttpCommonReceiver<BoxStreamUrlReceiver> boxLiveUrl = tyClient.getBoxLiveUrl(ardDroneInfo.getServerId(),boxSn); |
| | | return boxLiveUrl.getContent(); |
| | | if (ardDroneInfo == null) { |
| | | log.warn("未找到对应的飞行器信息,boxSn:{}", boxSn); |
| | | return null; |
| | | } |
| | | TyHttpCommonReceiver<BoxStreamUrlReceiver> boxLiveUrl = tyClient.getBoxLiveUrl(ardDroneInfo.getServerId(), |
| | | boxSn); |
| | | return boxLiveUrl == null ? null : boxLiveUrl.getContent(); |
| | | } |
| | | |
| | | /** |
| | |
| | | ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(boxHistoryDTO.getBoxSn()); |
| | | TyHttpCommonReceiver<List<BoxHistoryReceiver>> boxHistory = tyClient.getBoxHistory(ardDroneInfo.getServerId(), |
| | | boxHistoryDTO); |
| | | return boxHistory.getContent(); |
| | | return boxHistory == null ? null : boxHistory.getContent(); |
| | | } |
| | | |
| | | /** |
| | |
| | | @Override |
| | | public List<BoxPhotosReceiver> getBoxPhotos(BoxPhotosDTO boxPhotosDTO) { |
| | | ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(boxPhotosDTO.getBoxSn()); |
| | | TyHttpCommonReceiver<List<BoxPhotosReceiver>> boxPhotos = tyClient.getBoxPhotos(ardDroneInfo.getServerId(),boxPhotosDTO); |
| | | return boxPhotos.getContent(); |
| | | TyHttpCommonReceiver<List<BoxPhotosReceiver>> boxPhotos = tyClient.getBoxPhotos(ardDroneInfo.getServerId(), |
| | | boxPhotosDTO); |
| | | return boxPhotos == null ? null : boxPhotos.getContent(); |
| | | } |
| | | |
| | | /** |
| | |
| | | @Override |
| | | public Boolean updateBoxSettings(BoxSettingsDTO boxSettingsDTO) { |
| | | ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(boxSettingsDTO.getBoxSn()); |
| | | TyHttpCommonReceiver<?> result = tyClient.updateBoxSettings(ardDroneInfo.getServerId(),boxSettingsDTO); |
| | | TyHttpCommonReceiver<?> result = tyClient.updateBoxSettings(ardDroneInfo.getServerId(), boxSettingsDTO); |
| | | return result.getState() == 1; |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | /** |
| | | * 注册六合平台 |
| | | * 注册边缘服务器平台 |
| | | */ |
| | | @Override |
| | | public Boolean registerMessage(String serverId) { |
| | |
| | | RegisterCmd registerMessage = new RegisterCmd(tyToken.getCompanyId(), tyToken.getAccessToken().getBytes()); |
| | | this.sendMessage(serverId, registerMessage); |
| | | } catch (Exception e) { |
| | | log.error("注册六合平台失败:{}", e.getMessage()); |
| | | log.error("注册边缘服务器平台失败:{}", e.getMessage()); |
| | | } |
| | | return true; |
| | | } |
| | |
| | | */ |
| | | @Override |
| | | public UavState getUavState(String boxSn) { |
| | | return UavStateCache.getUavState(boxSn); |
| | | return UavStateCache.get(boxSn); |
| | | } |
| | | |
| | | /** |
| | |
| | | */ |
| | | @Override |
| | | public TelemetryData getUavTelemetryData(String boxSn) { |
| | | return UavTelemetryDataCache.getUavTelemetryData(boxSn); |
| | | return UavTelemetryDataCache.get(boxSn); |
| | | } |
| | | |
| | | /** |
| | |
| | | */ |
| | | @Override |
| | | public SignalInfo getSignalInfo(String boxSn) { |
| | | return UavSignalInfoCache.getUavSignalInfo(boxSn); |
| | | return UavSignalInfoCache.get(boxSn); |
| | | } |
| | | |
| | | /** |
| | |
| | | } |
| | | |
| | | /** |
| | | * 处理六合服务器返回的消息 |
| | | * 处理边缘服务器返回的消息 |
| | | */ |
| | | @Override |
| | | public void processReplyMessage(String key, BaseCmd tyCommand) { |
| | |
| | | break; |
| | | case 0x02: |
| | | // 处理注册消息 |
| | | HeartbeatReplyCmd heartbeatReplyCmd = (HeartbeatReplyCmd) tyCommand; |
| | | logPrint("心跳消息", heartbeatReplyCmd.getTimestamp()); |
| | | HeartbeatReplyCmd heartbeatReplyCmd = (HeartbeatReplyCmd) tyCommand; |
| | | logPrint("心跳消息", heartbeatReplyCmd.getTimestamp()); |
| | | break; |
| | | case 0x03: |
| | | // 处理订阅消息 |
| | |
| | | case (byte) 0xA8: |
| | | // 处理无人机状态消息 |
| | | UavStateCmd uavStateCmd = (UavStateCmd) tyCommand; |
| | | UavStateCache.putUavState(uavStateCmd.getUavState()); |
| | | UavStateCache.put(uavStateCmd.getUavState()); |
| | | //logPrint("无人机状态", uavStateCmd.getUavState().getBoxSn()); |
| | | // WebSocketUtil.sendMessageAll(uavStateCmd.getUavState()); |
| | | break; |
| | | case (byte) 0xA9: |
| | | // 处理无人机遥测消息 |
| | | UavTelemetryDataCmd uavTelemetryDataCmd = (UavTelemetryDataCmd) tyCommand; |
| | | UavTelemetryDataCache.putUavTelemetryData(uavTelemetryDataCmd.getTelemetryData()); |
| | | UavTelemetryDataCache.put(uavTelemetryDataCmd.getTelemetryData()); |
| | | //logPrint("无人机遥测", uavTelemetryDataCmd.getTelemetryData().getBoxSn()); |
| | | //WebSocketUtil.sendMessageAll(uavTelemetryDataCmd.getTelemetryData()); |
| | | break; |
| | |
| | | case (byte) 0x0C: |
| | | // 处理无人机信道质量数据 |
| | | SignalInfoCmd signalInfoCmd = (SignalInfoCmd) tyCommand; |
| | | UavSignalInfoCache.putUavSignalInfoCache(signalInfoCmd.getSignalInfo()); |
| | | UavSignalInfoCache.put(signalInfoCmd.getSignalInfo()); |
| | | //logPrint("无人机信道质量", signalInfoCmd.getSignalInfo().getBoxSn()); |
| | | break; |
| | | case (byte) 0xD1: |
| | |
| | | } |
| | | |
| | | /** |
| | | * 根据[服务器id]获取六合盒子列表 |
| | | * 根据[服务器id]获取边缘服务器盒子列表 |
| | | */ |
| | | @Override |
| | | public List<BoxInfoReceiver> getBoxSnToList(String id) { |
| | |
| | | |
| | | private List<BoxInfoReceiver> getBoxList(List<ArdServerInfo> ls) { |
| | | return ls.stream() |
| | | .filter(ardServerInfo -> ardServerInfo.getServerStatus().equals("1")) |
| | | .flatMap(ardServerInfo -> { |
| | | try { |
| | | List<BoxInfoReceiver> boxes = tyClient.getBoxList(ardServerInfo.getId()).getContent(); |
| | |
| | | |
| | | //公共日志打印 |
| | | private void logPrint(String message, Object obj) { |
| | | log.debug("收到{}回复{}", message, obj); |
| | | String text = String.format("收到%s回复 %s", message, obj); |
| | | ServerReplyMessage serverReplyMessage = ServerReplyMessage.builder().message(text).build(); |
| | | WebSocketUtil.sendMessage("reply", serverReplyMessage); |
| | | log.debug(text); |
| | | } |
| | | |
| | | //公共日志打印 |
| | | private void logPrint(String message, byte result, Integer errorCode) { |
| | | log.info("收到{}回复:{} 错误码:{}【{}】", |
| | | String text = String.format( |
| | | "收到%s回复 状态码:%d【%s】", |
| | | message, |
| | | ByteUtils.byteToHex(result), |
| | | //ByteUtils.byteToHex(result), |
| | | errorCode, |
| | | ErrorCodeEnum.getDescByCode(errorCode)); |
| | | ErrorCodeEnum.getDescByCode(errorCode) |
| | | ); |
| | | ServerReplyMessage serverReplyMessage = ServerReplyMessage.builder().message(text).build(); |
| | | WebSocketUtil.sendMessage("reply", serverReplyMessage); |
| | | log.debug(text); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 发送消息 |
| | | * 发送tcp消息 |
| | | */ |
| | | private void sendMessage(String key, BaseCmd msg) { |
| | | try { |
| | | ChannelFuture future = channels.get(key).getChannelFuture(); |
| | | Channel channel = future.channel(); |
| | | if (channel.isActive()) { |
| | | InetSocketAddress ipSocket = (InetSocketAddress) channel.remoteAddress(); |
| | | String host = ipSocket.getHostString(); |
| | | int port = ipSocket.getPort(); |
| | | channel.writeAndFlush(msg); // 发送编码后的数据 |
| | | log.debug("向六合服务器【{}:{}】发送数据,命令码:{}", host, port, String.format("0x%02X", msg.getCmdCode() & 0xFF)); |
| | | } else { |
| | | log.error("与六合服务器链接断开,无法发送数据!"); |
| | | } |
| | | } catch (Exception e) { |
| | | log.error("发送消息异常:{}", e.getMessage()); |
| | | } |
| | | TcpClientUtil.sendMessage(key, msg); |
| | | } |
| | | |
| | | } |