From f2236478e434b9d1b714b51d3586fb11a59e6f14 Mon Sep 17 00:00:00 2001
From: liusuyi <1951119284@qq.com>
Date: Sat, 26 Oct 2024 16:40:28 +0800
Subject: [PATCH] 增加 控制权和起飞

---
 ard-work/src/main/java/com/ard/tianyu/model/dto/manual/TakeOffDTO.java              |   28 ++
 ard-work/src/main/java/com/ard/tianyu/netty/handler/MessageProtocolDecoder.java     |   12 
 ard-work/src/main/java/com/ard/tianyu/service/impl/TyServiceImpl.java               |   35 ++
 ard-work/src/main/java/com/ard/tianyu/controller/UavCameraController.java           |  100 +++++++
 ard-work/src/main/java/com/ard/tianyu/netty/command/manual/TakeOffReplyCmd.java     |   32 ++
 ard-work/src/main/java/com/ard/tianyu/service/ITyService.java                       |   12 
 ard-work/src/main/java/com/ard/tianyu/controller/UavRealDataController.java         |   63 ++++
 ard-work/src/main/java/com/ard/tianyu/controller/UavManualFlyController.java        |   42 +++
 ard-work/src/main/java/com/ard/tianyu/model/dto/manual/SwitchUavControlDTO.java     |   22 +
 /dev/null                                                                           |  181 -------------
 ard-work/src/main/java/com/ard/tianyu/controller/UavGimbalController.java           |   69 +++++
 ard-work/src/main/java/com/ard/tianyu/netty/command/manual/SwitchUavControlCmd.java |   35 ++
 ard-work/src/main/java/com/ard/tianyu/controller/UavBaseController.java             |   83 ++++++
 ard-work/src/main/java/com/ard/vtdu/controller/MediaController.java                 |    2 
 ard-work/src/main/java/com/ard/tianyu/netty/command/manual/TakeOffCmd.java          |   35 ++
 15 files changed, 566 insertions(+), 185 deletions(-)

