From fddccbf217223e7287d6861c3020d9ba5cc15e55 Mon Sep 17 00:00:00 2001
From: liusuyi <1951119284@qq.com>
Date: Fri, 25 Oct 2024 15:42:19 +0800
Subject: [PATCH] 优化

---
 ard-work/src/main/java/com/ard/tianyu/model/dto/control/AbsAngleControlDto.java               |   37 +++
 ard-work/src/main/java/com/ard/tianyu/netty/handler/MessageProtocolDecoder.java               |   38 +++
 ard-work/src/main/java/com/ard/tianyu/netty/command/real/UavTelemetryDataCommand.java         |    5 
 ard-work/src/main/java/com/ard/tianyu/service/impl/TyServiceImpl.java                         |   87 ++++++
 ard-work/src/main/java/com/ard/tianyu/model/dto/camera/CapturePicDto.java                     |   22 +
 ard-work/src/main/java/com/ard/tianyu/netty/command/control/AbsAngleControlCommand.java       |   45 +++
 ard-work/src/main/java/com/ard/tianyu/netty/command/register/RegisterReplyCommand.java        |    3 
 ard-work/src/main/java/com/ard/tianyu/netty/command/register/HeartbeatCommand.java            |    3 
 ard-work/src/main/java/com/ard/tianyu/model/dto/control/AngleControlDto.java                  |   29 ++
 ard-work/src/main/java/com/ard/tianyu/netty/command/register/UavInitInfoCommand.java          |    3 
 ard-work/src/main/java/com/ard/tianyu/netty/command/control/AngleControlCommand.java          |   20 
 ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStopReplyCommand.java        |   32 ++
 ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStopCommand.java             |   36 +++
 ard-work/src/main/java/com/ard/tianyu/netty/command/real/SignalInfoCommand.java               |    3 
 ard-work/src/main/java/com/ard/tianyu/netty/command/camera/CapturePicReplyCommand.java        |   32 ++
 ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStartCommand.java            |   36 +++
 ard-work/src/main/java/com/ard/tianyu/netty/command/register/UavReadyNotificationCommand.java |    3 
 ard-work/src/main/java/com/ard/tianyu/model/dto/camera/RecordDto.java                         |   23 +
 ard-work/src/main/java/com/ard/tianyu/netty/command/camera/CapturePicCommand.java             |   35 ++
 ard-work/src/main/java/com/ard/tianyu/service/ITyService.java                                 |   27 ++
 ard-work/src/main/java/com/ard/tianyu/netty/command/register/HeartbeatReplyCommand.java       |    5 
 ard-work/src/main/java/com/ard/tianyu/netty/command/register/RegisterCommand.java             |    3 
 ard-work/src/main/java/com/ard/tianyu/netty/command/real/UavStateCommand.java                 |    2 
 ard-work/src/main/java/com/ard/tianyu/controller/UavController.java                           |   50 +++
 ard-work/src/main/java/com/ard/tianyu/model/dto/control/SpeedControlDto.java                  |   38 +++
 ard-admin/src/main/resources/application-dev.yml                                              |    6 
 ard-work/src/main/java/com/ard/tianyu/netty/command/control/SpeedControlCommand.java          |   47 +++
 ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStartReplyCommand.java       |   32 ++
 28 files changed, 663 insertions(+), 39 deletions(-)

diff --git a/ard-admin/src/main/resources/application-dev.yml b/ard-admin/src/main/resources/application-dev.yml
index 985f949..2d9a8df 100644
--- a/ard-admin/src/main/resources/application-dev.yml
+++ b/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
\ No newline at end of file
diff --git a/ard-work/src/main/java/com/ard/tianyu/controller/UavController.java b/ard-work/src/main/java/com/ard/tianyu/controller/UavController.java
index 3f620f7..27bbf9f 100644
--- a/ard-work/src/main/java/com/ard/tianyu/controller/UavController.java
+++ b/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();
     }
 
