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