From 29f21c70e977baf0bc2c4a2c37ba3096292c1388 Mon Sep 17 00:00:00 2001
From: ‘liusuyi’ <1951119284@qq.com>
Date: Sat, 15 Jul 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("按ID查询会话")
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;
+ /**
+ * 源rtsp地址
+ */
+ 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(转码速度最快,视频往往也最模糊)、superfast、veryfast、faster、fast、medium、slow、slower、veryslow、placebo这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解码 -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);
/**
- * 按id查询rtsp会话
+ * 按sessionId查询rtsp会话
*/
@Get("{apiUrl}/rtspsessions/get/{sessionId}")
String getRtspsessionById(@Var("apiUrl") String apiUrl, @Var("sessionId") String sessionId);
+
+ /**
+ * 按sessionId删除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(文件大小,单位为B)
+ * @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(文件大小,单位为B)
+ * @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