From de44eb3187c8a88c2942f8904701b96be09c61da Mon Sep 17 00:00:00 2001
From: liusuyi <1951119284@qq.com>
Date: Tue, 22 Oct 2024 16:59:57 +0800
Subject: [PATCH] 增加:云台控制基于角度

---
 ard-work/src/main/java/com/ard/vtdu/service/impl/MediaServiceImpl.java          |    3 +
 ard-work/src/main/java/com/ard/tianyu/netty/command/HeartbeatCommand.java       |    7 +++
 ard-work/src/main/java/com/ard/tianyu/netty/handler/MessageProtocolDecoder.java |    4 +-
 ard-work/src/main/java/com/ard/vtdu/util/ArdTool.java                           |    2 -
 ard-work/src/main/java/com/ard/tianyu/netty/command/RegisterCommand.java        |    7 +++
 ard-work/src/main/java/com/ard/tianyu/service/impl/TyServiceImpl.java           |   20 ++++++++--
 ard-work/src/main/java/com/ard/tianyu/controller/UavController.java             |    7 +++
 ard-work/src/main/java/com/ard/tianyu/service/ITyService.java                   |    5 ++
 ard-work/src/main/java/com/ard/tianyu/netty/command/HeartbeatReplyCommand.java  |    8 +++
 ard-work/src/main/java/com/ard/tianyu/netty/command/ControlAngleCommand.java    |   47 +++++++++++++++++++++++
 10 files changed, 99 insertions(+), 11 deletions(-)

diff --git a/ard-work/src/main/java/com/ard/tianyu/controller/UavController.java b/ard-work/src/main/java/com/ard/tianyu/controller/UavController.java
index ca7aae4..8d2d67a 100644
--- a/ard-work/src/main/java/com/ard/tianyu/controller/UavController.java
+++ b/ard-work/src/main/java/com/ard/tianyu/controller/UavController.java
@@ -69,4 +69,11 @@
         Boolean state = tyService.updateBoxSettings(boxSettingsDTO);
         return AjaxResult.success(state);
     }
+
+    @ApiOperation("云台转动(基于角度)")
+    @GetMapping("/controlAngle")
+    public AjaxResult controlAngle(String boxSn) {
+        tyService.controlAngle(boxSn);
+        return AjaxResult.success();
+    }
 }
\ No newline at end of file
diff --git a/ard-work/src/main/java/com/ard/tianyu/netty/command/ControlAngleCommand.java b/ard-work/src/main/java/com/ard/tianyu/netty/command/ControlAngleCommand.java
new file mode 100644
index 0000000..a99c17c
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/netty/command/ControlAngleCommand.java
@@ -0,0 +1,47 @@
+package com.ard.tianyu.netty.command;
+
+import io.netty.buffer.ByteBuf;
+import lombok.Data;
+
+/**
+ * 云台转动(基于角度)命令
+ *
+ * @author 刘苏义
+ * @date 2024/10/22 16:36
+ */
+
+@Data
+public class ControlAngleCommand extends BaseCommand{
+    private final byte[] boxSn; // 云盒编号
+    private final byte encryptFlag; // 加密标志
+    private final byte actionId; // 动作编号
+    private final byte rotationAngle; // 转动角度
+
+    public ControlAngleCommand(byte[] boxSn, byte encryptFlag, byte actionId, byte rotationAngle) {
+        if (boxSn.length != 15) {
+            throw new IllegalArgumentException("云盒编号长度必须为15字节");
+        }
+        setDataHeader((short)0x7479);
+        setDataLength(getDataLength());
+        setCmdCode((byte)0xD1);
+        this.boxSn = boxSn;
+        this.encryptFlag = encryptFlag;
+        this.actionId = actionId;
+        this.rotationAngle = rotationAngle;
+    }
+
+    public short getDataLength() {
+        // 计算数据长度: 云盒编号 + 指令编号 + 加密标志 + 动作编号 + 转动角度
+        return (short) (2 + 15 + 1 + 1 + 1); // 帧头 + 数据内容
+    }
+
+    public void encode(ByteBuf out) {
+        out.writeShort(getDataHeader());    // 写入帧头
+        out.writeShort(getDataLength());    // 写入数据长度
+        out.writeByte(getCmdCode());        // 写入指令编号
+        out.writeBytes(boxSn); // 写入云盒编号
+        out.writeByte(encryptFlag); // 写入加密标志
+        out.writeByte(actionId); // 写入动作编号
+        out.writeByte(rotationAngle); // 写入转动角度
+    }
+}
diff --git a/ard-work/src/main/java/com/ard/tianyu/netty/command/HeartbeatCommand.java b/ard-work/src/main/java/com/ard/tianyu/netty/command/HeartbeatCommand.java
index 17c3aba..a9ca971 100644
--- a/ard-work/src/main/java/com/ard/tianyu/netty/command/HeartbeatCommand.java
+++ b/ard-work/src/main/java/com/ard/tianyu/netty/command/HeartbeatCommand.java
@@ -2,7 +2,12 @@
 
 import io.netty.buffer.ByteBuf;
 