diff --git a/ard-work/src/main/java/com/ard/tianyu/controller/UavBaseController.java b/ard-work/src/main/java/com/ard/tianyu/controller/UavBaseController.java
new file mode 100644
index 0000000..e7a70bc
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/controller/UavBaseController.java
@@ -0,0 +1,83 @@
+package com.ard.tianyu.controller;
+
+import com.ard.common.core.domain.AjaxResult;
+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.receiver.BoxHistoryReceiver;
+import com.ard.tianyu.model.receiver.BoxPhotosReceiver;
+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 com.github.xiaoymin.knife4j.annotations.ApiSort;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * UavBaseController
+ *
+ * @author liusuyi
+ * @date 2024年10月21日13:52
+ **/
+@Api(tags = "无人机基础接口")
+@ApiSort(value = 2)
+@RequestMapping("/uav/base")
+@RestController
+public class UavBaseController {
+
+    @Resource
+    private ITyService tyService;
+
+    @ApiOperation("获取天宇token信息")
+    @ApiOperationSupport(order = 1)
+    @GetMapping("/getToken")
+    public AjaxResult getToken() {
+        return AjaxResult.success(tyService.getAccessToken());
+    }
+
+    @ApiOperation("获取天宇盒子列表")
+    @ApiOperationSupport(order = 2)
+    @GetMapping("/getBoxList")
+    public AjaxResult getBoxList() {
+        List<BoxInfoReceiver> BoxList = tyService.getBoxList();
+        return AjaxResult.success(BoxList);
+    }
+
+
+    @ApiOperation("获取飞行历史")
+    @ApiOperationSupport(order = 3)
+    @PostMapping("/getBoxHistory")
+    public AjaxResult getBoxHistory(@RequestBody BoxHistoryDTO boxHistoryDTO) {
+        List<BoxHistoryReceiver> boxHistory = tyService.getBoxHistory(boxHistoryDTO);
+        return AjaxResult.success(boxHistory);
+    }
+
+    @ApiOperation("获取任务照片")
+    @ApiOperationSupport(order = 4)
+    @PostMapping("/getBoxPhotos")
+    public AjaxResult getBoxPhotos(@RequestBody BoxPhotosDTO boxPhotosDTO) {
+        List<BoxPhotosReceiver> boxPhotos = tyService.getBoxPhotos(boxPhotosDTO);
+        return AjaxResult.success(boxPhotos);
+    }
+
+    @ApiOperation("获取直播地址")
+    @ApiOperationSupport(order = 5)
+    @GetMapping("/getBoxList/{boxSn}")
+    public AjaxResult getBoxLiveUrl(@PathVariable("boxSn") String boxSn) {
+        BoxStreamUrlReceiver boxLiveUrl = tyService.getBoxLiveUrl(boxSn);
+        return AjaxResult.success(boxLiveUrl);
+    }
+
+    @ApiOperation("修改云盒设置")
+    @PostMapping("/updateBoxSettings")
+    public AjaxResult updateBoxSettings(@RequestBody BoxSettingsDTO boxSettingsDTO) {
+        Boolean state = tyService.updateBoxSettings(boxSettingsDTO);
+        return AjaxResult.success(state);
+    }
+
+}
\ No newline at end of file
diff --git a/ard-work/src/main/java/com/ard/tianyu/controller/UavCameraController.java b/ard-work/src/main/java/com/ard/tianyu/controller/UavCameraController.java
new file mode 100644
index 0000000..a911e4b
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/controller/UavCameraController.java
@@ -0,0 +1,100 @@
+package com.ard.tianyu.controller;
+
+import com.ard.common.core.domain.AjaxResult;
+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.*;
+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.manual.SwitchUavControlDTO;
+import com.ard.tianyu.model.dto.signal.SignalInfo;
+import com.ard.tianyu.model.dto.state.UavState;
+import com.ard.tianyu.model.dto.telemetry.TelemetryData;
+import com.ard.tianyu.model.receiver.BoxHistoryReceiver;
+import com.ard.tianyu.model.receiver.BoxInfoReceiver;
+import com.ard.tianyu.model.receiver.BoxPhotosReceiver;
+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 java.util.List;
+
+/**
+ * UavCameraController
+ *
+ * @author liusuyi
+ * @date 2024年10月21日13:52
+ **/
+@Api(tags = "无人机相机接口")
+@RequestMapping("/uav/camera")
+@RestController
+public class UavCameraController {
+
+    @Resource
+    private ITyService tyService;
+
+
+    @ApiOperation("拍照")
+    @ApiOperationSupport(order = 1)
+    @PostMapping("/capturePicDto")
+    public AjaxResult capturePic(@RequestBody CapturePicDTO capturePicDto) {
+        tyService.capturePic(capturePicDto);
+        return AjaxResult.success();
+    }
+
+    @ApiOperation("录像")
+    @ApiOperationSupport(order = 2)
+    @PostMapping("/record")
+    public AjaxResult record(@RequestBody RecordDTO recordDto) {
+        tyService.record(recordDto);
+        return AjaxResult.success();
+    }
+
+    @ApiOperation(value = "变倍", notes = "actionCode值:10变倍加 | 11变倍减 | 15复位 | 255停止")
+    @ApiOperationSupport(order = 3)
+    @PostMapping("/zoom")
+    public AjaxResult zoom(@RequestBody ZoomDTO zoomDTO) {
+        tyService.zoom(zoomDTO);
+        return AjaxResult.success();
+    }
+
+    @ApiOperation("变倍指定倍数")
+    @ApiOperationSupport(order = 4)
+    @PostMapping("/zoomToLevel")
+    public AjaxResult zoomToLevel(@RequestBody ZoomToLevelDTO zoomToLevelDTO) {
+        tyService.zoomToLevel(zoomToLevelDTO);
+        return AjaxResult.success();
+    }
+
+    @ApiOperation(value = "切换摄像头", notes = "actionParam值:0切换到FPV摄像头  | 1切换到载荷摄像头")
+    @ApiOperationSupport(order = 5)
+    @PostMapping("/switchCamera")
+    public AjaxResult switchCamera(@RequestBody SwitchCameraDTO switchCameraDTO) {
+        tyService.switchCamera(switchCameraDTO);
+        return AjaxResult.success();
+    }
+
+    @ApiOperation(value = "切换视频源", notes = "相机在主相机镜头时有效,FPV镜头时无效 actionParam值:0-可见 1-变焦 2-红外")
+    @ApiOperationSupport(order = 6)
+    @PostMapping("/switchSource")
+    public AjaxResult switchSource(@RequestBody SwitchSourceDTO switchSourceDTO) {
+        tyService.switchSource(switchSourceDTO);
+        return AjaxResult.success();
+    }
+
+    @ApiOperation(value = "打开或关闭照片回传", notes = "actionParam值:0-关闭,1-打开")
+    @ApiOperationSupport(order = 10)
+    @PostMapping("/photoReturnToggle")
+    public AjaxResult photoReturnToggle(@RequestBody PhotoReturnToggleDTO photoReturnToggleDTO) {
+        tyService.photoReturnToggle(photoReturnToggleDTO);
+        return AjaxResult.success();
+    }
+
+}
\ 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
deleted file mode 100644
index 0f619e3..0000000
--- a/ard-work/src/main/java/com/ard/tianyu/controller/UavController.java
+++ /dev/null
@@ -1,181 +0,0 @@
-package com.ard.tianyu.controller;
-
-import com.ard.common.core.domain.AjaxResult;
-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.*;
-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;
-import com.ard.tianyu.model.receiver.BoxHistoryReceiver;
-import com.ard.tianyu.model.receiver.BoxPhotosReceiver;
-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 java.util.List;
-
-/**
- * UavTest
- *
- * @author liusuyi
- * @date 2024年10月21日13:52
- **/
-@Api(tags = "无人机接口")
-@RequestMapping("/uav")
-@RestController
-public class UavController {
-
-    @Resource
-    private ITyService tyService;
-
-    @ApiOperation("获取天宇token信息")
-    @GetMapping("/getToken")
-    public AjaxResult getToken() {
-        return AjaxResult.success(tyService.getAccessToken());
-    }
-
-    @ApiOperation("获取天宇盒子列表")
-    @GetMapping("/getBoxList")
-    public AjaxResult getBoxList() {
-        List<BoxInfoReceiver> BoxList = tyService.getBoxList();
-        return AjaxResult.success(BoxList);
-    }
-
-    @ApiOperation("获取直播地址")
-    @GetMapping("/getBoxList/{boxSn}")
-    public AjaxResult getBoxLiveUrl(@PathVariable("boxSn") String boxSn) {
-        BoxStreamUrlReceiver boxLiveUrl = tyService.getBoxLiveUrl(boxSn);
-        return AjaxResult.success(boxLiveUrl);
-    }
-
-    @ApiOperation("获取飞行历史")
-    @PostMapping("/getBoxHistory")
-    public AjaxResult getBoxHistory(@RequestBody BoxHistoryDTO boxHistoryDTO) {
-        List<BoxHistoryReceiver> boxHistory = tyService.getBoxHistory(boxHistoryDTO);
-        return AjaxResult.success(boxHistory);
-    }
-
-    @ApiOperation("获取任务照片")
-    @PostMapping("/getBoxPhotos")
-    public AjaxResult getBoxPhotos(@RequestBody BoxPhotosDTO boxPhotosDTO) {
-        List<BoxPhotosReceiver> boxPhotos = tyService.getBoxPhotos(boxPhotosDTO);
-        return AjaxResult.success(boxPhotos);
-    }
-
-    @ApiOperation("修改云盒设置")
-    @PostMapping("/updateBoxSettings")
-    public AjaxResult updateBoxSettings(@RequestBody BoxSettingsDTO boxSettingsDTO) {
-        Boolean state = tyService.updateBoxSettings(boxSettingsDTO);
-        return AjaxResult.success(state);
-    }
-
-    @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();
-    }
-
-    @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) {
-        UavState uavState = tyService.getUavState(boxSn);
-        return AjaxResult.success(uavState);
-    }
-
-    @ApiOperation("获取无人机遥测数据")
-    @GetMapping("/getUavTelemetryData")
-    public AjaxResult getUavTelemetryData(String boxSn) {
-        TelemetryData telemetryData = tyService.getUavTelemetryData(boxSn);
-        return AjaxResult.success(telemetryData);
-    }
-
-    @ApiOperation("获取无人机信道质量数据")
-    @GetMapping("/getSignalInfo")
-    public AjaxResult getSignalInfo(String boxSn) {
-        SignalInfo signalInfo = tyService.getSignalInfo(boxSn);
-        return AjaxResult.success(signalInfo);
-    }
-}
\ No newline at end of file
diff --git a/ard-work/src/main/java/com/ard/tianyu/controller/UavGimbalController.java b/ard-work/src/main/java/com/ard/tianyu/controller/UavGimbalController.java
new file mode 100644
index 0000000..22ff46d
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/controller/UavGimbalController.java
@@ -0,0 +1,69 @@
+package com.ard.tianyu.controller;
+
+import com.ard.common.core.domain.AjaxResult;
+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.*;
+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.manual.SwitchUavControlDTO;
+import com.ard.tianyu.model.dto.signal.SignalInfo;
+import com.ard.tianyu.model.dto.state.UavState;
+import com.ard.tianyu.model.dto.telemetry.TelemetryData;
+import com.ard.tianyu.model.receiver.BoxHistoryReceiver;
+import com.ard.tianyu.model.receiver.BoxInfoReceiver;
+import com.ard.tianyu.model.receiver.BoxPhotosReceiver;
+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 java.util.List;
+
+/**
+ * UavGimbalController
+ *
+ * @author liusuyi
+ * @date 2024年10月21日13:52
+ **/
+@Api(tags = "无人机云台控制接口")
+@RequestMapping("/uav/gimbal")
+@RestController
+public class UavGimbalController {
+
+    @Resource
+    private ITyService tyService;
+
+
+
+    @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();
+    }
+
+}
\ No newline at end of file
diff --git a/ard-work/src/main/java/com/ard/tianyu/controller/UavManualFlyController.java b/ard-work/src/main/java/com/ard/tianyu/controller/UavManualFlyController.java
new file mode 100644
index 0000000..808295a
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/controller/UavManualFlyController.java
@@ -0,0 +1,42 @@
+package com.ard.tianyu.controller;
+
+import com.ard.common.core.domain.AjaxResult;
+import com.ard.tianyu.model.dto.manual.SwitchUavControlDTO;
+import com.ard.tianyu.model.dto.manual.TakeOffDTO;
+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.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+/**
+ * UavManualFlyController
+ *
+ * @author liusuyi
+ * @date 2024年10月21日13:52
+ **/
+@Api(tags = "无人机手动飞行接口")
+@RequestMapping("/uav/manualFly")
+@RestController
+public class UavManualFlyController {
+
+    @Resource
+    private ITyService tyService;
+
+    @ApiOperation(value = "切换无人机控制权", notes = "actionParam值:0-云盒获取控制权, 1-云盒释放控制权")
+    @ApiOperationSupport(order = 1)
+    @PostMapping("/switchUavControl")
+    public AjaxResult switchUavControl(@RequestBody SwitchUavControlDTO switchUavControlDTO) {
+        tyService.switchUavControl(switchUavControlDTO);
+        return AjaxResult.success();
+    }
+    @ApiOperation(value = "起飞", notes = "起飞高度height取值范围:1.2~100,误差:+-0.4米")
+    @ApiOperationSupport(order = 2)
+    @PostMapping("/takeOff")
+    public AjaxResult takeOff(@RequestBody TakeOffDTO takeOffDTO) {
+        tyService.takeOff(takeOffDTO);
+        return AjaxResult.success();
+    }
+}
\ No newline at end of file
diff --git a/ard-work/src/main/java/com/ard/tianyu/controller/UavRealDataController.java b/ard-work/src/main/java/com/ard/tianyu/controller/UavRealDataController.java
new file mode 100644
index 0000000..4caafd6
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/controller/UavRealDataController.java
@@ -0,0 +1,63 @@
+package com.ard.tianyu.controller;
+
+import com.ard.common.core.domain.AjaxResult;
+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.*;
+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.manual.SwitchUavControlDTO;
+import com.ard.tianyu.model.dto.signal.SignalInfo;
+import com.ard.tianyu.model.dto.state.UavState;
+import com.ard.tianyu.model.dto.telemetry.TelemetryData;
+import com.ard.tianyu.model.receiver.BoxHistoryReceiver;
+import com.ard.tianyu.model.receiver.BoxInfoReceiver;
+import com.ard.tianyu.model.receiver.BoxPhotosReceiver;
+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 java.util.List;
+
+/**
+ * UavRealDataController
+ *
+ * @author liusuyi
+ * @date 2024年10月21日13:52
+ **/
+@Api(tags = "无人机实时数据接口")
+@RequestMapping("/uav/realData")
+@RestController
+public class UavRealDataController {
+
+    @Resource
+    private ITyService tyService;
+
+    @ApiOperation("获取无人机状态")
+    @GetMapping("/getUavState")
+    public AjaxResult getUavState(String boxSn) {
+        UavState uavState = tyService.getUavState(boxSn);
+        return AjaxResult.success(uavState);
+    }
+
+    @ApiOperation("获取无人机遥测数据")
+    @GetMapping("/getUavTelemetryData")
+    public AjaxResult getUavTelemetryData(String boxSn) {
+        TelemetryData telemetryData = tyService.getUavTelemetryData(boxSn);
+        return AjaxResult.success(telemetryData);
+    }
+
+    @ApiOperation("获取无人机信道质量数据")
+    @GetMapping("/getSignalInfo")
+    public AjaxResult getSignalInfo(String boxSn) {
+        SignalInfo signalInfo = tyService.getSignalInfo(boxSn);
+        return AjaxResult.success(signalInfo);
+    }
+}
\ No newline at end of file
diff --git a/ard-work/src/main/java/com/ard/tianyu/model/dto/manual/SwitchUavControlDTO.java b/ard-work/src/main/java/com/ard/tianyu/model/dto/manual/SwitchUavControlDTO.java
new file mode 100644
index 0000000..8732269
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/model/dto/manual/SwitchUavControlDTO.java
@@ -0,0 +1,22 @@
+package com.ard.tianyu.model.dto.manual;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 切换视频源实体对象
+ *
+ * @author liusuyi
+ * @date 2024年10月26日9:02
+ **/
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class SwitchUavControlDTO {
+    private String boxSn;
+    //	0x00 云盒获取控制权, 0x01云盒释放控制权
+    private byte actionParam;
+}
diff --git a/ard-work/src/main/java/com/ard/tianyu/model/dto/manual/TakeOffDTO.java b/ard-work/src/main/java/com/ard/tianyu/model/dto/manual/TakeOffDTO.java
new file mode 100644
index 0000000..9c54e67
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/model/dto/manual/TakeOffDTO.java
@@ -0,0 +1,28 @@
+package com.ard.tianyu.model.dto.manual;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+
+import javax.validation.constraints.DecimalMax;
+import javax.validation.constraints.DecimalMin;
+
+/**
+ * 起飞实体对象
+ *
+ * @author liusuyi
+ * @date 2024年10月26日9:02
+ **/
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@Validated
+public class TakeOffDTO {
+    private String boxSn;
+    @DecimalMin(value = "1.2", message = "起飞高度范围height最小值为 1.2")
+    @DecimalMax(value = "100", message = "起飞高度范围height最大值为 100")
+    private Float height;
+}
diff --git a/ard-work/src/main/java/com/ard/tianyu/netty/command/manual/SwitchUavControlCmd.java b/ard-work/src/main/java/com/ard/tianyu/netty/command/manual/SwitchUavControlCmd.java
new file mode 100644
index 0000000..ba4c91f
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/netty/command/manual/SwitchUavControlCmd.java
@@ -0,0 +1,35 @@
+package com.ard.tianyu.netty.command.manual;
+
+import com.ard.tianyu.model.dto.camera.SwitchSourceDTO;
+import com.ard.tianyu.model.dto.manual.SwitchUavControlDTO;
+import com.ard.tianyu.netty.command.BaseCmd;
+import io.netty.buffer.ByteBuf;
+
+/**
+ * 切换无人机控制权指令
+ *
+ * @author liusuyi
+ * @date 2024年10月26日11:18
+ **/
+public class SwitchUavControlCmd extends BaseCmd {
+
+    private final byte actionParam;        // 动作参数
+
+    public SwitchUavControlCmd(SwitchUavControlDTO switchUavControlDTO) {
+        setDataHeader((short) 0x7479);
+        setDataLength((short) 19);
+        setBoxSn(switchUavControlDTO.getBoxSn().getBytes());
+        setCmdCode((byte) 0xD1);
+        this.actionParam = switchUavControlDTO.getActionParam();
+    }
+
+    public void encode(ByteBuf out) {
+        out.writeShort(getDataHeader());    // 写入数据头
+        out.writeShort(getDataLength());    // 写入数据长度
+        out.writeBytes(getBoxSn());         // 写入盒子SN
+        out.writeByte(getCmdCode());        // 写入命令码
+        out.writeByte(0x00);          // 写入加密标志
+        out.writeByte(0x30);          // 写入动作编号
+        out.writeByte(actionParam);         // 写入动作参数
+    }
+}
diff --git a/ard-work/src/main/java/com/ard/tianyu/netty/command/manual/TakeOffCmd.java b/ard-work/src/main/java/com/ard/tianyu/netty/command/manual/TakeOffCmd.java
new file mode 100644
index 0000000..4dea279
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/netty/command/manual/TakeOffCmd.java
@@ -0,0 +1,35 @@
+package com.ard.tianyu.netty.command.manual;
+
+import com.ard.tianyu.model.dto.manual.TakeOffDTO;
+import com.ard.tianyu.netty.command.BaseCmd;
+import io.netty.buffer.ByteBuf;
+
+/**
+ * 起飞
+ *
+ * @author liusuyi
+ * @date 2024年10月26日15:43
+ **/
+public class TakeOffCmd extends BaseCmd {
+
+    private final Float height;
+
+    public TakeOffCmd(TakeOffDTO takeOffDTO) {
+        setDataHeader((short) 0x7479);
+        setDataLength((short) 22);
+        setBoxSn(takeOffDTO.getBoxSn().getBytes());
+        setCmdCode((byte) 0xD1);
+        this.height = takeOffDTO.getHeight();
+    }
+
+
+    public void encode(ByteBuf out) {
+        out.writeShort(getDataHeader());    // 写入数据头
+        out.writeShort(getDataLength());    // 写入数据长度
+        out.writeBytes(getBoxSn());         // 写入盒子SN
+        out.writeByte(getCmdCode());        // 写入命令码
+        out.writeByte(0x00);          // 写入加密标志
+        out.writeByte(0x11);          // 写入动作编号
+        out.writeFloat(height);             // 写入飞起高度
+    }
+}
diff --git a/ard-work/src/main/java/com/ard/tianyu/netty/command/manual/TakeOffReplyCmd.java b/ard-work/src/main/java/com/ard/tianyu/netty/command/manual/TakeOffReplyCmd.java
new file mode 100644
index 0000000..bc4c221
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/netty/command/manual/TakeOffReplyCmd.java
@@ -0,0 +1,32 @@
+package com.ard.tianyu.netty.command.manual;
+
+import com.ard.tianyu.netty.command.BaseCmd;
+import io.netty.buffer.ByteBuf;
+import lombok.Data;
+
+/**
+ * 起飞
+ *
+ * @author liusuyi
+ * @date 2024年10月26日15:43
+ **/
+@Data
+public class TakeOffReplyCmd extends BaseCmd {
+    private final byte encryptFlag = 0x00; // 加密标志
+    private final byte actionCode = 0x11;  // 动作编号
+    private final byte result;             // 执行结果
+    private final Integer errorCode;       // 错误码
+
+    public TakeOffReplyCmd(String boxSn, Byte result, Integer errorCode) {
+        setDataHeader((short) 0x6A77);
+        setDataLength((short) 22);
+        setBoxSn(boxSn.getBytes());
+        setCmdCode((byte) 0xD1);
+        this.result = result;
+        this.errorCode = errorCode;
+    }
+
+    public void encode(ByteBuf out) {
+
+    }
+}
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 db9c7d1..0d20128 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
@@ -5,6 +5,7 @@
 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.manual.TakeOffReplyCmd;
 import com.ard.tianyu.netty.command.notice.BoxPowerStatusReplyCmd;
 import com.ard.tianyu.netty.command.notice.FlyWayEndReplyCmd;
 import com.ard.tianyu.netty.command.notice.UavReadyReplyCmd;
