From 7beea5916728a84617d4791775d0aac70ab32eee Mon Sep 17 00:00:00 2001
From: zhaowenyu <35589726@qq.com>
Date: Fri, 12 Dec 2025 10:40:43 +0800
Subject: [PATCH] 2025-12-12 zwy 优化,订阅视频时,谁订阅发给谁直播地址,其他订阅不变

---
 ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceOSDServiceImpl.java         |    2 +-
 ard-sample/src/main/java/com/ard/sample/manage/service/impl/DockOSDServiceImpl.java           |    2 +-
 ard-sample/src/main/java/com/ard/sample/component/websocket/handler/DockWebSocketHandler.java |   25 +++++++++++++++++++------
 ard-sample/src/main/java/com/ard/sample/manage/service/impl/ControlServiceImpl.java           |    2 +-
 ard-sample/src/main/java/com/ard/sample/component/mqtt/handler/PropertySetReplyHandler.java   |    2 +-
 ard-sample/src/main/java/com/ard/sample/manage/service/impl/DockOnlineServiceImpl.java        |    2 +-
 ard-sample/src/main/java/com/ard/sample/wayline/service/impl/FlightTaskServiceImpl.java       |    4 ++--
 ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceServiceImpl.java            |    7 +++++--
 ard-sample/src/main/java/com/ard/sample/component/mqtt/handler/ServicesReplyHandler.java      |    2 +-
 ard-sample/src/main/java/com/ard/sample/component/websocket/handler/LiveStreamHandler.java    |    4 ++--
 10 files changed, 34 insertions(+), 18 deletions(-)

diff --git a/ard-sample/src/main/java/com/ard/sample/component/mqtt/handler/PropertySetReplyHandler.java b/ard-sample/src/main/java/com/ard/sample/component/mqtt/handler/PropertySetReplyHandler.java
index 4bb5a40..f84e890 100644
--- a/ard-sample/src/main/java/com/ard/sample/component/mqtt/handler/PropertySetReplyHandler.java
+++ b/ard-sample/src/main/java/com/ard/sample/component/mqtt/handler/PropertySetReplyHandler.java
@@ -60,6 +60,6 @@
         String dockControl="";
         dockControl=mapper.writeValueAsString(receiver);
 
-        _dockWebSocketHandler.sendMessageToSubscribers(deviceSn, MessageType.CONTROL.getType(),dockControl);
+        _dockWebSocketHandler.sendMessageToSubscribers(deviceSn, MessageType.CONTROL.getType(),dockControl, "");
     }
 }
diff --git a/ard-sample/src/main/java/com/ard/sample/component/mqtt/handler/ServicesReplyHandler.java b/ard-sample/src/main/java/com/ard/sample/component/mqtt/handler/ServicesReplyHandler.java
index c1909e5..c7d6e2f 100644
--- a/ard-sample/src/main/java/com/ard/sample/component/mqtt/handler/ServicesReplyHandler.java
+++ b/ard-sample/src/main/java/com/ard/sample/component/mqtt/handler/ServicesReplyHandler.java
@@ -64,7 +64,7 @@
         String dockControl="";
         dockControl=mapper.writeValueAsString(receiver);
 
-        _dockWebSocketHandler.sendMessageToSubscribers(deviceSn, MessageType.CONTROL.getType(),dockControl);
+        _dockWebSocketHandler.sendMessageToSubscribers(deviceSn, MessageType.CONTROL.getType(),dockControl, "");
 
 //        DockControlProgressWebSockerHandler.
     }
diff --git a/ard-sample/src/main/java/com/ard/sample/component/websocket/handler/DockWebSocketHandler.java b/ard-sample/src/main/java/com/ard/sample/component/websocket/handler/DockWebSocketHandler.java
index c9af46c..36ab8cc 100644
--- a/ard-sample/src/main/java/com/ard/sample/component/websocket/handler/DockWebSocketHandler.java
+++ b/ard-sample/src/main/java/com/ard/sample/component/websocket/handler/DockWebSocketHandler.java
@@ -153,6 +153,13 @@
             // 3. 处理订阅/取消订阅逻辑
             handleSubscription(userId, messageType, payload);
 
