liusuyi
2025-10-28 1482b5b13c171a54c3db59da37c82848bb89f54e
优化
1 files added
6 files modified
119 ■■■■■ changed files
ard-device/src/main/java/com/ard/device/component/sdk/common/FactoryType.java 25 ●●●●● patch | view | raw | blame | history
ard-device/src/main/java/com/ard/device/component/sdk/common/GlobalVariable.java 6 ●●●●● patch | view | raw | blame | history
ard-device/src/main/java/com/ard/device/component/sdk/dh/service/impl/DaHuaSDK.java 27 ●●●●● patch | view | raw | blame | history
ard-device/src/main/java/com/ard/device/component/sdk/factory/CameraSDKFactory.java 9 ●●●●● patch | view | raw | blame | history
ard-device/src/main/java/com/ard/device/component/sdk/hik/service/impl/HikVisionSDK.java 21 ●●●●● patch | view | raw | blame | history
ard-device/src/main/java/com/ard/device/component/sdk/service/CameraSDK.java 6 ●●●●● patch | view | raw | blame | history
ard-device/src/main/java/com/ard/device/component/sdk/service/CameraSDKService.java 25 ●●●●● patch | view | raw | blame | history
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,11 +30,13 @@
     * @throws IllegalArgumentException 如果传入的工厂参数不支持
     */
    public CameraSDK createCameraSDK(String factory) {
        if (factory.equals("1")) {
        FactoryType factoryType = FactoryType.fromCode(factory);
        switch (factoryType) {
            case HIKVISION:
            return hikvisionSDK;
        } else if (factory.equals("2")) {
            case DAHUA:
            return dahuaSDK;
        } else {
            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) {
                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());