@@ -92,12 +93,21 @@
                 byte encryptionFlag = in.readByte();
                 byte actionCode = in.readByte();
                 switch (actionCode) {
-                    case 0x22:
+                    case 0x11:
                         byte result = in.readByte();
                         int errorCode = in.readInt();
                         uavData = new byte[15];
                         in.readBytes(uavData);
                         String boxSn = new String(uavData);
+                        baseCmd = new TakeOffReplyCmd(boxSn, result, errorCode);
+                        log.debug("起飞回复: {}", boxSn);
+                        break;
+                    case 0x22:
+                        result = in.readByte();
+                        errorCode = in.readInt();
+                        uavData = new byte[15];
+                        in.readBytes(uavData);
+                        boxSn = new String(uavData);
                         baseCmd = new CameraModeReplyCmd(boxSn, result, errorCode);
                         log.debug("设置相机模式回复: {}", boxSn);
                         break;
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 d909b47..b304b82 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
@@ -7,6 +7,8 @@
 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.manual.SwitchUavControlDTO;
+import com.ard.tianyu.model.dto.manual.TakeOffDTO;
 import com.ard.tianyu.model.dto.signal.SignalInfo;
 import com.ard.tianyu.model.dto.state.UavState;
 import com.ard.tianyu.model.dto.telemetry.TelemetryData;
@@ -122,6 +124,16 @@
     void photoReturnToggle(PhotoReturnToggleDTO photoReturnToggleDTO);
 
     /**
+     * 切换无人机控制权
+     */
+    void switchUavControl(SwitchUavControlDTO switchUavControlDTO);
+
+    /**
+     * 起飞
+     */
+    void takeOff(TakeOffDTO takeOffDTO);
+
+    /**
      * 获取无人机状态
      */
     UavState getUavState(String boxSn);
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 637d878..1a3c1cd 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
@@ -15,6 +15,8 @@
 import com.ard.tianyu.model.dto.converter.UavSignalInfoConverter;
 import com.ard.tianyu.model.dto.converter.UavStateConverter;
 import com.ard.tianyu.model.dto.converter.UavTelemetryDataConverter;
+import com.ard.tianyu.model.dto.manual.SwitchUavControlDTO;
+import com.ard.tianyu.model.dto.manual.TakeOffDTO;
 import com.ard.tianyu.model.dto.signal.SignalInfo;
 import com.ard.tianyu.model.dto.state.UavState;
 import com.ard.tianyu.model.dto.telemetry.TelemetryData;
@@ -25,6 +27,9 @@
 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.manual.SwitchUavControlCmd;
+import com.ard.tianyu.netty.command.manual.TakeOffCmd;
+import com.ard.tianyu.netty.command.manual.TakeOffReplyCmd;
 import com.ard.tianyu.netty.command.notice.BoxPowerStatusReplyCmd;
 import com.ard.tianyu.netty.command.notice.FlyWayEndReplyCmd;
 import com.ard.tianyu.netty.command.notice.UavReadyReplyCmd;
@@ -268,6 +273,24 @@
     }
 
     /**
+     * 切换无人机控制权
+     */
+    @Override
+    public void switchUavControl(SwitchUavControlDTO switchUavControlDTO) {
+        SwitchUavControlCmd switchUavControlCmd = new SwitchUavControlCmd(switchUavControlDTO);
+        this.sendMessage(tyConfiguration.getIpPort(), switchUavControlCmd);
+    }
+
+    /**
+     * 起飞
+     */
+    @Override
+    public void takeOff(TakeOffDTO takeOffDTO) {
+        TakeOffCmd takeOffCmd = new TakeOffCmd(takeOffDTO);
+        this.sendMessage(tyConfiguration.getIpPort(), takeOffCmd);
+    }
+
+    /**
      * 获取无人机状态
      */
     @Override
