ard-admin/src/main/resources/application-dev.yml
@@ -24,12 +24,12 @@ # 天宇服务器配置 tianyu: # 天宇http服务器地址 endpoint: 112.98.106.22:22000 endpoint: 112.98.106.22:12000 accesskeyid: qmfmd3Ws7M4dMcylnrTU accesskeysecret: 5WBU2uEhHZaVefpZdaxpFh4LJW9fZZaa # 天宇tcp服务器地址 tcpserver: 112.98.106.22 tcpport: 23002 tcpport: 13002 # netty配置 netty: tcp: @@ -38,4 +38,4 @@ #流媒体配置 mediamtx: # 流媒体服务器地址 host: 192.168.1.27 host: 192.168.1.27 ard-work/src/main/java/com/ard/tianyu/controller/UavController.java
@@ -4,6 +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.signal.SignalInfo; import com.ard.tianyu.model.dto.state.UavState; import com.ard.tianyu.model.dto.telemetry.TelemetryData; @@ -12,11 +17,15 @@ import com.ard.tianyu.model.receiver.BoxInfoReceiver; import com.ard.tianyu.model.receiver.BoxStreamUrlReceiver; import com.ard.tianyu.service.ITyService; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import java.util.List; /** @@ -74,10 +83,43 @@ return AjaxResult.success(state); } @ApiOperation("云台转动(基于角度)") @GetMapping("/controlAngle") public AjaxResult controlAngle(String boxSn,Integer actionId,Integer rotationAngle) { tyService.angleControl(boxSn,actionId,rotationAngle); @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) { tyService.angleControl(angleControlDto); return AjaxResult.success(); } @ApiOperation(value = "云台绝对值控制(基于角度)", notes = "俯仰pitch范围:[-120°至+30°] 平移yaw范围:[-180°至+180°] 横滚roll范围:[-90°至+60°]") @ApiOperationSupport(order = 2) @PostMapping("/absAngleControl") public AjaxResult absAngleControl(@RequestBody @Validated AbsAngleControlDto angleControlDto) { tyService.absAngleControl(angleControlDto); return AjaxResult.success(); } @ApiOperation(value = "云台转动(基于速度)", notes = "俯仰转动速度:上正下负 平移转动速度:右正左负 横滚转动速度:顺时针正,逆时针负") @ApiOperationSupport(order = 3) @PostMapping("/speedControl") public AjaxResult speedControl(@RequestBody @Validated SpeedControlDto speedControlDto) { tyService.speedControl(speedControlDto); return AjaxResult.success(); } @ApiOperation("拍照") @ApiOperationSupport(order = 4) @PostMapping("/capturePicDto") public AjaxResult capturePic(@RequestBody CapturePicDto capturePicDto) { tyService.capturePic(capturePicDto); return AjaxResult.success(); } @ApiOperation("录像") @ApiOperationSupport(order = 5) @PostMapping("/record") public AjaxResult record(@RequestBody RecordDto recordDto) { tyService.record(recordDto); return AjaxResult.success(); } ard-work/src/main/java/com/ard/tianyu/model/dto/camera/CapturePicDto.java
New file @@ -0,0 +1,22 @@ package com.ard.tianyu.model.dto.camera; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.validation.annotation.Validated; /** * 拍照实体对象 * * @author liusuyi * @date 2024年10月25日13:32 **/ @Data @Builder @AllArgsConstructor @NoArgsConstructor @Validated public class CapturePicDto { private String boxSn; } ard-work/src/main/java/com/ard/tianyu/model/dto/camera/RecordDto.java
New file @@ -0,0 +1,23 @@ package com.ard.tianyu.model.dto.camera; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.validation.annotation.Validated; /** * 录像实体对象 * * @author liusuyi * @date 2024年10月25日13:32 **/ @Data @Builder @AllArgsConstructor @NoArgsConstructor @Validated public class RecordDto { private String boxSn; private Boolean isRecord; } ard-work/src/main/java/com/ard/tianyu/model/dto/control/AbsAngleControlDto.java
New file @@ -0,0 +1,37 @@ package com.ard.tianyu.model.dto.control; import lombok.AllArgsConstructor; 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 * * @author liusuyi * @date 2024年10月25日13:32 **/ @Data @Builder @AllArgsConstructor @NoArgsConstructor @Validated public class AbsAngleControlDto { private String boxSn; @Min(value = -120, message = "俯仰角 (pitch) 最小值为 -120°") @Max(value = 30, message = "俯仰角 (pitch) 最大值为 30°") private float pitch; // 俯仰角 @Min(value = -180, message = "偏航角 (yaw) 最小值为 -180°") @Max(value = 180, message = "偏航角 (yaw) 最大值为 180°") private float yaw; // 偏航角 @Min(value = -90, message = "横滚角 (roll) 最小值为 -90°") @Max(value = 60, message = "横滚角 (roll) 最大值为 60°") private float roll; } ard-work/src/main/java/com/ard/tianyu/model/dto/control/AngleControlDto.java
New file @@ -0,0 +1,29 @@ package com.ard.tianyu.model.dto.control; import lombok.AllArgsConstructor; 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 * * @author liusuyi * @date 2024年10月25日13:32 **/ @Data @Builder @AllArgsConstructor @NoArgsConstructor @Validated public class AngleControlDto { private String boxSn; private Byte actionCode; @Min(value = 0, message = "转动角度 最小值为 0") @Max(value = 255, message = "转动角度 最大值为 255") private Byte rotationAngle; } ard-work/src/main/java/com/ard/tianyu/model/dto/control/SpeedControlDto.java
New file @@ -0,0 +1,38 @@ package com.ard.tianyu.model.dto.control; import lombok.AllArgsConstructor; 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 * * @author liusuyi * @date 2024年10月25日13:32 **/ @Data @Builder @AllArgsConstructor @NoArgsConstructor public class SpeedControlDto { private String boxSn; /** * 俯仰转动速度 */ private float pitchSpeed; /** * 平移转动速度 */ private float yawSpeed; /** * 横滚转动速度 */ private float rollSpeed; } ard-work/src/main/java/com/ard/tianyu/netty/command/camera/CapturePicCommand.java
New file @@ -0,0 +1,35 @@ package com.ard.tianyu.netty.command.camera; import com.ard.tianyu.model.dto.camera.CapturePicDto; 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 CapturePicCommand extends BaseCommand { private final byte encryptFlag = 0x00; // 加密标志 private final byte actionCode=0x23; // 动作编号 public CapturePicCommand(CapturePicDto captureDto) { setDataHeader((short) 0x7479); setDataLength((short) 18); setBoxSn(captureDto.getBoxSn().getBytes()); setCmdCode((byte) 0xD1); } public void encode(ByteBuf out) { out.writeShort(getDataHeader()); // 写入数据头 out.writeShort(getDataLength()); // 写入数据长度 out.writeBytes(getBoxSn()); // 写入盒子SN out.writeByte(getCmdCode()); // 写入命令码 out.writeByte(encryptFlag); // 写入加密标志 out.writeByte(actionCode); // 写入动作编号 } } ard-work/src/main/java/com/ard/tianyu/netty/command/camera/CapturePicReplyCommand.java
New file @@ -0,0 +1,32 @@ package com.ard.tianyu.netty.command.camera; 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 CapturePicReplyCommand extends BaseCommand { private final byte encryptFlag = 0x00; // 加密标志 private final byte actionCode = 0x23; // 动作编号 private final byte result; // 执行结果 private final Integer errorCode; // 错误码 public CapturePicReplyCommand(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/RecordStartCommand.java
New file @@ -0,0 +1,36 @@ 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.netty.command.BaseCommand; import io.netty.buffer.ByteBuf; import lombok.Data; /** * 开始录像指令 * * @author liusuyi * @date 2024年10月25日14:44 **/ @Data public class RecordStartCommand extends BaseCommand { private final byte encryptFlag = 0x00; // 加密标志 private final byte actionCode=0x24; // 动作编号 public RecordStartCommand(RecordDto recordDto) { setDataHeader((short) 0x7479); setDataLength((short) 18); setBoxSn(recordDto.getBoxSn().getBytes()); setCmdCode((byte) 0xD1); } public void encode(ByteBuf out) { out.writeShort(getDataHeader()); // 写入数据头 out.writeShort(getDataLength()); // 写入数据长度 out.writeBytes(getBoxSn()); // 写入盒子SN out.writeByte(getCmdCode()); // 写入命令码 out.writeByte(encryptFlag); // 写入加密标志 out.writeByte(actionCode); // 写入动作编号 } } ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStartReplyCommand.java
New file @@ -0,0 +1,32 @@ package com.ard.tianyu.netty.command.camera; 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 RecordStartReplyCommand extends BaseCommand { private final byte encryptFlag = 0x00; // 加密标志 private final byte actionCode = 0x24; // 动作编号 private final byte result; // 执行结果 private final Integer errorCode; // 错误码 public RecordStartReplyCommand(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/RecordStopCommand.java
New file @@ -0,0 +1,36 @@ 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.netty.command.BaseCommand; import io.netty.buffer.ByteBuf; import lombok.Data; /** * 停止录像指令 * * @author liusuyi * @date 2024年10月25日14:44 **/ @Data public class RecordStopCommand extends BaseCommand { private final byte encryptFlag = 0x00; // 加密标志 private final byte actionCode = 0x25; // 动作编号 public RecordStopCommand(RecordDto recordDto) { setDataHeader((short) 0x7479); setDataLength((short) 18); setBoxSn(recordDto.getBoxSn().getBytes()); setCmdCode((byte) 0xD1); } public void encode(ByteBuf out) { out.writeShort(getDataHeader()); // 写入数据头 out.writeShort(getDataLength()); // 写入数据长度 out.writeBytes(getBoxSn()); // 写入盒子SN out.writeByte(getCmdCode()); // 写入命令码 out.writeByte(encryptFlag); // 写入加密标志 out.writeByte(actionCode); // 写入动作编号 } } ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStopReplyCommand.java
New file @@ -0,0 +1,32 @@ package com.ard.tianyu.netty.command.camera; 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 RecordStopReplyCommand extends BaseCommand { private final byte encryptFlag = 0x00; // 加密标志 private final byte actionCode = 0x25; // 动作编号 private final byte result; // 执行结果 private final Integer errorCode; // 错误码 public RecordStopReplyCommand(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/control/AbsAngleControlCommand.java
New file @@ -0,0 +1,45 @@ package com.ard.tianyu.netty.command.control; import com.ard.tianyu.model.dto.control.AbsAngleControlDto; import com.ard.tianyu.netty.command.BaseCommand; import io.netty.buffer.ByteBuf; import lombok.Data; /** * 云台绝对值控制(基于角度)命令 * * @author 刘苏义 * @date 2024/10/22 16:36 */ @Data public class AbsAngleControlCommand extends BaseCommand { private final byte encryptFlag = 0x00; // 加密标志 private final byte actionCode = 0x09; // 动作编号 private final float pitch; // 俯仰 private final float yaw; // 平移 private final float roll; // 横滚 public AbsAngleControlCommand(AbsAngleControlDto absAngleControlDto) { setDataHeader((short) 0x7479); setDataLength((short) 30); setBoxSn(absAngleControlDto.getBoxSn().getBytes()); setCmdCode((byte) 0xD1); this.pitch = absAngleControlDto.getPitch(); this.yaw = absAngleControlDto.getYaw(); this.roll = absAngleControlDto.getRoll(); } 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.writeFloat(pitch); // 写入转动角度 out.writeFloat(yaw); // 写入转动角度 out.writeFloat(roll); // 写入转动角度 } } ard-work/src/main/java/com/ard/tianyu/netty/command/control/AngleControlCommand.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/netty/command/ControlAngleCommand.java @@ -1,5 +1,7 @@ package com.ard.tianyu.netty.command; package com.ard.tianyu.netty.command.control; import com.ard.tianyu.model.dto.control.AngleControlDto; import com.ard.tianyu.netty.command.BaseCommand; import io.netty.buffer.ByteBuf; import lombok.Data; @@ -11,20 +13,18 @@ */ @Data public class ControlAngleCommand extends BaseCommand { private final byte encryptFlag; // 加密标志 public class AngleControlCommand extends BaseCommand { private final byte encryptFlag = 0x00; // 加密标志 private final byte actionCode; // 动作编号 private final byte rotationAngle; // 转动角度 public ControlAngleCommand(String boxSn, byte actionCode, byte rotationAngle) { public AngleControlCommand(AngleControlDto angleControlDto) { setDataHeader((short) 0x7479); setDataLength((short)19); setBoxSn(boxSn.getBytes()); setDataLength((short) 19); setBoxSn(angleControlDto.getBoxSn().getBytes()); setCmdCode((byte) 0xD1); this.encryptFlag = 0x00; this.actionCode = actionCode; this.rotationAngle = rotationAngle; this.actionCode = angleControlDto.getActionCode(); this.rotationAngle = angleControlDto.getRotationAngle(); } public void encode(ByteBuf out) { ard-work/src/main/java/com/ard/tianyu/netty/command/control/SpeedControlCommand.java
New file @@ -0,0 +1,47 @@ package com.ard.tianyu.netty.command.control; import com.ard.tianyu.model.dto.control.SpeedControlDto; import com.ard.tianyu.netty.command.BaseCommand; import io.netty.buffer.ByteBuf; import lombok.Data; /** * 云台绝对值控制(基于角度)命令 * * @author 刘苏义 * @date 2024/10/22 16:36 */ @Data public class SpeedControlCommand extends BaseCommand { private final byte encryptFlag = 0x00; // 加密标志 private final byte actionCode = (byte) 0xF4; // 动作编号 private final float pitchSpeed; // 俯仰转速 private final float yawSpeed; // 平移转速 private final float rollSpeed; // 横滚转速 private final short execTime = 200; // 执行时间 public SpeedControlCommand(SpeedControlDto speedControlDto) { setDataHeader((short) 0x7479); setDataLength((short) 32); setBoxSn(speedControlDto.getBoxSn().getBytes()); setCmdCode((byte) 0xD1); this.pitchSpeed = speedControlDto.getPitchSpeed(); this.yawSpeed = speedControlDto.getYawSpeed(); this.rollSpeed = speedControlDto.getRollSpeed(); } 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.writeFloat(pitchSpeed); // 写入转动角度 out.writeFloat(yawSpeed); // 写入转动角度 out.writeFloat(rollSpeed); // 写入转动角度 out.writeShort(execTime); // 写入执行时间 } } ard-work/src/main/java/com/ard/tianyu/netty/command/real/SignalInfoCommand.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/netty/command/SignalInfoCommand.java @@ -1,5 +1,6 @@ package com.ard.tianyu.netty.command; package com.ard.tianyu.netty.command.real; import com.ard.tianyu.netty.command.BaseCommand; import com.ard.tianyu.netty.protobuf.TelemetryDataPB; import io.netty.buffer.ByteBuf; import lombok.Data; ard-work/src/main/java/com/ard/tianyu/netty/command/real/UavStateCommand.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/netty/command/UavStateCommand.java @@ -1,4 +1,4 @@ package com.ard.tianyu.netty.command; package com.ard.tianyu.netty.command.real; import com.ard.tianyu.netty.command.BaseCommand; import com.ard.tianyu.netty.protobuf.TelemetryDataPB; ard-work/src/main/java/com/ard/tianyu/netty/command/real/UavTelemetryDataCommand.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/netty/command/UavTelemetryDataCommand.java @@ -1,5 +1,6 @@ package com.ard.tianyu.netty.command; package com.ard.tianyu.netty.command.real; import com.ard.tianyu.netty.command.BaseCommand; import com.ard.tianyu.netty.protobuf.TelemetryDataPB; import io.netty.buffer.ByteBuf; @@ -9,7 +10,7 @@ * @author liusuyi * @date 2024年10月23日9:33 **/ public class UavTelemetryDataCommand extends BaseCommand{ public class UavTelemetryDataCommand extends BaseCommand { private TelemetryDataPB.TelemetryData telemetryData; // 构造函数 public UavTelemetryDataCommand(TelemetryDataPB.TelemetryData telemetryData) { ard-work/src/main/java/com/ard/tianyu/netty/command/register/HeartbeatCommand.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/netty/command/HeartbeatCommand.java @@ -1,5 +1,6 @@ package com.ard.tianyu.netty.command; package com.ard.tianyu.netty.command.register; import com.ard.tianyu.netty.command.BaseCommand; import io.netty.buffer.ByteBuf; /** ard-work/src/main/java/com/ard/tianyu/netty/command/register/HeartbeatReplyCommand.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/netty/command/HeartbeatReplyCommand.java @@ -1,5 +1,6 @@ package com.ard.tianyu.netty.command; package com.ard.tianyu.netty.command.register; import com.ard.tianyu.netty.command.BaseCommand; import io.netty.buffer.ByteBuf; import lombok.Data; import lombok.NoArgsConstructor; @@ -27,6 +28,6 @@ out.writeShort(getDataHeader()); // 写入数据头 out.writeShort(getDataLength()); // 写入数据长度 out.writeByte(getCmdCode()); // 写入命令码 out.writeLong(timestamp); // 写入时间戳 out.writeLong(timestamp); // 写入时间戳 } } ard-work/src/main/java/com/ard/tianyu/netty/command/register/RegisterCommand.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/netty/command/RegisterCommand.java @@ -1,5 +1,6 @@ package com.ard.tianyu.netty.command;// RegisterMessage.java package com.ard.tianyu.netty.command.register;// RegisterMessage.java import com.ard.tianyu.netty.command.BaseCommand; import io.netty.buffer.ByteBuf; /** ard-work/src/main/java/com/ard/tianyu/netty/command/register/RegisterReplyCommand.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/netty/command/RegisterReplyCommand.java @@ -1,5 +1,6 @@ package com.ard.tianyu.netty.command;// RegisterMessage.java package com.ard.tianyu.netty.command.register;// RegisterMessage.java import com.ard.tianyu.netty.command.BaseCommand; import io.netty.buffer.ByteBuf; import lombok.Data; ard-work/src/main/java/com/ard/tianyu/netty/command/register/UavInitInfoCommand.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/netty/command/UavInitInfoCommand.java @@ -1,5 +1,6 @@ package com.ard.tianyu.netty.command; package com.ard.tianyu.netty.command.register; import com.ard.tianyu.netty.command.BaseCommand; import io.netty.buffer.ByteBuf; import lombok.Data; ard-work/src/main/java/com/ard/tianyu/netty/command/register/UavReadyNotificationCommand.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/netty/command/UavReadyNotificationCommand.java @@ -1,5 +1,6 @@ package com.ard.tianyu.netty.command; package com.ard.tianyu.netty.command.register; import com.ard.tianyu.netty.command.BaseCommand; import com.ard.tianyu.netty.protobuf.TelemetryDataPB; import io.netty.buffer.ByteBuf; import lombok.Data; ard-work/src/main/java/com/ard/tianyu/netty/handler/MessageProtocolDecoder.java
@@ -1,6 +1,15 @@ package com.ard.tianyu.netty.handler;// MessageProtocolDecoder.java import com.ard.tianyu.netty.command.*; import com.ard.tianyu.netty.command.camera.CapturePicReplyCommand; import com.ard.tianyu.netty.command.camera.RecordStartReplyCommand; import com.ard.tianyu.netty.command.camera.RecordStopReplyCommand; 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.HeartbeatReplyCommand; import com.ard.tianyu.netty.command.register.RegisterReplyCommand; import com.ard.tianyu.netty.command.register.UavReadyNotificationCommand; import com.ard.tianyu.netty.protobuf.TelemetryDataPB; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -74,12 +83,39 @@ byte encryptionFlag = in.readByte(); byte actionCode = in.readByte(); switch (actionCode) { case 0x23: byte result = in.readByte(); int errorCode = in.readInt(); uavData = new byte[15]; in.readBytes(uavData); String boxSn = new String(uavData); baseCommand = new CapturePicReplyCommand(boxSn, result, errorCode); log.debug("拍照回复: {}", boxSn); break; case 0x24: result = in.readByte(); errorCode = in.readInt(); uavData = new byte[15]; in.readBytes(uavData); boxSn = new String(uavData); baseCommand = new RecordStartReplyCommand(boxSn, result, errorCode); log.debug("开始录像回复: {}", boxSn); break; case 0x25: result = in.readByte(); errorCode = in.readInt(); uavData = new byte[15]; in.readBytes(uavData); boxSn = new String(uavData); baseCommand = new RecordStopReplyCommand(boxSn, result, errorCode); log.debug("停止录像回复: {}", boxSn); break; case 0x42: byte[] uavData1 = new byte[dataLength - 18]; in.readBytes(uavData1); byte[] uavData2 = new byte[15]; in.readBytes(uavData2); String boxSn = new String(uavData2); boxSn = new String(uavData2); TelemetryDataPB.UavInitInfo uavInitInfo = TelemetryDataPB.UavInitInfo.parseFrom(uavData1); baseCommand = new UavReadyNotificationCommand(boxSn, uavInitInfo, actionCode); log.debug("无人机初始化数据: {}", boxSn); ard-work/src/main/java/com/ard/tianyu/service/ITyService.java
@@ -3,6 +3,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.signal.SignalInfo; import com.ard.tianyu.model.dto.state.UavState; import com.ard.tianyu.model.dto.telemetry.TelemetryData; @@ -65,9 +70,27 @@ /** * 云台转动(基于角度) */ void angleControl(String boxSn, Integer actionId, Integer rotationAngle); void angleControl(AngleControlDto angleControlDto); void absAngleControl(String boxSn, Integer actionId, float pitch, float yaw, float roll); /** * 云台绝对值控制(基于角度) */ void absAngleControl(AbsAngleControlDto absAngleControlDto); /** * 云台转动(基于速度) */ void speedControl(SpeedControlDto speedControlDto); /** * 拍照 */ void capturePic(CapturePicDto capturePicDto); /** * 录像 */ void record(RecordDto recordDto); /** * 获取无人机状态 ard-work/src/main/java/com/ard/tianyu/service/impl/TyServiceImpl.java
@@ -8,6 +8,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.converter.UavSignalInfoConverter; import com.ard.tianyu.model.dto.converter.UavStateConverter; import com.ard.tianyu.model.dto.converter.UavTelemetryDataConverter; @@ -17,10 +22,19 @@ 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.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; @@ -151,14 +165,50 @@ * 云台控制基于角度 */ @Override public void angleControl(String boxSn, Integer actionId, Integer rotationAngle) { ControlAngleCommand controlAngleCommand = new ControlAngleCommand(boxSn, actionId.byteValue(), rotationAngle.byteValue()); public void angleControl(AngleControlDto angleControlDto) { AngleControlCommand controlAngleCommand = new AngleControlCommand(angleControlDto); this.sendMessage(tyConfiguration.getIpPort(), controlAngleCommand); } /** * 云台绝对值控制(基于角度) */ @Override public void absAngleControl(String boxSn, Integer actionId, float pitch, float yaw, float roll) { 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); } /** @@ -233,11 +283,32 @@ break; case (byte) 0xD1: // 处理无人机 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 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: