From 29f21c70e977baf0bc2c4a2c37ba3096292c1388 Mon Sep 17 00:00:00 2001
From: ‘liusuyi’ <1951119284@qq.com>
Date: 星期六, 15 七月 2023 17:15:19 +0800
Subject: [PATCH] 增加融云token接口

---
 ard-work/src/main/java/com/ruoyi/media/controller/MediaController.java            |   76 ++++++-
 ard-work/src/main/java/com/ruoyi/utils/tools/ArdTool.java                         |   34 +++
 ard-work/src/main/java/com/ruoyi/media/domain/StreamInfo.java                     |   60 ++++++
 ard-work/src/main/java/com/ruoyi/media/service/IMediaService.java                 |    9 +
 /dev/null                                                                         |   16 -
 ard-work/src/main/java/com/ruoyi/rongcloud/service/Impl/RongCloudServiceImpl.java |   47 +++++
 ard-work/src/main/java/com/ruoyi/rongcloud/service/RongCloudService.java          |   13 +
 ard-work/src/main/java/com/ruoyi/utils/forest/RongCloudClient.java                |   23 ++
 ard-work/src/main/java/com/ruoyi/rongcloud/controller/RongCloudController.java    |   34 +++
 ard-work/src/main/java/com/ruoyi/utils/forest/MediaClient.java                    |    9 
 ard-work/src/main/java/com/ruoyi/media/domain/RtspSession.java                    |    4 
 ard-work/src/main/java/com/ruoyi/media/service/impl/MediaService.java             |  165 +++++++++++++++--
 ard-work/src/main/java/com/ruoyi/rongcloud/domain/TokenParam.java                 |   16 +
 13 files changed, 452 insertions(+), 54 deletions(-)

diff --git a/ard-work/src/main/java/com/ruoyi/media/controller/MediaController.java b/ard-work/src/main/java/com/ruoyi/media/controller/MediaController.java
index 72e1e2e..4d1121a 100644
--- a/ard-work/src/main/java/com/ruoyi/media/controller/MediaController.java
+++ b/ard-work/src/main/java/com/ruoyi/media/controller/MediaController.java
@@ -1,17 +1,15 @@
 package com.ruoyi.media.controller;
 
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
-import com.ruoyi.common.annotation.Anonymous;
+import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.media.domain.MediaInfo;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.media.domain.StreamInfo;
 import com.ruoyi.media.service.IMediaService;
-import com.ruoyi.media.service.impl.MediaService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 
@@ -24,39 +22,45 @@
  **/
 @RestController
 @Api(tags = "娴佸獟浣撴帴鍙�")