@@ -355,7 +378,7 @@
                 }
                 if (tyCommand instanceof UavReadyReplyCmd) {
                     UavReadyReplyCmd uavReadyReplyCmd = (UavReadyReplyCmd) tyCommand;
-                    log.info("收到无人机准备完成通知,电池电量{} 经度{} 纬度{} 海拔{}",uavReadyReplyCmd.getBatteryPower(),uavReadyReplyCmd.getLongitude(),uavReadyReplyCmd.getLatitude(),uavReadyReplyCmd.getAltitude());
+                    log.info("收到无人机准备完成通知,电池电量{} 经度{} 纬度{} 海拔{}", uavReadyReplyCmd.getBatteryPower(), uavReadyReplyCmd.getLongitude(), uavReadyReplyCmd.getLatitude(), uavReadyReplyCmd.getAltitude());
                 }
                 if (tyCommand instanceof CameraModeReplyCmd) {
                     CameraModeReplyCmd cameraModeReplyCommand = (CameraModeReplyCmd) tyCommand;
@@ -363,7 +386,7 @@
                 }
                 if (tyCommand instanceof FlyWayEndReplyCmd) {
                     FlyWayEndReplyCmd flyWayEndReplyCmd = (FlyWayEndReplyCmd) tyCommand;
-                    log.info("收到无人机飞行结束通知:状态:{}",flyWayEndReplyCmd.getResult());
+                    log.info("收到无人机飞行结束通知:状态:{}", flyWayEndReplyCmd.getResult());
                 }
                 if (tyCommand instanceof CapturePicReplyCmd) {
                     CapturePicReplyCmd capturePicReplyCommand = (CapturePicReplyCmd) tyCommand;
@@ -377,6 +400,11 @@
                     RecordStopReplyCmd recordStopReplyCommand = (RecordStopReplyCmd) tyCommand;
                     log.info("收到无人机停止录像回复:{} 错误码:{}", String.format("0x%02X", recordStopReplyCommand.getResult() & 0xFF), recordStopReplyCommand.getErrorCode());
                 }
