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