liusuyi
2024-10-25 fddccbf217223e7287d6861c3020d9ba5cc15e55
优化
13 files added
5 files modified
10 files renamed
702 ■■■■■ changed files
ard-admin/src/main/resources/application-dev.yml 6 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/controller/UavController.java 50 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/model/dto/camera/CapturePicDto.java 22 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/model/dto/camera/RecordDto.java 23 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/model/dto/control/AbsAngleControlDto.java 37 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/model/dto/control/AngleControlDto.java 29 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/model/dto/control/SpeedControlDto.java 38 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/camera/CapturePicCommand.java 35 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/camera/CapturePicReplyCommand.java 32 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStartCommand.java 36 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStartReplyCommand.java 32 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStopCommand.java 36 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStopReplyCommand.java 32 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/control/AbsAngleControlCommand.java 45 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/control/AngleControlCommand.java 20 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/control/SpeedControlCommand.java 47 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/real/SignalInfoCommand.java 3 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/real/UavStateCommand.java 2 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/real/UavTelemetryDataCommand.java 5 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/register/HeartbeatCommand.java 3 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/register/HeartbeatReplyCommand.java 5 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/register/RegisterCommand.java 3 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/register/RegisterReplyCommand.java 3 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/register/UavInitInfoCommand.java 3 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/register/UavReadyNotificationCommand.java 3 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/handler/MessageProtocolDecoder.java 38 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/service/ITyService.java 27 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/service/impl/TyServiceImpl.java 87 ●●●●● patch | view | raw | blame | history
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: