ard-device/src/main/java/com/ard/device/camera/domain/ArdCamera.java
@@ -4,6 +4,7 @@ import com.ard.common.core.domain.BaseEntity; import com.ard.device.channel.domain.ArdChannel; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import java.util.List; @@ -17,6 +18,7 @@ @Data @AllArgsConstructor @NoArgsConstructor @Builder public class ArdCamera extends BaseEntity { private static final long serialVersionUID = 1L; ard-device/src/main/java/com/ard/device/camera/service/impl/ArdCameraServiceImpl.java
@@ -163,7 +163,7 @@ ardCamera.setUpdateBy(SecurityUtils.getUsername()); int res = ardCameraMapper.updateArdCamera(ardCamera); if (res > 0) { cameraSDKService.logout(ardCamera.getId());//sdk注销 cameraSDKService.logout(ardCamera);//sdk注销 cameraSDKService.login(ardCamera);//sdk登录获取通道信息 } return res; @@ -186,7 +186,7 @@ //删除当前相机的所有通道 ardChannelService.deleteArdChannelByDeviceId(id); //sdk注销 cameraSDKService.logout(id); cameraSDKService.logout(camera); } } return ardCameraMapper.deleteArdCameraByIds(ids); @@ -207,7 +207,7 @@ //删除当前相机的所有通道 ardChannelService.deleteArdChannelByDeviceId(id); //sdk注销 cameraSDKService.logout(id); cameraSDKService.logout(ArdCamera.builder().id(id).build()); } return i; } @@ -408,15 +408,20 @@ * @author 刘苏义 * @date 2024/8/22 14:37 */ @Scheduled(fixedDelay = 30000) @Scheduled(fixedDelay = 10000) public void failedReconnect() { try { log.debug("定时执行失败相机重连任务"); List<Object> ardCameras = redisService.getListKey(CacheConstants.CAMERA_LIST_KEY); ardCameras.stream() .map(object -> (ArdCamera) object) // 将Object转换为ArdCameras .filter(camera -> !GlobalVariable.loginMap.containsKey(camera.getId())) .forEach(camera -> cameraSDKService.login(camera)); // 从数据库取全部设备 List<ArdCamera> cameraList = selectArdCameraList(new ArdCamera()); cameraList.stream() // 只处理登录失败或离线的设备 .filter(camera -> camera.getLoginId() == null || camera.getLoginId() < 0 || "0".equals(camera.getState())) .forEach(camera -> { log.info("尝试重新登录设备 {}:{}", camera.getIp(), camera.getPort()); cameraSDKService.login(camera); }); } catch (Exception ex) { log.error("定时执行失败相机重连任务异常:{}", ex.getMessage()); } @@ -435,9 +440,7 @@ List<ArdCamera> ardCameraList = selectArdCameraList(new ArdCamera()); ardCameraList .forEach(camera -> { CameraCmd cmd = new CameraCmd(); cmd.setCameraId(camera.getId()); boolean onLineNew = cameraSDKService.isOnLine(cmd); boolean onLineNew = cameraSDKService.isOnLine(camera); boolean onLineOld = "1".equals(camera.getState()); if (onLineNew != onLineOld) { if (onLineNew) { ard-device/src/main/java/com/ard/device/component/sdk/common/GlobalVariable.java
@@ -16,8 +16,7 @@ **/ @Data public class GlobalVariable { //保存相机登录信息(cameraId:loginId) public static Map<String, Object> loginMap = new ConcurrentHashMap<>(); //保存相机登录信息(loginId:Camera) public static Map<Integer, ArdCamera> hikLoginMap = new ConcurrentHashMap<>(); } ard-device/src/main/java/com/ard/device/component/sdk/dh/service/impl/DaHuaSDK.java
@@ -17,6 +17,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.io.*; @@ -102,7 +103,8 @@ public void login(ArdCamera camera) { try { NetSDKLib.NET_DEVICEINFO_Ex m_stDeviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex(); NetSDKLib.LLong loginId = LoginModule.login(camera.getIp(), camera.getPort(), camera.getUsername(), camera.getPassword(), m_stDeviceInfo); NetSDKLib.LLong loginId = LoginModule.login(camera.getIp(), camera.getPort(), camera.getUsername(), camera.getPassword(), m_stDeviceInfo); if (loginId.longValue() <= 0) { camera.setChanNum(0); camera.setLoginId(-1L); @@ -116,7 +118,7 @@ camera.setChanNum(m_stDeviceInfo.byChanNum); camera.setStartChan(1); camera.setLoginId(loginId.longValue()); GlobalVariable.loginMap.put(camera.getId(), loginId); //获取最新通道 List<ArdChannel> ardChannelList = getChannels(camera); if (!ardChannelList.isEmpty()) { @@ -135,11 +137,8 @@ * 2023/10/17 8:28:13 */ @Override public void logout(String cameraId) { if (!GlobalVariable.loginMap.containsKey(cameraId)) { return; } NetSDKLib.LLong loginId = (NetSDKLib.LLong) GlobalVariable.loginMap.get(cameraId); public void logout(ArdCamera ardCamera) { NetSDKLib.LLong loginId = new NetSDKLib.LLong(ardCamera.getLoginId()); LoginModule.logout(loginId); } @@ -149,13 +148,9 @@ * 2023/10/17 8:28:13 */ @Override public boolean isOnLine(CameraCmd cmd) { public boolean isOnLine(ArdCamera ardCamera) { try { String cameraId = cmd.getCameraId(); if (!GlobalVariable.loginMap.containsKey(cameraId)) { return false; } NetSDKLib.LLong loginId = (NetSDKLib.LLong) GlobalVariable.loginMap.get(cameraId); NetSDKLib.LLong loginId = new NetSDKLib.LLong(ardCamera.getLoginId()); NetSDKLib.NET_WORKSTATE dh_ptz_location_info = new NetSDKLib.NET_WORKSTATE(); boolean b = ConfigModule.queryDevState(loginId, NET_DEVSTATE_ONLINE, dh_ptz_location_info); if (!b) { @@ -185,8 +180,8 @@ channel.setDeviceId(camera.getId()); channel.setChanNo(i); //获取视频编码 CameraCmd cameraCmd = new CameraCmd(camera.getId(), channel.getChanNo()); VideoCompressionCfg videoCompressionCfg = getVideoCompressionCfg(cameraCmd); camera.setChanNo(i); VideoCompressionCfg videoCompressionCfg = getVideoCompressionCfg(camera); if (StringUtils.isNotNull(videoCompressionCfg)) { channel.setVideoCode(videoCompressionCfg.getVideoEncType()); } @@ -202,16 +197,12 @@ } @Override public VideoCompressionCfg getVideoCompressionCfg(CameraCmd cmd) { String cameraId = cmd.getCameraId(); Integer chanNo = cmd.getChanNo(); if (!GlobalVariable.loginMap.containsKey(cameraId)) { return null; } NetSDKLib.LLong loginId = (NetSDKLib.LLong) GlobalVariable.loginMap.get(cameraId); public VideoCompressionCfg getVideoCompressionCfg(ArdCamera ardCamera) { NetSDKLib.LLong loginId = new NetSDKLib.LLong(ardCamera.getLoginId()); NetSDKLib.CFG_ENCODE_INFO cfg_encode_info = new NetSDKLib.CFG_ENCODE_INFO(); cfg_encode_info.nChannelID = chanNo - 1; boolean b = ConfigModule.GetNewDevConfig(loginId, chanNo - 1, CFG_CMD_ENCODE, cfg_encode_info); cfg_encode_info.nChannelID = ardCamera.getChanNo() - 1; boolean b = ConfigModule.GetNewDevConfig(loginId, ardCamera.getChanNo() - 1, CFG_CMD_ENCODE, cfg_encode_info); if (b) { int emCompression = cfg_encode_info.stuMainStream[0].stuVideoFormat.emCompression;//视频格式 String videoEncType; ard-device/src/main/java/com/ard/device/component/sdk/hik/service/impl/HikVisionSDK.java
@@ -9,6 +9,7 @@ import com.ard.device.component.sdk.common.ResolutionEnum; import com.ard.device.component.sdk.common.SdkErrorCodeEnum; import com.ard.device.component.sdk.common.osSelect; import com.ard.device.component.sdk.dh.lib.NetSDKLib; import com.ard.device.component.sdk.event.LoginEvent; import com.ard.device.component.sdk.hik.lib.ExceptionCallBack; import com.ard.device.component.sdk.hik.lib.HCNetSDK; @@ -109,8 +110,6 @@ return; } log.info("Login Success 【 {}:{} 】", camera.getIp(), camera.getPort()); GlobalVariable.loginMap.put(camera.getId(), loginId); GlobalVariable.hikLoginMap.put(loginId, camera); camera.setLoginId((long) loginId); camera.setState("1"); @@ -138,26 +137,15 @@ * 注销 */ @Override public void logout(String cameraId) { if (!GlobalVariable.loginMap.containsKey(cameraId)) { return; } Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId); boolean b = hCNetSDK.NET_DVR_Logout(userId); if (b) { GlobalVariable.loginMap.remove(cameraId); } public void logout(ArdCamera ardCamera) { hCNetSDK.NET_DVR_Logout(ardCamera.getLoginId().intValue()); } @Override public boolean isOnLine(CameraCmd cmd) { public boolean isOnLine(ArdCamera ardCamera) { try { String cameraId = cmd.getCameraId(); if (!GlobalVariable.loginMap.containsKey(cameraId)) { return false; } Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId); return hCNetSDK.NET_DVR_RemoteControl(userId, NET_DVR_CHECK_USER_STATUS, null, 0); return hCNetSDK.NET_DVR_RemoteControl(ardCamera.getLoginId().intValue(), NET_DVR_CHECK_USER_STATUS, null, 0); } catch (Exception ex) { log.error("检测在线异常:{}", ex.getMessage()); return false; @@ -169,19 +157,13 @@ * */ @Override public VideoCompressionCfg getVideoCompressionCfg(CameraCmd cmd) { String cameraId = cmd.getCameraId(); Integer chanNo = cmd.getChanNo(); if (!GlobalVariable.loginMap.containsKey(cameraId)) { return null; } Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId); public VideoCompressionCfg getVideoCompressionCfg(ArdCamera ardCamera) { Integer chanNo = ardCamera.getChanNo(); int userId = ardCamera.getLoginId().intValue(); HCNetSDK.NET_DVR_COMPRESSIONCFG_V30 compressionCfg = new HCNetSDK.NET_DVR_COMPRESSIONCFG_V30(); compressionCfg.write(); Pointer point = compressionCfg.getPointer(); IntByReference ibrBytesReturned = new IntByReference(0); boolean bool = hCNetSDK.NET_DVR_GetDVRConfig(userId, HCNetSDK.NET_DVR_GET_COMPRESSCFG_V30, chanNo, point, compressionCfg.size(), ibrBytesReturned); if (bool) { @@ -432,8 +414,8 @@ channel.setName(channelName); channel.setChanNo(chanNo); //获取视频编码 CameraCmd cameraCmd = new CameraCmd(camera.getId(), chanNo); VideoCompressionCfg videoCompressionCfg = getVideoCompressionCfg(cameraCmd); camera.setChanNo(chanNo); VideoCompressionCfg videoCompressionCfg = getVideoCompressionCfg(camera); if (StringUtils.isNotNull(videoCompressionCfg)) { channel.setVideoCode(videoCompressionCfg.getVideoEncType()); } ard-device/src/main/java/com/ard/device/component/sdk/service/CameraSDK.java
@@ -20,13 +20,13 @@ void login(ArdCamera cameras); //注销 void logout(String cameraId); void logout(ArdCamera ardCamera); //在线状态 boolean isOnLine(CameraCmd cmd); boolean isOnLine(ArdCamera ardCamera); //获取码流压缩参数 VideoCompressionCfg getVideoCompressionCfg(CameraCmd cmd); VideoCompressionCfg getVideoCompressionCfg(ArdCamera ardCamera); //获取相机通道信息 List<ArdChannel> getChannels(ArdCamera camera); ard-device/src/main/java/com/ard/device/component/sdk/service/CameraSDKService.java
@@ -55,15 +55,12 @@ //注销 @Override public void logout(String cameraId) { public void logout(ArdCamera ardCamera) { try { ArdCamera ardCamera = redisService.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId); if (ardCamera != null) { String factory = ardCamera.getFactory(); CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory); cameraSDK.logout(cameraId); GlobalVariable.loginMap.remove(cameraId);//移除相机登录id缓存 } String factory = ardCamera.getFactory(); CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory); cameraSDK.logout(ardCamera); } catch (Exception ex) { log.error("注销异常:{}", ex.getMessage()); } @@ -71,17 +68,11 @@ //在线检测 @Override public boolean isOnLine(CameraCmd cmd) { public boolean isOnLine(ArdCamera ardCamera) { try { boolean onLine = false; String cameraId = cmd.getCameraId(); ArdCamera ardCamera = redisService.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId); if (ardCamera != null) { String factory = ardCamera.getFactory(); CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory); onLine = cameraSDK.isOnLine(cmd); } return onLine; String factory = ardCamera.getFactory(); CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory); return cameraSDK.isOnLine(ardCamera); } catch (Exception ex) { log.error("检测在线异常:{}", ex.getMessage()); return false; @@ -90,16 +81,11 @@ @Override //获取码流压缩参数 public VideoCompressionCfg getVideoCompressionCfg(CameraCmd cmd) { public VideoCompressionCfg getVideoCompressionCfg(ArdCamera ardCamera) { try { String cameraId = cmd.getCameraId(); ArdCamera ardCamera = redisService.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId); if (ardCamera == null) { return null; } String factory = ardCamera.getFactory(); CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory); return cameraSDK.getVideoCompressionCfg(cmd); return cameraSDK.getVideoCompressionCfg(ardCamera); } catch (Exception ex) { log.error("获取码流压缩参数异常:{}", ex.getMessage()); return null;