From 016aa105789fca71e86cdbb0d26a181812f200f9 Mon Sep 17 00:00:00 2001 From: liusuyi <1951119284@qq.com> Date: 星期三, 10 七月 2024 15:33:36 +0800 Subject: [PATCH] 优化:流媒体同步任务 --- ard-work/src/main/java/com/ruoyi/media/controller/MediaController.java | 9 ard-work/src/main/java/com/ruoyi/call/controller/ArdCallSessionUserController.java | 9 ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/lib/ToolKits.java | 2 ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallHistoryServiceImpl.java | 43 ++ ard-work/src/main/java/com/ruoyi/media/service/IMediaService.java | 6 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SyncTask.java | 49 ++ ard-work/src/main/java/com/ruoyi/media/domain/RtmpSession.java | 1 ard-work/src/main/java/com/ruoyi/media/domain/Vtdu.java | 1 ard-work/src/main/java/com/ruoyi/media/domain/Items.java | 2 ard-work/src/main/java/com/ruoyi/media/service/impl/MediaV2ServiceImpl.java | 26 - ard-work/src/main/java/com/ruoyi/app/position/controller/ArdAppPositionController.java | 118 +++--- ard-work/src/main/java/com/ruoyi/device/channel/service/impl/ArdChannelServiceImpl.java | 47 ++ ard-work/src/main/java/com/ruoyi/media/service/impl/VtduServiceImpl.java | 67 ++++ ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java | 31 - ard-work/src/main/java/com/ruoyi/app/position/service/impl/AppPositionPushService.java | 22 - ard-work/src/main/java/com/ruoyi/call/mapper/ArdCallSessionUserMapper.java | 2 ard-work/src/main/java/com/ruoyi/media/domain/RtspSession.java | 1 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/PushTask.java | 105 +++--- ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/module/ConfigModule.java | 16 ard-work/src/main/java/com/ruoyi/media/service/IVtduService.java | 55 ++ ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallGroupUserServiceImpl.java | 19 + ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DahuaSDK.java | 73 ++-- ard-work/src/main/java/com/ruoyi/utils/websocket/service/ChatServerEndpoint.java | 31 + ard-work/src/main/java/com/ruoyi/media/domain/Paths.java | 3 ard-work/src/main/java/com/ruoyi/call/dto/CallMessage.java | 20 + ard-work/src/main/java/com/ruoyi/media/domain/WebrtcSession.java | 1 ard-work/src/main/java/com/ruoyi/media/mapper/VtduMapper.java | 20 ard-work/src/main/java/com/ruoyi/utils/forest/MediaClient.java | 5 ard-work/src/main/resources/mapper/vtdu/VtduMapper.xml | 3 ard-work/src/main/java/com/ruoyi/device/channel/service/IArdChannelService.java | 25 + ard-work/src/main/java/com/ruoyi/media/service/impl/MediaServiceImpl.java | 64 +-- ard-work/src/main/resources/mapper/call/ArdCallSessionUserMapper.xml | 5 ard-work/src/main/java/com/ruoyi/media/controller/VtduController.java | 27 - ard-work/src/main/java/com/ruoyi/device/camera/service/impl/ArdCamerasServiceImpl.java | 5 ard-work/src/main/java/com/ruoyi/call/service/IArdCallSessionUserService.java | 2 ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallSessionUserServiceImpl.java | 19 + 36 files changed, 591 insertions(+), 343 deletions(-) diff --git a/ard-work/src/main/java/com/ruoyi/app/position/controller/ArdAppPositionController.java b/ard-work/src/main/java/com/ruoyi/app/position/controller/ArdAppPositionController.java index 2099754..3b5c939 100644 --- a/ard-work/src/main/java/com/ruoyi/app/position/controller/ArdAppPositionController.java +++ b/ard-work/src/main/java/com/ruoyi/app/position/controller/ArdAppPositionController.java @@ -31,19 +31,22 @@ import com.ruoyi.common.core.page.TableDataInfo; import org.springframework.web.multipart.MultipartFile; +import java.net.InetAddress; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.UnknownHostException; import java.util.*; /** * app浣嶇疆Controller - * + * * @author ard * @date 2023-07-18 */ @Api(tags = "app浣嶇疆") @RestController @RequestMapping("/app/position") -public class ArdAppPositionController extends BaseController -{ +public class ArdAppPositionController extends BaseController { @Autowired private IArdAppPositionService ardAppPositionService; @Autowired @@ -57,8 +60,7 @@ @ApiOperation("鏌ヨapp浣嶇疆鍒楄〃") // @PreAuthorize("@ss.hasPermi('app:position:list')") @GetMapping("/list") - public TableDataInfo list(ArdAppPosition ardAppPosition) - { + public TableDataInfo list(ArdAppPosition ardAppPosition) { startPage(); List<ArdAppPosition> list = ardAppPositionService.selectArdAppPositionList(ardAppPosition); return getDataTable(list); @@ -70,8 +72,7 @@ @PreAuthorize("@ss.hasPermi('app:position:export')") @Log(title = "app浣嶇疆", businessType = BusinessType.EXPORT) @PostMapping("/export") - public void export(HttpServletResponse response, ArdAppPosition ardAppPosition) - { + public void export(HttpServletResponse response, ArdAppPosition ardAppPosition) { List<ArdAppPosition> list = ardAppPositionService.selectArdAppPositionList(ardAppPosition); ExcelUtil<ArdAppPosition> util = new ExcelUtil<ArdAppPosition>(ArdAppPosition.class); util.exportExcel(response, list, "app浣嶇疆鏁版嵁"); @@ -82,8 +83,7 @@ */ @PreAuthorize("@ss.hasPermi('app:position:query')") @GetMapping(value = "/{id}") - public AjaxResult getInfo(@PathVariable("id") String id) - { + public AjaxResult getInfo(@PathVariable("id") String id) { return success(ardAppPositionService.selectArdAppPositionById(id)); } @@ -94,8 +94,7 @@ // @PreAuthorize("@ss.hasPermi('app:position:add')") @Log(title = "app浣嶇疆", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@RequestBody ArdAppPosition ardAppPosition) - { + public AjaxResult add(@RequestBody ArdAppPosition ardAppPosition) { return AjaxResult.success(ardAppPositionService.insertArdAppPosition(ardAppPosition)); } @@ -105,8 +104,7 @@ @PreAuthorize("@ss.hasPermi('app:position:edit')") @Log(title = "app浣嶇疆", businessType = BusinessType.UPDATE) @PutMapping - public AjaxResult edit(@RequestBody ArdAppPosition ardAppPosition) - { + public AjaxResult edit(@RequestBody ArdAppPosition ardAppPosition) { return toAjax(ardAppPositionService.updateArdAppPosition(ardAppPosition)); } @@ -115,19 +113,18 @@ */ @PreAuthorize("@ss.hasPermi('app:position:remove')") @Log(title = "app浣嶇疆", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public AjaxResult remove(@PathVariable String[] ids) - { + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable String[] ids) { return toAjax(ardAppPositionService.deleteArdAppPositionByIds(ids)); } + /** * 鑾峰彇鎵�鏈夌敤鎴� */ @ApiOperation("鑾峰彇鎵�鏈夌敤鎴�") @GetMapping("/getUserlist") - public AjaxResult getUserlist(Long deptId) - { - SysUser user=new SysUser(); + public AjaxResult getUserlist(Long deptId) { + SysUser user = new SysUser(); user.setDeptId(deptId); List<SysUser> list = sysUserService.selectUserList(user); return AjaxResult.success(list); @@ -144,57 +141,50 @@ List<SysUser> list = sysUserService.selectAllAppUserList(user); return AjaxResult.success(list); } + /** * 鑾峰彇鎵�鏈塧pp鐢ㄦ埛 */ @ApiOperation("鑾峰彇鎵�鏈塧pp鐢ㄦ埛pc") @GetMapping("/getAppUserForPclist") - public AjaxResult getAppUserForPclist(Long deptId) - { - SysUser user=new SysUser(); + public AjaxResult getAppUserForPclist(Long deptId) { + SysUser user = new SysUser(); user.setDeptId(deptId); List<SysUser> list = sysUserService.selectAllAppUserList(user); - List<SysUser> onLineList=new ArrayList<>(); - List<SysUser> offLineList=new ArrayList<>(); - for(SysUser sysUser:list) - { + List<SysUser> onLineList = new ArrayList<>(); + List<SysUser> offLineList = new ArrayList<>(); + for (SysUser sysUser : list) { ArdAppPosition ardAppPosition = ardAppPositionService.selectLastArdAppPositionByUserId(sysUser.getUserId()); - if(ardAppPosition!=null) { - Map<String, Object> params =new HashMap<>(); + if (ardAppPosition != null) { + Map<String, Object> params = new HashMap<>(); params.put("longitude", ardAppPosition.getLongitude()); params.put("latitude", ardAppPosition.getLatitude()); params.put("altitude", ardAppPosition.getAltitude()); params.put("bearing", ardAppPosition.getBearing()); sysUser.setParams(params); } - if(StringUtils.isNotNull(sysUser.getAppOnlineState())) - { - if(sysUser.getAppOnlineState().equals("1")) - { + if (StringUtils.isNotNull(sysUser.getAppOnlineState())) { + if (sysUser.getAppOnlineState().equals("1")) { onLineList.add(sysUser); - } - else - { + } else { offLineList.add(sysUser); } - } - else - { + } else { offLineList.add(sysUser); } } - Map<String,Object> onlineMap=new HashMap<>(); - onlineMap.put("children",onLineList); - onlineMap.put("name","鍦ㄧ嚎鐢ㄦ埛("+onLineList.size()+")"); - onlineMap.put("disabled",true); - onlineMap.put("id","onLine"); - Map<String,Object> offlineMap=new HashMap<>(); - offlineMap.put("children",offLineList); - offlineMap.put("name","绂荤嚎鐢ㄦ埛("+offLineList.size()+")"); - offlineMap.put("disabled",true); - offlineMap.put("id","offLine"); - List< Map<String,Object> > lists = new ArrayList<>(); + Map<String, Object> onlineMap = new HashMap<>(); + onlineMap.put("children", onLineList); + onlineMap.put("name", "鍦ㄧ嚎鐢ㄦ埛(" + onLineList.size() + ")"); + onlineMap.put("disabled", true); + onlineMap.put("id", "onLine"); + Map<String, Object> offlineMap = new HashMap<>(); + offlineMap.put("children", offLineList); + offlineMap.put("name", "绂荤嚎鐢ㄦ埛(" + offLineList.size() + ")"); + offlineMap.put("disabled", true); + offlineMap.put("id", "offLine"); + List<Map<String, Object>> lists = new ArrayList<>(); lists.add(onlineMap); lists.add(offlineMap); return AjaxResult.success(lists); @@ -205,24 +195,28 @@ */ @ApiOperation("鑾峰彇鐢ㄦ埛璇︽儏") @GetMapping("/getUserInfo") - public AjaxResult getUserInfo(String userId) - { + public AjaxResult getUserInfo(String userId) { SysUser sysUser = sysUserService.selectUserById(userId); return AjaxResult.success(sysUser); } + @PostMapping("/uploadFile") @ApiOperation("涓婁紶鏂囦欢") - public AjaxResult uploadFile(MultipartFile file,String type) - { - String url = MinioUtil.putObjectAndGetUrl("app",type, file); - return AjaxResult.success(url); + public AjaxResult uploadFile(MultipartFile file, String type) throws MalformedURLException, UnknownHostException { + String urlStr = MinioUtil.putObjectAndGetUrl("app", type, file); + URL url = new URL(urlStr); + // 鏇挎崲 https 涓� http锛屽苟灏嗕富鏈哄悕鍜岀鍙e彿鏇挎崲涓烘湰鍦板湴鍧� + String serverIpAddress = InetAddress.getLocalHost().getHostAddress(); + // 鏋勫缓鏂扮殑 URL 瀵硅薄锛屼娇鐢� HTTPS 鍗忚 + URL httpsUrl = new URL("https", serverIpAddress, url.getPort(), url.getFile()); + return AjaxResult.success(httpsUrl); } @GetMapping("/getOnlinePCOrCommander") @ApiOperation("鏌ヨ鏈儴闂ㄥ湪绾縋C绔強鎸囨尌绔�") public AjaxResult getOnlinePCOrCommander() { String usersId = SecurityUtils.getUserId(); - Map<String,List<SysUser>> result = ardAppPositionService.getOnlinePCOrCommander(usersId); + Map<String, List<SysUser>> result = ardAppPositionService.getOnlinePCOrCommander(usersId); return AjaxResult.success(result); } @@ -230,10 +224,10 @@ @ApiOperation("鍗曞叺绔煡鐪嬪凡閫氳繃瀹℃壒鐨勫湪绾挎寚鎸ョ浣嶇疆") public AjaxResult getOnlineCommanderPosition() { String soilderId = SecurityUtils.getUserId(); - try{ - List<Map<String,Object>> result = ardAppPositionService.getOnlineCommanderPosition(soilderId); + try { + List<Map<String, Object>> result = ardAppPositionService.getOnlineCommanderPosition(soilderId); return AjaxResult.success(result); - }catch(Exception e){ + } catch (Exception e) { e.printStackTrace(); return AjaxResult.error(); } @@ -241,11 +235,11 @@ @PostMapping("/getAPPPositionByUserIdAndTime") @ApiOperation("鏌ョ湅APP鍘嗗彶浣嶇疆") - public AjaxResult getAPPPositionByUserIdAndTime(@RequestBody Map<String,String> para) { - try{ + public AjaxResult getAPPPositionByUserIdAndTime(@RequestBody Map<String, String> para) { + try { List<ArdAppPosition> result = ardAppPositionService.getAPPPositionByUserIdAndTime(para); return AjaxResult.success(result); - }catch(Exception e){ + } catch (Exception e) { e.printStackTrace(); return AjaxResult.error(); } diff --git a/ard-work/src/main/java/com/ruoyi/app/position/service/impl/AppPositionPushService.java b/ard-work/src/main/java/com/ruoyi/app/position/service/impl/AppPositionPushService.java index 00d1980..d60f957 100644 --- a/ard-work/src/main/java/com/ruoyi/app/position/service/impl/AppPositionPushService.java +++ b/ard-work/src/main/java/com/ruoyi/app/position/service/impl/AppPositionPushService.java @@ -126,6 +126,10 @@ Map<String, Object> map = JSONObject.parseObject(message, Map.class); if (map.size() > 0) { Boolean enabled = (Boolean) map.get("enabled"); + if(enabled==null) + { + return; + } if (enabled) { //鍚姩鍏ㄥ眬鎺ㄩ�� List<ArdAppPosition> newList = new ArrayList<>(AppPositionPushService.getAppPositionList()); @@ -172,24 +176,6 @@ AppPositionPushService.tempUserTimerMap.remove(userId); AppPositionPushService.tempDataMap.remove(userId); } - //region 鏃ф柟娉� -// Map<String, List<ArdAppPosition>> dataMap = new HashMap<>(); -// List<ArdAppPosition> positionList = AppPositionPush.initDataMap.get(userId);//鑾峰彇褰撳墠鐢ㄦ埛鐨勯粯璁ゅ彂閫佺殑鏁版嵁map -// if(frequency>0) -// { -// //鎺ユ敹鍒伴鐜囧ぇ浜�0锛屽睘浜庣敵璇峰紩瀵硷紝鑾峰彇闄ゅ紩瀵煎鐨勫叾浠朼pp鐢ㄦ埛鐨勪綅缃甃ist -// List<ArdAppPosition> appPositionList = positionList.stream() -// .filter(obj -> !obj.getUserId().equals(uId)) -// .collect(Collectors.toList()); -// dataMap.put(userId,appPositionList); -// } -// else { -// //鎺ユ敹鍒伴鐜囩瓑浜�0锛屽睘浜庨噴鏀惧紩瀵硷紝鑾峰彇鍒板叏閮╝pp鐢ㄦ埛鐨勪綅缃甃ist -// dataMap.put(userId,AppPositionPush.getAppPositionList()); -// } -// AppPositionPush.initDataMap.putAll(dataMap);//鏇存柊鍒濆浼氳瘽榛樿鏁版嵁map -// AppPositionPush.startLocationPushTask(userId,session,uId, frequency);//寮�鍚柊浠诲姟 - //endregion } } catch (Exception ex) diff --git a/ard-work/src/main/java/com/ruoyi/call/controller/ArdCallSessionUserController.java b/ard-work/src/main/java/com/ruoyi/call/controller/ArdCallSessionUserController.java index 5d83e2e..75dd55d 100644 --- a/ard-work/src/main/java/com/ruoyi/call/controller/ArdCallSessionUserController.java +++ b/ard-work/src/main/java/com/ruoyi/call/controller/ArdCallSessionUserController.java @@ -57,11 +57,12 @@ } /** - * 鑾峰彇浼氳瘽鐢ㄦ埛涓棿琛ㄨ缁嗕俊鎭� + * 鑾峰彇浼氳瘽璇︽儏 */ - @GetMapping(value = "/{id}") - public AjaxResult getInfo(@PathVariable("id") String id) { - return success(ardCallSessionUserService.selectArdCallSessionUserById(id)); + @ApiOperation("鑾峰彇浼氳瘽璇︽儏") + @GetMapping(value = "/{userId}/{sessionId}") + public AjaxResult getInfo(@PathVariable("userId") String userId,@PathVariable("sessionId") String sessionId) { + return success(ardCallSessionUserService.selectArdCallSessionUserBySesionId(userId,sessionId)); } /** diff --git a/ard-work/src/main/java/com/ruoyi/call/dto/CallMessage.java b/ard-work/src/main/java/com/ruoyi/call/dto/CallMessage.java new file mode 100644 index 0000000..56cca2a --- /dev/null +++ b/ard-work/src/main/java/com/ruoyi/call/dto/CallMessage.java @@ -0,0 +1,20 @@ +package com.ruoyi.call.dto; + +import lombok.Data; + +/** + * @ClassName:CallMessage + * @Description: + * @Author:ard + * @Date:2024骞�07鏈�08鏃�13:48 + * @Version:1.0 + **/ +@Data +public class CallMessage { + String step; + String roomId; + String userId; + String targetId; + Integer mediaType; + Integer type; +} diff --git a/ard-work/src/main/java/com/ruoyi/call/mapper/ArdCallSessionUserMapper.java b/ard-work/src/main/java/com/ruoyi/call/mapper/ArdCallSessionUserMapper.java index fd7d26e..8e54a4e 100644 --- a/ard-work/src/main/java/com/ruoyi/call/mapper/ArdCallSessionUserMapper.java +++ b/ard-work/src/main/java/com/ruoyi/call/mapper/ArdCallSessionUserMapper.java @@ -19,7 +19,7 @@ * @return 浼氳瘽鐢ㄦ埛涓棿琛� */ public ArdCallSessionUser selectArdCallSessionUserById(String id); - + public ArdCallSessionUser selectArdCallSessionUserBySesionId(@Param("userId") String userId,@Param("sessionId") String sessionId); /** * 鏌ヨ浼氳瘽鐢ㄦ埛涓棿琛ㄥ垪琛� * diff --git a/ard-work/src/main/java/com/ruoyi/call/service/IArdCallSessionUserService.java b/ard-work/src/main/java/com/ruoyi/call/service/IArdCallSessionUserService.java index f8aa9e5..9441907 100644 --- a/ard-work/src/main/java/com/ruoyi/call/service/IArdCallSessionUserService.java +++ b/ard-work/src/main/java/com/ruoyi/call/service/IArdCallSessionUserService.java @@ -18,7 +18,7 @@ * @return 浼氳瘽鐢ㄦ埛涓棿琛� */ public ArdCallSessionUser selectArdCallSessionUserById(String id); - + public ArdCallSessionUser selectArdCallSessionUserBySesionId(String userId,String sessionId); /** * 鏌ヨ浼氳瘽鐢ㄦ埛涓棿琛ㄥ垪琛� * diff --git a/ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallGroupUserServiceImpl.java b/ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallGroupUserServiceImpl.java index a2962b4..668544f 100644 --- a/ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallGroupUserServiceImpl.java +++ b/ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallGroupUserServiceImpl.java @@ -4,6 +4,8 @@ import java.util.List; import com.ruoyi.call.domain.ArdCallGroup; +import com.ruoyi.call.domain.ArdCallSessionUser; +import com.ruoyi.call.mapper.ArdCallSessionUserMapper; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.utils.DateUtils; @@ -36,6 +38,8 @@ private ArdCallGroupUserMapper ardCallGroupUserMapper; @Resource private SysUserMapper sysUserMapper; + @Resource + private ArdCallSessionUserMapper ardCallSessionUserMapper; /** * 鏌ヨ缇ょ粍鐢ㄦ埛涓棿 @@ -130,6 +134,19 @@ ardCallGroupUser.setCreateTime(DateUtils.getNowDate()); ardCallGroupUser.setUserId(userId); ardCallGroupUserMapper.insertArdCallGroupUser(ardCallGroupUser); + //閭�璇锋垚鍛樻垚鍔熷悗鍒涘缓session + //閫氳繃缇d鑾峰彇缇ession + String sessionId = ardCallSessionUserMapper.getGroupSessionId("1", id); + if (StringUtils.isNotEmpty(sessionId)) { + ArdCallSessionUser ardCallSessionUser = new ArdCallSessionUser(); + ardCallSessionUser.setId(IdUtils.simpleUUID()); + ardCallSessionUser.setType("1"); + ardCallSessionUser.setSessionId(sessionId); + ardCallSessionUser.setUserId(userId); + ardCallSessionUser.setTargetId(id); + ardCallSessionUser.setCreateTime(DateUtils.getNowDate()); + ardCallSessionUserMapper.insertArdCallSessionUser(ardCallSessionUser); + } }); return userIds.length; } @@ -151,7 +168,7 @@ //鑾峰彇骞冲彴鎵�鏈夌敤鎴� List<SysUser> userList = sysUserMapper.selectUserList(new SysUser()); //鑾峰彇缇ょ粍鍐呯敤鎴� - ArdCallGroupUser ardCallGroupUser=new ArdCallGroupUser(); + ArdCallGroupUser ardCallGroupUser = new ArdCallGroupUser(); ardCallGroupUser.setGroupId(groupId); List<ArdCallGroupUser> ardCallGroupUsers = ardCallGroupUserMapper.selectArdCallGroupUserList(ardCallGroupUser); // 鎻愬彇groupList涓殑userId鍒颁竴涓猄et涓� diff --git a/ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallHistoryServiceImpl.java b/ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallHistoryServiceImpl.java index 8667806..82014e5 100644 --- a/ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallHistoryServiceImpl.java +++ b/ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallHistoryServiceImpl.java @@ -1,7 +1,10 @@ package com.ruoyi.call.service.impl; +import java.util.HashMap; import java.util.List; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; import com.ruoyi.call.domain.*; import com.ruoyi.call.mapper.*; import com.ruoyi.common.utils.DateUtils; @@ -13,12 +16,17 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.call.service.IArdCallHistoryService; import javax.annotation.Resource; +import javax.websocket.Session; import static com.ruoyi.utils.websocket.util.WebSocketUtils.ONLINE_USER_SESSIONS; @@ -69,6 +77,8 @@ */ @Override public int insertArdCallHistory(ArdCallHistory ardCallHistory) { + + ardCallHistory.setId(IdUtils.simpleUUID()); ardCallHistory.setCreateTime(DateUtils.getNowDate()); ArdCallSession ardCallSession = ardCallSessionMapper.selectArdCallSessionById(ardCallHistory.getSessionId()); @@ -86,7 +96,20 @@ ardCallUnreadMessagesMapper.updateArdCallUnreadMessages(ardCallUnreadMessages); } //websocket鍙戦�佺粰targetId - WebSocketUtils.sendMessage(ONLINE_USER_SESSIONS.get(ardCallHistory.getTargetId()),ardCallHistory.getContent()); + // 鏋勫缓姝e垯琛ㄨ揪寮忔ā寮� + String regex = "^" + Pattern.quote(ardCallHistory.getTargetId()) + "_\\d+$"; + Pattern pattern = Pattern.compile(regex); + Map<String, Object> messageMap = new HashMap<>(); + messageMap.put("type", "message"); + messageMap.put("message", JSON.toJSONString(ardCallHistory)); + ONLINE_USER_SESSIONS.entrySet().stream() + .filter(entry -> { + Matcher matcher = pattern.matcher(entry.getKey()); + return matcher.matches(); + }) + .map(Map.Entry::getValue) + .forEach(session -> WebSocketUtils.sendMessage(session, messageMap)); + } else { //鏇存柊缇よ亰鐢ㄦ埛鏈娑堟伅璁℃暟 ArdCallGroupUser ardCallGroupUser = new ArdCallGroupUser(); @@ -106,9 +129,23 @@ ardCallUnreadMessages.setUnreadCount(ardCallUnreadMessages.getUnreadCount() + 1); ardCallUnreadMessagesMapper.updateArdCallUnreadMessages(ardCallUnreadMessages); } + //websocket鍙戦�佺粰targetId + // 鏋勫缓姝e垯琛ㄨ揪寮忔ā寮� + String regex = "^" + Pattern.quote(groupUser.getUserId()) + "_\\d+$"; + Pattern pattern = Pattern.compile(regex); + Map<String, Object> messageMap = new HashMap<>(); + messageMap.put("type", "message"); + messageMap.put("message", JSON.toJSONString(ardCallHistory)); + ONLINE_USER_SESSIONS.entrySet().stream() + .filter(entry -> + { + Matcher matcher = pattern.matcher(entry.getKey()); + return matcher.matches(); + }) + .map(Map.Entry::getValue) + .forEach(session -> WebSocketUtils.sendMessage(session, messageMap)); } - //websocket鍙戦�佺粰targetId - WebSocketUtils.sendMessage(ONLINE_USER_SESSIONS.get(groupUser.getUserId()),ardCallHistory.getContent()); + }); } diff --git a/ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallSessionUserServiceImpl.java b/ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallSessionUserServiceImpl.java index 13c2fdf..f6cdeea 100644 --- a/ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallSessionUserServiceImpl.java +++ b/ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallSessionUserServiceImpl.java @@ -54,6 +54,25 @@ return ardCallSessionUserMapper.selectArdCallSessionUserById(id); } + @Override + public ArdCallSessionUser selectArdCallSessionUserBySesionId(String userId,String sessionId) { + ArdCallSessionUser ardCallSessionUser = ardCallSessionUserMapper.selectArdCallSessionUserBySesionId(userId,sessionId); + if(ardCallSessionUser!=null) + { + //鑾峰彇鏈鏁伴噺 + ArdCallUnreadMessages ardCallUnreadMessages = ardCallUnreadMessagesMapper.getUnreadMessage(ardCallSessionUser.getSessionId(), ardCallSessionUser.getUserId()); + if (ardCallUnreadMessages != null) { + ardCallSessionUser.setUnReadCount(ardCallUnreadMessages.getUnreadCount()); + } else { + ardCallSessionUser.setUnReadCount(0); + } + //鑾峰彇鏈�鍚庝竴鏉℃秷鎭疄浣� + ArdCallHistory ardCallHistory = ardCallHistoryMapper.selectLastArdCallHistory(ardCallSessionUser.getSessionId()); + ardCallSessionUser.setArdCallHistory(ardCallHistory); + } + return ardCallSessionUser; + } + /** * 鏌ヨ浼氳瘽鐢ㄦ埛涓棿琛ㄥ垪琛� * diff --git a/ard-work/src/main/java/com/ruoyi/device/camera/service/impl/ArdCamerasServiceImpl.java b/ard-work/src/main/java/com/ruoyi/device/camera/service/impl/ArdCamerasServiceImpl.java index 63e8ade..aea448b 100644 --- a/ard-work/src/main/java/com/ruoyi/device/camera/service/impl/ArdCamerasServiceImpl.java +++ b/ard-work/src/main/java/com/ruoyi/device/camera/service/impl/ArdCamerasServiceImpl.java @@ -85,7 +85,8 @@ for (ArdCameras ardCamera : ardCameras) { redisCache.setCacheObject(getCacheKey(ardCamera.getId()), ardCamera); } - + //娓呯┖娴佸獟浣� + vtduService.clearVtdu(); } /** @@ -95,7 +96,7 @@ * @Param * @return */ - @Scheduled(cron = "0 0/10 * * * ?") + //@Scheduled(cron = "0 0/10 * * * ?") public void clearRecordTemp() { log.debug("瀹氭椂娓呯悊鏈湴褰曞儚缂撳瓨鏂囦欢锛堣秴杩�1澶╋級"); diff --git a/ard-work/src/main/java/com/ruoyi/device/channel/service/IArdChannelService.java b/ard-work/src/main/java/com/ruoyi/device/channel/service/IArdChannelService.java index e926827..eea7265 100644 --- a/ard-work/src/main/java/com/ruoyi/device/channel/service/IArdChannelService.java +++ b/ard-work/src/main/java/com/ruoyi/device/channel/service/IArdChannelService.java @@ -65,4 +65,29 @@ * @return 缁撴灉 */ public int deleteArdChannelByDeviceId(String deviceId); + /** + * @Author 鍒樿嫃涔� + * @Description 鑾峰彇2涓�氶亾鍒楄〃鐨勪氦闆� + * @Date 2024/7/10 9:38 + * @Param + * @return + */ + public List<ArdChannel> sameList(List<ArdChannel> oldArrayList, List<ArdChannel> newArrayList); + /** + * @Author 鍒樿嫃涔� + * @Description 鍙�2涓�氶亾鍒楄〃鐨勫樊闆� + * @Date 2024/7/10 9:39 + * @Param + * @return + */ + public List<ArdChannel> diffList(List<ArdChannel> firstArrayList, List<ArdChannel> secondArrayList); + + /** + * @Author 鍒樿嫃涔� + * @Description 鍚屾閫氶亾淇℃伅 + * @Date 2024/7/10 13:20 + * @Param + * @return + */ + public void asyncChannel(List<ArdChannel> oldArrayList, List<ArdChannel> newArrayList); } diff --git a/ard-work/src/main/java/com/ruoyi/device/channel/service/impl/ArdChannelServiceImpl.java b/ard-work/src/main/java/com/ruoyi/device/channel/service/impl/ArdChannelServiceImpl.java index 44ec3b3..ce6565d 100644 --- a/ard-work/src/main/java/com/ruoyi/device/channel/service/impl/ArdChannelServiceImpl.java +++ b/ard-work/src/main/java/com/ruoyi/device/channel/service/impl/ArdChannelServiceImpl.java @@ -1,6 +1,7 @@ package com.ruoyi.device.channel.service.impl; import java.util.List; +import java.util.stream.Collectors; import com.ruoyi.common.utils.uuid.IdUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -8,6 +9,8 @@ import com.ruoyi.device.channel.mapper.ArdChannelMapper; import com.ruoyi.device.channel.domain.ArdChannel; import com.ruoyi.device.channel.service.IArdChannelService; + +import javax.annotation.Resource; /** * 閫氶亾绠$悊Service涓氬姟灞傚鐞� @@ -17,7 +20,7 @@ */ @Service public class ArdChannelServiceImpl implements IArdChannelService { - @Autowired + @Resource private ArdChannelMapper ardChannelMapper; /** @@ -50,8 +53,8 @@ */ @Override public int insertArdChannel(ArdChannel ardChannel) { - ardChannel.setId(IdUtils.simpleUUID()); - return ardChannelMapper.insertArdChannel(ardChannel); + ardChannel.setId(IdUtils.simpleUUID()); + return ardChannelMapper.insertArdChannel(ardChannel); } /** @@ -86,6 +89,7 @@ public int deleteArdChannelById(String id) { return ardChannelMapper.deleteArdChannelById(id); } + /** * 鍒犻櫎閫氶亾绠$悊淇℃伅 * @@ -96,4 +100,39 @@ public int deleteArdChannelByDeviceId(String deviceId) { return ardChannelMapper.deleteArdChannelByDeviceId(deviceId); } -} + + //姹備袱涓璞ist鐨勪氦闆� + @Override + public List<ArdChannel> sameList(List<ArdChannel> oldArrayList, List<ArdChannel> newArrayList) { + List<ArdChannel> resultList = newArrayList.stream() + .filter(item -> oldArrayList.stream().map(e -> e.getChanNo()) + .collect(Collectors.toList()).contains(item.getChanNo())) + .collect(Collectors.toList()); + return resultList; + } + + //姹備袱涓璞ist鐨勫樊闆� + @Override + public List<ArdChannel> diffList(List<ArdChannel> firstArrayList, List<ArdChannel> secondArrayList) { + List<ArdChannel> resultList = firstArrayList.stream() + .filter(item -> !secondArrayList.stream().map(e -> e.getChanNo()).collect(Collectors.toList()).contains(item.getChanNo())) + .collect(Collectors.toList()); + return resultList; + } + + @Override + public void asyncChannel(List<ArdChannel> oldArrayList, List<ArdChannel> newArrayList) { + //闇�瑕佹洿鏂扮殑鏁版嵁,鍙傛暟椤哄簭娉ㄦ剰 + sameList(oldArrayList, newArrayList).stream().forEach(ardChannel -> { + updateArdChannel(ardChannel); + }); + //闇�瑕佸垹闄ょ殑鏁版嵁 + diffList(oldArrayList, newArrayList).stream().forEach(ardChannel -> { + deleteArdChannelById(ardChannel.getId()); + }); + //闇�瑕佹柊澧炵殑鏁版嵁 + diffList(newArrayList, oldArrayList).stream().forEach(ardChannel -> { + insertArdChannel(ardChannel); + }); + } +} \ No newline at end of file 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 6b39d98..7232194 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 @@ -193,13 +193,4 @@ return getDataTable(mediaService.getPullStreamList()); } - /** - * 閰嶇疆娴佸獟浣撳弬鏁� - */ - @PostMapping("/setConfig") - @ApiOperation("閰嶇疆娴佸獟浣撳弬鏁�") - @ApiOperationSupport(order = 8) - public AjaxResult setConfig(@RequestBody Config config) { - return AjaxResult.success(mediaService.setConfig(config)); - } } diff --git a/ard-work/src/main/java/com/ruoyi/media/controller/VtduController.java b/ard-work/src/main/java/com/ruoyi/media/controller/VtduController.java index d61b746..4df6fb0 100644 --- a/ard-work/src/main/java/com/ruoyi/media/controller/VtduController.java +++ b/ard-work/src/main/java/com/ruoyi/media/controller/VtduController.java @@ -114,32 +114,7 @@ */ @GetMapping(value = "/{name}/noPerm") public AjaxResult getInfoNoPerm(@PathVariable("name") String name) { - Vtdu vtdu = vtduService.selectVtduByName(name); - if (vtdu != null) { - String cameraId = name.split("_")[0]; - Integer chanNo = Integer.valueOf(name.split("_")[1]); - CameraCmd cmd = new CameraCmd(cameraId, chanNo); - Map<String, Object> videoCompressionCfg = cameraSdkService.getVideoCompressionCfg(cmd); - String videoEncType = (String) videoCompressionCfg.get("videoEncType"); - if (videoEncType != null) { - if (!videoEncType.equals("鏍囧噯h264")) { - vtdu.setIsCode("1"); - } else { - vtdu.setIsCode("0"); - } - } - else - { - vtdu.setIsCode("0"); - } - //娴佸獟浣撲笉瀛樺湪鏂板锛屽瓨鍦ㄦ洿鏂� - if (!mediaService.checkNameExist(name)) { - mediaService.addPath(name, vtdu.getRtspSource(), vtdu.getMode(), vtdu.getIsCode()); - } else { - vtduService.updateVtdu(vtdu); - } - } - return success(vtdu); + return success(vtduService.selectVtduByName(name)); } /** * 鏂板娴佸獟浣撶鐞� diff --git a/ard-work/src/main/java/com/ruoyi/media/domain/Items.java b/ard-work/src/main/java/com/ruoyi/media/domain/Items.java index bd4b340..19c5351 100644 --- a/ard-work/src/main/java/com/ruoyi/media/domain/Items.java +++ b/ard-work/src/main/java/com/ruoyi/media/domain/Items.java @@ -23,5 +23,5 @@ private List<Readers> readers; private List<String> tracks; private Long bytesReceived; - + private Date readyTime; } diff --git a/ard-work/src/main/java/com/ruoyi/media/domain/JsonsRoot.java b/ard-work/src/main/java/com/ruoyi/media/domain/Paths.java similarity index 78% rename from ard-work/src/main/java/com/ruoyi/media/domain/JsonsRoot.java rename to ard-work/src/main/java/com/ruoyi/media/domain/Paths.java index 08fb974..d6108be 100644 --- a/ard-work/src/main/java/com/ruoyi/media/domain/JsonsRoot.java +++ b/ard-work/src/main/java/com/ruoyi/media/domain/Paths.java @@ -1,6 +1,5 @@ package com.ruoyi.media.domain; -import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; import java.util.List; @@ -13,7 +12,7 @@ * @Version: 1.0 **/ @Data -public class JsonsRoot { +public class Paths { private int itemCount; diff --git a/ard-work/src/main/java/com/ruoyi/media/domain/RtmpSession.java b/ard-work/src/main/java/com/ruoyi/media/domain/RtmpSession.java index 8969464..c9906d3 100644 --- a/ard-work/src/main/java/com/ruoyi/media/domain/RtmpSession.java +++ b/ard-work/src/main/java/com/ruoyi/media/domain/RtmpSession.java @@ -15,7 +15,6 @@ public class RtmpSession { 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/RtspSession.java b/ard-work/src/main/java/com/ruoyi/media/domain/RtspSession.java index 8fb136a..629baac 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 @@ -16,7 +16,6 @@ public class RtspSession { 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/Vtdu.java b/ard-work/src/main/java/com/ruoyi/media/domain/Vtdu.java index 7ddf8bb..76d7158 100644 --- a/ard-work/src/main/java/com/ruoyi/media/domain/Vtdu.java +++ b/ard-work/src/main/java/com/ruoyi/media/domain/Vtdu.java @@ -57,4 +57,5 @@ * 鐩告満ID */ String cameraId; + } diff --git a/ard-work/src/main/java/com/ruoyi/media/domain/WebrtcSession.java b/ard-work/src/main/java/com/ruoyi/media/domain/WebrtcSession.java index 5e27c27..b66dbbe 100644 --- a/ard-work/src/main/java/com/ruoyi/media/domain/WebrtcSession.java +++ b/ard-work/src/main/java/com/ruoyi/media/domain/WebrtcSession.java @@ -15,7 +15,6 @@ public class WebrtcSession { 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/mapper/VtduMapper.java b/ard-work/src/main/java/com/ruoyi/media/mapper/VtduMapper.java index f491d55..e3377e2 100644 --- a/ard-work/src/main/java/com/ruoyi/media/mapper/VtduMapper.java +++ b/ard-work/src/main/java/com/ruoyi/media/mapper/VtduMapper.java @@ -1,19 +1,19 @@ package com.ruoyi.media.mapper; import java.util.List; + import com.ruoyi.media.domain.Vtdu; /** * 娴佸獟浣撶鐞哅apper鎺ュ彛 - * + * * @author ard * @date 2023-08-29 */ -public interface VtduMapper -{ +public interface VtduMapper { /** * 鏌ヨ娴佸獟浣撶鐞� - * + * * @param name 娴佸獟浣撶鐞嗕富閿� * @return 娴佸獟浣撶鐞� */ @@ -21,7 +21,7 @@ /** * 鏌ヨ娴佸獟浣撶鐞嗗垪琛� - * + * * @param vtdu 娴佸獟浣撶鐞� * @return 娴佸獟浣撶鐞嗛泦鍚� */ @@ -29,7 +29,7 @@ /** * 鏂板娴佸獟浣撶鐞� - * + * * @param vtdu 娴佸獟浣撶鐞� * @return 缁撴灉 */ @@ -37,7 +37,7 @@ /** * 淇敼娴佸獟浣撶鐞� - * + * * @param vtdu 娴佸獟浣撶鐞� * @return 缁撴灉 */ @@ -50,13 +50,15 @@ * @return 缁撴灉 */ public int deleteVtduByName(String name); + /** * 鎵归噺鍒犻櫎娴佸獟浣撶鐞� - * + * * @param names 闇�瑕佸垹闄ょ殑鏁版嵁涓婚敭闆嗗悎 * @return 缁撴灉 */ public int deleteVtduByNames(String[] names); + /** * 鍒犻櫎娴佸獟浣撶鐞嗕俊鎭� * @@ -64,4 +66,6 @@ * @return 缁撴灉 */ public int deleteVtduByCameraId(String cameraId); + + public void clearVtdu(); } 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 c5a3b28..360b7fe 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 @@ -55,10 +55,4 @@ Boolean kickWebrtcSession(String sessionId); - /** - * 閰嶇疆娴佸獟浣撳弬鏁� - * 鍒樿嫃涔� - * 2023/10/13 15:17:57 - */ - public String setConfig(Config config); } diff --git a/ard-work/src/main/java/com/ruoyi/media/service/IVtduService.java b/ard-work/src/main/java/com/ruoyi/media/service/IVtduService.java index e5d0246..7775461 100644 --- a/ard-work/src/main/java/com/ruoyi/media/service/IVtduService.java +++ b/ard-work/src/main/java/com/ruoyi/media/service/IVtduService.java @@ -1,19 +1,20 @@ package com.ruoyi.media.service; import java.util.List; + +import com.ruoyi.device.channel.domain.ArdChannel; import com.ruoyi.media.domain.Vtdu; /** * 娴佸獟浣撶鐞哠ervice鎺ュ彛 - * + * * @author ard * @date 2023-08-29 */ -public interface IVtduService -{ +public interface IVtduService { /** * 鏌ヨ娴佸獟浣撶鐞� - * + * * @param name 娴佸獟浣撶鐞嗕富閿� * @return 娴佸獟浣撶鐞� */ @@ -21,7 +22,7 @@ /** * 鏌ヨ娴佸獟浣撶鐞嗗垪琛� - * + * * @param vtdu 娴佸獟浣撶鐞� * @return 娴佸獟浣撶鐞嗛泦鍚� */ @@ -29,7 +30,7 @@ /** * 鏂板娴佸獟浣撶鐞� - * + * * @param vtdu 娴佸獟浣撶鐞� * @return 缁撴灉 */ @@ -37,7 +38,7 @@ /** * 淇敼娴佸獟浣撶鐞� - * + * * @param vtdu 娴佸獟浣撶鐞� * @return 缁撴灉 */ @@ -45,7 +46,7 @@ /** * 鎵归噺鍒犻櫎娴佸獟浣撶鐞� - * + * * @param names 闇�瑕佸垹闄ょ殑娴佸獟浣撶鐞嗕富閿泦鍚� * @return 缁撴灉 */ @@ -53,7 +54,7 @@ /** * 鍒犻櫎娴佸獟浣撶鐞嗕俊鎭� - * + * * @param name 娴佸獟浣撶鐞嗕富閿� * @return 缁撴灉 */ @@ -66,4 +67,40 @@ * @return 缁撴灉 */ public int deleteVtduByCameraId(String cameraId); + + /** + * @Author 鍒樿嫃涔� + * @Description 娓呯┖娴佸獟浣撴墍鏈夋暟鎹� + * @Date 2024/7/10 13:21 + * @Param + * @return + */ + public void clearVtdu(); + + /** + * @return + * @Author 鍒樿嫃涔� + * @Description 鑾峰彇2涓�氶亾鍒楄〃鐨勪氦闆� + * @Date 2024/7/10 9:38 + * @Param + */ + public List<Vtdu> sameList(List<Vtdu> vtdus, List<String> names); + + /** + * @return + * @Author 鍒樿嫃涔� + * @Description 鍙�2涓�氶亾鍒楄〃鐨勫樊闆� + * @Date 2024/7/10 9:39 + * @Param + */ + public List<String> diffListToDel(List<Vtdu> vtdus, List<String> names); + public List<Vtdu> diffListToAdd(List<Vtdu> vtdus, List<String> names); + /** + * @return + * @Author 鍒樿嫃涔� + * @Description 鍚屾娴佸獟浣� + * @Date 2024/7/10 13:18 + * @Param + */ + public void asyncVtdu(List<Vtdu> vtdus, List<String> names); } diff --git a/ard-work/src/main/java/com/ruoyi/media/service/impl/MediaServiceImpl.java b/ard-work/src/main/java/com/ruoyi/media/service/impl/MediaServiceImpl.java index eee6a8b..de4f9fc 100644 --- a/ard-work/src/main/java/com/ruoyi/media/service/impl/MediaServiceImpl.java +++ b/ard-work/src/main/java/com/ruoyi/media/service/impl/MediaServiceImpl.java @@ -1,10 +1,8 @@ package com.ruoyi.media.service.impl; import com.alibaba.fastjson2.JSONObject; -import com.dtflys.forest.Forest; import com.dtflys.forest.exceptions.ForestNetworkException; import com.dtflys.forest.exceptions.ForestRuntimeException; -import com.dtflys.forest.http.ForestRequest; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.media.domain.*; import com.ruoyi.media.service.IMediaService; @@ -17,9 +15,7 @@ import org.springframework.core.annotation.Order; import org.springframework.stereotype.Service; -import javax.annotation.PostConstruct; import javax.annotation.Resource; -import javax.xml.soap.SOAPEnvelope; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -34,22 +30,14 @@ @Service @Slf4j(topic = "vtdu") @Order(2) -public class MediaServiceImpl implements IMediaService, ApplicationRunner { - public static List<String> mediaNameList = new ArrayList<>(); +public class MediaServiceImpl implements IMediaService { + @Resource MediaClient mediaClient; @Value("${mediamtx.host}") String mediamtxHost; - @Override - public void run(ApplicationArguments args) throws Exception { - mediaNameList = getNameList(); - if (mediaNameList.size() > 0) { - removePath(mediaNameList.toArray(new String[0])); - mediaNameList.clear(); - } - } /** * 娣诲姞娴佸獟浣� @@ -90,7 +78,8 @@ if (!checkNameExist(name)) { mediaClient.addPath(name, conf); - mediaNameList.add(name); + } else { + mediaClient.editPath(name, conf); } map.put("rtspUrl", rtspUrl); @@ -188,7 +177,6 @@ try { if (checkNameExist(name)) { mediaClient.removePath(name); - mediaNameList.remove(name); } } catch (ForestRuntimeException ex) { log.error("绉婚櫎娴佸獟浣撳紓甯革細" + ex.getMessage()); @@ -197,9 +185,8 @@ @Override public List<StreamInfo> paths() { - String list = mediaClient.paths(); - JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class); - List<Items> items = jsonsRoot.getItems(); + Paths paths = mediaClient.paths(); + List<Items> items = paths.getItems(); List<StreamInfo> pathInfoList = new ArrayList<>(); for (Items item : items) { StreamInfo info = new StreamInfo(); @@ -261,9 +248,8 @@ @Override public List<StreamInfo> getPushStreamList() { List<StreamInfo> PushStreamInfoList = new ArrayList<>(); - String list = mediaClient.paths(); - JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class); - List<Items> items = jsonsRoot.getItems(); + Paths paths = mediaClient.paths(); + List<Items> items = paths.getItems(); for (Items item : items) { StreamInfo info = new StreamInfo(); //ID @@ -289,6 +275,7 @@ long bytesReceived = item.getBytesReceived(); String formatReceivedSize = ArdTool.formatFileSize(bytesReceived); info.setUpTraffic(formatReceivedSize); + info.setBeginTime(item.getReadyTime()); } else { RtspSession rtspSession = getRtspSessionById(source.getId()); //浼氳瘽ID @@ -336,9 +323,8 @@ @Override public List<StreamInfo> getPullStreamList() { List<StreamInfo> PullStreamInfoList = new ArrayList<>(); - String list = mediaClient.paths(); - JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class); - List<Items> items = jsonsRoot.getItems(); + Paths paths = mediaClient.paths(); + List<Items> items = paths.getItems(); for (Items item : items) { List<Readers> readers = item.getReaders(); for (Readers reader : readers) { @@ -375,6 +361,7 @@ PullStreamInfoList.add(info); break; case "webRTCSession": + case "webrtcSession": info.setSessionType("webrtc"); //webrtc鎾斁鍦板潃 url = "http://" + mediamtxHost + ":8889/" + name; @@ -478,41 +465,32 @@ */ @Override public List<String> getNameList() { + List<String> nameList = new ArrayList<>(); try { - String paths = mediaClient.paths(); - JsonsRoot jsonsRoot = JSONObject.parseObject(paths, JsonsRoot.class); - List<Items> items = jsonsRoot.getItems(); + Paths paths = mediaClient.paths(); + List<Items> items = paths.getItems(); for (Items item : items) { - mediaNameList.add(item.getName()); + nameList.add(item.getName()); } - } catch (ForestNetworkException ex) { - log.error("鑾峰彇娴佸獟浣搉ame鍒楄〃寮傚父锛�" + ex.getMessage()); - } catch (ForestRuntimeException ex) { + } catch (Exception ex) { log.error("鑾峰彇娴佸獟浣搉ame鍒楄〃寮傚父锛�" + ex.getMessage()); } - return mediaNameList; + return nameList; } /** - * 妫�鏌ュ悕绉版槸鍚﹀瓨鍦� + * 妫�鏌ame鏄惁瀛樺湪 * 鍒樿嫃涔� * 2023/10/19 15:18:45 */ @Override public boolean checkNameExist(String name) { boolean result = false; - if (mediaNameList.contains(name)) { + List<String> nameList = getNameList(); + if (nameList.contains(name)) { result = true; } return result; - } - - /** - * 閰嶇疆娴佸獟浣撳弬鏁� - */ - @Override - public String setConfig(Config config) { - return mediaClient.setConfig(config); } diff --git a/ard-work/src/main/java/com/ruoyi/media/service/impl/MediaV2ServiceImpl.java b/ard-work/src/main/java/com/ruoyi/media/service/impl/MediaV2ServiceImpl.java index fcd2cab..ec24786 100644 --- a/ard-work/src/main/java/com/ruoyi/media/service/impl/MediaV2ServiceImpl.java +++ b/ard-work/src/main/java/com/ruoyi/media/service/impl/MediaV2ServiceImpl.java @@ -4,7 +4,6 @@ import com.dtflys.forest.exceptions.ForestNetworkException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.media.domain.*; -import com.ruoyi.media.service.IMediaService; import com.ruoyi.media.service.IMediaV2Service; import com.ruoyi.utils.forest.MediaClient; import com.ruoyi.utils.tools.ArdTool; @@ -73,9 +72,8 @@ conf.setSourceProtocol("tcp"); List<String> nameList = new ArrayList<>(); - String paths = mediaClient.paths(); - JsonsRoot jsonsRoot = JSONObject.parseObject(paths, JsonsRoot.class); - List<Items> items = jsonsRoot.getItems(); + Paths paths = mediaClient.paths(); + List<Items> items = paths.getItems(); for (Items item : items) { nameList.add(item.getName()); } @@ -167,9 +165,8 @@ @Override public List<StreamInfo> paths() { - String list = mediaClient.paths(); - JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class); - List<Items> items = jsonsRoot.getItems(); + Paths paths = mediaClient.paths(); + List<Items> items = paths.getItems(); List<StreamInfo> pathInfoList = new ArrayList<>(); for (Items item : items) { StreamInfo info = new StreamInfo(); @@ -232,9 +229,8 @@ @Override public List<StreamInfo> getPushStreamList() { List<StreamInfo> PushStreamInfoList = new ArrayList<>(); - String list = mediaClient.paths(); - JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class); - List<Items> items = jsonsRoot.getItems(); + Paths paths = mediaClient.paths(); + List<Items> items = paths.getItems(); for (Items item : items) { StreamInfo info = new StreamInfo(); //ID @@ -306,9 +302,8 @@ @Override public List<StreamInfo> getPullStreamList() { List<StreamInfo> PullStreamInfoList = new ArrayList<>(); - String list = mediaClient.paths(); - JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class); - List<Items> items = jsonsRoot.getItems(); + Paths paths = mediaClient.paths(); + List<Items> items = paths.getItems(); for (Items item : items) { List<Readers> readers = item.getReaders(); for (Readers reader : readers) { @@ -451,9 +446,8 @@ public List<String> getNameList() { List<String> nameList = new ArrayList<>(); try { - String paths = mediaClient.paths(); - JsonsRoot jsonsRoot = JSONObject.parseObject(paths, JsonsRoot.class); - List<Items> items = jsonsRoot.getItems(); + Paths paths = mediaClient.paths(); + List<Items> items = paths.getItems(); for (Items item : items) { nameList.add(item.getName()); } diff --git a/ard-work/src/main/java/com/ruoyi/media/service/impl/VtduServiceImpl.java b/ard-work/src/main/java/com/ruoyi/media/service/impl/VtduServiceImpl.java index 91e8103..36a8628 100644 --- a/ard-work/src/main/java/com/ruoyi/media/service/impl/VtduServiceImpl.java +++ b/ard-work/src/main/java/com/ruoyi/media/service/impl/VtduServiceImpl.java @@ -3,8 +3,10 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.device.channel.domain.ArdChannel; import com.ruoyi.media.service.IMediaService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -141,4 +143,69 @@ } return vtduMapper.deleteVtduByCameraId(cameraId); } + + /** + * @return + * @Author 鍒樿嫃涔� + * @Description 娓呴櫎鎵�鏈夋祦濯掍綋鏁版嵁 + * @Date 2024/7/10 13:31 + * @Param + */ + public void clearVtdu() { + vtduMapper.clearVtdu(); + } + + + //闇�瑕佹洿鏂扮殑锛堟祦濯掍綋鍜寁tdu鐩稿悓锛� + @Override + public List<Vtdu> sameList(List<Vtdu> vtdus, List<String> names) { + return vtdus.stream().filter(vtdu -> names.contains(vtdu.getName())).collect(Collectors.toList()); + } + + //闇�瑕佸垹闄ょ殑锛堟祦濯掍綋涓鐨勶級 + @Override + public List<String> diffListToDel(List<Vtdu> vtdus, List<String> names) { + if (vtdus.size() >= names.size()) { + List<String> nameList = vtdus.stream().map(Vtdu::getName) + .filter(item -> !names.contains(item)) + .collect(Collectors.toList()); + return nameList; + } else { + + List<String> nameList = names.stream().filter(item -> !vtdus.stream().map(Vtdu::getName).collect(Collectors.toList()).contains(item)) + .collect(Collectors.toList()); + return nameList; + } + + } + + //闇�瑕佹柊澧炵殑锛堟祦濯掍綋涓皯鐨勶級 + @Override + public List<Vtdu> diffListToAdd(List<Vtdu> vtdus, List<String> names) { + return vtdus.stream().filter(vtdu -> !names.contains(vtdu.getName())).collect(Collectors.toList()); + } + + /** + * @Author 鍒樿嫃涔� + * @Description 鍚屾鏈湴vtdu搴撳拰娴佸獟浣撲腑鐨勬暟鎹� + * @Date 2024/7/10 15:26 + * @Param vtdus vtdu搴撶殑闆嗗悎 + * @Param names 娴佸獟浣撶殑name闆嗗悎 + * @return + */ + @Override + public void asyncVtdu(List<Vtdu> vtdus, List<String> names) { + //闇�瑕佹洿鏂扮殑鏁版嵁,鍙傛暟椤哄簭娉ㄦ剰 + sameList(vtdus, names).stream().forEach(vtdu -> { + mediaService.editPath(vtdu.getName(), vtdu.getRtspSource(), vtdu.getMode(), vtdu.getIsCode()); + }); + //闇�瑕佸垹闄ょ殑鏁版嵁 + diffListToDel(vtdus, names).stream().forEach(name -> { + mediaService.removePath(name); + }); + //闇�瑕佹柊澧炵殑鏁版嵁 + diffListToAdd(vtdus, names).stream().forEach(vtdu -> { + mediaService.addPath(vtdu.getName(), vtdu.getRtspSource(), vtdu.getMode(), vtdu.getIsCode()); + }); + } } 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 a187f3e..158a6ee 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 @@ -4,6 +4,9 @@ import com.ruoyi.media.domain.Conf; import com.ruoyi.media.domain.Config; import com.ruoyi.media.domain.Items; +import com.ruoyi.media.domain.Paths; + +import java.nio.file.Path; /** * @Description: mediamtx娴佸獟浣撳鎴风 @@ -42,7 +45,7 @@ * 鏌ヨ鎵�鏈夎矾寰� */ @Get("/paths/list") - public String paths(); + public Paths paths(); /** * 鏌ヨ鎵�鏈塺tsp浼氳瘽 diff --git a/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/lib/ToolKits.java b/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/lib/ToolKits.java index e1326a9..269de7f 100644 --- a/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/lib/ToolKits.java +++ b/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/lib/ToolKits.java @@ -488,7 +488,7 @@ int nBufferLen = 2*1024*1024; byte[] strBuffer = new byte[nBufferLen]; - if(netsdkapi.CLIENT_GetNewDevConfig( hLoginHandle, strCmd , nChn, strBuffer, nBufferLen,error,3000)) { + if(netsdkapi.CLIENT_GetNewDevConfig( hLoginHandle, strCmd , nChn, strBuffer, nBufferLen,error,6000)) { cmdObject.write(); if (configapi.CLIENT_ParseData(strCmd, strBuffer, cmdObject.getPointer(), cmdObject.size(), null)) { diff --git a/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/module/ConfigModule.java b/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/module/ConfigModule.java index 645afae..631218d 100644 --- a/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/module/ConfigModule.java +++ b/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/module/ConfigModule.java @@ -81,7 +81,20 @@ return result; } - + public static String getChannelName(NetSDKLib.LLong hLoginHandle,Integer channel) { + String channelName = ""; + NetSDKLib.AV_CFG_ChannelName channelTitleName = new NetSDKLib.AV_CFG_ChannelName(); + if (ToolKits.GetDevConfig(hLoginHandle, channel, NetSDKLib.CFG_CMD_CHANNELTITLE, channelTitleName)) { + try { + channelName = new String(channelTitleName.szName, "GBK"); + } catch (Exception e) { + System.err.println("getChannelName Failed!"); + } + } else { + System.err.println("Get Channel Name Failed." + ToolKits.getErrorCodePrint()); + } + return channelName; + } public static boolean GetDevConfig(NetSDKLib.LLong hLoginHandle, int nChn, String strCmd, Structure cmdObject) { boolean result = true; IntByReference error = new IntByReference(0); @@ -128,6 +141,7 @@ stOut.read(); ToolKits.GetPointerDataToStructArr(stOut.pCameraStateInfo, arrCameraStatus); // 灏哖ointer鎷疯礉鍒版暟缁勫唴瀛� final String[] connectionState = {"鏈煡", "姝e湪杩炴帴", "宸茶繛鎺�", "鏈繛鎺�", "閫氶亾鏈厤缃�,鏃犱俊鎭�", "閫氶亾鏈夐厤缃�,浣嗚绂佺敤"}; + log.debug(connectionState[arrCameraStatus[chanNo - 1].emConnectionState]); if (connectionState[arrCameraStatus[chanNo - 1].emConnectionState].equals("宸茶繛鎺�")) { log.debug("閫氶亾" + arrCameraStatus[chanNo - 1].nChannel + connectionState[arrCameraStatus[chanNo - 1].emConnectionState]); bRet = true; diff --git a/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DahuaSDK.java b/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DahuaSDK.java index ec6c8a3..3957ce6 100644 --- a/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DahuaSDK.java +++ b/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DahuaSDK.java @@ -112,9 +112,7 @@ log.error("璁惧[" + camera.getIp() + ":" + camera.getPort() + "]鐧诲綍澶辫触:" + getErrorCodePrint()); return AjaxResult.warn(ErrorCode.getErrorCode(LoginModule.netsdk.CLIENT_GetLastError())); } -// if (GlobalVariable.loginMap.containsKey(camera.getId())) { -// GlobalVariable.loginMap.remove(camera.getId()); -// } + camera.setState("1"); camera.setChanNum(m_stDeviceInfo.byChanNum); camera.setStartDChan(1); @@ -123,7 +121,12 @@ //鑾峰彇鏈�鏂伴�氶亾 List<ArdChannel> ardChannelList = getChannels(camera); if (ardChannelList.size() > 0) { + ardChannelService.deleteArdChannelByDeviceId(camera.getId()); + ardChannelList.stream().forEach(channel -> { + ardChannelService.insertArdChannel(channel); + }); camera.setChanNum(ardChannelList.size()); + camera.setChannelList(ardChannelList); ardCamerasService.updateArdCameras(camera); //閰嶇疆鍒版祦濯掍綋 addVtdu(camera); @@ -154,9 +157,6 @@ log.error("璁惧[" + camera.getIp() + ":" + camera.getPort() + "]鐧诲綍澶辫触:" + getErrorCodePrint()); return AjaxResult.warn(getErrorCodePrint()); } -// if (GlobalVariable.loginMap.containsKey(camera.getId())) { -// GlobalVariable.loginMap.remove(camera.getId()); -// } camera.setState("1"); camera.setChanNum(m_stDeviceInfo.byChanNum); camera.setStartDChan(1); @@ -167,7 +167,12 @@ //鑾峰彇鏈�鏂伴�氶亾 List<ArdChannel> ardChannelList = getChannels(camera); if (ardChannelList.size() > 0) { + ardChannelService.deleteArdChannelByDeviceId(camera.getId()); + ardChannelList.stream().forEach(channel -> { + ardChannelService.insertArdChannel(channel); + }); camera.setChanNum(ardChannelList.size()); + camera.setChannelList(ardChannelList); ardCamerasService.updateArdCameras(camera); //閰嶇疆鍒版祦濯掍綋 addVtdu(camera); @@ -183,17 +188,17 @@ //娣诲姞鍒版祦濯掍綋 private void addVtdu(ArdCameras camera) { - for (int i = 1; i < camera.getChanNum() + 1; i++) { - String name = camera.getId() + "_" + i; - String rtspSource = "rtsp://" + camera.getUsername() + ":" + camera.getPassword() + "@" + camera.getIp() + ":" + camera.getRtspPort() + "/cam/realmonitor?channel=" + i + "&subtype=0"; - Vtdu vtdu = vtduService.selectVtduByName(name); - if (vtdu != null) { + camera.getChannelList().stream().forEach(channel -> { + String name = camera.getId() + "_" + channel.getChanNo(); + String rtspSource = "rtsp://" + camera.getUsername() + ":" + camera.getPassword() + "@" + camera.getIp() + ":" + camera.getRtspPort() + "/cam/realmonitor?channel=" + channel.getChanNo() + "&subtype=0"; + //鍒犻櫎娴佸獟浣� + if (vtduService.selectVtduByName(name) != null) { vtduService.deleteVtduByName(name); } //娣诲姞鍒版祦濯掍綋 - CameraCmd cmd = new CameraCmd(camera.getId(), i); + CameraCmd cmd = new CameraCmd(camera.getId(), channel.getChanNo()); Map<String, Object> videoCompressionCfg = getVideoCompressionCfg(cmd); - vtdu = new Vtdu(); + Vtdu vtdu = new Vtdu(); if (videoCompressionCfg.get("videoEncType") != null) { if (videoCompressionCfg.get("videoEncType").equals("鏍囧噯h264")) { vtdu.setIsCode("0");//榛樿涓嶈浆鐮� @@ -204,11 +209,11 @@ vtdu.setIsCode("0");//榛樿涓嶈浆鐮� } vtdu.setRtspSource(rtspSource); - vtdu.setName(camera.getId() + "_" + i); + vtdu.setName(name); vtdu.setMode("1");//榛樿CPU杞В鐮� vtdu.setCameraId(camera.getId()); vtduService.insertVtdu(vtdu); - } + }); } //鍒涘缓寮曞闃熷垪 @@ -226,23 +231,12 @@ //鑾峰彇閫氶亾 public List<ArdChannel> getChannels(ArdCameras camera) { - ardChannelService.deleteArdChannelByDeviceId(camera.getId()); LLong loginId = new LLong(camera.getLoginId()); List<ArdChannel> ardChannelList = new ArrayList<>(); for (int i = 1; i < camera.getChanNum() + 1; i++) { ArdChannel channel = new ArdChannel(); - NetSDKLib.AV_CFG_ChannelName av_cfg_channelName = new NetSDKLib.AV_CFG_ChannelName(); - boolean b = ConfigModule.GetNewDevConfig(loginId, i - 1, CFG_CMD_CHANNELTITLE, av_cfg_channelName); - if (!b) { - log.error("鑾峰彇閰嶇疆澶辫触,璇风◢鍚庨噸璇�" + getErrorCodePrint()); - // return AjaxResult.warn(ErrorCode.getErrorCode(LoginModule.netsdk.CLIENT_GetLastError())); - } - String chanName = ""; - try { - chanName = new String(av_cfg_channelName.szName, "GBK").trim(); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } + String chanName = ConfigModule.getChannelName(loginId, i - 1).trim(); + log.debug("鑾峰彇閫氶亾鍚嶇О锛�" + chanName); channel.setName(chanName.equals("") ? "閫氶亾" + i : chanName); channel.setDeviceId(camera.getId()); channel.setChanNo(i); @@ -253,7 +247,6 @@ } } ardChannelList.add(channel); - ardChannelService.insertArdChannel(channel); } return ardChannelList; } @@ -411,9 +404,9 @@ float t = (float) dh_ptz_location_info.nPTZTilt / 10 * -1; String nPTZTilt = df.format(t < 0 ? t + 360 : t); String nPTZZoom = df.format((float) dh_ptz_location_info.nPTZZoom); - ptzMap.put("p" , nPTZPan); - ptzMap.put("t" , nPTZTilt); - ptzMap.put("z" , nPTZZoom); + ptzMap.put("p", nPTZPan); + ptzMap.put("t", nPTZTilt); + ptzMap.put("z", nPTZZoom); return AjaxResult.success(ptzMap); } @@ -591,7 +584,7 @@ // return false; //} log.debug("鏈湴褰曞儚寮�濮�"); - return AjaxResult.success("鏈湴褰曞儚寮�濮�" , lRealHandle); + return AjaxResult.success("鏈湴褰曞儚寮�濮�", lRealHandle); } catch (Exception ex) { log.error("鏈湴褰曞儚寮�濮嬪紓甯�" + ex.getMessage()); return AjaxResult.error("鏈湴褰曞儚寮�濮嬪紓甯�" + ex.getMessage()); @@ -796,7 +789,7 @@ log.error("璁剧疆ptz澶辫触:" + getErrorCodePrint()); return AjaxResult.warn("璁剧疆ptz澶辫触:" + getErrorCodePrint()); } - return AjaxResult.success("寮曞鐩爣浣嶇疆鎴愬姛",correctPitch); + return AjaxResult.success("寮曞鐩爣浣嶇疆鎴愬姛", correctPitch); } catch (Exception ex) { log.error("寮曞鐩爣浣嶇疆寮傚父:" + ex.getMessage()); return AjaxResult.error("寮曞鐩爣浣嶇疆寮傚父:" + ex.getMessage()); @@ -1110,10 +1103,10 @@ int nHeight = cfg_encode_info.stuMainStream[0].stuVideoFormat.nHeight; String resolution = nWidth + "*" + nHeight; float nFrameRate = cfg_encode_info.stuMainStream[0].stuVideoFormat.nFrameRate; - map.put("resolution" , resolution);//鍒嗚鲸鐜� - map.put("videoBitrate" , String.valueOf(nBitRate));//姣旂壒鐜� - map.put("videoEncType" , videoEncType);//缂栫爜 - map.put("nFrameRate" , String.valueOf(nFrameRate));//甯х巼 + map.put("resolution", resolution);//鍒嗚鲸鐜� + map.put("videoBitrate", String.valueOf(nBitRate));//姣旂壒鐜� + map.put("videoEncType", videoEncType);//缂栫爜 + map.put("nFrameRate", String.valueOf(nFrameRate));//甯х巼 } } catch (Exception ex) { log.error("鍙栫爜娴佸帇缂╁弬鏁板紓甯�:" + ex.getMessage()); @@ -1140,8 +1133,8 @@ float nAngelH = (float) dh_out_ptz_view_range_status.nAngelH / 10; float nAngelV = (float) dh_out_ptz_view_range_status.nAngelV / 10; Map<String, Object> map = getPtz(cmd);//鑾峰彇ptz - map.put("fHorFieldAngle" , nAngelH);// 姘村钩瑙嗗満瑙� - map.put("fVerFieldAngle" , nAngelV);// 鍨傜洿瑙嗗満瑙� + map.put("fHorFieldAngle", nAngelH);// 姘村钩瑙嗗満瑙� + map.put("fVerFieldAngle", nAngelV);// 鍨傜洿瑙嗗満瑙� return AjaxResult.success(map); } catch (Exception ex) { log.error("鑾峰彇浜戝彴鍙鍩熷紓甯�" + ex.getMessage()); diff --git a/ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java b/ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java index ed90621..0269e99 100644 --- a/ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java +++ b/ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java @@ -144,10 +144,6 @@ log.debug("Set fExceptionCallBack function successfully!"); } } - -// if (GlobalVariable.loginMap.containsKey(camera.getId())) { -// GlobalVariable.loginMap.remove(camera.getId()); -// } GlobalVariable.loginMap.put(camera.getId(), lUserID); GlobalVariable.loginCameraMap.put(lUserID, camera); camera.setLoginId(lUserID); @@ -163,6 +159,10 @@ //鑾峰彇鏈�鏂伴�氶亾 List<ArdChannel> cameraChannelList = getChannels(camera); if (cameraChannelList.size() > 0) { + ardChannelService.deleteArdChannelByDeviceId(camera.getId()); + cameraChannelList.stream().forEach(channel -> { + ardChannelService.insertArdChannel(channel); + }); camera.setChannelList(cameraChannelList); camera.setChanNum(cameraChannelList.size()); ardCamerasService.updateArdCameras(camera); @@ -251,9 +251,7 @@ } } } -// if (GlobalVariable.loginMap.containsKey(camera.getId())) { -// GlobalVariable.loginMap.remove(camera.getId()); -// } + GlobalVariable.loginMap.put(camera.getId(), lUserID); GlobalVariable.loginCameraMap.put(lUserID, camera); camera.setLoginId(lUserID); @@ -269,6 +267,10 @@ //鑾峰彇鏈�鏂伴�氶亾 List<ArdChannel> cameraChannelList = getChannels(camera); if (cameraChannelList.size() > 0) { + ardChannelService.deleteArdChannelByDeviceId(camera.getId()); + cameraChannelList.stream().forEach(channel -> { + ardChannelService.insertArdChannel(channel); + }); camera.setChannelList(cameraChannelList); camera.setChanNum(cameraChannelList.size()); ardCamerasService.updateArdCameras(camera); @@ -300,17 +302,17 @@ //娣诲姞鍒版祦濯掍綋 private void addVtdu(ArdCameras camera) { try { - for (ArdChannel channel : camera.getChannelList()) { + camera.getChannelList().stream().forEach(channel->{ String name = camera.getId() + "_" + channel.getChanNo(); String rtspSource = "rtsp://" + camera.getUsername() + ":" + camera.getPassword() + "@" + camera.getIp() + ":" + camera.getRtspPort() + "/h264/ch" + channel.getChanNo() + "/main/av_stream"; - Vtdu vtdu = vtduService.selectVtduByName(name); - if (vtdu != null) { + //鍒犻櫎娴佸獟浣� + if (vtduService.selectVtduByName(name) != null) { vtduService.deleteVtduByName(name); } //娣诲姞鍒版祦濯掍綋 - vtdu = new Vtdu(); + Vtdu vtdu = new Vtdu(); vtdu.setRtspSource(rtspSource); - vtdu.setName(camera.getId() + "_" + channel.getChanNo()); + vtdu.setName(name); CameraCmd cmd = new CameraCmd(camera.getId(), channel.getChanNo()); Map<String, Object> videoCompressionCfg = getVideoCompressionCfg(cmd); if (videoCompressionCfg.get("videoEncType").equals("鏍囧噯h264")) { @@ -321,7 +323,7 @@ vtdu.setMode("1");//榛樿CPU杞В鐮� vtdu.setCameraId(camera.getId()); vtduService.insertVtdu(vtdu); - } + }); } catch (Exception ex) { log.error("閫氶亾娣诲姞鍒版祦濯掍綋寮傚父锛�" + ex.getMessage()); } @@ -1849,8 +1851,6 @@ //鑾峰彇閫氶亾 List<ArdChannel> channelList = new ArrayList<>(); try { - //鍒犻櫎绠$悊閫氶亾 - ardChannelService.deleteArdChannelByDeviceId(camera.getId()); IntByReference ibrBytesReturned = new IntByReference(0);//鑾峰彇IP鎺ュ叆閰嶇疆鍙傛暟 HCNetSDK.NET_DVR_IPPARACFG_V40 m_strIpparaCfg = new HCNetSDK.NET_DVR_IPPARACFG_V40(); m_strIpparaCfg.write(); @@ -1891,7 +1891,6 @@ } channelList.add(channel); } - ardChannelService.insertArdChannel(channel); } } catch (Exception ex) { log.error("鑾峰彇IP閫氶亾寮傚父:" + ex.getMessage()); diff --git a/ard-work/src/main/java/com/ruoyi/utils/websocket/service/ChatServerEndpoint.java b/ard-work/src/main/java/com/ruoyi/utils/websocket/service/ChatServerEndpoint.java index 5b1dcb4..c988db1 100644 --- a/ard-work/src/main/java/com/ruoyi/utils/websocket/service/ChatServerEndpoint.java +++ b/ard-work/src/main/java/com/ruoyi/utils/websocket/service/ChatServerEndpoint.java @@ -1,6 +1,8 @@ package com.ruoyi.utils.websocket.service; +import com.alibaba.fastjson2.JSONObject; import com.ruoyi.app.position.service.impl.AppPositionPushService; +import com.ruoyi.call.dto.CallMessage; import com.ruoyi.utils.websocket.util.WebSocketUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -9,6 +11,11 @@ import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import java.io.IOException; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static com.ruoyi.utils.websocket.util.WebSocketUtils.ONLINE_USER_SESSIONS; /** * @ClassName ChatServerEndpoint @@ -33,11 +40,27 @@ @OnMessage public void onMessage(@PathParam("userId") String userId, String message) { log.info("鏀跺埌娑堟伅锛�" + message); - Session session = WebSocketUtils.ONLINE_USER_SESSIONS.get(userId); - WebSocketUtils.sendMessage(session, message); - //sendMessageAll("鐢ㄦ埛[" + userid + "] : " + message); +// Session session = WebSocketUtils.ONLINE_USER_SESSIONS.get(userId); +// WebSocketUtils.sendMessage(session, message); + Map<String, Object> messageMap = JSONObject.parseObject(message, Map.class); + if (((String) messageMap.get("type")).equals("callMessage")) { + String msg = (String) messageMap.get("message"); + CallMessage callMessage = JSONObject.parseObject(msg, CallMessage.class); + if (callMessage != null && callMessage.getType().equals(0)) { + String regex = "^" + Pattern.quote(callMessage.getTargetId()) + "_\\d+$"; + Pattern pattern = Pattern.compile(regex); + ONLINE_USER_SESSIONS.entrySet().stream() + .filter(entry -> { + Matcher matcher = pattern.matcher(entry.getKey()); + return matcher.matches(); + }) + .map(Map.Entry::getValue) + .forEach(session -> WebSocketUtils.sendMessage(session, message)); + } + + } // 鏍规嵁鐢ㄦ埛鏂扮殑棰戠巼閲嶆柊璋冩暣瀹氭椂浠诲姟 - AppPositionPushService.messageHandler(userId,message); + AppPositionPushService.messageHandler(userId, message); } @OnClose diff --git a/ard-work/src/main/resources/mapper/call/ArdCallSessionUserMapper.xml b/ard-work/src/main/resources/mapper/call/ArdCallSessionUserMapper.xml index 01cde9a..5eee9a0 100644 --- a/ard-work/src/main/resources/mapper/call/ArdCallSessionUserMapper.xml +++ b/ard-work/src/main/resources/mapper/call/ArdCallSessionUserMapper.xml @@ -27,11 +27,14 @@ </where> </select> + <select id="selectArdCallSessionUserBySesionId" parameterType="String" resultMap="ArdCallSessionUserResult"> + <include refid="selectArdCallSessionUserVo"/> + where session_id = #{sessionId} and user_id = #{userId} + </select> <select id="selectArdCallSessionUserById" parameterType="String" resultMap="ArdCallSessionUserResult"> <include refid="selectArdCallSessionUserVo"/> where id = #{id} </select> - <insert id="insertArdCallSessionUser" parameterType="ArdCallSessionUser"> insert into ard_call_session_user <trim prefix="(" suffix=")" suffixOverrides=","> diff --git a/ard-work/src/main/resources/mapper/vtdu/VtduMapper.xml b/ard-work/src/main/resources/mapper/vtdu/VtduMapper.xml index 41de89d..95d7b5d 100644 --- a/ard-work/src/main/resources/mapper/vtdu/VtduMapper.xml +++ b/ard-work/src/main/resources/mapper/vtdu/VtduMapper.xml @@ -118,4 +118,7 @@ from vtdu where camera_id = #{cameraId} </delete> + <delete id="clearVtdu"> + delete from vtdu + </delete> </mapper> \ No newline at end of file diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/PushTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/PushTask.java index 6363c40..3bc7376 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/PushTask.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/PushTask.java @@ -17,6 +17,7 @@ import javax.annotation.Resource; import java.util.*; + import static com.ruoyi.utils.websocket.util.WebSocketUtils.ONLINE_USER_SESSIONS; /** @@ -36,6 +37,7 @@ ICameraSdkService cameraSdkService; @Resource IGlobalAlarmService globalAlarmService; + /** * @鎻忚堪 瀹氭椂鎺ㄩ�佹墍鏈夋姤璀︾殑鐐逛綅鏁伴噺 * @鍙傛暟 [] @@ -66,62 +68,61 @@ */ public void ptzPush() { try { - List<Map<String, Object>> list = new ArrayList<>(); - List<Object> Objects = redisCache.getListKey(CacheConstants.CAMERA_LIST_KEY); - if (Objects.size() > 0) { - for (Object obj : Objects) { - ArdCameras camera = (ArdCameras) obj; - if (!GlobalVariable.loginMap.containsKey(camera.getId()))//鍙帹閫侀娆$櫥褰曟垚鍔熺殑鐩告満 - { - continue; - } - if(!"1".equals(camera.getGdtype())) - { - continue; - } - CameraCmd cmd = new CameraCmd(); - cmd.setCameraId(camera.getId()); - cmd.setChanNo(1); - cmd.setOperator(camera.getOperatorId()); - //鎺ㄩ�佸湪绾跨殑鐩告満 - boolean onLine = cameraSdkService.isOnLine(cmd); - if(!onLine) - { - continue; - } - AjaxResult ajaxResult = cameraSdkService.getGisInfo(cmd); - Map<String, Object> ptz = (Map<String, Object>)ajaxResult.get("data"); - if (StringUtils.isNull(ptz)) { - continue; - } - SysUser sysUser = redisCache.getCacheObject(CacheConstants.USER_LIST_KEY + camera.getOperatorId()); - if (StringUtils.isNotNull(sysUser)) { - cmd.setOperatorZh(sysUser.getNickName()); - } else { - cmd.setOperatorZh(cmd.getOperator()); - } + if (ONLINE_USER_SESSIONS.size() > 0) { + List<Map<String, Object>> list = new ArrayList<>(); + List<Object> Objects = redisCache.getListKey(CacheConstants.CAMERA_LIST_KEY); + if (Objects.size() > 0) { + for (Object obj : Objects) { + ArdCameras camera = (ArdCameras) obj; + if (!GlobalVariable.loginMap.containsKey(camera.getId()))//鍙帹閫侀娆$櫥褰曟垚鍔熺殑鐩告満 + { + continue; + } + if (!"1".equals(camera.getGdtype())) { + continue; + } + CameraCmd cmd = new CameraCmd(); + cmd.setCameraId(camera.getId()); + cmd.setChanNo(1); + cmd.setOperator(camera.getOperatorId()); + //鎺ㄩ�佸湪绾跨殑鐩告満 + boolean onLine = cameraSdkService.isOnLine(cmd); + if (!onLine) { + continue; + } + AjaxResult ajaxResult = cameraSdkService.getGisInfo(cmd); + Map<String, Object> ptz = (Map<String, Object>) ajaxResult.get("data"); + if (StringUtils.isNull(ptz)) { + continue; + } + SysUser sysUser = redisCache.getCacheObject(CacheConstants.USER_LIST_KEY + camera.getOperatorId()); + if (StringUtils.isNotNull(sysUser)) { + cmd.setOperatorZh(sysUser.getNickName()); + } else { + cmd.setOperatorZh(cmd.getOperator()); + } - //鑾峰彇鏃堕棿宸� - long secDatePoor = 0; - if (StringUtils.isNotNull(camera.getOperatorExpired())) { - secDatePoor = DateUtils.getSecDatePoor(camera.getOperatorExpired(), new Date()); - if (secDatePoor < 0) { - secDatePoor = 0; + //鑾峰彇鏃堕棿宸� + long secDatePoor = 0; + if (StringUtils.isNotNull(camera.getOperatorExpired())) { + secDatePoor = DateUtils.getSecDatePoor(camera.getOperatorExpired(), new Date()); + if (secDatePoor < 0) { + secDatePoor = 0; + } + } + + if (ptz.size() > 0) { + ptz.put("cameraId", cmd.getCameraId()); + ptz.put("usernameZh", cmd.getOperatorZh()); + ptz.put("operatorId", cmd.getOperator());//涓婇攣鐢ㄦ埛id + ptz.put("expirationRemainingSecond", secDatePoor); + ptz.put("longitude", camera.getLongitude()); + ptz.put("latitude", camera.getLatitude()); + ptz.put("altitude", camera.getAltitude()); + list.add(ptz); } } - if (ptz.size() > 0) { - ptz.put("cameraId", cmd.getCameraId()); - ptz.put("usernameZh", cmd.getOperatorZh()); - ptz.put("operatorId", cmd.getOperator());//涓婇攣鐢ㄦ埛id - ptz.put("expirationRemainingSecond", secDatePoor); - ptz.put("longitude",camera.getLongitude()); - ptz.put("latitude",camera.getLatitude()); - ptz.put("altitude",camera.getAltitude()); - list.add(ptz); - } - } - if (ONLINE_USER_SESSIONS.size() > 0) { Map<String, Object> sendMap = new HashMap<>(); sendMap.put("10000", list); WebSocketUtils.sendMessageAll(sendMap); diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SyncTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SyncTask.java index d6ed2c3..4e7d4ff 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SyncTask.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SyncTask.java @@ -3,12 +3,16 @@ import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.device.camera.domain.ArdCameras; import com.ruoyi.device.camera.domain.CameraCmd; import com.ruoyi.device.camera.factory.CameraSDK; import com.ruoyi.device.camera.factory.CameraSDKFactory; import com.ruoyi.device.camera.service.IArdCamerasService; import com.ruoyi.device.camera.service.ICameraSdkService; +import com.ruoyi.device.channel.domain.ArdChannel; +import com.ruoyi.device.channel.service.IArdChannelService; +import com.ruoyi.device.channel.service.impl.ArdChannelServiceImpl; import com.ruoyi.media.domain.Vtdu; import com.ruoyi.media.service.IMediaService; import com.ruoyi.media.service.IVtduService; @@ -21,6 +25,8 @@ import javax.annotation.Resource; import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; /** * @Description: 鍚屾浠诲姟 @@ -43,6 +49,10 @@ IMediaService mediaService; @Resource private ICameraSdkService cameraSdkService; + @Resource + private CameraSDKFactory cameraSDKFactory; + @Resource + private IArdChannelService ardChannelService; /** * 鍚屾鐩告満鍦ㄧ嚎鐘舵�� * 鍒樿嫃涔� @@ -69,6 +79,34 @@ } } catch (Exception ex) { log.error("鍚屾鐩告満鍦ㄧ嚎鐘舵�佸紓甯�:" + ex.getMessage()); + } + } + + /** + * @Author 鍒樿嫃涔� + * @Description 鍚屾nvr閫氶亾鐘舵�佸疄鏃跺悓姝ユ祦濯掍綋 + * @Date 2024/7/9 16:01 + */ + public void nvrChannelState() { + //鑾峰彇鎵�鏈塶vr璁惧 + List<ArdCameras> ardCamerasList = iArdCamerasService.selectArdCamerasListNoDataScope(new ArdCameras()); + if (ardCamerasList.size() > 0) { + ardCamerasList.stream() + .filter(ardCameras -> ardCameras.getGdtype().equals("2")) + .forEach(ardCameras -> { + //閫氳繃SDK鑾峰彇NVR褰撳墠閫氶亾 + CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(ardCameras.getFactory()); + List<ArdChannel> ardChannelList = cameraSDK.getChannels(ardCameras); + //鍚屾閫氶亾琛� + ArdChannel ardChannel=new ArdChannel(); + ardChannel.setDeviceId(ardCameras.getId()); + List<ArdChannel> ardChannelListDb = ardChannelService.selectArdChannelList(ardChannel); + ardChannelService.asyncChannel(ardChannelListDb,ardChannelList); + //鍚屾娴佸獟浣撹〃 + + //鍚屾娴佸獟浣揳pi + + }); } } @@ -105,13 +143,8 @@ * 2023/10/13 14:13:53 */ public void vtdu() { - - List<Vtdu> vtdus = vtduService.selectVtduList(new Vtdu()); - for (Vtdu vtdu : vtdus) { - boolean nameExist = mediaService.checkNameExist(vtdu.getName()); - if (!nameExist) { - mediaService.addPath(vtdu.getName(), vtdu.getRtspSource(), vtdu.getMode(), vtdu.getIsCode()); - } - } + List<String> nameList = mediaService.getNameList(); + List<Vtdu> vtduList = vtduService.selectVtduList(new Vtdu()); + vtduService.asyncVtdu(vtduList,nameList); } } -- Gitblit v1.9.3