ard-work/src/main/java/com/ruoyi/call/dto/CallMessage.java
@@ -2,6 +2,8 @@ import lombok.Data; import java.util.List; /** * @ClassName:CallMessage * @Description: @@ -15,6 +17,7 @@ String roomId; String userId; String targetId; List<String> targetIds; Integer mediaType; Integer type; } ard-work/src/main/java/com/ruoyi/device/camera/mapper/ArdCamerasMapper.java
@@ -6,6 +6,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.common.annotation.DataScope; import com.ruoyi.device.camera.domain.ArdCameras; import org.apache.ibatis.annotations.MapKey; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -90,7 +92,6 @@ */ public ArdCameras checkCameraIpAndPortUnique(@Param("ip") String ip, @Param("port")Integer port); //public List<Map<String, Object>> getCamerasByDeptId(@Param("deptId")Long deptId,@Param("userId")String userId); public List<Map<String, Object>> getCamerasByDeptId(@Param("deptIdList")List<Long> deptIdList,@Param("userId")String userId); public Boolean getCameraOperationByCameraId(@Param("id") String id, @Param("userId") String userId); @@ -98,4 +99,13 @@ public List<Map<String, Object>> getChannelByCameraId(String id); public List<ArdCameras> findTowerCamerasBySubAndOwnDeptIds(@Param("deptIdList")List<Long> deptIdList); /** * @Author åèä¹ * @Description éç½®ææç¸æºç»å½id为-1 * @Date 2024/7/17 10:17 * @Param * @return */ public int resetCameraLoginId(); } ard-work/src/main/java/com/ruoyi/device/camera/service/IArdCamerasService.java
@@ -138,4 +138,7 @@ public Boolean getCameraOperationByCameraId(String id,String userId); public Map<String,Object> getChannelByCameraId(String id); //å°ææç¸æºç»å½id置为-1 public int resetCameraLoginId(); } ard-work/src/main/java/com/ruoyi/device/camera/service/impl/ArdCamerasServiceImpl.java
@@ -760,4 +760,9 @@ } } } @Override public int resetCameraLoginId() { return ardCamerasMapper.resetCameraLoginId(); } } ard-work/src/main/java/com/ruoyi/device/camera/service/impl/CameraSdkServiceImpl.java
@@ -41,7 +41,7 @@ * @Date: 2023å¹´10æ16æ¥15:21:01 **/ @Service @Slf4j(topic = "SDK") @Slf4j(topic = "sdk") public class CameraSdkServiceImpl implements ICameraSdkService, ApplicationRunner { @Resource private IArdCamerasService ardCamerasService; @@ -64,10 +64,10 @@ @Override public void run(ApplicationArguments args) { try { log.info("åå§åç»å½ç¸æºå¼å§"); ardCamerasService.resetCameraLoginId(); List<ArdCameras> ardCameras = ardCamerasService.selectArdCamerasListNoDataScope(new ArdCameras()); for (ArdCameras camera : ardCameras) { asyncLogin(camera); } ardCameras.stream().forEach(ardCamera -> asyncLogin(ardCamera)); } catch (Exception ex) { log.error("åå§åç»å½ç¸æºå¼å¸¸ï¼" + ex.getMessage()); } @@ -586,17 +586,17 @@ case 1: if (ardWellGuideCamera.getP1() != null) { ptzMap = new HashMap<>(); ptzMap.put("p" , ardWellGuideCamera.getP1()); ptzMap.put("t" , ardWellGuideCamera.getT1()); ptzMap.put("z" , ardWellGuideCamera.getZ1()); ptzMap.put("p", ardWellGuideCamera.getP1()); ptzMap.put("t", ardWellGuideCamera.getT1()); ptzMap.put("z", ardWellGuideCamera.getZ1()); } break; case 2: if (ardWellGuideCamera.getP2() != null) { ptzMap = new HashMap<>(); ptzMap.put("p" , ardWellGuideCamera.getP2()); ptzMap.put("t" , ardWellGuideCamera.getT2()); ptzMap.put("z" , ardWellGuideCamera.getZ2()); ptzMap.put("p", ardWellGuideCamera.getP2()); ptzMap.put("t", ardWellGuideCamera.getT2()); ptzMap.put("z", ardWellGuideCamera.getZ2()); } break; @@ -624,9 +624,9 @@ } //æäºåæ å¼å§å¼å¯¼ if (!guideTargetPosition(cmd).get("code").equals(200)) { return AjaxResult.warn("äºåæ å¼å¯¼å¤±è´¥" , "cameraId:" + cameraId); return AjaxResult.warn("äºåæ å¼å¯¼å¤±è´¥", "cameraId:" + cameraId); } return AjaxResult.success("äºåæ å¼å¯¼æå" , "cameraId:" + cameraId); return AjaxResult.success("äºåæ å¼å¯¼æå", "cameraId:" + cameraId); } ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/module/ConfigModule.java
@@ -90,10 +90,10 @@ try { channelName = new String(channelTitleName.szName, "GBK"); } catch (Exception e) { System.err.println("getChannelName Failed!"); log.error("getChannelName Failed!"); } } else { System.err.println("Get Channel Name Failed." + ToolKits.getErrorCodePrint()); log.error("Get Channel Name Failed." + ToolKits.getErrorCodePrint()); } return channelName; } ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DahuaSDK.java
@@ -160,7 +160,7 @@ camera.setState("1"); camera.setChanNum(m_stDeviceInfo.byChanNum); camera.setStartChan(1); camera.setLoginId((Long) loginId.longValue()); camera.setLoginId(loginId.longValue()); ardCamerasService.updateArdCameras(camera); GlobalVariable.loginMap.put(camera.getId(), loginId); @@ -208,7 +208,7 @@ //è·åéé public List<ArdChannel> getChannels(ArdCameras camera) { if (camera.getLoginId().equals(-1)) { if (camera.getLoginId() < 0) { return new ArrayList<>(); } LLong loginId = new LLong(camera.getLoginId()); ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java
@@ -1831,9 +1831,6 @@ //è·åIPéé public List<ArdChannel> getChannels(ArdCameras camera) { if (camera.getLoginId().equals(-1)) { return new ArrayList<>(); } //è·åéé List<ArdChannel> channelList = new ArrayList<>(); try { ard-work/src/main/java/com/ruoyi/utils/websocket/service/ChatServerEndpoint.java
@@ -3,6 +3,7 @@ import com.alibaba.fastjson2.JSONObject; import com.ruoyi.app.position.service.impl.AppPositionPushService; import com.ruoyi.call.dto.CallMessage; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.utils.websocket.util.WebSocketUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -11,7 +12,10 @@ import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import java.io.IOException; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -39,38 +43,60 @@ @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); log.debug("æ¶å°æ¶æ¯ï¼" + message); Map<String, Object> messageMap = JSONObject.parseObject(message, Map.class); if (((String) messageMap.get("type")).equals("callMessage")) { if (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)); WebSocketUtils.sendMessagePrefix(callMessage.getTargetId(), message); } //群è if (callMessage != null && callMessage.getType().equals(1)) { String step = callMessage.getStep(); switch (step) { case "joinRoom": Set<String> userSet = WebSocketUtils.ROOM_USER_SET.getOrDefault(callMessage.getRoomId(), new HashSet<>()); userSet.add(callMessage.getUserId()); WebSocketUtils.ROOM_USER_SET.put(callMessage.getRoomId(), userSet); WebSocketUtils.sendRoomMessage(callMessage.getRoomId(), message); break; case "inviteRoom": List<String> targetIds = callMessage.getTargetIds(); targetIds.stream().forEach(targetId -> { WebSocketUtils.sendMessagePrefix(targetId, message); }); break; case "leaveRoom": userSet = WebSocketUtils.ROOM_USER_SET.getOrDefault(callMessage.getRoomId(), new HashSet<>()); if (userSet.size() > 0) { userSet.remove(callMessage.getUserId()); WebSocketUtils.ROOM_USER_SET.put(callMessage.getRoomId(), userSet); WebSocketUtils.sendRoomMessage(callMessage.getRoomId(), message); } break; default: WebSocketUtils.sendMessagePrefix(callMessage.getTargetId(), message); break; } } } // æ ¹æ®ç¨æ·æ°çé¢çéæ°è°æ´å®æ¶ä»»å¡ AppPositionPushService.messageHandler(userId, message); } @OnClose public void onClose(@PathParam("userId") String userId, Session session) { //å½åçSession ç§»é¤ WebSocketUtils.ONLINE_USER_SESSIONS.remove(userId); //å¹¶ä¸éç¥å ¶ä»äººå½åç¨æ·å·²ç»ç¦»å¼èå¤©å®¤äº String message = "ç¨æ·[" + userId + "] æå¼è¿æ¥ï¼"; //sendMessage(session,message); log.info("æ¶æ¯ï¼" + message); //仿¿é´ä¸ç§»é¤ç¨æ· WebSocketUtils.ROOM_USER_SET.values().stream().forEach(userSet -> userSet.remove(userId)); try { session.close(); AppPositionPushService.stopHandler(userId); @@ -88,5 +114,4 @@ } log.info("Throwable msg " + throwable.getMessage()); } } ard-work/src/main/java/com/ruoyi/utils/websocket/util/WebSocketUtils.java
@@ -2,14 +2,15 @@ import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.springframework.web.socket.WebSocketSession; import javax.websocket.RemoteEndpoint; import javax.websocket.Session; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.*; import java.util.concurrent.*; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @ClassName WebSocketUtils @@ -23,6 +24,8 @@ // åå¨ websocket session public static final Map<String, Session> ONLINE_USER_SESSIONS = new ConcurrentHashMap<>(); //å卿¿é´ public static final ConcurrentHashMap<String, Set<String>> ROOM_USER_SET = new ConcurrentHashMap<>(); /** * @param session ç¨æ· session @@ -36,15 +39,16 @@ if (basic == null) { return; } synchronized(session) { synchronized (session) { try { log.debug("åéæ¶æ¯ï¼"+message); log.debug("åéæ¶æ¯ï¼" + message); session.getBasicRemote().sendText(message); } catch (IOException e) { log.error("sendMessage IOException ",e); log.error("sendMessage IOException ", e); } } } /** * @param session ç¨æ· session * @param message åéå 容 @@ -57,14 +61,15 @@ if (basic == null) { return; } synchronized(session) { synchronized (session) { try { session.getBasicRemote().sendText(new JSONObject(message).toString()); } catch (IOException e) { log.error("sendMessage IOException ",e); log.error("sendMessage IOException ", e); } } } public static void sendMessage(Session session, List message) { if (session == null) { return; @@ -73,27 +78,63 @@ if (basic == null) { return; } synchronized(session) { synchronized (session) { try { session.getBasicRemote().sendText( String.join(", ", message)); session.getBasicRemote().sendText(String.join(", ", message)); } catch (IOException e) { log.error("sendMessage IOException ",e); log.error("sendMessage IOException ", e); } } } /** * æ¨éæ¶æ¯å°å ¶ä»å®¢æ·ç«¯ * * @param message */ public static void sendMessageAll(String message) { ONLINE_USER_SESSIONS.forEach((sessionId, session) -> sendMessage(session, message)); } /** * æ¨éæ¶æ¯å°å ¶ä»å®¢æ·ç«¯ * * @param message */ public static void sendMessageAll(Map message) { JSONObject jsonObject=new JSONObject(message); JSONObject jsonObject = new JSONObject(message); ONLINE_USER_SESSIONS.forEach((sessionId, session) -> sendMessage(session, jsonObject.toString())); } /** * æ¨éæ¶æ¯å°å½åæ¿é´çå ¶ä»å®¢æ·ç«¯ * * @param message */ public static void sendRoomMessage(String roomId, String message) { Set<String> userSet = ROOM_USER_SET.getOrDefault(roomId, new HashSet<>()); userSet.stream().forEach(userId -> { String regex = "^" + Pattern.quote(userId) + "_\\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)); }); } /** * @Author åèä¹ * @Description åéæ¶æ¯ç»userId_åç¼ç人 * @Date 2024/7/16 10:24 * @Param * @return */ public static void sendMessagePrefix(String targetId, String message) { String regex = "^" + Pattern.quote(targetId) + "_\\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)); } } ard-work/src/main/resources/mapper/device/ArdCamerasMapper.xml
@@ -413,4 +413,7 @@ and tower_id is not null order by create_time desc </select> <update id="resetCameraLoginId"> update ard_cameras set login_id = -1 </update> </mapper> ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SyncTask.java
@@ -53,6 +53,7 @@ private CameraSDKFactory cameraSDKFactory; @Resource private IArdChannelService ardChannelService; /** * åæ¥ç¸æºå¨çº¿ç¶æ * åèä¹ @@ -88,20 +89,22 @@ * @Date 2024/7/9 16:01 */ public void syncChannelState() { log.warn("宿¶åæ¥ééä»»å¡å¼å§"); log.debug("宿¶åæ¥ééä»»å¡å¼å§"); //è·åæænvrè®¾å¤ List<ArdCameras> ardCamerasList = iArdCamerasService.selectArdCamerasListNoDataScope(new ArdCameras()); if (ardCamerasList.size() > 0) { ardCamerasList.stream() .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(ardCameras,ardChannelListDb,ardChannelList); if (ardCameras.getLoginId() > 0) { //éè¿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(ardCameras, ardChannelListDb, ardChannelList); } }); } } @@ -139,9 +142,9 @@ * 2023/10/13 14:13:53 */ public void syncVtdu() { log.warn("宿¶åæ¥æµåªä½ä»»å¡å¼å§"); log.debug("宿¶åæ¥æµåªä½ä»»å¡å¼å§"); List<String> nameList = mediaService.getNameList(); List<Vtdu> vtduList = vtduService.selectVtduList(new Vtdu()); vtduService.asyncVtdu(vtduList,nameList); vtduService.asyncVtdu(vtduList, nameList); } } server/mediamtx/mediamtx.yml
@@ -44,17 +44,17 @@ # Enable the HTTP API. api: yes # Address of the API listener. apiAddress: 192.168.1.227:9997 apiAddress: 192.168.1.27:9997 # Enable Prometheus-compatible metrics. metrics: no # Address of the metrics listener. metricsAddress: 192.168.1.227:9998 metricsAddress: 192.168.1.27:9998 # Enable pprof-compatible endpoint to monitor performances. pprof: no # Address of the pprof listener. pprofAddress: 192.168.1.227:9999 pprofAddress: 192.168.1.27:9999 # Command to run when a client connects to the server. # This is terminated with SIGINT when a client disconnects from the server. @@ -225,7 +225,7 @@ webrtcICEInterfaces: [192.168.1.1] # List of public IP addresses that are to be used as a host. # This is used typically for servers that are behind 1:1 D-NAT. webrtcICEHostNAT1To1IPs: [192.168.1.227] webrtcICEHostNAT1To1IPs: [192.168.1.27] # Address of a ICE UDP listener in format host:port. # If filled, ICE traffic will pass through a single UDP port, # allowing the deployment of the server inside a container or behind a NAT. sql/20230320091649.nb3Binary files differ
sql/20230905public.sql
ÎļþÒÑɾ³ý sql/init20240715.sql
ÎļþÃû´Ó sql/public20240412.sql ÐÞ¸Ä ÎļþÌ«´ó sql/public.sql
ÎļþÒÑɾ³ý sql/quartz.sql
ÎļþÒÑɾ³ý sql/ry-vue-pg.sql
ÎļþÒÑɾ³ý sql/ry_20220822.sql
ÎļþÒÑɾ³ý