-@Anonymous
-public class MediaController {
+@RequestMapping("/media/stream")
+public class MediaController extends BaseController {
     @Resource
     private IMediaService mediaService;
 
     @PostMapping("/add")
     @ApiOperation("澧炲姞杞爜")
-    public AjaxResult addPath(@RequestBody MediaInfo mediaInfo) {
-        String rtsp = mediaService.addPath(mediaInfo.getCameraId(), mediaInfo.getRtspPath());
+    @ApiOperationSupport(includeParameters = {"streamInfo.name","streamInfo.rtspSource"})
+    public AjaxResult addPath(@RequestBody StreamInfo streamInfo) {
+        String rtsp = mediaService.addPath(streamInfo.getName(), streamInfo.getRtspSource());
         return AjaxResult.success(rtsp);
     }
+
     @PostMapping("/remove")
     @ApiOperation("绉婚櫎杞爜")
-    @ApiOperationSupport(includeParameters={"mediaInfo.cameraId"})
-    public AjaxResult removePath(@RequestBody MediaInfo mediaInfo) {
-        mediaService.removePath(mediaInfo.getCameraId());
+    @ApiOperationSupport(includeParameters = {"streamInfo.name"})
+    public AjaxResult removePath(@RequestBody StreamInfo streamInfo) {
+        mediaService.removePath(streamInfo.getName());
         return AjaxResult.success();
     }
+
     @GetMapping("/getPaths")
     @ApiOperation("鑾峰彇褰撳墠杞爜鍒楄〃")
     public AjaxResult getPaths() {
         return AjaxResult.success(mediaService.paths());
     }
+
     @GetMapping("/getRtspSessions")
     @ApiOperation("鑾峰彇rtsp浼氳瘽鍒楄〃")
     public AjaxResult getRtspSessions() {
         return AjaxResult.success(mediaService.rtspsessions());
     }
+
     @GetMapping("/getRtspConns")
     @ApiOperation("鑾峰彇rtsp杩炴帴鍒楄〃")
     public AjaxResult getRtspConns() {
         return AjaxResult.success(mediaService.rtspconns());
     }
+
     @GetMapping("/getRtspSessionById")
     @ApiOperation("鎸塈D鏌ヨ浼氳瘽")
     public AjaxResult getRtspSessionById(String sessionId) {
@@ -68,9 +72,53 @@
     public AjaxResult getPushStreams() {
         return AjaxResult.success(mediaService.getPushStreams());
     }
+
     @GetMapping("/getPullStreams")
     @ApiOperation("鑾峰彇鎷夋祦淇℃伅")
     public AjaxResult getPullStreams() {
         return AjaxResult.success(mediaService.getPullStreams());
     }
+
+    @PreAuthorize("@ss.hasPermi('media:stream:list')")
+    @GetMapping("/pushList")
+    @ApiOperation("鑾峰彇鎺ㄦ祦鍒楄〃")
+    public TableDataInfo getPushStreamList() {
+        startPage();
+        return getDataTable(mediaService.getPushStreamList());
+    }
+    /**
+     * 鏂板娴佸獟浣撴帹娴�
+     */
+    @PreAuthorize("@ss.hasPermi('media:stream:add')")
+    @PostMapping
+    @ApiOperationSupport(includeParameters = {"streamInfo.name"})
+    public AjaxResult add(@RequestBody StreamInfo streamInfo) throws InterruptedException {
+        String rtsp = mediaService.addPath(streamInfo.getName(), streamInfo.getRtspSource());
+        return AjaxResult.success(rtsp);
+    }
+    /**
+     * 鍒犻櫎娴佸獟浣撴帹娴�
+     */
+    @PreAuthorize("@ss.hasPermi('media:stream:remove')")
+    @DeleteMapping("/path/{name}")
+    public AjaxResult remove(@PathVariable String name) {
+        mediaService.removePath(name);
+        return AjaxResult.success();
+    }
+    /**
+     * 鍒犻櫎娴佸獟浣撴媺娴�
+     */
+    @PreAuthorize("@ss.hasPermi('media:stream:remove')")
+    @DeleteMapping("/{id}")
+    public AjaxResult removePullStreamSession(@PathVariable String id) {
+        return AjaxResult.success(mediaService.kickRtspSession(id));
+    }
+
+    @PreAuthorize("@ss.hasPermi('media:stream:list')")
+    @GetMapping("/pullList")
+    @ApiOperation("鑾峰彇鎷夋祦鍒楄〃")
+    public TableDataInfo getPullStreamList() {
+        startPage();
+        return getDataTable(mediaService.getPullStreamList());
+    }
 }
diff --git a/ard-work/src/main/java/com/ruoyi/media/domain/MediaInfo.java b/ard-work/src/main/java/com/ruoyi/media/domain/MediaInfo.java
deleted file mode 100644
index 6f06f1e..0000000
--- a/ard-work/src/main/java/com/ruoyi/media/domain/MediaInfo.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.ruoyi.media.domain;
-
-import lombok.Data;
-
-/**
- * @Description: 娴佸獟浣撲俊鎭疄浣�
- * @ClassName: MediaInfo
- * @Author: 鍒樿嫃涔�
- * @Date: 2023骞�07鏈�13鏃�10:11
- * @Version: 1.0
- **/
-@Data
-public class MediaInfo {
-    String cameraId;
-    String rtspPath;
-}
diff --git a/ard-work/src/main/java/com/ruoyi/media/domain/RtspSession.java b/ard-work/src/main/java/com/ruoyi/media/domain/RtspSession.java
index 26aebbd..8fb136a 100644
--- a/ard-work/src/main/java/com/ruoyi/media/domain/RtspSession.java
+++ b/ard-work/src/main/java/com/ruoyi/media/domain/RtspSession.java
@@ -1,5 +1,6 @@
 package com.ruoyi.media.domain;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 
 import java.util.Date;
@@ -13,8 +14,9 @@
  */
 @Data
 public class RtspSession {
-    private String cameraId;
+    private String name;
     private String id;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date created;
     private String remoteAddr;
     private String state;
diff --git a/ard-work/src/main/java/com/ruoyi/media/domain/StreamInfo.java b/ard-work/src/main/java/com/ruoyi/media/domain/StreamInfo.java
new file mode 100644
index 0000000..656a67a
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/media/domain/StreamInfo.java
@@ -0,0 +1,60 @@
+package com.ruoyi.media.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @Description:娴佷俊鎭�
+ * @ClassName: PushStreamInfo
+ * @Author: 鍒樿嫃涔�
+ * @Date: 2023骞�07鏈�15鏃�8:40:37
+ * @Version: 1.0
+ **/
+@Data
+@JsonInclude(value = JsonInclude.Include.NON_NULL)
+public class StreamInfo {
+    /**
+     * 浼氳瘽ID
+     */
+    String id;
+    /**
+     * 璺緞鍚嶇О
+     */
+    String name;
+    /**
+     * 婧恟tsp鍦板潃
+     */
+    String rtspSource;
+    /**
+     * rtsp鎾斁鍦板潃
+     */
+    String rtspUrl;
+    /**
+     * 浼犺緭鏂瑰紡
+     */
+    String protocol;
+    /**
+     * 涓婅娴侀噺
+     */
+    String upTraffic;
+    /**
+     * 涓嬭娴侀噺
+     */
+    String downTraffic;
+    /**
+     * 鎷夋祦鏁伴噺
+     */
+    Integer num;
+    /**
+     * 寮�濮嬫椂闂�
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    Date beginTime;
+    /**
+     * 杩滅▼涓绘満
+     */
+    String remoteAddr;
+}
diff --git a/ard-work/src/main/java/com/ruoyi/media/service/IMediaService.java b/ard-work/src/main/java/com/ruoyi/media/service/IMediaService.java
index 214c6b0..c3e1553 100644
--- a/ard-work/src/main/java/com/ruoyi/media/service/IMediaService.java
+++ b/ard-work/src/main/java/com/ruoyi/media/service/IMediaService.java
@@ -1,6 +1,7 @@
 package com.ruoyi.media.service;
 import com.ruoyi.media.domain.Items;
 import com.ruoyi.media.domain.RtspSession;
+import com.ruoyi.media.domain.StreamInfo;
 
 import java.util.List;
 
@@ -11,7 +12,15 @@
     public List<Items>paths();
     public List<Items> rtspconns();
     public List<Items> rtspsessions();
+
     RtspSession getRtspSessionById(String sessionId);
+
     List<RtspSession>getPushStreams();
     List<RtspSession>getPullStreams();
+
+    List<StreamInfo>getPushStreamList();
+    List<StreamInfo>getPullStreamList();
+
+    Boolean kickRtspSession(String sessionId);
+
 }
diff --git a/ard-work/src/main/java/com/ruoyi/media/service/impl/MediaService.java b/ard-work/src/main/java/com/ruoyi/media/service/impl/MediaService.java
index 00e5413..bf043d6 100644
--- a/ard-work/src/main/java/com/ruoyi/media/service/impl/MediaService.java
+++ b/ard-work/src/main/java/com/ruoyi/media/service/impl/MediaService.java
@@ -4,12 +4,15 @@
 import com.ruoyi.media.domain.*;
 import com.ruoyi.media.service.IMediaService;
 import com.ruoyi.utils.forest.MediaClient;
+import com.ruoyi.utils.tools.ArdTool;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * @Description:
@@ -29,8 +32,8 @@
 
     @Override
     public String addPath(String name, String rtspPath) {
-        String apiUrl="http://"+mediamtxHost+":9997/v2";
-        String rtspUrl="rtsp://"+mediamtxHost+":8554/";
+        String apiUrl = "http://" + mediamtxHost + ":9997/v2";
+        String rtspUrl = "rtsp://" + mediamtxHost + ":8554/";
         Conf mediaInfo = new Conf();
         //-vcodec libx264 //鎸囧畾瑙嗛缂栫爜鍣ㄤ负 libx264锛屼娇鐢� H.264 缂栫爜鏍煎紡杩涜瑙嗛鍘嬬缉
         //-preset ultrafast  //--preset鐨勫弬鏁颁富瑕佽皟鑺傜紪鐮侀�熷害鍜岃川閲忕殑骞宠 锛屾湁ultrafast锛堣浆鐮侀�熷害鏈�蹇紝瑙嗛寰�寰�涔熸渶妯$硦锛夈�乻uperfast銆乿eryfast銆乫aster銆乫ast銆乵edium銆乻low銆乻lower銆乿eryslow銆乸lacebo杩�10涓�夐」锛屼粠蹇埌鎱�
@@ -42,22 +45,24 @@
         //CPU杞В鐮佺紪鐮�
         String cmd = "ffmpeg -rtsp_transport tcp -i \"" + rtspPath + "\" -vcodec libx264 -preset:v ultrafast -r 25 -threads 4  -b:v 4096k -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH";
         //GPU纭В鐮佺紪鐮� -hwaccel cuvid -c:v h264_cuvid  浣跨敤cuda瑙g爜   -c:v h264_nvenc 浣跨敤cuda缂栫爜
-        //String cmd = "ffmpeg -hwaccel cuvid -c:v h264_cuvid  -rtsp_transport udp  -i \"" + rtspPath + "\" -c:v h264_nvenc  -r 25 -threads 4 -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH";
-        mediaInfo.setRunoninit(cmd);
-        mediaInfo.setRunoninitrestart(true);
+        //String cmd = "ffmpeg -hwaccel cuvid -c:v h264_cuvid  -rtsp_transport udp  -i \"" + rtspPath + "\" -c:v h264_nvenc  -r 25 -threads 4  -b:v 4096k -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH";
+//        mediaInfo.setRunoninit(cmd);
+//        mediaInfo.setRunoninitrestart(true);
+        mediaInfo.setRunondemand(cmd);
+        mediaInfo.setRunondemandrestart(true);
         mediaClient.addPath(apiUrl, name, mediaInfo);
         return rtspUrl + name;
     }
 
     @Override
     public void removePath(String name) {
-        String apiUrl="http://"+mediamtxHost+":9997/v2";
+        String apiUrl = "http://" + mediamtxHost + ":9997/v2";
         mediaClient.removePath(apiUrl, name);
     }
 
     @Override
     public List<Items> paths() {
-        String apiUrl="http://"+mediamtxHost+":9997/v2";
+        String apiUrl = "http://" + mediamtxHost + ":9997/v2";
         String list = mediaClient.paths(apiUrl);
         JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class);
         return jsonsRoot.getItems();
@@ -65,7 +70,7 @@
 
     @Override
     public List<Items> rtspconns() {
-        String apiUrl="http://"+mediamtxHost+":9997/v2";
+        String apiUrl = "http://" + mediamtxHost + ":9997/v2";
         String list = mediaClient.rtspconns(apiUrl);
         JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class);
         return jsonsRoot.getItems();
@@ -73,7 +78,7 @@
 
     @Override
     public List<Items> rtspsessions() {
-        String apiUrl="http://"+mediamtxHost+":9997/v2";
+        String apiUrl = "http://" + mediamtxHost + ":9997/v2";
         String list = mediaClient.rtspsessions(apiUrl);
         JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class);
         return jsonsRoot.getItems();
@@ -81,24 +86,23 @@
 
     @Override
     public RtspSession getRtspSessionById(String sessionId) {
-        String apiUrl="http://"+mediamtxHost+":9997/v2";
-        String list = mediaClient.getRtspsessionById(apiUrl,sessionId);
+        String apiUrl = "http://" + mediamtxHost + ":9997/v2";
+        String list = mediaClient.getRtspsessionById(apiUrl, sessionId);
         RtspSession rtspSession = JSONObject.parseObject(list, RtspSession.class);
         return rtspSession;
     }
 
     @Override
     public List<RtspSession> getPushStreams() {
-        List<RtspSession> rtspSessions=new ArrayList<>();
-        String apiUrl="http://"+mediamtxHost+":9997/v2";
+        List<RtspSession> rtspSessions = new ArrayList<>();
+        String apiUrl = "http://" + mediamtxHost + ":9997/v2";
         String list = mediaClient.paths(apiUrl);
         JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class);
         List<Items> items = jsonsRoot.getItems();
-        for(Items item:items)
-        {
+        for (Items item : items) {
             Source source = item.getSource();
             RtspSession rtspSession = getRtspSessionById(source.getId());
-            rtspSession.setCameraId(item.getName());
+            rtspSession.setName(item.getName());
             rtspSessions.add(rtspSession);
         }
         return rtspSessions;
@@ -106,20 +110,137 @@
 
     @Override
     public List<RtspSession> getPullStreams() {
-        List<RtspSession> rtspSessions=new ArrayList<>();
-        String apiUrl="http://"+mediamtxHost+":9997/v2";
+        List<RtspSession> rtspSessions = new ArrayList<>();
+        String apiUrl = "http://" + mediamtxHost + ":9997/v2";
         String list = mediaClient.paths(apiUrl);
         JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class);
         List<Items> items = jsonsRoot.getItems();
-        for(Items item:items)
-        {
+        for (Items item : items) {
             List<Readers> readers = item.getReaders();
-            for(Readers reader:readers) {
+            for (Readers reader : readers) {
                 RtspSession rtspSession = getRtspSessionById(reader.getId());
-                rtspSession.setCameraId(item.getName());
+                rtspSession.setName(item.getName());
                 rtspSessions.add(rtspSession);
             }
         }
         return rtspSessions;
     }
+
+    @Override
+    public List<StreamInfo> getPushStreamList() {
+        List<StreamInfo> PushStreamInfoList = new ArrayList<>();
+        String apiUrl = "http://" + mediamtxHost + ":9997/v2";
+        String list = mediaClient.paths(apiUrl);
+        JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class);
+        List<Items> items = jsonsRoot.getItems();
+        for (Items item : items) {
+            StreamInfo info = new StreamInfo();
+            //ID
+            String name = item.getName();
+            info.setName(name);
+            //RTSP鎾斁鍦板潃
+            String rtspUrl = "rtsp://" + mediamtxHost + ":8554/" + name;
+            info.setRtspUrl(rtspUrl);
+            Source source = item.getSource();
+            if(source==null)
+            {
+                continue;
+            }
+            RtspSession rtspSession = getRtspSessionById(source.getId());
+            //浼氳瘽ID
+            info.setId(rtspSession.getId());
+            //寮�濮嬫帹娴佹椂闂�
+            info.setBeginTime(rtspSession.getCreated());
+            //涓婅娴侀噺
+            long bytesReceived = rtspSession.getBytesReceived();
+            String formatReceivedSize = ArdTool.formatFileSize(bytesReceived);
+            info.setUpTraffic(formatReceivedSize);
+            //涓嬭娴侀噺
+            long bytesSent = rtspSession.getBytesSent();
+            String formatSentSize = ArdTool.formatFileSize(bytesSent);
+            info.setDownTraffic(formatSentSize);
+            //RTSP婧愬湴鍧�
+            //String runoninit = item.getConf().getRunoninit();
+            String runoninit = item.getConf().getRunondemand();
+            String regex = "rtsp://[^\\s\"]+";
+            Pattern pattern = Pattern.compile(regex);
+            Matcher matcher = pattern.matcher(runoninit);
+            if (matcher.find()) {
+                info.setRtspSource(matcher.group());
+            }
+            //浼犺緭鍗忚
+            regex = "-rtsp_transport\\s+(\\w+)";
+            pattern = Pattern.compile(regex);
+            matcher = pattern.matcher(runoninit);
+            if (matcher.find()) {
+                info.setProtocol(matcher.group(1));
+            }
+            //鎷夋祦鏁伴噺
+            List<Readers> readers = item.getReaders();
+            info.setNum(readers.size());
+            //鎺ㄦ祦鏈嶅姟鍣�
+            info.setRemoteAddr(rtspSession.getRemoteAddr());
+
+            PushStreamInfoList.add(info);
+        }
+        return PushStreamInfoList;
+    }
+
+    @Override
+    public List<StreamInfo> getPullStreamList() {
+        List<StreamInfo> PullStreamInfoList = new ArrayList<>();
+        String apiUrl = "http://" + mediamtxHost + ":9997/v2";
+        String list = mediaClient.paths(apiUrl);
+        JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class);
+        List<Items> items = jsonsRoot.getItems();
+        for (Items item : items) {
+            StreamInfo info = new StreamInfo();
+            //ID
+            String name = item.getName();
+            info.setName(name);
+            //RTSP鎾斁鍦板潃
+            String rtspUrl = "rtsp://" + mediamtxHost + ":8554/" + name;
+            info.setRtspUrl(rtspUrl);
+            List<Readers> readers = item.getReaders();
+            for (Readers reader : readers) {
+                RtspSession rtspSession = getRtspSessionById(reader.getId());
+                //浼氳瘽ID
+                info.setId(rtspSession.getId());
+                //寮�濮嬫媺娴佹椂闂�
+                info.setBeginTime(rtspSession.getCreated());
+                //涓婅娴侀噺
+                long bytesReceived = rtspSession.getBytesReceived();
+                String formatReceivedSize = ArdTool.formatFileSize(bytesReceived);
+                info.setUpTraffic(formatReceivedSize);
+                //涓嬭娴侀噺
+                long bytesSent = rtspSession.getBytesSent();
+                String formatSentSize = ArdTool.formatFileSize(bytesSent);
+                info.setDownTraffic(formatSentSize);
+
+                //浼犺緭鍗忚
+                String runoninit = item.getConf().getRunondemand();
+                String regex = "-rtsp_transport\\s+(\\w+)";
+                Pattern pattern = Pattern.compile(regex);
+                Matcher matcher = pattern.matcher(runoninit);
+                if (matcher.find()) {
+                    info.setProtocol(matcher.group(1));
+                }
+                //鎷夋祦鏈嶅姟鍣�
+                info.setRemoteAddr(rtspSession.getRemoteAddr());
+                PullStreamInfoList.add(info);
+            }
+        }
+        return PullStreamInfoList;
+    }
+
+    @Override
+    public Boolean kickRtspSession(String sessionId) {
+        try {
+            String apiUrl = "http://" + mediamtxHost + ":9997/v2";
+            mediaClient.kick(apiUrl, sessionId);
+            return true;
+        } catch (Exception ex) {
+            return false;
+        }
+    }
 }
diff --git a/ard-work/src/main/java/com/ruoyi/rongcloud/controller/RongCloudController.java b/ard-work/src/main/java/com/ruoyi/rongcloud/controller/RongCloudController.java
new file mode 100644
index 0000000..0659a99
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/rongcloud/controller/RongCloudController.java
@@ -0,0 +1,34 @@
+package com.ruoyi.rongcloud.controller;
+
+import com.ruoyi.common.annotation.Anonymous;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.rongcloud.service.RongCloudService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * @Description:
+ * @ClassName: RongCloudController
+ * @Author: 鍒樿嫃涔�
+ * @Date: 2023骞�07鏈�15鏃�16:57:56
+ * @Version: 1.0
+ **/
+@RestController
+@Api(tags = "铻嶄簯鎺ュ彛")
+@Anonymous
+public class RongCloudController {
+    @Resource
+    RongCloudService rongCloudService;
+
+    @GetMapping("getToken")
+    @ApiOperation("鑾峰彇token")
+    public AjaxResult getToken(String userId,String name)
+    {
+        String token = rongCloudService.getToken(userId, name);
+        return AjaxResult.success(token);
+    }
+}
diff --git a/ard-work/src/main/java/com/ruoyi/rongcloud/domain/TokenParam.java b/ard-work/src/main/java/com/ruoyi/rongcloud/domain/TokenParam.java
new file mode 100644
index 0000000..1592491
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/rongcloud/domain/TokenParam.java
@@ -0,0 +1,16 @@
+package com.ruoyi.rongcloud.domain;
+
+import lombok.Data;
+
+/**
+ * @Description:
+ * @ClassName: TokenParam
+ * @Author: 鍒樿嫃涔�
+ * @Date: 2023骞�07鏈�15鏃�16:54:39
+ * @Version: 1.0
+ **/
+@Data
+public class TokenParam {
+    String userId;
+    String name;
+}
diff --git a/ard-work/src/main/java/com/ruoyi/rongcloud/service/Impl/RongCloudServiceImpl.java b/ard-work/src/main/java/com/ruoyi/rongcloud/service/Impl/RongCloudServiceImpl.java
new file mode 100644
index 0000000..07176a1
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/rongcloud/service/Impl/RongCloudServiceImpl.java
@@ -0,0 +1,47 @@
+package com.ruoyi.rongcloud.service.Impl;
+
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.rongcloud.domain.TokenParam;
+import com.ruoyi.rongcloud.service.RongCloudService;
+import com.ruoyi.system.mapper.SysConfigMapper;
+import com.ruoyi.system.service.ISysConfigService;
+import com.ruoyi.utils.forest.RongCloudClient;
+import okhttp3.FormBody;
+import okhttp3.RequestBody;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Date;
+
+/**
+ * @Description:
+ * @ClassName: RongCloudServiceImpl
+ * @Author: 鍒樿嫃涔�
+ * @Date: 2023骞�07鏈�15鏃�16:49:12
+ * @Version: 1.0
+ **/
+@Service
+public class RongCloudServiceImpl implements RongCloudService {
+
+    @Resource
+    RongCloudClient rongCloudClient;
+    @Resource
+    ISysConfigService iSysConfigService;
+    @Override
+    public String getToken(String userId,String name) {
+//        String appKey="6tnym11s1h717";
+//        String appSecret="IwcGk2flZr";
+        String rongyunApiUrl = iSysConfigService.selectConfigByKey("rongyun");
+        String appKey = iSysConfigService.selectConfigByKey("RongCloudAppKey");
+        String appSecret = iSysConfigService.selectConfigByKey("RongCloudAppSecret");
+        TokenParam param=new TokenParam();
+        param.setUserId(userId);
+        param.setName(name);
+        String Nonce = String.valueOf(Math.random()).split("\\.")[1];
+        String Timestamp = String.valueOf(new Date().getTime());
+        String Signature = DigestUtils.sha1Hex(appSecret + Nonce + Timestamp);//App Secret + Nonce + Timestamp
+        String token = rongCloudClient.getToken(rongyunApiUrl,appKey, Nonce, Timestamp, Signature, param);
+        return token;
+    }
+}
diff --git a/ard-work/src/main/java/com/ruoyi/rongcloud/service/RongCloudService.java b/ard-work/src/main/java/com/ruoyi/rongcloud/service/RongCloudService.java
new file mode 100644
index 0000000..476765a
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/rongcloud/service/RongCloudService.java
@@ -0,0 +1,13 @@
+package com.ruoyi.rongcloud.service;
+
+/**
+ * @Description:
+ * @ClassName: RongCloudService
+ * @Author: 鍒樿嫃涔�
+ * @Date: 2023骞�07鏈�15鏃�16:48:36
+ * @Version: 1.0
+ **/
+public interface RongCloudService {
+
+    String getToken(String userId,String name);
+}
diff --git a/ard-work/src/main/java/com/ruoyi/utils/forest/MediaClient.java b/ard-work/src/main/java/com/ruoyi/utils/forest/MediaClient.java
index 7cba8ac..f3e0480 100644
--- a/ard-work/src/main/java/com/ruoyi/utils/forest/MediaClient.java
+++ b/ard-work/src/main/java/com/ruoyi/utils/forest/MediaClient.java
@@ -45,8 +45,15 @@
     String rtspconns(@Var("apiUrl") String apiUrl);
 
     /**
-     * 鎸塱d鏌ヨrtsp浼氳瘽
+     * 鎸塻essionId鏌ヨrtsp浼氳瘽
      */
     @Get("{apiUrl}/rtspsessions/get/{sessionId}")
     String getRtspsessionById(@Var("apiUrl") String apiUrl, @Var("sessionId") String sessionId);
+
+    /**
+     * 鎸塻essionId鍒犻櫎rtsp浼氳瘽
+     */
+    @Post("{apiUrl}/rtspsessions/kick/{sessionId}")
+    String kick(@Var("apiUrl") String apiUrl, @Var("sessionId") String sessionId);
+
 }
diff --git a/ard-work/src/main/java/com/ruoyi/utils/forest/RongCloudClient.java b/ard-work/src/main/java/com/ruoyi/utils/forest/RongCloudClient.java
new file mode 100644
index 0000000..db4f18a
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/utils/forest/RongCloudClient.java
@@ -0,0 +1,23 @@
+package com.ruoyi.utils.forest;
+
+import com.dtflys.forest.annotation.BaseRequest;
+import com.dtflys.forest.annotation.Body;
+import com.dtflys.forest.annotation.Post;
+import com.dtflys.forest.annotation.Var;
+import com.ruoyi.rongcloud.domain.TokenParam;
+
+@BaseRequest(
+        baseURL = "{rongyunApiUrl}",
+        sslProtocol = "TLS"
+)
+public interface RongCloudClient {
+
+    @Post(url = "/user/getToken.json", headers = {
+            "App-Key:{AppKey}",
+            "Nonce:{Nonce}",
+            "Timestamp:{Timestamp}",
+            "Signature:{Signature}",
+    })
+    public String getToken(@Var("rongyunApiUrl") String rongyunApiUrl,@Var("AppKey") String AppKey, @Var("Nonce") String Nonce, @Var("Timestamp") String Timestamp, @Var("Signature") String Signature, @Body TokenParam param);
+
+}
diff --git a/ard-work/src/main/java/com/ruoyi/utils/tools/ArdTool.java b/ard-work/src/main/java/com/ruoyi/utils/tools/ArdTool.java
index 70172c5..ded00ce 100644
--- a/ard-work/src/main/java/com/ruoyi/utils/tools/ArdTool.java
+++ b/ard-work/src/main/java/com/ruoyi/utils/tools/ArdTool.java
@@ -5,6 +5,7 @@
 
 import javax.annotation.Resource;
 import java.lang.reflect.Field;
+import java.text.DecimalFormat;
 import java.time.LocalTime;
 import java.util.*;
 
@@ -87,4 +88,37 @@
             return 1;
         }
     }
