From c197c31a1a7bc8a0d7011e39193e3d94060b397c Mon Sep 17 00:00:00 2001
From: liusuyi <1951119284@qq.com>
Date: Tue, 11 Mar 2025 13:35:37 +0800
Subject: [PATCH] 优化websocket应答信息

---
 ard-work/src/main/java/com/ard/tianyu/websocket/handler/TyMessageHandler.java |  115 ++++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 88 insertions(+), 27 deletions(-)

diff --git a/ard-work/src/main/java/com/ard/tianyu/websocket/handler/TyMessageHandler.java b/ard-work/src/main/java/com/ard/tianyu/websocket/handler/TyMessageHandler.java
index d7be5e8..f5e5bbe 100644
--- a/ard-work/src/main/java/com/ard/tianyu/websocket/handler/TyMessageHandler.java
+++ b/ard-work/src/main/java/com/ard/tianyu/websocket/handler/TyMessageHandler.java
@@ -2,10 +2,10 @@
 
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.TypeReference;
-import com.ard.tianyu.service.impl.UavControlManager;
-import com.ard.tianyu.service.impl.UavStreamManager;
+import com.ard.tianyu.service.control.UavControlService;
 import com.ard.tianyu.websocket.domain.BaseMessage;
-import com.ard.tianyu.websocket.domain.PullStreamDTO;
+import com.ard.tianyu.websocket.domain.UavStreamMessage;
+import com.ard.tianyu.websocket.domain.UavStateMessage;
 import com.ard.tianyu.websocket.utils.WebSocketUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
@@ -21,54 +21,115 @@
 public class TyMessageHandler extends TextWebSocketHandler {
 
     @Resource
-    private UavControlManager uavControlManager;
-    @Resource
     private UavStreamManager uavStreamManager;
+    @Resource
+    private UavControlService uavControlService;
+    @Resource
+    private UavStateManager uavStateManager;
+
+
     @Override
     public void handleTextMessage(WebSocketSession session, TextMessage message) {
-        // 处理接收到的消息
-        String userId = (String) session.getAttributes().get("userId");
+        String userIdStr = (String) session.getAttributes().get("userId");
+        Long userId = Long.parseLong(userIdStr);
         String payload = message.getPayload();
         log.info("【cmd】Received message: {}", payload);
         log.info("【cmd】size: {}", WebSocketUtil.ONLINE_USER_SESSIONS.size());
+
         BaseMessage<?> baseMessage = JSON.parseObject(payload, BaseMessage.class);
         switch (baseMessage.getType()) {
             case "stream":
-                BaseMessage<PullStreamDTO> streamMessage = JSON.parseObject(payload,
-                        new TypeReference<BaseMessage<PullStreamDTO>>() {
-                        });
-                PullStreamDTO pullStreamDTO = streamMessage.getPayload();
-                if (pullStreamDTO != null) {
-                    String boxSn = pullStreamDTO.getBoxSn();
-                    if (pullStreamDTO.getPullType().equals(1)) {
-                        uavStreamManager.startPullStream(boxSn, userId);
-                    } else {
-                        uavStreamManager.stopPullStream(boxSn, userId);
-                    }
-                }
+                handleStreamMessage(payload, userId);
+                break;
+            case "state":
+                handleStateMessage(payload, userId);
                 break;
         }
-
     }
+
+    /**
+     * 处理流消息
+     * <p>
+     * 该方法解析给定的负载数据,以获取无人机流消息,并根据消息类型决定是否开始或停止流
+     *
+     * @param payload 消息的负载数据,通常为JSON字符串
+     * @param userId  接收消息的用户ID
+     */
+    private void handleStreamMessage(String payload, Long userId) {
+        // 解析JSON负载数据为BaseMessage对象,包含UavStreamMessage类型的有效载荷
+        BaseMessage<UavStreamMessage> streamMessage = JSON.parseObject(payload,
+                new TypeReference<BaseMessage<UavStreamMessage>>() {
+                });
+        UavStreamMessage uavStreamMessage = streamMessage.getPayload();
+
+        // 检查解析后的UavStreamMessage对象是否非空
+        if (uavStreamMessage != null) {
+            String boxSn = uavStreamMessage.getBoxSn();
+
+            // 根据Subscribe决定操作类型:true表示开始拉流,false表示停止拉流
+            if (uavStreamMessage.getSubscribe()) {
+                uavStreamManager.startPullStream(boxSn, userId);
+            } else {
+                uavStreamManager.stopPullStream(boxSn, userId);
+            }
+        }
+    }
+
+    /**
+     * 处理状态消息
+     * 根据接收到的消息内容,决定无人机状态信息的订阅或退订
+     *
+     * @param payload 消息负载,包含订阅信息
+     * @param userId  用户ID,用于标识用户
+     */
+    private void handleStateMessage(String payload, Long userId) {
+        // 解析接收到的JSON消息,将其转换为BaseMessage对象
+        BaseMessage<UavStateMessage> stateMessage = JSON.parseObject(payload,
+                new TypeReference<BaseMessage<UavStateMessage>>() {
+                });
+        // 获取消息的有效载荷部分
+        UavStateMessage uavStateMessage = stateMessage.getPayload();
+
+        // 检查有效载荷是否存在
+        if (uavStateMessage != null) {
+            // 获取无人机盒子的序列号
+            String boxSn = uavStateMessage.getBoxSn();
+            // 根据消息中的订阅标志,决定是订阅还是退订无人机状态
+            Boolean subscribe = uavStateMessage.getSubscribe();
+            if (subscribe) {
+                // 执行订阅操作
+                uavStateManager.subscribeState(boxSn, userId);
+            } else {
+                // 执行退订操作
+                uavStateManager.unsubscribeState(boxSn, userId);
+            }
+        }
+    }
+
 
     @Override
     public void afterConnectionEstablished(WebSocketSession session) {
         log.info("【cmd】Connected: {}", session.getId());
-        String userId = (String) session.getAttributes().get("userId");
+        String userIdStr = (String) session.getAttributes().get("userId");
+        Long userId = Long.parseLong(userIdStr);
         WebSocketUtil.ONLINE_USER_SESSIONS.put(userId, session);
         log.info("【cmd】size: {}", WebSocketUtil.ONLINE_USER_SESSIONS.size());
-
     }
 
     @Override
     public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
         log.info("【cmd】Disconnected: {}", session.getId());
-        String userId = (String) session.getAttributes().get("userId");
+        String userIdStr = (String) session.getAttributes().get("userId");
+        Long userId = Long.parseLong(userIdStr);
         WebSocketUtil.ONLINE_USER_SESSIONS.remove(userId);
         log.info("【cmd】size: {}", WebSocketUtil.ONLINE_USER_SESSIONS.size());
-        //停止用户的所有流
+        // 停止用户的所有流
         uavStreamManager.stopAllPullStreamByUser(userId);
-        //移除控制的无人机
-        uavControlManager.releaseAllControlByUser(userId);
+        if (userId != null) {
+            // 释放该用户所有 UAV 控制权
+            uavControlService.releaseAllControls(userId);
+        }
+
+        uavStateManager.removeSubscribeState(userId);
     }
-}
\ No newline at end of file
+}

--
Gitblit v1.9.3