-
+/**
+ * 心跳命令
+ *
+ * @author 刘苏义
+ * @date 2024/10/22 16:36
+ */
 public class HeartbeatCommand extends BaseCommand {
 
     private final long timestamp;
diff --git a/ard-work/src/main/java/com/ard/tianyu/netty/command/HeartbeatReplyCommand.java b/ard-work/src/main/java/com/ard/tianyu/netty/command/HeartbeatReplyCommand.java
index 495c275..6b98c89 100644
--- a/ard-work/src/main/java/com/ard/tianyu/netty/command/HeartbeatReplyCommand.java
+++ b/ard-work/src/main/java/com/ard/tianyu/netty/command/HeartbeatReplyCommand.java
@@ -1,10 +1,15 @@
 package com.ard.tianyu.netty.command;
 
 import io.netty.buffer.ByteBuf;
-import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+/**
+ * 心跳回复命令
+ *
+ * @author 刘苏义
+ * @date 2024/10/22 16:36
+ */
 @Data
 @NoArgsConstructor
 public class HeartbeatReplyCommand extends BaseCommand {
@@ -17,6 +22,7 @@
         setCmdCode((byte) 0x02); // 设置指令编号
         setDataLength((short) (13)); // 数据长度 (指令编号 + 时间戳)
     }
+
     public void encode(ByteBuf out) {
         out.writeShort(getDataHeader());
         out.writeShort(getDataLength());
diff --git a/ard-work/src/main/java/com/ard/tianyu/netty/command/RegisterCommand.java b/ard-work/src/main/java/com/ard/tianyu/netty/command/RegisterCommand.java
index 5d61c98..89d3dd6 100644
--- a/ard-work/src/main/java/com/ard/tianyu/netty/command/RegisterCommand.java
+++ b/ard-work/src/main/java/com/ard/tianyu/netty/command/RegisterCommand.java
@@ -1,6 +1,13 @@
 package com.ard.tianyu.netty.command;// RegisterMessage.java
+
 import io.netty.buffer.ByteBuf;
 
+/**
+ * 注册命令
+ *
+ * @author 刘苏义
+ * @date 2024/10/22 16:36
+ */
 public class RegisterCommand extends BaseCommand {
     private int userId;
     private byte[] accessToken;
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 5c27bd5..60d9321 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
@@ -45,7 +45,7 @@
         if (command != null) {
             out.add(command); // 添加解码的命令对象到输出列表
         } else {
-           // log.warn("无法识别的命令码: {}", cmdCode);
+          //  log.warn("无法识别的命令码: {}", cmdCode);
         }
     }
-}
+}
\ No newline at end of file
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 6301887..b38d972 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
@@ -55,7 +55,10 @@
 
     /**
      * 注册
-     * @return
      */
     void registerMessage();