+    /**
+     * 鏂囦欢澶у皬鏅鸿兘杞崲
+     * 浼氬皢鏂囦欢澶у皬杞崲涓烘渶澶ф弧瓒冲崟浣�
+     * @param size锛堟枃浠跺ぇ灏忥紝鍗曚綅涓築锛�
+     * @return 鏂囦欢澶у皬
+     */
+    public static String formatFileSize(Long size) {
+        String sizeName = null;
+        if (1024 * 1024 > size && size >= 1024) {
+            sizeName = String.format("%.2f", size.doubleValue() / 1024) + "KB";
+        } else if (1024 * 1024 * 1024 > size && size >= 1024 * 1024) {
+            sizeName = String.format("%.2f", size.doubleValue() / (1024 * 1024)) + "MB";
+        } else if (size >= 1024 * 1024 * 1024) {
+            sizeName = String.format("%.2f", size.doubleValue() / (1024 * 1024 * 1024)) + "GB";
+        } else {
+            sizeName = size.toString() + "B";
+        }
+        return sizeName;
+    }
+    /**
+     * 鏂囦欢澶у皬鏅鸿兘杞崲
+     * 浼氬皢鏂囦欢澶у皬杞崲涓烘渶澶ф弧瓒冲崟浣�
+     * @param size锛堟枃浠跺ぇ灏忥紝鍗曚綅涓築锛�
+     * @return	鏂囦欢澶у皬
+     */
+    public static String readableFileSize(long size) {
+        if (size <= 0) {
+            return "0";
+        }
+        final String[] units = new String[]{"B", "KB", "MB", "GB", "TB"};
+        int digitGroups = (int) (Math.log10(size) / Math.log10(1024));
+        return new DecimalFormat("#,###.##").format(size / Math.pow(1024, digitGroups)) + " " + units[digitGroups];
+    }
 }

--
Gitblit v1.9.3