liusuyi
2024-10-26 f8a09d564aeba26eb9d729fee5e7fbcab3811de1
优化
12 files added
7 files modified
1 files copied
22 files renamed
855 ■■■■■ changed files
ard-admin/src/main/resources/application-dev.yml 9 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/controller/UavController.java 41 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/model/dto/camera/PhotoReturnToggleDTO.java 21 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/model/dto/camera/SwitchCameraDTO.java 27 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/model/dto/camera/SwitchSourceDTO.java 23 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/model/dto/camera/ZoomDTO.java 23 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/model/dto/camera/ZoomToLevelDTO.java 28 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/BaseCmd.java 2 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/PointFlyCmd.java 4 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/camera/CameraModeCmd.java 6 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/camera/CameraModeReplyCmd.java 7 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/camera/CapturePicCmd.java 6 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/camera/CapturePicReplyCmd.java 6 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/camera/PhotoReturnToggleCmd.java 38 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStartCmd.java 6 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStartReplyCmd.java 6 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStopCmd.java 6 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStopReplyCmd.java 6 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/camera/SwitchCameraCmd.java 34 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/camera/SwitchSourceCmd.java 35 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/camera/ZoomCmd.java 15 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/camera/ZoomToLevelCmd.java 37 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/control/AbsAngleControlCmd.java 6 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/control/AngleControlCmd.java 6 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/control/SpeedControlCmd.java 6 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/notice/BoxPowerStatusReplyCmd.java 27 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/notice/FlyWayEndReplyCmd.java 32 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/notice/UavReadyReplyCmd.java 36 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/real/SignalInfoCmd.java 6 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/real/UavStateCmd.java 6 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/real/UavTelemetryDataCmd.java 6 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/register/HeartbeatCmd.java 6 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/register/HeartbeatReplyCmd.java 6 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/register/RegisterCmd.java 6 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/register/RegisterReplyCmd.java 6 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/register/UavInitInfoCmd.java 6 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/command/register/UavInitReplyCmd.java 10 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/handler/ClientHandler.java 6 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/handler/MessageProtocolDecoder.java 74 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/netty/handler/MessageProtocolEncoder.java 8 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/service/ITyService.java 33 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/service/impl/TyServiceImpl.java 177 ●●●●● patch | view | raw | blame | history
ard-admin/src/main/resources/application-dev.yml
@@ -24,17 +24,12 @@
# 天宇服务器配置
tianyu:
  # 天宇http服务器地址
  endpoint: 112.98.106.22:12000
  endpoint: 112.98.106.22:22000
  accesskeyid: qmfmd3Ws7M4dMcylnrTU
  accesskeysecret: 5WBU2uEhHZaVefpZdaxpFh4LJW9fZZaa
  # 天宇tcp服务器地址
  tcpserver: 112.98.106.22
  tcpport: 13002
# netty配置
netty:
  tcp:
    enabled: true
    reConnectInterval: 30000
  tcpport: 23002
#流媒体配置
mediamtx:
  # 流媒体服务器地址
