| | |
| | | import com.ard.tianyu.model.dto.BoxHistoryDTO; |
| | | import com.ard.tianyu.model.dto.BoxPhotosDTO; |
| | | import com.ard.tianyu.model.dto.BoxSettingsDTO; |
| | | import com.ard.tianyu.model.dto.camera.CapturePicDto; |
| | | import com.ard.tianyu.model.dto.camera.RecordDto; |
| | | import com.ard.tianyu.model.dto.control.AbsAngleControlDto; |
| | | import com.ard.tianyu.model.dto.control.AngleControlDto; |
| | | import com.ard.tianyu.model.dto.control.SpeedControlDto; |
| | | import com.ard.tianyu.model.dto.converter.UavSignalInfoConverter; |
| | | import com.ard.tianyu.model.dto.converter.UavStateConverter; |
| | | import com.ard.tianyu.model.dto.converter.UavTelemetryDataConverter; |
| | |
| | | import com.ard.tianyu.model.receiver.*; |
| | | import com.ard.tianyu.netty.command.*; |
| | | import com.ard.tianyu.netty.TyNettyTcpClient; |
| | | import com.ard.tianyu.netty.command.camera.*; |
| | | import com.ard.tianyu.netty.command.control.AbsAngleControlCommand; |
| | | import com.ard.tianyu.netty.command.control.AngleControlCommand; |
| | | import com.ard.tianyu.netty.command.control.SpeedControlCommand; |
| | | import com.ard.tianyu.netty.command.real.SignalInfoCommand; |
| | | import com.ard.tianyu.netty.command.real.UavStateCommand; |
| | | import com.ard.tianyu.netty.command.real.UavTelemetryDataCommand; |
| | | import com.ard.tianyu.netty.command.register.*; |
| | | import com.ard.tianyu.service.ITyService; |
| | | import io.netty.buffer.ByteBuf; |
| | | import io.netty.buffer.Unpooled; |
| | | import io.netty.channel.Channel; |
| | | import io.netty.channel.ChannelFuture; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.poi.hssf.record.Record; |
| | | import org.springframework.scheduling.annotation.Scheduled; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | |
| | | this.sendMessage(tyConfiguration.getIpPort(), registerMessage); |
| | | } |
| | | |
| | | /** |
| | | * 无人机控制订阅 |
| | | */ |
| | | public void uavControlSubscribe(String boxSn) { |
| | | SubscribeCommand subscribeCommand = new SubscribeCommand(boxSn); |
| | | this.sendMessage(tyConfiguration.getIpPort(), subscribeCommand); |
| | | } |
| | | |
| | | /** |
| | | * 发送消息 |
| | |
| | | InetSocketAddress ipSocket = (InetSocketAddress) channel.remoteAddress(); |
| | | String host = ipSocket.getHostString(); |
| | | int port = ipSocket.getPort(); |
| | | // 创建 ByteBuf 并编码消息 |
| | | ByteBuf buffer = Unpooled.buffer(); |
| | | msg.encode(buffer); // 确保对消息进行编码 |
| | | channel.writeAndFlush(buffer); // 发送编码后的数据 |
| | | channel.writeAndFlush(msg); // 发送编码后的数据 |
| | | log.debug("向天宇服务器【{}:{}】发送数据,命令码:{}", host, port, String.format("0x%02X", msg.getCmdCode() & 0xFF)); |
| | | } else { |
| | | log.error("与天宇服务器链接断开,无法发送数据!"); |
| | |
| | | * 云台控制基于角度 |
| | | */ |
| | | @Override |
| | | public void controlAngle(String boxSn, Integer actionId, Integer rotationAngle) { |
| | | ControlAngleCommand controlAngleCommand = new ControlAngleCommand(boxSn.getBytes(), (byte) 0x00, actionId.byteValue(), rotationAngle.byteValue()); |
| | | public void angleControl(AngleControlDto angleControlDto) { |
| | | AngleControlCommand controlAngleCommand = new AngleControlCommand(angleControlDto); |
| | | this.sendMessage(tyConfiguration.getIpPort(), controlAngleCommand); |
| | | } |
| | | |
| | | /** |
| | | * 云台绝对值控制(基于角度) |
| | | */ |
| | | @Override |
| | | public void absAngleControl(AbsAngleControlDto absAngleControlDto) { |
| | | AbsAngleControlCommand absAngleControlCommand = new AbsAngleControlCommand(absAngleControlDto); |
| | | this.sendMessage(tyConfiguration.getIpPort(), absAngleControlCommand); |
| | | } |
| | | |
| | | /** |
| | | * 云台转动(基于速度) |
| | | */ |
| | | @Override |
| | | public void speedControl(SpeedControlDto speedControlDto) { |
| | | SpeedControlCommand speedControlCommand = new SpeedControlCommand(speedControlDto); |
| | | this.sendMessage(tyConfiguration.getIpPort(), speedControlCommand); |
| | | } |
| | | |
| | | /** |
| | | * 拍照 |
| | | */ |
| | | @Override |
| | | public void capturePic(CapturePicDto capturePicDto) { |
| | | CapturePicCommand capturePicCommand = new CapturePicCommand(capturePicDto); |
| | | this.sendMessage(tyConfiguration.getIpPort(), capturePicCommand); |
| | | } |
| | | |
| | | /** |
| | | * 录像 |
| | | */ |
| | | @Override |
| | | public void record(RecordDto recordDto) { |
| | | BaseCommand baseCommand; |
| | | if (recordDto.getIsRecord()) { |
| | | baseCommand = new RecordStartCommand(recordDto); |
| | | } else { |
| | | baseCommand = new RecordStopCommand(recordDto); |
| | | } |
| | | this.sendMessage(tyConfiguration.getIpPort(), baseCommand); |
| | | } |
| | | |
| | | /** |
| | |
| | | break; |
| | | case 0x03: |
| | | // 处理订阅消息 |
| | | SubscribeCommand subscribeCommand = (SubscribeCommand) tyCommand; |
| | | log.info("收到订阅消息-->处理订阅消息{}", subscribeCommand.getBoxSn()); |
| | | break; |
| | | case 0x04: |
| | | // 处理取消订阅消息 |
| | | subscribeCommand = (SubscribeCommand) tyCommand; |
| | | log.info("收到取消订阅消息-->处理取消订阅消息{}", subscribeCommand.getBoxSn()); |
| | | break; |
| | | case (byte) 0xA8: |
| | | // 处理无人机状态消息 |
| | |
| | | break; |
| | | case (byte) 0xD1: |
| | | // 处理无人机 |
| | | DroneReadyNotificationCommand droneReadyNotificationCommand = (DroneReadyNotificationCommand) tyCommand; |
| | | if (droneReadyNotificationCommand.getActionCode() == (byte) 0x42) { |
| | | UavInitInfoCommand uavInitCommand = new UavInitInfoCommand((byte) 0x00, (byte) 0x42, (byte) 0x01); |
| | | this.sendMessage(tyConfiguration.getIpPort(), uavInitCommand); |
| | | log.info("收到无人机初始化详情-回复防止再次发送"); |
| | | if (tyCommand instanceof UavReadyNotificationCommand) { |
| | | UavReadyNotificationCommand droneReadyNotificationCommand = (UavReadyNotificationCommand) tyCommand; |
| | | if (droneReadyNotificationCommand.getActionCode() == (byte) 0x42) { |
| | | UavInitInfoCommand uavInitCommand = new UavInitInfoCommand(droneReadyNotificationCommand.getBoxSn()); |
| | | this.sendMessage(tyConfiguration.getIpPort(), uavInitCommand); |
| | | log.info("收到无人机初始化详情-回复防止再次发送"); |
| | | } |
| | | } |
| | | if (tyCommand instanceof CapturePicReplyCommand) { |
| | | CapturePicReplyCommand capturePicReplyCommand = (CapturePicReplyCommand) tyCommand; |
| | | if (capturePicReplyCommand.getActionCode() == (byte) 0x23) { |
| | | log.info("收到无人机拍照回复:{} 错误码:{}", String.format("0x%02X", capturePicReplyCommand.getResult() & 0xFF), capturePicReplyCommand.getErrorCode()); |
| | | } |
| | | } |
| | | |
| | | if (tyCommand instanceof RecordStartReplyCommand) { |
| | | RecordStartReplyCommand recordStartReplyCommand = (RecordStartReplyCommand) tyCommand; |
| | | if (recordStartReplyCommand.getActionCode() == (byte) 0x24) { |
| | | log.info("收到无人机开始录像回复:{} 错误码:{}", String.format("0x%02X", recordStartReplyCommand.getResult() & 0xFF), recordStartReplyCommand.getErrorCode()); |
| | | } |
| | | } |
| | | if (tyCommand instanceof RecordStopReplyCommand) { |
| | | RecordStopReplyCommand recordStopReplyCommand = (RecordStopReplyCommand) tyCommand; |
| | | if (recordStopReplyCommand.getActionCode() == (byte) 0x25) { |
| | | log.info("收到无人机停止录像回复:{} 错误码:{}", String.format("0x%02X", recordStopReplyCommand.getResult() & 0xFF), recordStopReplyCommand.getErrorCode()); |
| | | } |
| | | } |
| | | break; |
| | | default: |