ard-work/src/main/java/com/ard/tianyu/controller/UavController.java
@@ -4,11 +4,11 @@ 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.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.signal.SignalInfo; import com.ard.tianyu.model.dto.state.UavState; import com.ard.tianyu.model.dto.telemetry.TelemetryData; @@ -24,8 +24,6 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import java.util.List; /** @@ -86,7 +84,7 @@ @ApiOperation(value = "云台转动(基于角度)", notes = "actionCode值:0-回中,1-上,2-右上,3-右,4-右下,5-下,6-左下,7-左,8-左上,254-停止") @ApiOperationSupport(order = 1) @PostMapping("/angleControl") public AjaxResult angleControl(@RequestBody AngleControlDto angleControlDto) { public AjaxResult angleControl(@RequestBody AngleControlDTO angleControlDto) { tyService.angleControl(angleControlDto); return AjaxResult.success(); } @@ -94,7 +92,7 @@ @ApiOperation(value = "云台绝对值控制(基于角度)", notes = "俯仰pitch范围:[-120°至+30°] 平移yaw范围:[-180°至+180°] 横滚roll范围:[-90°至+60°]") @ApiOperationSupport(order = 2) @PostMapping("/absAngleControl") public AjaxResult absAngleControl(@RequestBody @Validated AbsAngleControlDto angleControlDto) { public AjaxResult absAngleControl(@RequestBody @Validated AbsAngleControlDTO angleControlDto) { tyService.absAngleControl(angleControlDto); return AjaxResult.success(); } @@ -102,7 +100,7 @@ @ApiOperation(value = "云台转动(基于速度)", notes = "俯仰转动速度:上正下负 平移转动速度:右正左负 横滚转动速度:顺时针正,逆时针负") @ApiOperationSupport(order = 3) @PostMapping("/speedControl") public AjaxResult speedControl(@RequestBody @Validated SpeedControlDto speedControlDto) { public AjaxResult speedControl(@RequestBody @Validated SpeedControlDTO speedControlDto) { tyService.speedControl(speedControlDto); return AjaxResult.success(); } @@ -110,7 +108,7 @@ @ApiOperation("拍照") @ApiOperationSupport(order = 4) @PostMapping("/capturePicDto") public AjaxResult capturePic(@RequestBody CapturePicDto capturePicDto) { public AjaxResult capturePic(@RequestBody CapturePicDTO capturePicDto) { tyService.capturePic(capturePicDto); return AjaxResult.success(); } @@ -118,7 +116,7 @@ @ApiOperation("录像") @ApiOperationSupport(order = 5) @PostMapping("/record") public AjaxResult record(@RequestBody RecordDto recordDto) { public AjaxResult record(@RequestBody RecordDTO recordDto) { tyService.record(recordDto); return AjaxResult.success(); } ard-work/src/main/java/com/ard/tianyu/model/dto/camera/CameraModeDTO.javacopy from ard-work/src/main/java/com/ard/tianyu/model/dto/camera/RecordDto.java copy to ard-work/src/main/java/com/ard/tianyu/model/dto/camera/CameraModeDTO.java
File was copied from ard-work/src/main/java/com/ard/tianyu/model/dto/camera/RecordDto.java @@ -7,7 +7,7 @@ import org.springframework.validation.annotation.Validated; /** * 录像实体对象 * 设置相机模式实体对象 * * @author liusuyi * @date 2024年10月25日13:32 @@ -17,7 +17,7 @@ @AllArgsConstructor @NoArgsConstructor @Validated public class RecordDto { public class CameraModeDTO { private String boxSn; private Boolean isRecord; private Byte actionParam; } ard-work/src/main/java/com/ard/tianyu/model/dto/camera/CapturePicDTO.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/model/dto/camera/CapturePicDto.java @@ -17,6 +17,6 @@ @AllArgsConstructor @NoArgsConstructor @Validated public class CapturePicDto { public class CapturePicDTO { private String boxSn; } ard-work/src/main/java/com/ard/tianyu/model/dto/camera/RecordDTO.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/model/dto/camera/RecordDto.java @@ -17,7 +17,7 @@ @AllArgsConstructor @NoArgsConstructor @Validated public class RecordDto { public class RecordDTO { private String boxSn; private Boolean isRecord; } ard-work/src/main/java/com/ard/tianyu/model/dto/control/AbsAngleControlDTO.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/model/dto/control/AbsAngleControlDto.java @@ -20,7 +20,7 @@ @AllArgsConstructor @NoArgsConstructor @Validated public class AbsAngleControlDto { public class AbsAngleControlDTO { private String boxSn; @Min(value = -120, message = "俯仰角 (pitch) 最小值为 -120°") ard-work/src/main/java/com/ard/tianyu/model/dto/control/AngleControlDTO.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/model/dto/control/AngleControlDto.java @@ -20,7 +20,7 @@ @AllArgsConstructor @NoArgsConstructor @Validated public class AngleControlDto { public class AngleControlDTO { private String boxSn; private Byte actionCode; @Min(value = 0, message = "转动角度 最小值为 0") ard-work/src/main/java/com/ard/tianyu/model/dto/control/SpeedControlDTO.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/model/dto/control/SpeedControlDto.java @@ -4,10 +4,6 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.validation.annotation.Validated; import javax.validation.constraints.Max; import javax.validation.constraints.Min; /** * AngleControlDto @@ -19,7 +15,7 @@ @Builder @AllArgsConstructor @NoArgsConstructor public class SpeedControlDto { public class SpeedControlDTO { private String boxSn; /** ard-work/src/main/java/com/ard/tianyu/netty/command/camera/CameraModeCommand.java
New file @@ -0,0 +1,38 @@ package com.ard.tianyu.netty.command.camera; import com.ard.tianyu.model.dto.camera.CameraModeDTO; import com.ard.tianyu.netty.command.BaseCommand; import io.netty.buffer.ByteBuf; import lombok.Data; /** * 设置相机模式指令 * * @author liusuyi * @date 2024年10月25日14:44 **/ @Data public class CameraModeCommand extends BaseCommand { private final byte encryptFlag = 0x00; // 加密标志 private final byte actionCode = 0x22; // 动作编号 private final byte actionParam; // 动作参数 public CameraModeCommand(CameraModeDTO cameraModeDTO) { setDataHeader((short) 0x7479); setDataLength((short) 19); setBoxSn(cameraModeDTO.getBoxSn().getBytes()); setCmdCode((byte) 0xD1); actionParam = cameraModeDTO.getActionParam(); } public void encode(ByteBuf out) { out.writeShort(getDataHeader()); // 写入数据头 out.writeShort(getDataLength()); // 写入数据长度 out.writeBytes(getBoxSn()); // 写入盒子SN out.writeByte(getCmdCode()); // 写入命令码 out.writeByte(encryptFlag); // 写入加密标志 out.writeByte(actionCode); // 写入动作编号 out.writeByte(actionParam); // 写入动作参数 } } ard-work/src/main/java/com/ard/tianyu/netty/command/camera/CameraModeReplyCommand.java
New file @@ -0,0 +1,33 @@ package com.ard.tianyu.netty.command.camera; import com.ard.tianyu.model.dto.camera.CameraModeDTO; import com.ard.tianyu.netty.command.BaseCommand; import io.netty.buffer.ByteBuf; import lombok.Data; /** * 设置相机模式回复指令 * * @author liusuyi * @date 2024年10月25日14:44 **/ @Data public class CameraModeReplyCommand extends BaseCommand { private final byte encryptFlag = 0x00; // 加密标志 private final byte actionCode = 0x22; // 动作编号 private final byte result; // 执行结果 private final Integer errorCode; // 错误码 public CameraModeReplyCommand(String boxSn,Byte result,Integer errorCode) { setDataHeader((short) 0x6A77); //setDataLength((short) 18); setCmdCode((byte) 0xD1); setBoxSn(boxSn.getBytes()); this.result = result; this.errorCode = errorCode; } public void encode(ByteBuf out) { } } ard-work/src/main/java/com/ard/tianyu/netty/command/camera/CapturePicCommand.java
@@ -1,6 +1,6 @@ package com.ard.tianyu.netty.command.camera; import com.ard.tianyu.model.dto.camera.CapturePicDto; import com.ard.tianyu.model.dto.camera.CapturePicDTO; import com.ard.tianyu.netty.command.BaseCommand; import io.netty.buffer.ByteBuf; import lombok.Data; @@ -17,7 +17,7 @@ private final byte actionCode=0x23; // 动作编号 public CapturePicCommand(CapturePicDto captureDto) { public CapturePicCommand(CapturePicDTO captureDto) { setDataHeader((short) 0x7479); setDataLength((short) 18); setBoxSn(captureDto.getBoxSn().getBytes()); ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStartCommand.java
@@ -1,7 +1,6 @@ package com.ard.tianyu.netty.command.camera; import com.ard.tianyu.model.dto.camera.CapturePicDto; import com.ard.tianyu.model.dto.camera.RecordDto; import com.ard.tianyu.model.dto.camera.RecordDTO; import com.ard.tianyu.netty.command.BaseCommand; import io.netty.buffer.ByteBuf; import lombok.Data; @@ -18,7 +17,7 @@ private final byte actionCode=0x24; // 动作编号 public RecordStartCommand(RecordDto recordDto) { public RecordStartCommand(RecordDTO recordDto) { setDataHeader((short) 0x7479); setDataLength((short) 18); setBoxSn(recordDto.getBoxSn().getBytes()); ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStopCommand.java
@@ -1,7 +1,6 @@ package com.ard.tianyu.netty.command.camera; import com.ard.tianyu.model.dto.camera.CapturePicDto; import com.ard.tianyu.model.dto.camera.RecordDto; import com.ard.tianyu.model.dto.camera.RecordDTO; import com.ard.tianyu.netty.command.BaseCommand; import io.netty.buffer.ByteBuf; import lombok.Data; @@ -18,7 +17,7 @@ private final byte actionCode = 0x25; // 动作编号 public RecordStopCommand(RecordDto recordDto) { public RecordStopCommand(RecordDTO recordDto) { setDataHeader((short) 0x7479); setDataLength((short) 18); setBoxSn(recordDto.getBoxSn().getBytes()); ard-work/src/main/java/com/ard/tianyu/netty/command/control/AbsAngleControlCommand.java
@@ -1,6 +1,6 @@ package com.ard.tianyu.netty.command.control; import com.ard.tianyu.model.dto.control.AbsAngleControlDto; import com.ard.tianyu.model.dto.control.AbsAngleControlDTO; import com.ard.tianyu.netty.command.BaseCommand; import io.netty.buffer.ByteBuf; import lombok.Data; @@ -20,7 +20,7 @@ private final float yaw; // 平移 private final float roll; // 横滚 public AbsAngleControlCommand(AbsAngleControlDto absAngleControlDto) { public AbsAngleControlCommand(AbsAngleControlDTO absAngleControlDto) { setDataHeader((short) 0x7479); setDataLength((short) 30); setBoxSn(absAngleControlDto.getBoxSn().getBytes()); ard-work/src/main/java/com/ard/tianyu/netty/command/control/AngleControlCommand.java
@@ -1,6 +1,6 @@ package com.ard.tianyu.netty.command.control; import com.ard.tianyu.model.dto.control.AngleControlDto; import com.ard.tianyu.model.dto.control.AngleControlDTO; import com.ard.tianyu.netty.command.BaseCommand; import io.netty.buffer.ByteBuf; import lombok.Data; @@ -18,7 +18,7 @@ private final byte actionCode; // 动作编号 private final byte rotationAngle; // 转动角度 public AngleControlCommand(AngleControlDto angleControlDto) { public AngleControlCommand(AngleControlDTO angleControlDto) { setDataHeader((short) 0x7479); setDataLength((short) 19); setBoxSn(angleControlDto.getBoxSn().getBytes()); ard-work/src/main/java/com/ard/tianyu/netty/command/control/SpeedControlCommand.java
@@ -1,6 +1,6 @@ package com.ard.tianyu.netty.command.control; import com.ard.tianyu.model.dto.control.SpeedControlDto; import com.ard.tianyu.model.dto.control.SpeedControlDTO; import com.ard.tianyu.netty.command.BaseCommand; import io.netty.buffer.ByteBuf; import lombok.Data; @@ -22,7 +22,7 @@ private final short execTime = 200; // 执行时间 public SpeedControlCommand(SpeedControlDto speedControlDto) { public SpeedControlCommand(SpeedControlDTO speedControlDto) { setDataHeader((short) 0x7479); setDataLength((short) 32); setBoxSn(speedControlDto.getBoxSn().getBytes()); ard-work/src/main/java/com/ard/tianyu/netty/handler/MessageProtocolDecoder.java
@@ -1,6 +1,7 @@ package com.ard.tianyu.netty.handler;// MessageProtocolDecoder.java import com.ard.tianyu.netty.command.*; import com.ard.tianyu.netty.command.camera.CameraModeReplyCommand; import com.ard.tianyu.netty.command.camera.CapturePicReplyCommand; import com.ard.tianyu.netty.command.camera.RecordStartReplyCommand; import com.ard.tianyu.netty.command.camera.RecordStopReplyCommand; @@ -83,21 +84,30 @@ byte encryptionFlag = in.readByte(); byte actionCode = in.readByte(); switch (actionCode) { case 0x23: case 0x22: byte result = in.readByte(); int errorCode = in.readInt(); uavData = new byte[15]; in.readBytes(uavData); String boxSn = new String(uavData); baseCommand = new CameraModeReplyCommand(boxSn, result, errorCode); log.debug("设置相机模式回复: {}", boxSn); break; case 0x23: result = in.readByte(); errorCode = in.readInt(); uavData = new byte[15]; in.readBytes(uavData); boxSn = new String(uavData); baseCommand = new CapturePicReplyCommand(boxSn, result, errorCode); log.debug("拍照回复: {}", boxSn); break; case 0x24: result = in.readByte(); errorCode = in.readInt(); result = in.readByte(); errorCode = in.readInt(); uavData = new byte[15]; in.readBytes(uavData); boxSn = new String(uavData); boxSn = new String(uavData); baseCommand = new RecordStartReplyCommand(boxSn, result, errorCode); log.debug("开始录像回复: {}", boxSn); break; ard-work/src/main/java/com/ard/tianyu/service/ITyService.java
@@ -3,11 +3,12 @@ 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.camera.CameraModeDTO; 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.signal.SignalInfo; import com.ard.tianyu.model.dto.state.UavState; import com.ard.tianyu.model.dto.telemetry.TelemetryData; @@ -70,27 +71,32 @@ /** * 云台转动(基于角度) */ void angleControl(AngleControlDto angleControlDto); void angleControl(AngleControlDTO angleControlDto); /** * 云台绝对值控制(基于角度) */ void absAngleControl(AbsAngleControlDto absAngleControlDto); void absAngleControl(AbsAngleControlDTO absAngleControlDto); /** * 云台转动(基于速度) */ void speedControl(SpeedControlDto speedControlDto); void speedControl(SpeedControlDTO speedControlDto); /** * 设置相机模式 */ void updateCameraMode(CameraModeDTO cameraModeDTO); /** * 拍照 */ void capturePic(CapturePicDto capturePicDto); void capturePic(CapturePicDTO capturePicDto); /** * 录像 */ void record(RecordDto recordDto); void record(RecordDTO recordDto); /** * 获取无人机状态 ard-work/src/main/java/com/ard/tianyu/service/impl/TyServiceImpl.java
@@ -8,11 +8,12 @@ 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.camera.CameraModeDTO; 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; @@ -34,7 +35,6 @@ 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; @@ -165,7 +165,7 @@ * 云台控制基于角度 */ @Override public void angleControl(AngleControlDto angleControlDto) { public void angleControl(AngleControlDTO angleControlDto) { AngleControlCommand controlAngleCommand = new AngleControlCommand(angleControlDto); this.sendMessage(tyConfiguration.getIpPort(), controlAngleCommand); } @@ -174,7 +174,7 @@ * 云台绝对值控制(基于角度) */ @Override public void absAngleControl(AbsAngleControlDto absAngleControlDto) { public void absAngleControl(AbsAngleControlDTO absAngleControlDto) { AbsAngleControlCommand absAngleControlCommand = new AbsAngleControlCommand(absAngleControlDto); this.sendMessage(tyConfiguration.getIpPort(), absAngleControlCommand); } @@ -183,16 +183,26 @@ * 云台转动(基于速度) */ @Override public void speedControl(SpeedControlDto speedControlDto) { public void speedControl(SpeedControlDTO speedControlDto) { SpeedControlCommand speedControlCommand = new SpeedControlCommand(speedControlDto); this.sendMessage(tyConfiguration.getIpPort(), speedControlCommand); } /** * 设置相机模式 */ @Override public void updateCameraMode(CameraModeDTO cameraModeDTO) { CameraModeCommand cameraModeCommand = new CameraModeCommand(cameraModeDTO); this.sendMessage(tyConfiguration.getIpPort(), cameraModeCommand); } /** * 拍照 */ @Override public void capturePic(CapturePicDto capturePicDto) { public void capturePic(CapturePicDTO capturePicDto) { updateCameraMode(CameraModeDTO.builder().boxSn(capturePicDto.getBoxSn()).actionParam((byte)0x01).build()); CapturePicCommand capturePicCommand = new CapturePicCommand(capturePicDto); this.sendMessage(tyConfiguration.getIpPort(), capturePicCommand); } @@ -201,9 +211,10 @@ * 录像 */ @Override public void record(RecordDto recordDto) { public void record(RecordDTO recordDto) { BaseCommand baseCommand; if (recordDto.getIsRecord()) { updateCameraMode(CameraModeDTO.builder().boxSn(recordDto.getBoxSn()).actionParam((byte)0x02).build()); baseCommand = new RecordStartCommand(recordDto); } else { baseCommand = new RecordStopCommand(recordDto); @@ -291,6 +302,13 @@ log.info("收到无人机初始化详情-回复防止再次发送"); } } if (tyCommand instanceof CameraModeReplyCommand) { CameraModeReplyCommand cameraModeReplyCommand = (CameraModeReplyCommand) tyCommand; if (cameraModeReplyCommand.getActionCode() == (byte) 0x22) { log.info("收到无人机设置相机模式回复:{} 错误码:{}", String.format("0x%02X", cameraModeReplyCommand.getResult() & 0xFF), cameraModeReplyCommand.getErrorCode()); } } if (tyCommand instanceof CapturePicReplyCommand) { CapturePicReplyCommand capturePicReplyCommand = (CapturePicReplyCommand) tyCommand; if (capturePicReplyCommand.getActionCode() == (byte) 0x23) {