ard-work/src/main/java/com/ard/tianyu/controller/UavController.java
@@ -4,8 +4,7 @@
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.camera.*;
import com.ard.tianyu.model.dto.control.AbsAngleControlDTO;
import com.ard.tianyu.model.dto.control.AngleControlDTO;
import com.ard.tianyu.model.dto.control.SpeedControlDTO;
@@ -121,6 +120,44 @@
        return AjaxResult.success();
    }
    @ApiOperation(value = "变倍", notes = "actionCode值:10变倍加 | 11变倍减 | 15复位 | 255停止")
    @ApiOperationSupport(order = 6)
    @PostMapping("/zoom")
    public AjaxResult zoom(@RequestBody ZoomDTO zoomDTO) {
        tyService.zoom(zoomDTO);
        return AjaxResult.success();
    }
    @ApiOperation("变倍指定倍数")
    @ApiOperationSupport(order = 7)
    @PostMapping("/zoomToLevel")
    public AjaxResult zoomToLevel(@RequestBody ZoomToLevelDTO zoomToLevelDTO) {
        tyService.zoomToLevel(zoomToLevelDTO);
        return AjaxResult.success();
    }
    @ApiOperation(value = "切换摄像头", notes = "actionParam值:0切换到FPV摄像头  | 1切换到载荷摄像头")
    @ApiOperationSupport(order = 8)
    @PostMapping("/switchCamera")
    public AjaxResult switchCamera(@RequestBody SwitchCameraDTO switchCameraDTO) {
        tyService.switchCamera(switchCameraDTO);
        return AjaxResult.success();
    }
    @ApiOperation(value = "切换视频源", notes = "相机在主相机镜头时有效,FPV镜头时无效 actionParam值:0-可见 1-变焦 2-红外")
    @ApiOperationSupport(order = 8)
    @PostMapping("/switchSource")
    public AjaxResult switchSource(@RequestBody SwitchSourceDTO switchSourceDTO) {
        tyService.switchSource(switchSourceDTO);
        return AjaxResult.success();
    }
    @ApiOperation(value = "打开或关闭照片回传", notes = "actionParam值:0-关闭,1-打开")
    @ApiOperationSupport(order = 8)
    @PostMapping("/photoReturnToggle")
    public AjaxResult photoReturnToggle(@RequestBody PhotoReturnToggleDTO photoReturnToggleDTO) {
        tyService.photoReturnToggle(photoReturnToggleDTO);
        return AjaxResult.success();
    }
    @ApiOperation("获取无人机状态")
    @GetMapping("/getUavState")
    public AjaxResult getUavState(String boxSn) {
ard-work/src/main/java/com/ard/tianyu/model/dto/camera/PhotoReturnToggleDTO.java
New file
@@ -0,0 +1,21 @@
package com.ard.tianyu.model.dto.camera;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
 * 照片回传实体对象
 *
 * @author liusuyi
 * @date 2024年10月26日14:06
 **/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class PhotoReturnToggleDTO {
    private String boxSn;
    private byte actionParam;
}
ard-work/src/main/java/com/ard/tianyu/model/dto/camera/SwitchCameraDTO.java
New file
@@ -0,0 +1,27 @@
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;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
/**
 * 切换摄像头实体对象
 *
 * @author liusuyi
 * @date 2024年10月26日9:02
 **/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Validated
public class SwitchCameraDTO {
    private String boxSn;
    //    0x00 FPV 0x01 载荷
    private byte actionParam;
}
ard-work/src/main/java/com/ard/tianyu/model/dto/camera/SwitchSourceDTO.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月26日9:02
 **/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class SwitchSourceDTO {
    private String boxSn;
    //    0x00-可见 0x01-变焦 0x02-红外
    private byte actionParam;
}
ard-work/src/main/java/com/ard/tianyu/model/dto/camera/ZoomDTO.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
public class ZoomDTO {
    private String boxSn;
    //0x0A变倍加 | 0x0B变倍减 | 0x0F复位|0xFF停止|
    private byte ActionCode;
}
ard-work/src/main/java/com/ard/tianyu/model/dto/camera/ZoomToLevelDTO.java
New file
@@ -0,0 +1,28 @@
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;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
/**
 * 变倍到指定倍数
 *
 * @author liusuyi
 * @date 2024年10月26日9:02
 **/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Validated
public class ZoomToLevelDTO {
    private String boxSn;
    @Min(value = 1, message = "范围level 最小值为 1")
    @Max(value = 200, message = "范围level 最大值为 200")
    private byte level;
}
ard-work/src/main/java/com/ard/tianyu/netty/command/BaseCmd.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/netty/command/BaseCommand.java
@@ -4,7 +4,7 @@
import lombok.Data;
@Data
public abstract class BaseCommand {
public abstract class BaseCmd {
    private short dataHeader; // 帧头
    private short dataLength; // 数据长度
    private byte[] boxSn;     // 云盒编号
ard-work/src/main/java/com/ard/tianyu/netty/command/PointFlyCmd.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/netty/command/PointFlyCommand.java
@@ -1,13 +1,13 @@
package com.ard.tianyu.netty.command;// PointFlyCommand.java
import io.netty.buffer.ByteBuf;
public class PointFlyCommand extends BaseCommand {
public class PointFlyCmd extends BaseCmd {
    private double longitude;
    private double latitude;
    private float height;
    private float speed;
    public PointFlyCommand(double longitude, double latitude, float height, float speed) {
    public PointFlyCmd(double longitude, double latitude, float height, float speed) {
        this.longitude = longitude;
        this.latitude = latitude;
        this.height = height;
ard-work/src/main/java/com/ard/tianyu/netty/command/camera/CameraModeCmd.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/netty/command/camera/CameraModeCommand.java
@@ -1,7 +1,7 @@
package com.ard.tianyu.netty.command.camera;
import com.ard.tianyu.model.dto.camera.CameraModeDTO;
import com.ard.tianyu.netty.command.BaseCommand;
import com.ard.tianyu.netty.command.BaseCmd;
import io.netty.buffer.ByteBuf;
import lombok.Data;
@@ -12,13 +12,13 @@
 * @date 2024年10月25日14:44
 **/
@Data
public class CameraModeCommand extends BaseCommand {
public class CameraModeCmd extends BaseCmd {
    private final byte encryptFlag = 0x00; // 加密标志
    private final byte actionCode = 0x22;  // 动作编号
    private final byte actionParam; // 动作参数
    public CameraModeCommand(CameraModeDTO cameraModeDTO) {
    public CameraModeCmd(CameraModeDTO cameraModeDTO) {
        setDataHeader((short) 0x7479);
        setDataLength((short) 19);
        setBoxSn(cameraModeDTO.getBoxSn().getBytes());
ard-work/src/main/java/com/ard/tianyu/netty/command/camera/CameraModeReplyCmd.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/netty/command/camera/CameraModeReplyCommand.java
@@ -1,7 +1,6 @@
package com.ard.tianyu.netty.command.camera;
import com.ard.tianyu.model.dto.camera.CameraModeDTO;
import com.ard.tianyu.netty.command.BaseCommand;
import com.ard.tianyu.netty.command.BaseCmd;
import io.netty.buffer.ByteBuf;
import lombok.Data;
@@ -12,13 +11,13 @@
 * @date 2024年10月25日14:44
 **/
@Data
public class CameraModeReplyCommand extends BaseCommand {
public class CameraModeReplyCmd extends BaseCmd {
    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) {
    public CameraModeReplyCmd(String boxSn, Byte result, Integer errorCode) {
        setDataHeader((short) 0x6A77);
        //setDataLength((short) 18);
        setCmdCode((byte) 0xD1);
ard-work/src/main/java/com/ard/tianyu/netty/command/camera/CapturePicCmd.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/netty/command/camera/CapturePicCommand.java
@@ -1,7 +1,7 @@
package com.ard.tianyu.netty.command.camera;
import com.ard.tianyu.model.dto.camera.CapturePicDTO;
import com.ard.tianyu.netty.command.BaseCommand;
import com.ard.tianyu.netty.command.BaseCmd;
import io.netty.buffer.ByteBuf;
import lombok.Data;
@@ -12,12 +12,12 @@
 * @date 2024年10月25日14:44
 **/
@Data
public class CapturePicCommand extends BaseCommand {
public class CapturePicCmd extends BaseCmd {
    private final byte encryptFlag = 0x00; // 加密标志
    private final byte actionCode=0x23;  // 动作编号
    public CapturePicCommand(CapturePicDTO captureDto) {
    public CapturePicCmd(CapturePicDTO captureDto) {
        setDataHeader((short) 0x7479);
        setDataLength((short) 18);
        setBoxSn(captureDto.getBoxSn().getBytes());
ard-work/src/main/java/com/ard/tianyu/netty/command/camera/CapturePicReplyCmd.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/netty/command/camera/CapturePicReplyCommand.java
@@ -1,6 +1,6 @@
package com.ard.tianyu.netty.command.camera;
import com.ard.tianyu.netty.command.BaseCommand;
import com.ard.tianyu.netty.command.BaseCmd;
import io.netty.buffer.ByteBuf;
import lombok.Data;
@@ -11,13 +11,13 @@
 * @date 2024年10月25日14:44
 **/
@Data
public class CapturePicReplyCommand extends BaseCommand {
public class CapturePicReplyCmd extends BaseCmd {
    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) {
    public CapturePicReplyCmd(String boxSn, Byte result, Integer errorCode) {
        setDataHeader((short) 0x6A77);
        //setDataLength((short) 18);
        setCmdCode((byte) 0xD1);
ard-work/src/main/java/com/ard/tianyu/netty/command/camera/PhotoReturnToggleCmd.java
New file
@@ -0,0 +1,38 @@
package com.ard.tianyu.netty.command.camera;
import com.ard.tianyu.model.dto.camera.PhotoReturnToggleDTO;
import com.ard.tianyu.netty.command.BaseCmd;
import io.netty.buffer.ByteBuf;
import lombok.Data;
/**
 * 打开或关闭照片回传指令
 *
 * @author liusuyi
 * @date 2024年10月25日14:44
 **/
@Data
public class PhotoReturnToggleCmd extends BaseCmd {
    private final byte encryptFlag = 0x00;      // 加密标志
    private final byte actionCode = 0x43;       // 动作编号
    private final byte actionParam;
    public PhotoReturnToggleCmd(PhotoReturnToggleDTO photoReturnToggleDTO) {
        setDataHeader((short) 0x7479);
        setDataLength((short) 19);
        setBoxSn(photoReturnToggleDTO.getBoxSn().getBytes());
        setCmdCode((byte) 0xD1);
        this.actionParam = photoReturnToggleDTO.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/RecordStartCmd.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStartCommand.java
@@ -1,7 +1,7 @@
package com.ard.tianyu.netty.command.camera;
import com.ard.tianyu.model.dto.camera.RecordDTO;
import com.ard.tianyu.netty.command.BaseCommand;
import com.ard.tianyu.netty.command.BaseCmd;
import io.netty.buffer.ByteBuf;
import lombok.Data;
@@ -12,12 +12,12 @@
 * @date 2024年10月25日14:44
 **/
@Data
public class RecordStartCommand extends BaseCommand {
public class RecordStartCmd extends BaseCmd {
    private final byte encryptFlag = 0x00; // 加密标志
    private final byte actionCode=0x24;    // 动作编号
    public RecordStartCommand(RecordDTO recordDto) {
    public RecordStartCmd(RecordDTO recordDto) {
        setDataHeader((short) 0x7479);
        setDataLength((short) 18);
        setBoxSn(recordDto.getBoxSn().getBytes());
ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStartReplyCmd.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStartReplyCommand.java
@@ -1,6 +1,6 @@
package com.ard.tianyu.netty.command.camera;
import com.ard.tianyu.netty.command.BaseCommand;
import com.ard.tianyu.netty.command.BaseCmd;
import io.netty.buffer.ByteBuf;
import lombok.Data;
@@ -11,13 +11,13 @@
 * @date 2024年10月25日14:44
 **/
@Data
public class RecordStartReplyCommand extends BaseCommand {
public class RecordStartReplyCmd extends BaseCmd {
    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) {
    public RecordStartReplyCmd(String boxSn, Byte result, Integer errorCode) {
        setDataHeader((short) 0x6A77);
        //setDataLength((short) 18);
        setCmdCode((byte) 0xD1);
ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStopCmd.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStopCommand.java
@@ -1,7 +1,7 @@
package com.ard.tianyu.netty.command.camera;
import com.ard.tianyu.model.dto.camera.RecordDTO;
import com.ard.tianyu.netty.command.BaseCommand;
import com.ard.tianyu.netty.command.BaseCmd;
import io.netty.buffer.ByteBuf;
import lombok.Data;
@@ -12,12 +12,12 @@
 * @date 2024年10月25日14:44
 **/
@Data
public class RecordStopCommand extends BaseCommand {
public class RecordStopCmd extends BaseCmd {
    private final byte encryptFlag = 0x00; // 加密标志
    private final byte actionCode = 0x25;    // 动作编号
    public RecordStopCommand(RecordDTO recordDto) {
    public RecordStopCmd(RecordDTO recordDto) {
        setDataHeader((short) 0x7479);
        setDataLength((short) 18);
        setBoxSn(recordDto.getBoxSn().getBytes());
ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStopReplyCmd.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStopReplyCommand.java
@@ -1,6 +1,6 @@
package com.ard.tianyu.netty.command.camera;
import com.ard.tianyu.netty.command.BaseCommand;
import com.ard.tianyu.netty.command.BaseCmd;
import io.netty.buffer.ByteBuf;
import lombok.Data;
@@ -11,13 +11,13 @@
 * @date 2024年10月25日14:44
 **/
@Data
public class RecordStopReplyCommand extends BaseCommand {
public class RecordStopReplyCmd extends BaseCmd {
    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) {
    public RecordStopReplyCmd(String boxSn, Byte result, Integer errorCode) {
        setDataHeader((short) 0x6A77);
        //setDataLength((short) 18);
        setCmdCode((byte) 0xD1);
ard-work/src/main/java/com/ard/tianyu/netty/command/camera/SwitchCameraCmd.java
New file
@@ -0,0 +1,34 @@
package com.ard.tianyu.netty.command.camera;
import com.ard.tianyu.model.dto.camera.SwitchCameraDTO;
import com.ard.tianyu.netty.command.BaseCmd;
import io.netty.buffer.ByteBuf;
/**
 * 切换摄像机指令
 *
 * @author liusuyi
 * @date 2024年10月26日11:18
 **/
public class SwitchCameraCmd extends BaseCmd {
    private final byte actionParam;        // 动作参数
    public SwitchCameraCmd(SwitchCameraDTO switchCameraDTO) {
        setDataHeader((short) 0x7479);
        setDataLength((short) 19);
        setBoxSn(switchCameraDTO.getBoxSn().getBytes());
        setCmdCode((byte) 0xD1);
        this.actionParam = switchCameraDTO.getActionParam();
    }
    public void encode(ByteBuf out) {
        out.writeShort(getDataHeader());    // 写入数据头
        out.writeShort(getDataLength());    // 写入数据长度
        out.writeBytes(getBoxSn());         // 写入盒子SN
        out.writeByte(getCmdCode());        // 写入命令码
        out.writeByte(0x00);          // 写入加密标志
        out.writeByte(0x27);          // 写入动作编号
        out.writeByte(actionParam);         // 写入动作参数
    }
}
ard-work/src/main/java/com/ard/tianyu/netty/command/camera/SwitchSourceCmd.java
New file
@@ -0,0 +1,35 @@
package com.ard.tianyu.netty.command.camera;
import com.ard.tianyu.model.dto.camera.SwitchCameraDTO;
import com.ard.tianyu.model.dto.camera.SwitchSourceDTO;
import com.ard.tianyu.netty.command.BaseCmd;
import io.netty.buffer.ByteBuf;
/**
 * 切换摄像机指令
 *
 * @author liusuyi
 * @date 2024年10月26日11:18
 **/
public class SwitchSourceCmd extends BaseCmd {
    private final byte actionParam;        // 动作参数
    public SwitchSourceCmd(SwitchSourceDTO switchSourceDTO) {
        setDataHeader((short) 0x7479);
        setDataLength((short) 19);
        setBoxSn(switchSourceDTO.getBoxSn().getBytes());
        setCmdCode((byte) 0xD1);
        this.actionParam = switchSourceDTO.getActionParam();
    }
    public void encode(ByteBuf out) {
        out.writeShort(getDataHeader());    // 写入数据头
        out.writeShort(getDataLength());    // 写入数据长度
        out.writeBytes(getBoxSn());         // 写入盒子SN
        out.writeByte(getCmdCode());        // 写入命令码
        out.writeByte(0x00);          // 写入加密标志
        out.writeByte(0x26);          // 写入动作编号
        out.writeByte(actionParam);         // 写入动作参数
    }
}
ard-work/src/main/java/com/ard/tianyu/netty/command/camera/ZoomCmd.java
copy from ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStopCommand.java copy to ard-work/src/main/java/com/ard/tianyu/netty/command/camera/ZoomCmd.java
File was copied from ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStopCommand.java
@@ -1,27 +1,28 @@
package com.ard.tianyu.netty.command.camera;
import com.ard.tianyu.model.dto.camera.RecordDTO;
import com.ard.tianyu.netty.command.BaseCommand;
import com.ard.tianyu.model.dto.camera.ZoomDTO;
import com.ard.tianyu.netty.command.BaseCmd;
import io.netty.buffer.ByteBuf;
import lombok.Data;
/**
 * 停止录像指令
 * 变倍指令
 *
 * @author liusuyi
 * @date 2024年10月25日14:44
 **/
@Data
public class RecordStopCommand extends BaseCommand {
public class ZoomCmd extends BaseCmd {
    private final byte encryptFlag = 0x00; // 加密标志
    private final byte actionCode = 0x25;    // 动作编号
    private final byte actionCode;  // 动作编号
    public RecordStopCommand(RecordDTO recordDto) {
    public ZoomCmd(ZoomDTO zoomDTO) {
        setDataHeader((short) 0x7479);
        setDataLength((short) 18);
        setBoxSn(recordDto.getBoxSn().getBytes());
        setBoxSn(zoomDTO.getBoxSn().getBytes());
        setCmdCode((byte) 0xD1);
        this.actionCode=zoomDTO.getActionCode();
    }
    public void encode(ByteBuf out) {
ard-work/src/main/java/com/ard/tianyu/netty/command/camera/ZoomToLevelCmd.java
New file
@@ -0,0 +1,37 @@
package com.ard.tianyu.netty.command.camera;
import com.ard.tianyu.model.dto.camera.ZoomToLevelDTO;
import com.ard.tianyu.netty.command.BaseCmd;
import io.netty.buffer.ByteBuf;
import lombok.Data;
/**
 * 变倍到指定倍数指令
 *
 * @author liusuyi
 * @date 2024年10月25日14:44
 **/
@Data
public class ZoomToLevelCmd extends BaseCmd {
    private final byte encryptFlag = 0x00; // 加密标志
    private final byte actionCode = 0x0D;  // 动作编号
    private final byte level;              // 倍数
    public ZoomToLevelCmd(ZoomToLevelDTO zoomToLevelDTO) {
        setDataHeader((short) 0x7479);
        setDataLength((short) 19);
        setBoxSn(zoomToLevelDTO.getBoxSn().getBytes());
        setCmdCode((byte) 0xD1);
        this.level = zoomToLevelDTO.getLevel();
    }
    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(level);               // 写入变倍数值
    }
}
ard-work/src/main/java/com/ard/tianyu/netty/command/control/AbsAngleControlCmd.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/netty/command/control/AbsAngleControlCommand.java
@@ -1,7 +1,7 @@
package com.ard.tianyu.netty.command.control;
import com.ard.tianyu.model.dto.control.AbsAngleControlDTO;
import com.ard.tianyu.netty.command.BaseCommand;
import com.ard.tianyu.netty.command.BaseCmd;
import io.netty.buffer.ByteBuf;
import lombok.Data;
@@ -13,14 +13,14 @@
 */
@Data
public class AbsAngleControlCommand extends BaseCommand {
public class AbsAngleControlCmd extends BaseCmd {
    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) {
    public AbsAngleControlCmd(AbsAngleControlDTO absAngleControlDto) {
        setDataHeader((short) 0x7479);
        setDataLength((short) 30);
        setBoxSn(absAngleControlDto.getBoxSn().getBytes());
ard-work/src/main/java/com/ard/tianyu/netty/command/control/AngleControlCmd.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/netty/command/control/AngleControlCommand.java
@@ -1,7 +1,7 @@
package com.ard.tianyu.netty.command.control;
import com.ard.tianyu.model.dto.control.AngleControlDTO;
import com.ard.tianyu.netty.command.BaseCommand;
import com.ard.tianyu.netty.command.BaseCmd;
import io.netty.buffer.ByteBuf;
import lombok.Data;
@@ -13,12 +13,12 @@
 */
@Data
public class AngleControlCommand extends BaseCommand {
public class AngleControlCmd extends BaseCmd {
    private final byte encryptFlag = 0x00; // 加密标志
    private final byte actionCode; // 动作编号
    private final byte rotationAngle; // 转动角度
    public AngleControlCommand(AngleControlDTO angleControlDto) {
    public AngleControlCmd(AngleControlDTO angleControlDto) {
        setDataHeader((short) 0x7479);
        setDataLength((short) 19);
        setBoxSn(angleControlDto.getBoxSn().getBytes());
ard-work/src/main/java/com/ard/tianyu/netty/command/control/SpeedControlCmd.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/netty/command/control/SpeedControlCommand.java
@@ -1,7 +1,7 @@
package com.ard.tianyu.netty.command.control;
import com.ard.tianyu.model.dto.control.SpeedControlDTO;
import com.ard.tianyu.netty.command.BaseCommand;
import com.ard.tianyu.netty.command.BaseCmd;
import io.netty.buffer.ByteBuf;
import lombok.Data;
@@ -13,7 +13,7 @@
 */
@Data
public class SpeedControlCommand extends BaseCommand {
public class SpeedControlCmd extends BaseCmd {
    private final byte encryptFlag = 0x00;          // 加密标志
    private final byte actionCode = (byte) 0xF4;    // 动作编号
    private final float pitchSpeed;                 // 俯仰转速
@@ -22,7 +22,7 @@
    private final short execTime = 200;             // 执行时间
    public SpeedControlCommand(SpeedControlDTO speedControlDto) {
    public SpeedControlCmd(SpeedControlDTO speedControlDto) {
        setDataHeader((short) 0x7479);
        setDataLength((short) 32);
        setBoxSn(speedControlDto.getBoxSn().getBytes());
ard-work/src/main/java/com/ard/tianyu/netty/command/notice/BoxPowerStatusReplyCmd.java
New file
@@ -0,0 +1,27 @@
package com.ard.tianyu.netty.command.notice;
import com.ard.tianyu.netty.command.BaseCmd;
import io.netty.buffer.ByteBuf;
import lombok.Data;
/**
 * 云盒开关机通知回复指令
 *
 * @author liusuyi
 * @date 2024年10月26日11:54
 **/
@Data
public class BoxPowerStatusReplyCmd extends BaseCmd {
    private final byte status; // 时间戳
    public BoxPowerStatusReplyCmd(byte status) {
        setDataHeader((short) 0x6A77);  // 设置帧头
        setCmdCode((byte) 0x0A);        // 设置指令编号
        setDataLength((short) 17);      // 数据长度
        this.status = status;
    }
    public void encode(ByteBuf out) {
    }
}
ard-work/src/main/java/com/ard/tianyu/netty/command/notice/FlyWayEndReplyCmd.java
New file
@@ -0,0 +1,32 @@
package com.ard.tianyu.netty.command.notice;
import com.ard.tianyu.netty.command.BaseCmd;
import io.netty.buffer.ByteBuf;
import lombok.Data;
/**
 * 航线结束通知回复指令
 *
 * @author liusuyi
 * @date 2024年10月26日11:54
 **/
@Data
public class FlyWayEndReplyCmd extends BaseCmd {
    private final byte encryptFlag = 0x00;  // 加密标志
    private final byte actionCode = 0x2E;   // 动作编号
    private final byte result;              // 执行结果
    private final int errorCode;            // 错误码
    public FlyWayEndReplyCmd(String boxSn, byte result, int errorCode) {
        setDataHeader((short) 0x6A77);      // 设置帧头
        setCmdCode((byte) 0x3D);            // 设置指令编号
        setDataLength((short) 23);          // 数据长度
        this.result = result;
        this.errorCode = errorCode;
        setBoxSn(boxSn.getBytes());
    }
    public void encode(ByteBuf out) {
    }
}
ard-work/src/main/java/com/ard/tianyu/netty/command/notice/UavReadyReplyCmd.java
New file
@@ -0,0 +1,36 @@
package com.ard.tianyu.netty.command.notice;
import com.ard.tianyu.netty.command.BaseCmd;
import io.netty.buffer.ByteBuf;
import lombok.Data;
/**
 * 无人机准备完成通知回复指令
 *
 * @author liusuyi
 * @date 2024年10月26日11:54
 **/
@Data
public class UavReadyReplyCmd extends BaseCmd {
    private final byte encryptFlag = 0x00;  // 加密标志
    private final byte actionCode = 0x3D;   // 动作编号
    private final byte batteryPower;        // 电池电量
    private final double longitude;         // 经度
    private final double latitude;          // 纬度
    private final int altitude;             // 海拔高度
    public UavReadyReplyCmd(String boxSn,byte batteryPower,double longitude,double latitude,int altitude) {
        setDataHeader((short) 0x6A77);      // 设置帧头
        setCmdCode((byte) 0x3D);            // 设置指令编号
        setDataLength((short) 39);          // 数据长度
        this.batteryPower = batteryPower;
        this.longitude = longitude;
        this.latitude = latitude;
        this.altitude = altitude;
        setBoxSn(boxSn.getBytes());
    }
    public void encode(ByteBuf out) {
    }
}
ard-work/src/main/java/com/ard/tianyu/netty/command/real/SignalInfoCmd.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/netty/command/real/SignalInfoCommand.java
@@ -1,17 +1,17 @@
package com.ard.tianyu.netty.command.real;
import com.ard.tianyu.netty.command.BaseCommand;
import com.ard.tianyu.netty.command.BaseCmd;
import com.ard.tianyu.netty.protobuf.TelemetryDataPB;
import io.netty.buffer.ByteBuf;
import lombok.Data;
@Data
public class SignalInfoCommand extends BaseCommand {
public class SignalInfoCmd extends BaseCmd {
    private int delayTime;
    private TelemetryDataPB.SignalInfo signalInfo;
    // 构造函数
    public SignalInfoCommand(TelemetryDataPB.SignalInfo signalInfo) {
    public SignalInfoCmd(TelemetryDataPB.SignalInfo signalInfo) {
        setDataHeader((short) 0x6A77); // 设置帧头
       // setDataLength((short) (1 + uavState.toByteArray().length)); // 数据长度
        setCmdCode((byte) 0x0C); // 设置命令编号
ard-work/src/main/java/com/ard/tianyu/netty/command/real/UavStateCmd.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/netty/command/real/UavStateCommand.java
@@ -1,14 +1,14 @@
package com.ard.tianyu.netty.command.real;
import com.ard.tianyu.netty.command.BaseCommand;
import com.ard.tianyu.netty.command.BaseCmd;
import com.ard.tianyu.netty.protobuf.TelemetryDataPB;
import io.netty.buffer.ByteBuf;
public class UavStateCommand extends BaseCommand {
public class UavStateCmd extends BaseCmd {
    private TelemetryDataPB.UavState uavState;  // ProtoBuf 数据类
    // 构造函数
    public UavStateCommand(TelemetryDataPB.UavState uavState) {
    public UavStateCmd(TelemetryDataPB.UavState uavState) {
        setDataHeader((short) 0x6A77); // 设置帧头
       // setDataLength((short) (1 + uavState.toByteArray().length)); // 数据长度
        setCmdCode((byte) 0xA8); // 设置命令编号
ard-work/src/main/java/com/ard/tianyu/netty/command/real/UavTelemetryDataCmd.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/netty/command/real/UavTelemetryDataCommand.java
@@ -1,6 +1,6 @@
package com.ard.tianyu.netty.command.real;
import com.ard.tianyu.netty.command.BaseCommand;
import com.ard.tianyu.netty.command.BaseCmd;
import com.ard.tianyu.netty.protobuf.TelemetryDataPB;
import io.netty.buffer.ByteBuf;
@@ -10,10 +10,10 @@
 * @author liusuyi
 * @date 2024年10月23日9:33
 **/
public class UavTelemetryDataCommand extends BaseCommand {
public class UavTelemetryDataCmd extends BaseCmd {
    private TelemetryDataPB.TelemetryData telemetryData;
    // 构造函数
    public UavTelemetryDataCommand(TelemetryDataPB.TelemetryData telemetryData) {
    public UavTelemetryDataCmd(TelemetryDataPB.TelemetryData telemetryData) {
        setDataHeader((short) 0x6A77); // 设置帧头
        // setDataLength((short) (1 + uavState.toByteArray().length)); // 数据长度
        setCmdCode((byte) 0xA9); // 设置命令编号
ard-work/src/main/java/com/ard/tianyu/netty/command/register/HeartbeatCmd.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/netty/command/register/HeartbeatCommand.java
@@ -1,6 +1,6 @@
package com.ard.tianyu.netty.command.register;
import com.ard.tianyu.netty.command.BaseCommand;
import com.ard.tianyu.netty.command.BaseCmd;
import io.netty.buffer.ByteBuf;
/**
@@ -9,11 +9,11 @@
 * @author 刘苏义
 * @date 2024/10/22 16:36
 */
public class HeartbeatCommand extends BaseCommand {
public class HeartbeatCmd extends BaseCmd {
    private final long timestamp;
    public HeartbeatCommand(long timestamp) {
    public HeartbeatCmd(long timestamp) {
        setDataHeader((short)0x7479);
        setDataLength((short)0x09);
        setCmdCode((byte)0x02);
ard-work/src/main/java/com/ard/tianyu/netty/command/register/HeartbeatReplyCmd.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/netty/command/register/HeartbeatReplyCommand.java
@@ -1,6 +1,6 @@
package com.ard.tianyu.netty.command.register;
import com.ard.tianyu.netty.command.BaseCommand;
import com.ard.tianyu.netty.command.BaseCmd;
import io.netty.buffer.ByteBuf;
import lombok.Data;
import lombok.NoArgsConstructor;
@@ -13,11 +13,11 @@
 */
@Data
@NoArgsConstructor
public class HeartbeatReplyCommand extends BaseCommand {
public class HeartbeatReplyCmd extends BaseCmd {
    private long timestamp; // 时间戳
    public HeartbeatReplyCommand(long timestamp) {
    public HeartbeatReplyCmd(long timestamp) {
        setDataHeader((short) 0x6A77); // 设置帧头
        setCmdCode((byte) 0x02); // 设置指令编号
        setDataLength((short) (13)); // 数据长度 (指令编号 + 时间戳)
ard-work/src/main/java/com/ard/tianyu/netty/command/register/RegisterCmd.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/netty/command/register/RegisterCommand.java
@@ -1,6 +1,6 @@
package com.ard.tianyu.netty.command.register;// RegisterMessage.java
import com.ard.tianyu.netty.command.BaseCommand;
import com.ard.tianyu.netty.command.BaseCmd;
import io.netty.buffer.ByteBuf;
/**
@@ -9,11 +9,11 @@
 * @author 刘苏义
 * @date 2024/10/22 16:36
 */
public class RegisterCommand extends BaseCommand {
public class RegisterCmd extends BaseCmd {
    private int userId;
    private byte[] accessToken;
    public RegisterCommand(int userId, byte[] accessToken) {
    public RegisterCmd(int userId, byte[] accessToken) {
        setDataHeader((short) 0x7479); // 设置帧头
        setDataLength((short) (5 + accessToken.length)); // 数据长度
        setCmdCode((byte) 0x01); // 设置命令编号
ard-work/src/main/java/com/ard/tianyu/netty/command/register/RegisterReplyCmd.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/netty/command/register/RegisterReplyCommand.java
@@ -1,6 +1,6 @@
package com.ard.tianyu.netty.command.register;// RegisterMessage.java
import com.ard.tianyu.netty.command.BaseCommand;
import com.ard.tianyu.netty.command.BaseCmd;
import io.netty.buffer.ByteBuf;
import lombok.Data;
@@ -11,10 +11,10 @@
 * @date 2024/10/22 16:36
 */
@Data
public class RegisterReplyCommand extends BaseCommand {
public class RegisterReplyCmd extends BaseCmd {
    private byte success;
    public RegisterReplyCommand(byte success) {
    public RegisterReplyCmd(byte success) {
        setDataHeader((short) 0x6A77); // 设置帧头
        setDataLength((short) (6)); // 数据长度
        setCmdCode((byte) 0x01); // 设置命令编号
ard-work/src/main/java/com/ard/tianyu/netty/command/register/UavInitInfoCmd.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/netty/command/register/UavInitInfoCommand.java
@@ -1,6 +1,6 @@
package com.ard.tianyu.netty.command.register;
import com.ard.tianyu.netty.command.BaseCommand;
import com.ard.tianyu.netty.command.BaseCmd;
import io.netty.buffer.ByteBuf;
import lombok.Data;
@@ -12,13 +12,13 @@
 */
@Data
public class UavInitInfoCommand extends BaseCommand {
public class UavInitInfoCmd extends BaseCmd {
    private final byte encryptFlag; // 加密标志
    private final byte actionCode; // 动作编号
    private final byte result; // 执行结果
    public UavInitInfoCommand(byte[] boxSn) {
    public UavInitInfoCmd(byte[] boxSn) {
        setDataHeader((short) 0x7479);
        setDataLength((short) 19);
        setCmdCode((byte) 0xD1);
ard-work/src/main/java/com/ard/tianyu/netty/command/register/UavInitReplyCmd.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/netty/command/register/UavReadyNotificationCommand.java
@@ -1,6 +1,6 @@
package com.ard.tianyu.netty.command.register;
import com.ard.tianyu.netty.command.BaseCommand;
import com.ard.tianyu.netty.command.BaseCmd;
import com.ard.tianyu.netty.protobuf.TelemetryDataPB;
import io.netty.buffer.ByteBuf;
import lombok.Data;
@@ -12,19 +12,17 @@
 * @date 2024/10/24 17:18
 */
@Data
public class UavReadyNotificationCommand extends BaseCommand {
public class UavInitReplyCmd extends BaseCmd {
    private byte actionCode;
    private byte actionCode = 0x42;
    private TelemetryDataPB.UavInitInfo uavInitInfo;
    public UavReadyNotificationCommand(String boxSn, TelemetryDataPB.UavInitInfo uavInitInfo, byte actionCode) {
    public UavInitReplyCmd(String boxSn, TelemetryDataPB.UavInitInfo uavInitInfo) {
        setDataHeader((short) 0x6A77); // 设置帧头
        // setDataLength((short) (1 + uavState.toByteArray().length)); // 数据长度
        setBoxSn(boxSn.getBytes());
        setCmdCode((byte) 0xD1); // 设置命令编号
        this.uavInitInfo = uavInitInfo;
        this.actionCode = actionCode;
    }
    @Override
ard-work/src/main/java/com/ard/tianyu/netty/handler/ClientHandler.java
@@ -1,7 +1,7 @@
package com.ard.tianyu.netty.handler;
import com.ard.tianyu.netty.TyNettyTcpClient;
import com.ard.tianyu.netty.command.BaseCommand;
import com.ard.tianyu.netty.command.BaseCmd;
import com.ard.tianyu.service.ITyService;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
@@ -18,7 +18,7 @@
@Component
@Slf4j
@ChannelHandler.Sharable
public class ClientHandler extends SimpleChannelInboundHandler<BaseCommand> {
public class ClientHandler extends SimpleChannelInboundHandler<BaseCmd> {
    @Resource
    private ITyService tyService;
@@ -27,7 +27,7 @@
    private TyNettyTcpClient tyNettyTcpClient;
    @Override
    public void channelRead0(ChannelHandlerContext ctx, BaseCommand command) {
    public void channelRead0(ChannelHandlerContext ctx, BaseCmd command) {
        InetSocketAddress ipSocket = (InetSocketAddress) ctx.channel().remoteAddress();
        String host = ipSocket.getHostString();
        int port = ipSocket.getPort();
ard-work/src/main/java/com/ard/tianyu/netty/handler/MessageProtocolDecoder.java
@@ -1,16 +1,19 @@
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;
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.command.camera.CameraModeReplyCmd;
import com.ard.tianyu.netty.command.camera.CapturePicReplyCmd;
import com.ard.tianyu.netty.command.camera.RecordStartReplyCmd;
import com.ard.tianyu.netty.command.camera.RecordStopReplyCmd;
import com.ard.tianyu.netty.command.notice.BoxPowerStatusReplyCmd;
import com.ard.tianyu.netty.command.notice.FlyWayEndReplyCmd;
import com.ard.tianyu.netty.command.notice.UavReadyReplyCmd;
import com.ard.tianyu.netty.command.real.SignalInfoCmd;
import com.ard.tianyu.netty.command.real.UavStateCmd;
import com.ard.tianyu.netty.command.real.UavTelemetryDataCmd;
import com.ard.tianyu.netty.command.register.HeartbeatReplyCmd;
import com.ard.tianyu.netty.command.register.RegisterReplyCmd;
import com.ard.tianyu.netty.command.register.UavInitReplyCmd;
import com.ard.tianyu.netty.protobuf.TelemetryDataPB;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
@@ -40,33 +43,38 @@
            return;
        }
        byte cmdCode = in.readByte();
        BaseCommand baseCommand = null;
        BaseCmd baseCmd = null;
        switch (cmdCode) {
            case 0x01:
                byte success = in.readByte(); // 读取是否成功
                log.warn("注册回复: {}", success == 0x01 ? "成功" : "失败");
                baseCommand = new RegisterReplyCommand(success);
                baseCmd = new RegisterReplyCmd(success);
                break;
            case 0x02:
                long timestamp = in.readLong(); // 读取时间戳
                baseCommand = new HeartbeatReplyCommand(timestamp);
                baseCmd = new HeartbeatReplyCmd(timestamp);
                log.debug("心跳回复: 时间戳 {}", timestamp);
                break;
            case 0x03:
            case 0x04:
                break;
            case 0x0A:
                byte status = in.readByte();
                baseCmd = new BoxPowerStatusReplyCmd(status);
                log.debug("云盒开机/关机通知回复: 状态 {}", String.format("0x%02X", status & 0xFF));
                break;
            case (byte) 0xA8:
                byte[] uavStatus = new byte[dataLength - 1];
                in.readBytes(uavStatus);  // 读取 ProtoBuf 数据
                TelemetryDataPB.UavState uavState = TelemetryDataPB.UavState.parseFrom(uavStatus);
                baseCommand = new UavStateCommand(uavState);
                baseCmd = new UavStateCmd(uavState);
                log.debug("无人机状态数据: {}", uavState.getBoxSn());
                break;
            case (byte) 0xA9:
                byte[] uavData = new byte[dataLength - 1];
                in.readBytes(uavData);
                TelemetryDataPB.TelemetryData telemetryData = TelemetryDataPB.TelemetryData.parseFrom(uavData);
                baseCommand = new UavTelemetryDataCommand(telemetryData);
                baseCmd = new UavTelemetryDataCmd(telemetryData);
                log.debug("遥测数据: {}", telemetryData.getBoxSn());
                break;
            case (byte) 0x0C:
@@ -77,7 +85,7 @@
                uavData = new byte[dataLength - 20];
                in.readBytes(uavData);
                TelemetryDataPB.SignalInfo signalInfo = TelemetryDataPB.SignalInfo.parseFrom(uavData);
                baseCommand = new SignalInfoCommand(signalInfo);
                baseCmd = new SignalInfoCmd(signalInfo);
                log.debug("信道质量数据: {}", delayTime);
                break;
            case (byte) 0xD1:
@@ -90,7 +98,7 @@
                        uavData = new byte[15];
                        in.readBytes(uavData);
                        String boxSn = new String(uavData);
                        baseCommand = new CameraModeReplyCommand(boxSn, result, errorCode);
                        baseCmd = new CameraModeReplyCmd(boxSn, result, errorCode);
                        log.debug("设置相机模式回复: {}", boxSn);
                        break;
                    case 0x23:
@@ -99,7 +107,7 @@
                        uavData = new byte[15];
                        in.readBytes(uavData);
                        boxSn = new String(uavData);
                        baseCommand = new CapturePicReplyCommand(boxSn, result, errorCode);
                        baseCmd = new CapturePicReplyCmd(boxSn, result, errorCode);
                        log.debug("拍照回复: {}", boxSn);
                        break;
                    case 0x24:
@@ -108,7 +116,7 @@
                        uavData = new byte[15];
                        in.readBytes(uavData);
                        boxSn = new String(uavData);
                        baseCommand = new RecordStartReplyCommand(boxSn, result, errorCode);
                        baseCmd = new RecordStartReplyCmd(boxSn, result, errorCode);
                        log.debug("开始录像回复: {}", boxSn);
                        break;
                    case 0x25:
@@ -117,8 +125,28 @@
                        uavData = new byte[15];
                        in.readBytes(uavData);
                        boxSn = new String(uavData);
                        baseCommand = new RecordStopReplyCommand(boxSn, result, errorCode);
                        baseCmd = new RecordStopReplyCmd(boxSn, result, errorCode);
                        log.debug("停止录像回复: {}", boxSn);
                        break;
                    case 0x2E:
                        result = in.readByte();
                        errorCode = in.readInt();
                        uavData = new byte[15];
                        in.readBytes(uavData);
                        boxSn = new String(uavData);
                        baseCmd = new FlyWayEndReplyCmd(boxSn, result, errorCode);
                        log.debug("航线结束通知回复: {}", boxSn);
                        break;
                    case 0x3D:
                        byte batteryPower = in.readByte();
                        double longitude = in.readDouble();
                        double latitude = in.readDouble();
                        int altitude = in.readInt();
                        uavData = new byte[dataLength - 24];
                        in.readBytes(uavData);
                        boxSn = new String(uavData);
                        baseCmd = new UavReadyReplyCmd(boxSn, batteryPower, longitude, latitude, altitude);
                        log.debug("无人机准备完成通知回复: 电池电量 {}", String.format("0x%02X", batteryPower & 0xFF));
                        break;
                    case 0x42:
                        byte[] uavData1 = new byte[dataLength - 18];
@@ -127,7 +155,7 @@
                        in.readBytes(uavData2);
                        boxSn = new String(uavData2);
                        TelemetryDataPB.UavInitInfo uavInitInfo = TelemetryDataPB.UavInitInfo.parseFrom(uavData1);
                        baseCommand = new UavReadyNotificationCommand(boxSn, uavInitInfo, actionCode);
                        baseCmd = new UavInitReplyCmd(boxSn, uavInitInfo);
                        log.debug("无人机初始化数据: {}", boxSn);
                        break;
                    default:
@@ -144,8 +172,8 @@
                        String.format("0x%02X", actionCode & 0xFF));//String.format("0x%02X", cmdCode & 0xFF)
        }
        if (baseCommand != null) {
            out.add(baseCommand);
        if (baseCmd != null) {
            out.add(baseCmd);
        }
    }
}
ard-work/src/main/java/com/ard/tianyu/netty/handler/MessageProtocolEncoder.java
@@ -1,17 +1,15 @@
package com.ard.tianyu.netty.handler;// MessageProtocolEncoder.java
import com.ard.tianyu.netty.command.BaseCommand;
import com.ard.tianyu.netty.command.BaseCmd;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;
import lombok.extern.slf4j.Slf4j;
import java.util.Arrays;
@Slf4j
public class MessageProtocolEncoder extends MessageToByteEncoder<BaseCommand> {
public class MessageProtocolEncoder extends MessageToByteEncoder<BaseCmd> {
    @Override
    protected void encode(ChannelHandlerContext ctx, BaseCommand command, ByteBuf out) throws Exception {
    protected void encode(ChannelHandlerContext ctx, BaseCmd command, ByteBuf out) throws Exception {
        command.encode(out); // 编码具体负载
        // 打印
ard-work/src/main/java/com/ard/tianyu/service/ITyService.java
@@ -3,9 +3,7 @@
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.CameraModeDTO;
import com.ard.tianyu.model.dto.camera.CapturePicDTO;
import com.ard.tianyu.model.dto.camera.RecordDTO;
import com.ard.tianyu.model.dto.camera.*;
import com.ard.tianyu.model.dto.control.AbsAngleControlDTO;
import com.ard.tianyu.model.dto.control.AngleControlDTO;
import com.ard.tianyu.model.dto.control.SpeedControlDTO;
@@ -13,7 +11,7 @@
import com.ard.tianyu.model.dto.state.UavState;
import com.ard.tianyu.model.dto.telemetry.TelemetryData;
import com.ard.tianyu.model.receiver.*;
import com.ard.tianyu.netty.command.BaseCommand;
import com.ard.tianyu.netty.command.BaseCmd;
import com.dtflys.forest.annotation.Var;
import java.util.List;
@@ -99,6 +97,31 @@
    void record(RecordDTO recordDto);
    /**
     * 变倍
     */
    void zoom(ZoomDTO zoomDTO);
    /**
     * 变倍到指定倍数
     */
    void zoomToLevel(ZoomToLevelDTO zoomToLevelDTO);
    /**
     * 切换摄像头
     */
    void switchCamera(SwitchCameraDTO switchCameraDTO);
    /**
     * 切换视频源
     */
    void switchSource(SwitchSourceDTO switchSourceDTO);
    /**
     * 打开或关闭照片回传
     */
    void photoReturnToggle(PhotoReturnToggleDTO photoReturnToggleDTO);
    /**
     * 获取无人机状态
     */
    UavState getUavState(String boxSn);
@@ -116,5 +139,5 @@
    /**
     * 解析天宇服务端发来的消息
     */
    void processMessage(String key, BaseCommand tyMessage);
    void processMessage(String key, BaseCmd tyMessage);
}
ard-work/src/main/java/com/ard/tianyu/service/impl/TyServiceImpl.java
@@ -8,9 +8,7 @@
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.CameraModeDTO;
import com.ard.tianyu.model.dto.camera.CapturePicDTO;
import com.ard.tianyu.model.dto.camera.RecordDTO;
import com.ard.tianyu.model.dto.camera.*;
import com.ard.tianyu.model.dto.control.AbsAngleControlDTO;
import com.ard.tianyu.model.dto.control.AngleControlDTO;
import com.ard.tianyu.model.dto.control.SpeedControlDTO;
@@ -24,12 +22,15 @@
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.control.AbsAngleControlCmd;
import com.ard.tianyu.netty.command.control.AngleControlCmd;
import com.ard.tianyu.netty.command.control.SpeedControlCmd;
import com.ard.tianyu.netty.command.notice.BoxPowerStatusReplyCmd;
import com.ard.tianyu.netty.command.notice.FlyWayEndReplyCmd;
import com.ard.tianyu.netty.command.notice.UavReadyReplyCmd;
import com.ard.tianyu.netty.command.real.SignalInfoCmd;
import com.ard.tianyu.netty.command.real.UavStateCmd;
import com.ard.tianyu.netty.command.real.UavTelemetryDataCmd;
import com.ard.tianyu.netty.command.register.*;
import com.ard.tianyu.service.ITyService;
import io.netty.channel.Channel;
@@ -135,15 +136,14 @@
    @Override
    public void registerMessage() {
        AccessTokenReceiver tyToken = tyConfiguration.getAccessToken();
        RegisterCommand registerMessage = new RegisterCommand(tyToken.getCompanyId(), tyToken.getAccessToken().getBytes());
        RegisterCmd registerMessage = new RegisterCmd(tyToken.getCompanyId(), tyToken.getAccessToken().getBytes());
        this.sendMessage(tyConfiguration.getIpPort(), registerMessage);
    }
    /**
     * 发送消息
     */
    public void sendMessage(String key, BaseCommand msg) {
    public void sendMessage(String key, BaseCmd msg) {
        try {
            ChannelFuture future = TyNettyTcpClient.channels.get(key).getChannelFuture();
            Channel channel = future.channel();
@@ -166,7 +166,7 @@
     */
    @Override
    public void angleControl(AngleControlDTO angleControlDto) {
        AngleControlCommand controlAngleCommand = new AngleControlCommand(angleControlDto);
        AngleControlCmd controlAngleCommand = new AngleControlCmd(angleControlDto);
        this.sendMessage(tyConfiguration.getIpPort(), controlAngleCommand);
    }
@@ -175,7 +175,7 @@
     */
    @Override
    public void absAngleControl(AbsAngleControlDTO absAngleControlDto) {
        AbsAngleControlCommand absAngleControlCommand = new AbsAngleControlCommand(absAngleControlDto);
        AbsAngleControlCmd absAngleControlCommand = new AbsAngleControlCmd(absAngleControlDto);
        this.sendMessage(tyConfiguration.getIpPort(), absAngleControlCommand);
    }
@@ -184,7 +184,7 @@
     */
    @Override
    public void speedControl(SpeedControlDTO speedControlDto) {
        SpeedControlCommand speedControlCommand = new SpeedControlCommand(speedControlDto);
        SpeedControlCmd speedControlCommand = new SpeedControlCmd(speedControlDto);
        this.sendMessage(tyConfiguration.getIpPort(), speedControlCommand);
    }
@@ -193,7 +193,7 @@
     */
    @Override
    public void updateCameraMode(CameraModeDTO cameraModeDTO) {
        CameraModeCommand cameraModeCommand = new CameraModeCommand(cameraModeDTO);
        CameraModeCmd cameraModeCommand = new CameraModeCmd(cameraModeDTO);
        this.sendMessage(tyConfiguration.getIpPort(), cameraModeCommand);
    }
@@ -202,8 +202,8 @@
     */
    @Override
    public void capturePic(CapturePicDTO capturePicDto) {
        updateCameraMode(CameraModeDTO.builder().boxSn(capturePicDto.getBoxSn()).actionParam((byte)0x01).build());
        CapturePicCommand capturePicCommand = new CapturePicCommand(capturePicDto);
        updateCameraMode(CameraModeDTO.builder().boxSn(capturePicDto.getBoxSn()).actionParam((byte) 0x01).build());
        CapturePicCmd capturePicCommand = new CapturePicCmd(capturePicDto);
        this.sendMessage(tyConfiguration.getIpPort(), capturePicCommand);
    }
@@ -212,14 +212,59 @@
     */
    @Override
    public void record(RecordDTO recordDto) {
        BaseCommand baseCommand;
        BaseCmd baseCmd;
        if (recordDto.getIsRecord()) {
            updateCameraMode(CameraModeDTO.builder().boxSn(recordDto.getBoxSn()).actionParam((byte)0x02).build());
            baseCommand = new RecordStartCommand(recordDto);
            updateCameraMode(CameraModeDTO.builder().boxSn(recordDto.getBoxSn()).actionParam((byte) 0x02).build());
            baseCmd = new RecordStartCmd(recordDto);
        } else {
            baseCommand = new RecordStopCommand(recordDto);
            baseCmd = new RecordStopCmd(recordDto);
        }
        this.sendMessage(tyConfiguration.getIpPort(), baseCommand);
        this.sendMessage(tyConfiguration.getIpPort(), baseCmd);
    }
    /**
     * 变倍
     */
    @Override
    public void zoom(ZoomDTO zoomDTO) {
        ZoomCmd zoomCommand = new ZoomCmd(zoomDTO);
        this.sendMessage(tyConfiguration.getIpPort(), zoomCommand);
    }
    /**
     * 变倍到指定倍数
     */
    @Override
    public void zoomToLevel(ZoomToLevelDTO zoomToLevelDTO) {
        ZoomToLevelCmd zoomToLevelCommand = new ZoomToLevelCmd(zoomToLevelDTO);
        this.sendMessage(tyConfiguration.getIpPort(), zoomToLevelCommand);
    }
    /**
     * 切换摄像头
     */
    @Override
    public void switchCamera(SwitchCameraDTO switchCameraDTO) {
        SwitchCameraCmd switchCameraCmd = new SwitchCameraCmd(switchCameraDTO);
        this.sendMessage(tyConfiguration.getIpPort(), switchCameraCmd);
    }
    /**
     * 切换视频源
     */
    @Override
    public void switchSource(SwitchSourceDTO switchSourceDTO) {
        SwitchSourceCmd switchSourceCmd = new SwitchSourceCmd(switchSourceDTO);
        this.sendMessage(tyConfiguration.getIpPort(), switchSourceCmd);
    }
    /**
     * 打开或关闭照片回传
     */
    @Override
    public void photoReturnToggle(PhotoReturnToggleDTO photoReturnToggleDTO) {
        PhotoReturnToggleCmd photoReturnToggleCmd = new PhotoReturnToggleCmd(photoReturnToggleDTO);
        this.sendMessage(tyConfiguration.getIpPort(), photoReturnToggleCmd);
    }
    /**
@@ -246,14 +291,17 @@
        return UavSignalInfoCache.getUavSignalInfo(boxSn);
    }
    /**
     * 处理天宇服务器返回的消息
     */
    @Override
    public void processMessage(String key, BaseCommand tyCommand) {
    public void processMessage(String key, BaseCmd tyCommand) {
        byte cmdCode = tyCommand.getCmdCode();
        switch (cmdCode) {
            case 0x01:
                // 处理心跳消息
                RegisterReplyCommand registerReplyCommand = (RegisterReplyCommand) tyCommand;
                log.info("收到注册消息-->处理注册消息{}", registerReplyCommand.getSuccess());
                RegisterReplyCmd registerReplyCommand = (RegisterReplyCmd) tyCommand;
                log.debug("收到注册消息-->处理注册消息:{}", registerReplyCommand.getSuccess());
                if (registerReplyCommand.getSuccess() != 1) {
                    // 注册失败,重新注册
                    log.info("注册失败,重新注册");
@@ -262,8 +310,8 @@
                break;
            case 0x02:
                // 处理注册消息
                HeartbeatReplyCommand heartbeatReplyCommand = (HeartbeatReplyCommand) tyCommand;
                log.debug("收到心跳消息-->处理心跳消息{}", heartbeatReplyCommand.getTimestamp());
                HeartbeatReplyCmd heartbeatReplyCmd = (HeartbeatReplyCmd) tyCommand;
                log.debug("收到心跳消息-->处理心跳消息:{}", heartbeatReplyCmd.getTimestamp());
                break;
            case 0x03:
                // 处理订阅消息
@@ -271,62 +319,63 @@
            case 0x04:
                // 处理取消订阅消息
                break;
            case 0x0A:
                // 处理云盒开关机通知消息
                BoxPowerStatusReplyCmd boxPowerStatusReplyCmd = (BoxPowerStatusReplyCmd) tyCommand;
                log.debug("收到云盒开关机通知消息-->状态:{}", boxPowerStatusReplyCmd.getStatus());
                break;
            case (byte) 0xA8:
                // 处理无人机状态消息
                log.debug("收到无人机状态消息-->无人机状态消息");
                UavStateCommand uavStateCommand = (UavStateCommand) tyCommand;
                UavState uavState = UavStateConverter.convertProtoToEntity(uavStateCommand.getUavState());
                UavStateCmd uavStateCmd = (UavStateCmd) tyCommand;
                UavState uavState = UavStateConverter.convertProtoToEntity(uavStateCmd.getUavState());
                UavStateCache.putUavState(uavState);
                break;
            case (byte) 0xA9:
                // 处理无人机遥测消息
                log.debug("收到无人机遥测消息-->无人机遥测消息");
                UavTelemetryDataCommand uavTelemetryDataCommand = (UavTelemetryDataCommand) tyCommand;
                TelemetryData telemetryData = UavTelemetryDataConverter.convertProtoToEntity(uavTelemetryDataCommand.getTelemetryData());
                UavTelemetryDataCmd uavTelemetryDataCmd = (UavTelemetryDataCmd) tyCommand;
                TelemetryData telemetryData = UavTelemetryDataConverter.convertProtoToEntity(uavTelemetryDataCmd.getTelemetryData());
                UavTelemetryDataCache.putUavTelemetryData(telemetryData);
                break;
            case (byte) 0x0C:
                // 处理无人机信道质量数据
                log.debug("收到无人机信道质量数据消息-->无人机信道质量数据消息");
                SignalInfoCommand signalInfoCommand = (SignalInfoCommand) tyCommand;
                SignalInfo signalInfo = UavSignalInfoConverter.convertProtoToEntity(signalInfoCommand.getSignalInfo());
                SignalInfoCmd signalInfoCmd = (SignalInfoCmd) tyCommand;
                SignalInfo signalInfo = UavSignalInfoConverter.convertProtoToEntity(signalInfoCmd.getSignalInfo());
                UavSignalInfoCache.putUavSignalInfoCache(signalInfo);
                break;
            case (byte) 0xD1:
                // 处理无人机
                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 UavInitReplyCmd) {
                    UavInitReplyCmd uavInitReplyCmd = (UavInitReplyCmd) tyCommand;
                    UavInitInfoCmd uavInitCommand = new UavInitInfoCmd(uavInitReplyCmd.getBoxSn());
                    this.sendMessage(tyConfiguration.getIpPort(), uavInitCommand);
                    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 UavReadyReplyCmd) {
                    UavReadyReplyCmd uavReadyReplyCmd = (UavReadyReplyCmd) tyCommand;
                    log.info("收到无人机准备完成通知,电池电量{} 经度{} 纬度{} 海拔{}",uavReadyReplyCmd.getBatteryPower(),uavReadyReplyCmd.getLongitude(),uavReadyReplyCmd.getLatitude(),uavReadyReplyCmd.getAltitude());
                }
                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 CameraModeReplyCmd) {
                    CameraModeReplyCmd cameraModeReplyCommand = (CameraModeReplyCmd) tyCommand;
                    log.info("收到无人机设置相机模式回复:{} 错误码:{}", String.format("0x%02X", cameraModeReplyCommand.getResult() & 0xFF), cameraModeReplyCommand.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 FlyWayEndReplyCmd) {
                    FlyWayEndReplyCmd flyWayEndReplyCmd = (FlyWayEndReplyCmd) tyCommand;
                    log.info("收到无人机飞行结束通知:状态:{}",flyWayEndReplyCmd.getResult());
                }
                if (tyCommand instanceof RecordStopReplyCommand) {
                    RecordStopReplyCommand recordStopReplyCommand = (RecordStopReplyCommand) tyCommand;
                    if (recordStopReplyCommand.getActionCode() == (byte) 0x25) {
                        log.info("收到无人机停止录像回复:{} 错误码:{}", String.format("0x%02X", recordStopReplyCommand.getResult() & 0xFF), recordStopReplyCommand.getErrorCode());
                    }
                if (tyCommand instanceof CapturePicReplyCmd) {
                    CapturePicReplyCmd capturePicReplyCommand = (CapturePicReplyCmd) tyCommand;
                    log.info("收到无人机拍照回复:{} 错误码:{}", String.format("0x%02X", capturePicReplyCommand.getResult() & 0xFF), capturePicReplyCommand.getErrorCode());
                }
                if (tyCommand instanceof RecordStartReplyCmd) {
                    RecordStartReplyCmd recordStartReplyCommand = (RecordStartReplyCmd) tyCommand;
                    log.info("收到无人机开始录像回复:{} 错误码:{}", String.format("0x%02X", recordStartReplyCommand.getResult() & 0xFF), recordStartReplyCommand.getErrorCode());
                }
                if (tyCommand instanceof RecordStopReplyCmd) {
                    RecordStopReplyCmd recordStopReplyCommand = (RecordStopReplyCmd) tyCommand;
                    log.info("收到无人机停止录像回复:{} 错误码:{}", String.format("0x%02X", recordStopReplyCommand.getResult() & 0xFF), recordStopReplyCommand.getErrorCode());
                }
                break;
            default:
@@ -339,7 +388,7 @@
    public void sendHeartBeat() {
        long timestamp = System.currentTimeMillis();
        log.debug("定时向天宇发送⼼跳,时间戳{}", timestamp);
        HeartbeatCommand heartbeatMessage = new HeartbeatCommand(timestamp);
        HeartbeatCmd heartbeatMessage = new HeartbeatCmd(timestamp);
        this.sendMessage(tyConfiguration.getIpPort(), heartbeatMessage);
    }
}