ard-device/src/main/java/com/ard/device/component/sdk/common/FactoryType.java
New file @@ -0,0 +1,25 @@ package com.ard.device.component.sdk.common; public enum FactoryType { HIKVISION("1"), DAHUA("2"); private final String factoryCode; FactoryType(String factoryCode) { this.factoryCode = factoryCode; } public String getFactoryCode() { return factoryCode; } public static FactoryType fromCode(String code) { for (FactoryType type : FactoryType.values()) { if (type.getFactoryCode().equals(code)) { return type; } } throw new IllegalArgumentException("Unsupported factory code: " + code); } } ard-device/src/main/java/com/ard/device/component/sdk/common/GlobalVariable.java
@@ -2,6 +2,7 @@ import com.ard.device.camera.domain.ArdCamera; import lombok.Data; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -19,9 +20,4 @@ public static Map<String, Object> loginMap = new ConcurrentHashMap<>(); //保存相机登录信息(loginId:Camera) public static Map<Integer, ArdCamera> hikLoginMap = new ConcurrentHashMap<>(); //相机预览字典 public static Map<String, Object> previewMap = new ConcurrentHashMap<>(); //线程字典 public static Map<String, String> threadMap = new ConcurrentHashMap<>(); } ard-device/src/main/java/com/ard/device/component/sdk/dh/service/impl/DaHuaSDK.java
@@ -1,13 +1,10 @@ package com.ard.device.component.sdk.dh.service.impl; import com.ard.common.core.domain.AjaxResult; import com.ard.common.utils.StringUtils; import com.ard.device.camera.domain.ArdCamera; import com.ard.device.camera.domain.CameraCmd; import com.ard.device.camera.service.IArdCameraService; import com.ard.device.channel.domain.ArdChannel; import com.ard.device.channel.domain.VideoCompressionCfg; import com.ard.device.channel.service.IArdChannelService; import com.ard.device.component.sdk.common.GlobalVariable; import com.ard.device.component.sdk.common.osSelect; import com.ard.device.component.sdk.dh.module.ConfigModule; @@ -41,12 +38,7 @@ public class DaHuaSDK implements CameraSDK { @Resource private IArdCameraService ardCameraService; @Resource private IArdChannelService ardChannelService; @Resource private ApplicationEventPublisher eventPublisher; public static NetSDKLib netsdk = null; public static NetSDKLib configsdk = null; @@ -107,7 +99,7 @@ * 登录 */ @Override public AjaxResult login(ArdCamera camera) { 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); @@ -118,7 +110,6 @@ LoginEvent loginEvent = new LoginEvent(camera); eventPublisher.publishEvent(loginEvent); log.warn("设备[{}:{}]登录失败:{}", camera.getIp(), camera.getPort(), getErrorCodePrint()); return AjaxResult.warn(getErrorCodePrint()); } log.debug("设备[{}:{}]登录成功:{}", camera.getIp(), camera.getPort(), loginId); camera.setState("1"); @@ -133,12 +124,8 @@ } LoginEvent loginEvent = new LoginEvent(camera); eventPublisher.publishEvent(loginEvent); //创建引导队列 //createGuideQueue(camera); return AjaxResult.success("登录成功"); } catch (Exception ex) { log.error("登录异常:{}", ex.getMessage()); return AjaxResult.error("登录异常:" + ex.getMessage()); } } @@ -146,16 +133,14 @@ * 注销 * 刘苏义 * 2023/10/17 8:28:13 * * @return */ @Override public boolean logout(String cameraId) { public void logout(String cameraId) { if (!GlobalVariable.loginMap.containsKey(cameraId)) { return false; return; } NetSDKLib.LLong loginId = (NetSDKLib.LLong) GlobalVariable.loginMap.get(cameraId); return LoginModule.logout(loginId); LoginModule.logout(loginId); } /** @@ -186,7 +171,7 @@ /** * 获取通道 */ @Override public List<ArdChannel> getChannels(ArdCamera camera) { if (camera.getLoginId() < 0) { return new ArrayList<>(); @@ -215,7 +200,6 @@ } return ardChannelList; } @Override public VideoCompressionCfg getVideoCompressionCfg(CameraCmd cmd) { @@ -282,7 +266,6 @@ return null; } } /** * 动态库加载 - 大华 NetSDK + ConfigSDK ard-device/src/main/java/com/ard/device/component/sdk/factory/CameraSDKFactory.java
@@ -1,5 +1,6 @@ package com.ard.device.component.sdk.factory; import com.ard.device.component.sdk.common.FactoryType; import com.ard.device.component.sdk.dh.service.impl.DaHuaSDK; import com.ard.device.component.sdk.hik.service.impl.HikVisionSDK; import com.ard.device.component.sdk.service.CameraSDK; @@ -29,12 +30,14 @@ * @throws IllegalArgumentException 如果传入的工厂参数不支持 */ public CameraSDK createCameraSDK(String factory) { if (factory.equals("1")) { return hikvisionSDK; } else if (factory.equals("2")) { return dahuaSDK; } else { throw new IllegalArgumentException("Unsupported device: " + factory); FactoryType factoryType = FactoryType.fromCode(factory); switch (factoryType) { case HIKVISION: return hikvisionSDK; case DAHUA: return dahuaSDK; default: throw new IllegalArgumentException("Unsupported device: " + factory); } } } ard-device/src/main/java/com/ard/device/component/sdk/hik/service/impl/HikVisionSDK.java
@@ -1,13 +1,10 @@ package com.ard.device.component.sdk.hik.service.impl; import com.ard.common.core.domain.AjaxResult; import com.ard.common.utils.StringUtils; import com.ard.device.camera.domain.ArdCamera; import com.ard.device.camera.service.IArdCameraService; import com.ard.device.channel.domain.ArdChannel; import com.ard.device.camera.domain.CameraCmd; import com.ard.device.channel.domain.VideoCompressionCfg; import com.ard.device.channel.service.IArdChannelService; import com.ard.device.component.sdk.common.GlobalVariable; import com.ard.device.component.sdk.common.ResolutionEnum; import com.ard.device.component.sdk.common.SdkErrorCodeEnum; @@ -76,7 +73,7 @@ * 登录 */ @Override public AjaxResult login(ArdCamera camera) { public void login(ArdCamera camera) { try { String m_sDeviceIP = camera.getIp(); String m_sUsername = camera.getUsername(); @@ -109,7 +106,6 @@ eventPublisher.publishEvent(loginEvent); log.warn("设备[{}:{}]登录失败: {}({})", camera.getIp(), camera.getPort(), SdkErrorCodeEnum.getDescByCode(errorCode), errorCode); return AjaxResult.warn("设备[" + camera.getIp() + ":" + camera.getPort() + "]登录失败: " + SdkErrorCodeEnum.getDescByCode(errorCode) + "(" + errorCode + ")"); } log.info("Login Success 【 {}:{} 】", camera.getIp(), camera.getPort()); @@ -119,7 +115,7 @@ camera.setState("1"); int chanNum = m_strDeviceInfo.struDeviceV30.byChanNum; int startChan = m_strDeviceInfo.struDeviceV30.byStartDChan + 1; if (camera.getType().equals("2")) { if ("2".equals(camera.getType())) { chanNum = m_strDeviceInfo.struDeviceV30.byIPChanNum; startChan = m_strDeviceInfo.struDeviceV30.byStartDChan; } @@ -132,10 +128,8 @@ } LoginEvent loginEvent = new LoginEvent(camera); eventPublisher.publishEvent(loginEvent); return AjaxResult.success("设备登录成功"); } catch (Exception ex) { log.error("注册设备异常", ex); return AjaxResult.error("注册设备异常" + ex.getMessage()); } } @@ -143,16 +137,15 @@ * 注销 */ @Override public boolean logout(String cameraId) { public void logout(String cameraId) { if (!GlobalVariable.loginMap.containsKey(cameraId)) { return false; return; } Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId); boolean b = hCNetSDK.NET_DVR_Logout(userId); if (b) { GlobalVariable.loginMap.remove(cameraId); } return b; } @Override @@ -314,7 +307,7 @@ } //分辨率 String resolution = ResolutionEnum.fromCode(compressionCfg.struNormHighRecordPara.byResolution).getResolution(); Objects.requireNonNull(ResolutionEnum.fromCode(compressionCfg.struNormHighRecordPara.byResolution)).getResolution(); //帧率 String nFrameRate; switch (compressionCfg.struNormHighRecordPara.dwVideoFrameRate) { @@ -401,6 +394,7 @@ /** * 获取通道 */ @Override public List<ArdChannel> getChannels(ArdCamera camera) { //获取通道 List<ArdChannel> channelList = new ArrayList<>(); @@ -443,7 +437,7 @@ channel.setVideoCode(videoCompressionCfg.getVideoEncType()); } //NVR过滤离线通道 if (camera.getType().equals("3") || camera.getType().equals("2")) { if ("3".equals(camera.getType()) || "2".equals(camera.getType())) { if (ipParaCfg.struStreamMode[iChanNo].uGetStream.struChanInfo.byEnable != 1) { continue; } @@ -493,7 +487,6 @@ System.out.println("✅ SDK 加载成功!"); } catch (Exception ex) { System.err.println("❌ SDK 加载失败: " + strDllPath + "\n异常信息: " + ex.getMessage()); ex.printStackTrace(); return false; } } ard-device/src/main/java/com/ard/device/component/sdk/service/CameraSDK.java
@@ -17,10 +17,10 @@ public interface CameraSDK { //登录 AjaxResult login(ArdCamera cameras); void login(ArdCamera cameras); //注销 boolean logout(String cameraId); void logout(String cameraId); //在线状态 boolean isOnLine(CameraCmd cmd); @@ -29,5 +29,5 @@ VideoCompressionCfg getVideoCompressionCfg(CameraCmd cmd); //获取相机通道信息 public List<ArdChannel> getChannels(ArdCamera camera); List<ArdChannel> getChannels(ArdCamera camera); } ard-device/src/main/java/com/ard/device/component/sdk/service/CameraSDKService.java
@@ -13,6 +13,7 @@ import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.ArrayList; import java.util.Date; @@ -27,7 +28,7 @@ **/ @Service @Slf4j public class CameraSDKService { public class CameraSDKService implements CameraSDK { @Resource private RedisCache redisService; @@ -37,41 +38,39 @@ //异步登录 @Async public AjaxResult login(ArdCamera ardCamera) { @Override public void login(ArdCamera ardCamera) { try { if (ardCamera == null) { return AjaxResult.warn("设备不存在"); log.warn("设备不存在"); return; } String factory = ardCamera.getFactory(); CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory); return cameraSDK.login(ardCamera);//异步登录 cameraSDK.login(ardCamera);//异步登录 } catch (Exception ex) { log.error("登录异常:{}", ex.getMessage()); return AjaxResult.error("登录异常:" + ex.getMessage()); } } //注销 public boolean logout(String cameraId) { boolean result = false; @Override public void logout(String cameraId) { try { ArdCamera ardCamera = redisService.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId); if (ardCamera != null) { String factory = ardCamera.getFactory(); CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory); result = cameraSDK.logout(cameraId); if (result) { GlobalVariable.loginMap.remove(cameraId);//移除相机登录id缓存 } cameraSDK.logout(cameraId); GlobalVariable.loginMap.remove(cameraId);//移除相机登录id缓存 } } catch (Exception ex) { log.error("注销异常:{}", ex.getMessage()); return false; } return result; } //在线检测 @Override public boolean isOnLine(CameraCmd cmd) { try { boolean onLine = false; @@ -89,6 +88,7 @@ } } @Override //获取码流压缩参数 public VideoCompressionCfg getVideoCompressionCfg(CameraCmd cmd) { try { @@ -107,6 +107,7 @@ } //获取通道列表 @Override public List<ArdChannel> getChannels(ArdCamera camera) { try { CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(camera.getFactory());