From 764d04b497356ba6bcbb75fd42b51eca750f7223 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期三, 29 五月 2024 15:02:51 +0800
Subject: [PATCH] 调整上级观看消息的发送

---
 src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/media/MediaController.java |  108 +++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 86 insertions(+), 22 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/media/MediaController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/media/MediaController.java
old mode 100644
new mode 100755
index 450c54a..26e9685
--- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/media/MediaController.java
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/media/MediaController.java
@@ -1,36 +1,46 @@
 package com.genersoft.iot.vmp.vmanager.gb28181.media;
 
 import com.genersoft.iot.vmp.common.StreamInfo;
-import com.genersoft.iot.vmp.service.IStreamPushService;
+import com.genersoft.iot.vmp.conf.exception.ControllerException;
+import com.genersoft.iot.vmp.conf.security.JwtUtils;
+import com.genersoft.iot.vmp.conf.security.SecurityUtils;
+import com.genersoft.iot.vmp.conf.security.dto.LoginUser;
+import com.genersoft.iot.vmp.media.service.IMediaServerService;
+import com.genersoft.iot.vmp.media.zlm.dto.StreamAuthorityInfo;
 import com.genersoft.iot.vmp.service.IMediaService;
-import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
+import com.genersoft.iot.vmp.service.IStreamProxyService;
+import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
+import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
+import com.genersoft.iot.vmp.vmanager.bean.StreamContent;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.security.SecurityRequirement;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletRequest;
 
-@Api(tags = "濯掍綋娴佺浉鍏�")
+
+@Tag(name  = "濯掍綋娴佺浉鍏�")
 @Controller
-@CrossOrigin
+
 @RequestMapping(value = "/api/media")
 public class MediaController {
 
     private final static Logger logger = LoggerFactory.getLogger(MediaController.class);
 
     @Autowired
-    private IVideoManagerStorager storager;
+    private IRedisCatchStorage redisCatchStorage;
 
     @Autowired
-    private IStreamPushService streamPushService;
+    private IStreamProxyService streamProxyService;
 
     @Autowired
-    private IMediaService mediaService;
+    private IMediaServerService mediaServerService;
 
 
     /**
@@ -39,19 +49,73 @@
      * @param stream 娴乮d
      * @return
      */
-    @ApiOperation("鏍规嵁搴旂敤鍚嶅拰娴乮d鑾峰彇鎾斁鍦板潃")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "app", value = "搴旂敤鍚�", dataTypeClass = String.class),
-            @ApiImplicitParam(name = "stream", value = "娴乮d", dataTypeClass = String.class),
-            @ApiImplicitParam(name = "mediaServerId", value = "濯掍綋鏈嶅姟鍣╥d", dataTypeClass = String.class),
-    })
+    @Operation(summary = "鏍规嵁搴旂敤鍚嶅拰娴乮d鑾峰彇鎾斁鍦板潃", security = @SecurityRequirement(name = JwtUtils.HEADER))
+    @Parameter(name = "app", description = "搴旂敤鍚�", required = true)
+    @Parameter(name = "stream", description = "娴乮d", required = true)
+    @Parameter(name = "mediaServerId", description = "濯掍綋鏈嶅姟鍣╥d")
+    @Parameter(name = "callId", description = "鎺ㄦ祦鏃舵惡甯︾殑鑷畾涔夐壌鏉僆D")
+    @Parameter(name = "useSourceIpAsStreamIp", description = "鏄惁浣跨敤璇锋眰IP浣滀负杩斿洖鐨勫湴鍧�IP")
     @GetMapping(value = "/stream_info_by_app_and_stream")
     @ResponseBody
-    public StreamInfo getStreamInfoByAppAndStream(@RequestParam String app, @RequestParam String stream, @RequestParam String mediaServerId){
+    public StreamContent getStreamInfoByAppAndStream(HttpServletRequest request, @RequestParam String app,
+                                                     @RequestParam String stream,
+                                                     @RequestParam(required = false) String mediaServerId,
+                                                     @RequestParam(required = false) String callId,
+                                                     @RequestParam(required = false) Boolean useSourceIpAsStreamIp){
+        boolean authority = false;
+        if (callId != null) {
+            // 鏉冮檺鏍¢獙
+            StreamAuthorityInfo streamAuthorityInfo = redisCatchStorage.getStreamAuthorityInfo(app, stream);
+            if (streamAuthorityInfo != null
+                    && streamAuthorityInfo.getCallId() != null
+                    && streamAuthorityInfo.getCallId().equals(callId)) {
+                authority = true;
+            }else {
+                throw new ControllerException(ErrorCode.ERROR400.getCode(), "鑾峰彇鎾斁鍦板潃閴存潈澶辫触");
+            }
+        }else {
+            // 鏄惁鐧婚檰鐢ㄦ埛, 鐧婚檰鐢ㄦ埛杩斿洖瀹屾暣淇℃伅
+            LoginUser userInfo = SecurityUtils.getUserInfo();
+            if (userInfo!= null) {
+                authority = true;
+            }
+        }
 
-        return mediaService.getStreamInfoByAppAndStreamWithCheck(app, stream,mediaServerId);
+        StreamInfo streamInfo;
+
+        if (useSourceIpAsStreamIp != null && useSourceIpAsStreamIp) {
+            String host = request.getHeader("Host");
+            String localAddr = host.split(":")[0];
+            logger.info("浣跨敤{}浣滀负杩斿洖娴佺殑ip", localAddr);
+            streamInfo = mediaServerService.getStreamInfoByAppAndStreamWithCheck(app, stream, mediaServerId, localAddr, authority);
+        }else {
+            streamInfo = mediaServerService.getStreamInfoByAppAndStreamWithCheck(app, stream, mediaServerId, authority);
+        }
+
+        if (streamInfo != null){
+            return  new StreamContent(streamInfo);
+        }else {
+            //鑾峰彇娴佸け璐ワ紝閲嶅惎鎷夋祦鍚庨噸璇曚竴娆�
+            streamProxyService.stop(app,stream);
+            boolean start = streamProxyService.start(app, stream);
+            try {
+                Thread.sleep(1000);
+            } catch (InterruptedException e) {
+                logger.error("[绾跨▼浼戠湢澶辫触]锛� {}", e.getMessage());
+            }
+            if (useSourceIpAsStreamIp != null && useSourceIpAsStreamIp) {
+                String host = request.getHeader("Host");
+                String localAddr = host.split(":")[0];
+                logger.info("浣跨敤{}浣滀负杩斿洖娴佺殑ip", localAddr);
+                streamInfo = mediaServerService.getStreamInfoByAppAndStreamWithCheck(app, stream, mediaServerId, localAddr, authority);
+            }else {
+                streamInfo = mediaServerService.getStreamInfoByAppAndStreamWithCheck(app, stream, mediaServerId, authority);
+            }
+            if (streamInfo != null){
+                return new StreamContent(streamInfo);
+            }else {
+                throw new ControllerException(ErrorCode.ERROR100);
+            }
+        }
     }
-
-
-
 }

--
Gitblit v1.8.0