+            // 直播类型订阅:触发开启直播
+            if (MessageType.LIVESTREAM.getType().equals(messageType) && payload.isSubscribe()) {
+                String sn = payload.getSn();
+                _liveStreamService.StartLiveStreaming(sn,userId);
+                log.info("设备[{}]直播流已开启(用户[{}]订阅触发)", sn, userId);
+            }
+
         } catch (Exception e) {
             log.error("用户[{}]消息处理异常", userId, e);
             sendMessage(session, "消息格式错误或处理失败:" + e.getMessage());
@@ -187,11 +194,11 @@
             subscriptions.computeIfAbsent(subscriptionKey, k -> ConcurrentHashMap.newKeySet()).add(userId);
 //            log.info("用户[{}]订阅设备[{}]的[{}]类型消息", userId, sn, type);
 
-            // 直播类型订阅:触发开启直播
-            if (MessageType.LIVESTREAM.getType().equals(type)) {
-                _liveStreamService.StartLiveStreaming(sn);
-                log.info("设备[{}]直播流已开启(用户[{}]订阅触发)", sn, userId);
-            }
+//            // 直播类型订阅:触发开启直播
+//            if (MessageType.LIVESTREAM.getType().equals(type)) {
+//                _liveStreamService.StartLiveStreaming(sn);
+//                log.info("设备[{}]直播流已开启(用户[{}]订阅触发)", sn, userId);
+//            }
         } else {
             // 取消订阅操作
             if (subscriptions.containsKey(subscriptionKey)) {
@@ -257,7 +264,7 @@
      * @param type    消息类型(对应MessageType)
      * @param content 消息内容(JSON字符串)
      */
-    public void sendMessageToSubscribers(String sn, String type, String content) {
+    public void sendMessageToSubscribers(String sn, String type, String content, String uId) {
         String subscriptionKey = getSubscriptionKey(sn, type);
         Set<String> subscriberIds = subscriptions.getOrDefault(subscriptionKey, Collections.emptySet());
 
@@ -280,6 +287,12 @@
 
             // 线程安全发送消息
             try {
+                if(MessageType.LIVESTREAM.getType().equals(type)) {
+                    WebSocketSession liveSession = userSessions.get(uId);
+                    sendMessage(liveSession, content);
+                    log.info("单独向用户[{}]推送设备[{}]的[{}]类型消息:{}", uId, sn, type, content);
+                    return;
+                }
                 sendMessage(session, content);
                 log.debug("向用户[{}]推送设备[{}]的[{}]类型消息:{}", userId, sn, type, content);
             } catch (IOException e) {
diff --git a/ard-sample/src/main/java/com/ard/sample/component/websocket/handler/LiveStreamHandler.java b/ard-sample/src/main/java/com/ard/sample/component/websocket/handler/LiveStreamHandler.java
index 90e1f72..60c1ef7 100644
--- a/ard-sample/src/main/java/com/ard/sample/component/websocket/handler/LiveStreamHandler.java
+++ b/ard-sample/src/main/java/com/ard/sample/component/websocket/handler/LiveStreamHandler.java
@@ -31,7 +31,7 @@
     /**
      * 开启直播
      */
-    public void StartLiveStreaming(String sn) {
+    public void StartLiveStreaming(String sn ,String userId) {
         //调用开始直播
         ResponseResult rlive = null;
         String resultLive = "";
@@ -61,7 +61,7 @@
                     }
                 }
             }
-            _dockWebSocketHandler.sendMessageToSubscribers(sn, MessageType.LIVESTREAM.getType(), resultLive);
+            _dockWebSocketHandler.sendMessageToSubscribers(sn, MessageType.LIVESTREAM.getType(), resultLive, userId);
             log.info("SN: {}-直播地址:{}", sn, resultLive);
         } catch (Exception e) {
             log.info("SN: {}-开启直播失败!原因:{}", sn, e.getMessage());
diff --git a/ard-sample/src/main/java/com/ard/sample/manage/service/impl/ControlServiceImpl.java b/ard-sample/src/main/java/com/ard/sample/manage/service/impl/ControlServiceImpl.java
index b2c1dbd..ca96e58 100644
--- a/ard-sample/src/main/java/com/ard/sample/manage/service/impl/ControlServiceImpl.java
+++ b/ard-sample/src/main/java/com/ard/sample/manage/service/impl/ControlServiceImpl.java
@@ -191,7 +191,7 @@
             e.printStackTrace();
         }
         // 设备控制进度消息websocket发给前端
-        _dockWebSocketHandler.sendMessageToSubscribers(sn, MessageType.PROGRESS.getType(), dockProgress);
+        _dockWebSocketHandler.sendMessageToSubscribers(sn, MessageType.PROGRESS.getType(), dockProgress, "");
 
         if (receiver.getNeedReply() != null && receiver.getNeedReply() == 1) {
             String topic = headers.get(MqttHeaders.RECEIVED_TOPIC) + TopicConst._REPLY_SUF;
diff --git a/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceOSDServiceImpl.java b/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceOSDServiceImpl.java
index 9f55a60..b9c3894 100644
--- a/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceOSDServiceImpl.java
+++ b/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceOSDServiceImpl.java
@@ -116,7 +116,7 @@
             wsMessage.getData().setHost(data);
 
             // 发送给websocket客户端
-            _dockWebSocketHandler.sendMessageToSubscribers(device.getDeviceSn(), MessageType.STATUS.getType(), dockOsd);
+            _dockWebSocketHandler.sendMessageToSubscribers(device.getDeviceSn(), MessageType.STATUS.getType(), dockOsd, "");
 
             sendMessageService.sendBatch(webSessions, wsMessage);
             this.pushTelemetryData(data, device.getDeviceSn());
diff --git a/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceServiceImpl.java b/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceServiceImpl.java
index 9b8d260..efc6fba 100644
--- a/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceServiceImpl.java
+++ b/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceServiceImpl.java
@@ -1,6 +1,8 @@
 package com.ard.sample.manage.service.impl;
 
 import com.alibaba.fastjson2.JSONObject;
+import com.ard.common.core.domain.model.LoginUser;
+import com.ard.common.utils.SecurityUtils;
 import com.ard.device.camera.domain.ArdCamera;
 import com.ard.device.camera.service.IArdCameraService;
 import com.ard.device.channel.domain.ArdChannel;
@@ -369,6 +371,7 @@
     //region 单独写一个方法做权限验证,由于有好多定时任务也在实时获取设备列表,原方法不适用再添加权限注解
     @Override
     public List<DeviceDTO> getDockList(String nickname) {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
         List<DeviceDTO> devicesList = this.getDockListByParams(
                 DeviceQueryParam.builder()
                         .domains(List.of(DeviceDomainEnum.GATEWAY.getVal(), DeviceDomainEnum.DOCK.getVal()))
@@ -376,8 +379,8 @@
                         .build());
         // 在獲取设备列表时,顺便获取直播地址
         for(DeviceDTO devices : devicesList){
-            _liveStreamHandler.StartLiveStreaming(devices.getDeviceSn());
-            _liveStreamHandler.StartLiveStreaming(devices.getChildDeviceSn());
+            _liveStreamHandler.StartLiveStreaming(devices.getDeviceSn(), loginUser.getUserId().toString());
+            _liveStreamHandler.StartLiveStreaming(devices.getChildDeviceSn(), loginUser.getUserId().toString());
             ArdCamera ardCamera = new ArdCamera();
             ardCamera.setDockId(devices.getId());
             List<ArdCamera> ardCameraList = _cameraService.selectArdCameraList(ardCamera);
diff --git a/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DockOSDServiceImpl.java b/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DockOSDServiceImpl.java
index 18a8e27..36346d8 100644
--- a/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DockOSDServiceImpl.java
+++ b/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DockOSDServiceImpl.java
@@ -97,7 +97,7 @@
             wsMessage.getData().setHost(data);
             sendMessageService.sendBatch(webSessions, wsMessage);
             // 发送给websocket客户端
-            _dockWebSocketHandler.sendMessageToSubscribers(device.getDeviceSn(), MessageType.STATUS.getType(), dockOsd);
+            _dockWebSocketHandler.sendMessageToSubscribers(device.getDeviceSn(), MessageType.STATUS.getType(), dockOsd, "");
         }
     }
 }
diff --git a/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DockOnlineServiceImpl.java b/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DockOnlineServiceImpl.java
index 670e1c2..9824635 100644
--- a/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DockOnlineServiceImpl.java
+++ b/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DockOnlineServiceImpl.java
@@ -84,7 +84,7 @@
             String json = getJSONString(MessageType.STATE.getType(), device.getDeviceSn(), dockStatus, droneStatus);
 
             // 发送给websocket客户端
-            _dockWebSocketHandler.sendMessageToSubscribers(device.getDeviceSn(), MessageType.STATE.getType(), json);
+            _dockWebSocketHandler.sendMessageToSubscribers(device.getDeviceSn(), MessageType.STATE.getType(), json, "");
         }
     }
 
diff --git a/ard-sample/src/main/java/com/ard/sample/wayline/service/impl/FlightTaskServiceImpl.java b/ard-sample/src/main/java/com/ard/sample/wayline/service/impl/FlightTaskServiceImpl.java
index 34da626..0907f99 100644
--- a/ard-sample/src/main/java/com/ard/sample/wayline/service/impl/FlightTaskServiceImpl.java
+++ b/ard-sample/src/main/java/com/ard/sample/wayline/service/impl/FlightTaskServiceImpl.java
@@ -149,7 +149,7 @@
         } catch (Exception e) {
             e.printStackTrace();
         }
-        _dockWebSocketHandler.sendMessageToSubscribers(dockSn, MessageType.STATUS.getType(), json);
+        _dockWebSocketHandler.sendMessageToSubscribers(dockSn, MessageType.STATUS.getType(), json, "");
     }
 
     /**
@@ -194,7 +194,7 @@
         } catch (Exception e) {
             e.printStackTrace();
         }
-        _dockWebSocketHandler.sendMessageToSubscribers(jobArr[0], MessageType.STATUS.getType(), json);
+        _dockWebSocketHandler.sendMessageToSubscribers(jobArr[0], MessageType.STATUS.getType(), json, "");
         log.info("定时任务自定义状态为待执行,json: {}", json);
         // endregion
         long now = System.currentTimeMillis();

--
Gitblit v1.9.3