diff --git a/ard-work/src/main/java/com/ard/tianyu/model/dto/camera/CapturePicDto.java b/ard-work/src/main/java/com/ard/tianyu/model/dto/camera/CapturePicDto.java
new file mode 100644
index 0000000..3532beb
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/model/dto/camera/CapturePicDto.java
@@ -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;
+}
diff --git a/ard-work/src/main/java/com/ard/tianyu/model/dto/camera/RecordDto.java b/ard-work/src/main/java/com/ard/tianyu/model/dto/camera/RecordDto.java
new file mode 100644
index 0000000..cee59f5
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/model/dto/camera/RecordDto.java
@@ -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;
+}
diff --git a/ard-work/src/main/java/com/ard/tianyu/model/dto/control/AbsAngleControlDto.java b/ard-work/src/main/java/com/ard/tianyu/model/dto/control/AbsAngleControlDto.java
new file mode 100644
index 0000000..978c561
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/model/dto/control/AbsAngleControlDto.java
@@ -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;
+}
diff --git a/ard-work/src/main/java/com/ard/tianyu/model/dto/control/AngleControlDto.java b/ard-work/src/main/java/com/ard/tianyu/model/dto/control/AngleControlDto.java
new file mode 100644
index 0000000..6a7cdcc
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/model/dto/control/AngleControlDto.java
@@ -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;
+}
diff --git a/ard-work/src/main/java/com/ard/tianyu/model/dto/control/SpeedControlDto.java b/ard-work/src/main/java/com/ard/tianyu/model/dto/control/SpeedControlDto.java
new file mode 100644
index 0000000..d673ae8
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/model/dto/control/SpeedControlDto.java
@@ -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;
+
+}
diff --git a/ard-work/src/main/java/com/ard/tianyu/netty/command/camera/CapturePicCommand.java b/ard-work/src/main/java/com/ard/tianyu/netty/command/camera/CapturePicCommand.java
new file mode 100644
index 0000000..7aeabdb
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/netty/command/camera/CapturePicCommand.java
@@ -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);          // 写入动作编号
+    }
+}
diff --git a/ard-work/src/main/java/com/ard/tianyu/netty/command/camera/CapturePicReplyCommand.java b/ard-work/src/main/java/com/ard/tianyu/netty/command/camera/CapturePicReplyCommand.java
new file mode 100644
index 0000000..aa3b550
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/netty/command/camera/CapturePicReplyCommand.java
@@ -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) {
+
+    }
+}
diff --git a/ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStartCommand.java b/ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStartCommand.java
new file mode 100644
index 0000000..f3ab32a
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStartCommand.java
@@ -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);          // 写入动作编号
+    }
+}
diff --git a/ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStartReplyCommand.java b/ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStartReplyCommand.java
new file mode 100644
index 0000000..6c12116
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStartReplyCommand.java
@@ -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) {
+
+    }
+}
diff --git a/ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStopCommand.java b/ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStopCommand.java
new file mode 100644
index 0000000..91fc9a9
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStopCommand.java
@@ -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);          // 写入动作编号
+    }
+}
diff --git a/ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStopReplyCommand.java b/ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStopReplyCommand.java
new file mode 100644
index 0000000..b11bee7
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/netty/command/camera/RecordStopReplyCommand.java
@@ -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) {
+
+    }
+}
diff --git a/ard-work/src/main/java/com/ard/tianyu/netty/command/control/AbsAngleControlCommand.java b/ard-work/src/main/java/com/ard/tianyu/netty/command/control/AbsAngleControlCommand.java
new file mode 100644
index 0000000..9e39ac3
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/netty/command/control/AbsAngleControlCommand.java
@@ -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);               // 写入转动角度
+    }
+}
diff --git a/ard-work/src/main/java/com/ard/tianyu/netty/command/ControlAngleCommand.java b/ard-work/src/main/java/com/ard/tianyu/netty/command/control/AngleControlCommand.java
similarity index 60%
rename from ard-work/src/main/java/com/ard/tianyu/netty/command/ControlAngleCommand.java
rename to ard-work/src/main/java/com/ard/tianyu/netty/command/control/AngleControlCommand.java
index 694e9f4..ddde4da 100644
--- a/ard-work/src/main/java/com/ard/tianyu/netty/command/ControlAngleCommand.java
+++ b/ard-work/src/main/java/com/ard/tianyu/netty/command/control/AngleControlCommand.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) {
diff --git a/ard-work/src/main/java/com/ard/tianyu/netty/command/control/SpeedControlCommand.java b/ard-work/src/main/java/com/ard/tianyu/netty/command/control/SpeedControlCommand.java
new file mode 100644
index 0000000..d4fbabf
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/netty/command/control/SpeedControlCommand.java
@@ -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);           // 写入执行时间
+    }
+}
diff --git a/ard-work/src/main/java/com/ard/tianyu/netty/command/SignalInfoCommand.java b/ard-work/src/main/java/com/ard/tianyu/netty/command/real/SignalInfoCommand.java
similarity index 88%
rename from ard-work/src/main/java/com/ard/tianyu/netty/command/SignalInfoCommand.java
rename to ard-work/src/main/java/com/ard/tianyu/netty/command/real/SignalInfoCommand.java
index db4e295..751ffe9 100644
--- a/ard-work/src/main/java/com/ard/tianyu/netty/command/SignalInfoCommand.java
+++ b/ard-work/src/main/java/com/ard/tianyu/netty/command/real/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;
diff --git a/ard-work/src/main/java/com/ard/tianyu/netty/command/UavStateCommand.java b/ard-work/src/main/java/com/ard/tianyu/netty/command/real/UavStateCommand.java
similarity index 94%
rename from ard-work/src/main/java/com/ard/tianyu/netty/command/UavStateCommand.java
rename to ard-work/src/main/java/com/ard/tianyu/netty/command/real/UavStateCommand.java
index 5e7eff2..7df96fb 100644
--- a/ard-work/src/main/java/com/ard/tianyu/netty/command/UavStateCommand.java
+++ b/ard-work/src/main/java/com/ard/tianyu/netty/command/real/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;
diff --git a/ard-work/src/main/java/com/ard/tianyu/netty/command/UavTelemetryDataCommand.java b/ard-work/src/main/java/com/ard/tianyu/netty/command/real/UavTelemetryDataCommand.java
similarity index 84%
rename from ard-work/src/main/java/com/ard/tianyu/netty/command/UavTelemetryDataCommand.java
rename to ard-work/src/main/java/com/ard/tianyu/netty/command/real/UavTelemetryDataCommand.java
index 6ecd1fa..c520cd3 100644
--- a/ard-work/src/main/java/com/ard/tianyu/netty/command/UavTelemetryDataCommand.java
+++ b/ard-work/src/main/java/com/ard/tianyu/netty/command/real/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) {
diff --git a/ard-work/src/main/java/com/ard/tianyu/netty/command/HeartbeatCommand.java b/ard-work/src/main/java/com/ard/tianyu/netty/command/register/HeartbeatCommand.java
similarity index 87%
rename from ard-work/src/main/java/com/ard/tianyu/netty/command/HeartbeatCommand.java
rename to ard-work/src/main/java/com/ard/tianyu/netty/command/register/HeartbeatCommand.java
index 10d61a3..bca0ea3 100644
--- a/ard-work/src/main/java/com/ard/tianyu/netty/command/HeartbeatCommand.java
+++ b/ard-work/src/main/java/com/ard/tianyu/netty/command/register/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;
 
 /**
diff --git a/ard-work/src/main/java/com/ard/tianyu/netty/command/HeartbeatReplyCommand.java b/ard-work/src/main/java/com/ard/tianyu/netty/command/register/HeartbeatReplyCommand.java
similarity index 83%
rename from ard-work/src/main/java/com/ard/tianyu/netty/command/HeartbeatReplyCommand.java
rename to ard-work/src/main/java/com/ard/tianyu/netty/command/register/HeartbeatReplyCommand.java
index bbb9b6f..19dfa4d 100644
--- a/ard-work/src/main/java/com/ard/tianyu/netty/command/HeartbeatReplyCommand.java
+++ b/ard-work/src/main/java/com/ard/tianyu/netty/command/register/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);           // 写入时间戳
     }
 }
\ No newline at end of file
diff --git a/ard-work/src/main/java/com/ard/tianyu/netty/command/RegisterCommand.java b/ard-work/src/main/java/com/ard/tianyu/netty/command/register/RegisterCommand.java
similarity index 88%
rename from ard-work/src/main/java/com/ard/tianyu/netty/command/RegisterCommand.java
rename to ard-work/src/main/java/com/ard/tianyu/netty/command/register/RegisterCommand.java
index 2de1337..dfebbfb 100644
--- a/ard-work/src/main/java/com/ard/tianyu/netty/command/RegisterCommand.java
+++ b/ard-work/src/main/java/com/ard/tianyu/netty/command/register/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;
 
 /**
diff --git a/ard-work/src/main/java/com/ard/tianyu/netty/command/RegisterReplyCommand.java b/ard-work/src/main/java/com/ard/tianyu/netty/command/register/RegisterReplyCommand.java
similarity index 86%
rename from ard-work/src/main/java/com/ard/tianyu/netty/command/RegisterReplyCommand.java
rename to ard-work/src/main/java/com/ard/tianyu/netty/command/register/RegisterReplyCommand.java
index 0eff2c3..159b2da 100644
--- a/ard-work/src/main/java/com/ard/tianyu/netty/command/RegisterReplyCommand.java
+++ b/ard-work/src/main/java/com/ard/tianyu/netty/command/register/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;
 
diff --git a/ard-work/src/main/java/com/ard/tianyu/netty/command/UavInitInfoCommand.java b/ard-work/src/main/java/com/ard/tianyu/netty/command/register/UavInitInfoCommand.java
similarity index 92%
rename from ard-work/src/main/java/com/ard/tianyu/netty/command/UavInitInfoCommand.java
rename to ard-work/src/main/java/com/ard/tianyu/netty/command/register/UavInitInfoCommand.java
index 9944dd5..ec2b494 100644
--- a/ard-work/src/main/java/com/ard/tianyu/netty/command/UavInitInfoCommand.java
+++ b/ard-work/src/main/java/com/ard/tianyu/netty/command/register/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;
 
diff --git a/ard-work/src/main/java/com/ard/tianyu/netty/command/UavReadyNotificationCommand.java b/ard-work/src/main/java/com/ard/tianyu/netty/command/register/UavReadyNotificationCommand.java
similarity index 89%
rename from ard-work/src/main/java/com/ard/tianyu/netty/command/UavReadyNotificationCommand.java
rename to ard-work/src/main/java/com/ard/tianyu/netty/command/register/UavReadyNotificationCommand.java
index 338e530..25de8fb 100644
--- a/ard-work/src/main/java/com/ard/tianyu/netty/command/UavReadyNotificationCommand.java
+++ b/ard-work/src/main/java/com/ard/tianyu/netty/command/register/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;
diff --git a/ard-work/src/main/java/com/ard/tianyu/netty/handler/MessageProtocolDecoder.java b/ard-work/src/main/java/com/ard/tianyu/netty/handler/MessageProtocolDecoder.java
index ac924b9..4f88354 100644
--- a/ard-work/src/main/java/com/ard/tianyu/netty/handler/MessageProtocolDecoder.java
+++ b/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);
diff --git a/ard-work/src/main/java/com/ard/tianyu/service/ITyService.java b/ard-work/src/main/java/com/ard/tianyu/service/ITyService.java
index b5cd2e8..3f50eb6 100644
--- a/ard-work/src/main/java/com/ard/tianyu/service/ITyService.java
+++ b/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);
 
     /**
      * 获取无人机状态
diff --git a/ard-work/src/main/java/com/ard/tianyu/service/impl/TyServiceImpl.java b/ard-work/src/main/java/com/ard/tianyu/service/impl/TyServiceImpl.java
index b9f8059..66dacea 100644
--- a/ard-work/src/main/java/com/ard/tianyu/service/impl/TyServiceImpl.java
+++ b/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:

--
Gitblit v1.9.3