+                //起飞回复
+                if (tyCommand instanceof TakeOffReplyCmd) {
+                    TakeOffReplyCmd takeOffReplyCommand = (TakeOffReplyCmd) tyCommand;
+                    log.info("收到无人机起飞回复:{} 错误码:{}", String.format("0x%02X", takeOffReplyCommand.getResult() & 0xFF), takeOffReplyCommand.getErrorCode());
+                }
                 break;
             default:
                 // 处理其他消息
@@ -384,6 +412,9 @@
         }
     }
 
+    /**
+     * 定时3秒发送心跳指令
+     */
     @Scheduled(fixedRate = 3000)
     public void sendHeartBeat() {
         long timestamp = System.currentTimeMillis();
diff --git a/ard-work/src/main/java/com/ard/vtdu/controller/MediaController.java b/ard-work/src/main/java/com/ard/vtdu/controller/MediaController.java
index 7653063..84c89a8 100644
--- a/ard-work/src/main/java/com/ard/vtdu/controller/MediaController.java
+++ b/ard-work/src/main/java/com/ard/vtdu/controller/MediaController.java
@@ -22,7 +22,7 @@
  * @Version: 1.0
  **/
 @RestController
-@Api(tags = "mediaMTX接口")
+@Api(tags = "流媒体接口")
 @RequestMapping("/mediamtx/media")
 public class MediaController extends BaseController {
 

--
Gitblit v1.9.3