+    /**
+     * 云台转动(基于角度)
+     */
+    void controlAngle(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 3438c14..e9d3dbd 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
@@ -7,10 +7,12 @@
 import com.ard.tianyu.model.dto.BoxSettingsDTO;
 import com.ard.tianyu.model.receiver.*;
 import com.ard.tianyu.netty.command.BaseCommand;
+import com.ard.tianyu.netty.command.ControlAngleCommand;
 import com.ard.tianyu.netty.command.HeartbeatCommand;
 import com.ard.tianyu.netty.command.RegisterCommand;
 import com.ard.tianyu.netty.TyNettyTcpClient;
 import com.ard.tianyu.service.ITyService;
+import com.ard.vtdu.util.ArdTool;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
 import io.netty.channel.Channel;
@@ -104,14 +106,18 @@
         return result.getState() == 1;
     }
 
-
+    /**
+     * 注册天宇平台
+     */
     @Override
     public void registerMessage() {
         AccessTokenReceiver tyToken = tyConfiguration.getAccessToken();
         RegisterCommand registerMessage = new RegisterCommand(tyToken.getCompanyId(), tyToken.getAccessToken().getBytes());
         this.sendMessage(tyConfiguration.getIpPort(), registerMessage);
     }
-
+    /**
+     * 发送消息
+     */
     public boolean sendMessage(String key, BaseCommand msg) {
         //将从用户接收的信息发送到天宇 commandCache
         boolean cmdResult = false;
@@ -128,7 +134,7 @@
 
                 channel.writeAndFlush(buffer); // 发送编码后的数据
                 cmdResult = true;
-                log.info("向天宇服务器" + host + ":" + port + "发送数据" + ",命令码:" + msg.getCmdCode());
+                log.info("向天宇服务器" + host + ":" + port + "发送数据" + ",命令码:" + String.format("0x%02X", msg.getCmdCode() & 0xFF));
             } else {
                 log.error("与天宇服务器链接断开,无法发送数据!");
             }
@@ -140,10 +146,16 @@
         }
     }
 
+    @Override
+    public void controlAngle(String boxSn) {
+        ControlAngleCommand controlAngleCommand = new ControlAngleCommand(boxSn.getBytes(),(byte)0x00,(byte)0x00,(byte)0x05);
+        this.sendMessage(tyConfiguration.getIpPort(), controlAngleCommand);
+    }
+
     @Scheduled(fixedRate = 5000)
     public void sendHeartBeat() {
         long timestamp = System.currentTimeMillis();
-        log.debug("定时向天宇发送⼼跳,时间戳{}", timestamp);
+        log.info("定时向天宇发送⼼跳,时间戳{}", timestamp);
         HeartbeatCommand heartbeatMessage = new HeartbeatCommand(timestamp);
         this.sendMessage(tyConfiguration.getIpPort(), heartbeatMessage);
     }
diff --git a/ard-work/src/main/java/com/ard/vtdu/service/impl/MediaServiceImpl.java b/ard-work/src/main/java/com/ard/vtdu/service/impl/MediaServiceImpl.java
index 031509c..e7bf0e3 100644
--- a/ard-work/src/main/java/com/ard/vtdu/service/impl/MediaServiceImpl.java
+++ b/ard-work/src/main/java/com/ard/vtdu/service/impl/MediaServiceImpl.java
@@ -571,6 +571,9 @@
         log.info("定时同步MediaMTX任务开始");
         List<String> nameList = getNameList();
         List<BoxReceiver> boxList = tyService.getBoxList();
+        if (boxList == null || boxList.isEmpty()) {
+            return;
+        }
         List<ArdVtdu> ardVtduList = boxList.stream()
                 .filter(boxReceiver -> boxReceiver.getOnLine() != 0)  // 过滤掉不在线的
                 .map(boxReceiver -> {
diff --git a/ard-work/src/main/java/com/ard/vtdu/util/ArdTool.java b/ard-work/src/main/java/com/ard/vtdu/util/ArdTool.java
index c4fb18b..18392c0 100644
--- a/ard-work/src/main/java/com/ard/vtdu/util/ArdTool.java
+++ b/ard-work/src/main/java/com/ard/vtdu/util/ArdTool.java
@@ -209,6 +209,4 @@
             }
         }
     }
-
-
 }

--
Gitblit v1.9.3