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