ard-work/src/main/java/com/ard/tianyu/controller/UavBaseController.java
New file @@ -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); } } ard-work/src/main/java/com/ard/tianyu/controller/UavCameraController.java
New file @@ -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(); } } ard-work/src/main/java/com/ard/tianyu/controller/UavController.java
File was deleted ard-work/src/main/java/com/ard/tianyu/controller/UavGimbalController.java
New file @@ -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(); } } ard-work/src/main/java/com/ard/tianyu/controller/UavManualFlyController.java
New file @@ -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(); } } ard-work/src/main/java/com/ard/tianyu/controller/UavRealDataController.java
New file @@ -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); } } ard-work/src/main/java/com/ard/tianyu/model/dto/manual/SwitchUavControlDTO.java
New file @@ -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; } ard-work/src/main/java/com/ard/tianyu/model/dto/manual/TakeOffDTO.java
New file @@ -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; } ard-work/src/main/java/com/ard/tianyu/netty/command/manual/SwitchUavControlCmd.java
New file @@ -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); // 写入动作参数 } } ard-work/src/main/java/com/ard/tianyu/netty/command/manual/TakeOffCmd.java
New file @@ -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); // 写入飞起高度 } } ard-work/src/main/java/com/ard/tianyu/netty/command/manual/TakeOffReplyCmd.java
New file @@ -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) { } } 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; 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); 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(); 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 {