forked from ard/ruoyi-api

aijinhui
2023-11-07 1ccdcb4a890687d59b272f5397e8b41ae4ce2254
Merge remote-tracking branch 'origin/master'
1 files added
2 files deleted
9 files modified
3 files renamed
872 ■■■■ changed files
ard-work/src/main/java/com/ruoyi/device/camera/service/ICameraSdkService.java 2 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ruoyi/device/camera/service/impl/AsyncLogin.java 34 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ruoyi/device/camera/service/impl/CameraSdkServiceImpl.java 222 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ruoyi/device/camera/strategy/SdkStrategy.java 19 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ruoyi/device/camera/strategy/SdkStrategyFactory.java 43 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ruoyi/inspect/service/impl/ArdVideoInspectTaskServiceImpl.java 1 ●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ruoyi/inspect/service/impl/InspectionTaskManager.java 8 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/controller/DhSdkController.java 4 ●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/IDhClientService.java 70 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DhSdkStrategy.java 210 ●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/controller/HikSdkController.java 6 ●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/lib/LoginResultCallBack.java 5 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikSdkStrategy.java 231 ●●●●● patch | view | raw | blame | history
ruoyi-common/src/main/java/com/ruoyi/common/filter/MyI18nInterceptor.java 2 ●●● patch | view | raw | blame | history
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SyncTask.java 15 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ruoyi/device/camera/service/ICameraSdkService.java
@@ -2,6 +2,8 @@
import com.ruoyi.device.camera.domain.ArdCameras;
import com.ruoyi.device.camera.domain.CameraCmd;
import org.springframework.scheduling.annotation.Async;
import java.util.Map;
public interface ICameraSdkService {
ard-work/src/main/java/com/ruoyi/device/camera/service/impl/AsyncLogin.java
File was deleted
ard-work/src/main/java/com/ruoyi/device/camera/service/impl/CameraSdkServiceImpl.java
@@ -7,8 +7,8 @@
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.camera.service.IArdCamerasService;
import com.ruoyi.device.camera.service.ICameraSdkService;
import com.ruoyi.utils.sdk.dhsdk.service.IDhClientService;
import com.ruoyi.utils.sdk.hiksdk.service.IHikClientService;
import com.ruoyi.device.camera.strategy.SdkStrategy;
import com.ruoyi.device.camera.strategy.SdkStrategyFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
@@ -32,27 +32,30 @@
    @Resource
    private IArdCamerasService ardCamerasService;
    @Resource
    IHikClientService hikClientService;
    private RedisCache redisCache;
    @Resource
    IDhClientService dhClientService;
    @Resource
    RedisCache redisCache;
    private SdkStrategyFactory sdkStrategyFactory;
    /**
     * 启动线程方法,用于执行初始化登录相机的逻辑
     *
     * @param args 命令行参数
     */
    @Override
    public void run(ApplicationArguments args) throws Exception {
    public void run(ApplicationArguments args) {
        try {
            // 从ardCamerasService中获取ArdCameras列表
            List<ArdCameras> ardCameras = ardCamerasService.selectArdCamerasListNoDataScope(new ArdCameras());
            for (ArdCameras camera : ardCameras) {
                if ("1".equals(camera.getFactory())) {
                    hikClientService.login(camera);
                } else if ("2".equals(camera.getFactory())) {
                    dhClientService.login(camera);
                }
                login(camera);
            }
        } catch (Exception ex) {
            // 初始化登录相机异常,记录错误日志
            log.error("初始化登录相机异常:" + ex.getMessage());
        }
    }
    //登录
    @Override
@@ -61,13 +64,10 @@
        try {
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    hikClientService.login(ardCamera);
                SdkStrategy sdkStrategy = sdkStrategyFactory.getSdkStrategy(factory);
                //sdkStrategy.login(ardCamera);//同步登录
                sdkStrategy.asyncLogin(ardCamera);//异步登录
                    result = true;
                } else if (factory.equals("2")) {
                    dhClientService.login(ardCamera);
                    result = true;
                }
            }
        } catch (Exception ex) {
            log.error("登录异常:" + ex.getMessage());
@@ -84,11 +84,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.logout(cameraId);
                } else if (factory.equals("2")) {
                    result = dhClientService.logout(cameraId);
                }
                SdkStrategy sdkStrategy = sdkStrategyFactory.getSdkStrategy(factory);
                result = sdkStrategy.logout(cameraId);
            }
        } catch (Exception ex) {
            log.error("注销异常:" + ex.getMessage());
@@ -106,11 +103,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    onLine = hikClientService.isOnLine(cmd);
                } else if (factory.equals("2")) {
                    onLine = dhClientService.isOnLine(cmd);
                }
                SdkStrategy sdkStrategy = sdkStrategyFactory.getSdkStrategy(factory);
                onLine = sdkStrategy.isOnLine(cmd);
            }
            return onLine;
        } catch (Exception ex) {
@@ -129,11 +123,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.pTZControlWithSpeed(cmd);
                } else if (factory.equals("2")) {
                    result = dhClientService.pTZControl(cmd);
                }
                SdkStrategy sdkStrategy = sdkStrategyFactory.getSdkStrategy(factory);
                result = sdkStrategy.pTZControl(cmd);
            }
            return result;
        } catch (Exception ex) {
@@ -151,11 +142,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.setFocusPos(cmd);
                } else if (factory.equals("2")) {
                    result = dhClientService.setFocusPos(cmd);
                }
                SdkStrategy sdkStrategy = sdkStrategyFactory.getSdkStrategy(factory);
                result = sdkStrategy.setFocusPos(cmd);
            }
        } catch (Exception ex) {
            log.error("设置聚焦值异常:" + ex.getMessage());
@@ -173,11 +161,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.getFocusPos(cmd);
                } else if (factory.equals("2")) {
                    result = dhClientService.getFocusPos(cmd);
                }
                SdkStrategy sdkStrategy = sdkStrategyFactory.getSdkStrategy(factory);
                result = sdkStrategy.getFocusPos(cmd);
            }
        } catch (Exception ex) {
            log.error("获取聚焦值异常:" + ex.getMessage());
@@ -187,6 +172,7 @@
    //设置预置位
    @Override
    @SdkOperate
    public boolean setPreset(CameraCmd cmd) {
        boolean result = false;
        try {
@@ -194,11 +180,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.setPreset(cmd);
                } else if (factory.equals("2")) {
                    result = dhClientService.setPreset(cmd);
                }
                SdkStrategy sdkStrategy = sdkStrategyFactory.getSdkStrategy(factory);
                result = sdkStrategy.setPreset(cmd);
            }
        } catch (Exception ex) {
            log.error("设置预置位异常:" + ex.getMessage());
@@ -208,6 +191,7 @@
    //调用预置位
    @Override
    @SdkOperate
    public boolean gotoPreset(CameraCmd cmd) {
        boolean result = false;
        try {
@@ -215,11 +199,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.gotoPreset(cmd);
                } else if (factory.equals("2")) {
                    result = dhClientService.gotoPreset(cmd);
                }
                SdkStrategy sdkStrategy = sdkStrategyFactory.getSdkStrategy(factory);
                result = sdkStrategy.gotoPreset(cmd);
            }
        } catch (Exception ex) {
            log.error("调用预置位异常:" + ex.getMessage());
@@ -236,11 +217,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    map = hikClientService.getVideoCompressionCfg(cmd);
                } else if (factory.equals("2")) {
                    map = dhClientService.getVideoCompressionCfg(cmd);
                }
                SdkStrategy sdkStrategy = sdkStrategyFactory.getSdkStrategy(factory);
                map = sdkStrategy.getVideoCompressionCfg(cmd);
            }
        } catch (Exception ex) {
            log.error("获取码流压缩参数异常:" + ex.getMessage());
@@ -257,11 +235,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.controlDefogcfg(cmd);
                } else if (factory.equals("2")) {
                    //不支持
                }
                SdkStrategy sdkStrategy = sdkStrategyFactory.getSdkStrategy(factory);
                result = sdkStrategy.controlDefogcfg(cmd);
            }
        } catch (Exception ex) {
            log.error("操控透雾异常:" + ex.getMessage());
@@ -278,11 +253,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.controlInfrarecfg(cmd);
                } else if (factory.equals("2")) {
                    result = dhClientService.controlInfrarecfg(cmd);
                }
                SdkStrategy sdkStrategy = sdkStrategyFactory.getSdkStrategy(factory);
                result = sdkStrategy.controlInfrarecfg(cmd);
            }
        } catch (Exception ex) {
            log.error("操控红外异常:" + ex.getMessage());
@@ -299,11 +271,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.controlFocusMode(cmd);
                } else if (factory.equals("2")) {
                    result = dhClientService.controlFocusMode(cmd);
                }
                SdkStrategy sdkStrategy = sdkStrategyFactory.getSdkStrategy(factory);
                result = sdkStrategy.controlFocusMode(cmd);
            }
        } catch (Exception ex) {
            log.error("操控聚焦模式异常:" + ex.getMessage());
@@ -320,11 +289,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.getFocusMode(cmd);
                } else if (factory.equals("2")) {
                    result = dhClientService.getFocusMode(cmd);
                }
                SdkStrategy sdkStrategy = sdkStrategyFactory.getSdkStrategy(factory);
                result = sdkStrategy.getFocusMode(cmd);
            }
        } catch (Exception ex) {
            log.error("获取聚焦模式异常:" + ex.getMessage());
@@ -341,11 +307,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.controlPTHeateRpwron(cmd);
                } else if (factory.equals("2")) {
                    //不支持
                }
                SdkStrategy sdkStrategy = sdkStrategyFactory.getSdkStrategy(factory);
                result = sdkStrategy.controlPTHeateRpwron(cmd);
            }
        } catch (Exception ex) {
            log.error("操控云台加热异常:" + ex.getMessage());
@@ -362,11 +325,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.controlCameraDeicing(cmd);
                } else if (factory.equals("2")) {
                    //不支持
                }
                SdkStrategy sdkStrategy = sdkStrategyFactory.getSdkStrategy(factory);
                result = sdkStrategy.controlCameraDeicing(cmd);
            }
        } catch (Exception ex) {
            log.error("操控云台加热异常:" + ex.getMessage());
@@ -383,11 +343,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.getPTZLockInfo(cmd);
                } else if (factory.equals("2")) {
                }
                SdkStrategy sdkStrategy = sdkStrategyFactory.getSdkStrategy(factory);
                result = sdkStrategy.getPTZLockInfo(cmd);
            }
        } catch (Exception ex) {
            log.error("获取云台锁定信息异常:" + ex.getMessage());
@@ -413,13 +370,8 @@
            if (ardCamera != null) {
                //获取摄像头工厂
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    //调用hikClientService的picCutCate方法
                    url = hikClientService.picCutCate(cmd);
                } else if (factory.equals("2")) {
                    //调用dhClientService的picCutCate方法
                    url = dhClientService.picCutCate(cmd);
                }
                SdkStrategy sdkStrategy = sdkStrategyFactory.getSdkStrategy(factory);
                url = sdkStrategy.picCutCate(cmd);
            }
        } catch (Exception ex) {
            log.error("抓图异常:" + ex.getMessage());
@@ -436,11 +388,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    map = hikClientService.getPtz(cmd);
                } else if (factory.equals("2")) {
                    map = dhClientService.getPtz(cmd);
                }
                SdkStrategy sdkStrategy = sdkStrategyFactory.getSdkStrategy(factory);
                map = sdkStrategy.getPtz(cmd);
            }
        } catch (Exception ex) {
            log.error("获取ptz异常:" + ex.getMessage());
@@ -457,11 +406,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    map = hikClientService.getPtzScope(cmd);
                } else if (factory.equals("2")) {
                }
                SdkStrategy sdkStrategy = sdkStrategyFactory.getSdkStrategy(factory);
                map = sdkStrategy.getPtzScope(cmd);
            }
        } catch (Exception ex) {
            log.error("获取ptz范围异常:" + ex.getMessage());
@@ -479,11 +425,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.setPtz(cmd);
                } else if (factory.equals("2")) {
                    result = dhClientService.setPtz(cmd);
                }
                SdkStrategy sdkStrategy = sdkStrategyFactory.getSdkStrategy(factory);
                result = sdkStrategy.setPtz(cmd);
            }
        } catch (Exception ex) {
            log.error("设置ptz异常:" + ex.getMessage());
@@ -501,11 +444,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.setZeroPtz(cmd);
                } else if (factory.equals("2")) {
                    result = dhClientService.setZeroPtz(cmd);
                }
                SdkStrategy sdkStrategy = sdkStrategyFactory.getSdkStrategy(factory);
                result = sdkStrategy.setZeroPtz(cmd);
            }
        } catch (Exception ex) {
            log.error("设置零方位角异常:" + ex.getMessage());
@@ -523,11 +463,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.guideTargetPosition(cmd);
                } else if (factory.equals("2")) {
                    result = dhClientService.guideTargetPosition(cmd);
                }
                SdkStrategy sdkStrategy = sdkStrategyFactory.getSdkStrategy(factory);
                result = sdkStrategy.guideTargetPosition(cmd);
            }
        } catch (Exception ex) {
            log.error("引导指向目标异常:" + ex.getMessage());
@@ -590,11 +527,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    url = hikClientService.record(cmd);
                } else if (factory.equals("2")) {
                    url = dhClientService.record(cmd);
                }
                SdkStrategy sdkStrategy = sdkStrategyFactory.getSdkStrategy(factory);
                url = sdkStrategy.record(cmd);
            }
        } catch (Exception ex) {
            log.error("录像异常:" + ex.getMessage());
@@ -611,11 +545,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.recordStart(cmd);
                } else if (factory.equals("2")) {
                    result = dhClientService.recordStart(cmd);
                }
                SdkStrategy sdkStrategy = sdkStrategyFactory.getSdkStrategy(factory);
                result = sdkStrategy.recordStart(cmd);
            }
        } catch (Exception ex) {
            log.error("开始录像异常:" + ex.getMessage());
@@ -632,11 +563,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    url = hikClientService.recordStopToMinio(cmd);
                } else if (factory.equals("2")) {
                    url = dhClientService.recordStopToMinio(cmd);
                }
                SdkStrategy sdkStrategy = sdkStrategyFactory.getSdkStrategy(factory);
                url = sdkStrategy.recordStopToMinio(cmd);
            }
        } catch (Exception ex) {
            log.error("停止录像异常:" + ex.getMessage());
@@ -653,11 +581,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.recordStopNotToMinio(cmd);
                } else if (factory.equals("2")) {
                    result = dhClientService.recordStopNotToMinio(cmd);
                }
                SdkStrategy sdkStrategy = sdkStrategyFactory.getSdkStrategy(factory);
                result = sdkStrategy.recordStopNotToMinio(cmd);
            }
        } catch (Exception ex) {
            log.error("停止录像异常:" + ex.getMessage());
@@ -674,11 +599,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    map = hikClientService.getGisInfo(cmd);
                } else if (factory.equals("2")) {
                    map = dhClientService.getGisInfo(cmd);
                }
                SdkStrategy sdkStrategy = sdkStrategyFactory.getSdkStrategy(factory);
                map = sdkStrategy.getGisInfo(cmd);
            }
        } catch (Exception ex) {
            log.error("获取相机架设参数异常:" + ex.getMessage());
ard-work/src/main/java/com/ruoyi/device/camera/strategy/SdkStrategy.java
File was renamed from ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/IHikClientService.java
@@ -1,23 +1,20 @@
package com.ruoyi.utils.sdk.hiksdk.service;
package com.ruoyi.device.camera.strategy;
import com.ruoyi.device.camera.domain.ArdCameras;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.channel.domain.ArdChannel;
import java.util.List;
import java.util.Map;
/**
 * @ClassName: IHikClientService
 * @Description: 海康操作客户端接口类
 * @Author: Administrator
 * @Date: 2023年01月17日 15:59
 * @Version: 1.0
 **/
public interface IHikClientService {
 *  相机SDK策略接口
 * 刘苏义
 * 2023/11/7 10:48:52
 */
public interface SdkStrategy {
    //同步登录
    void login(ArdCameras cameras);
    boolean login(ArdCameras cameras);
    //异步登录
    void asyncLogin(ArdCameras cameras);
@@ -29,7 +26,7 @@
    boolean isOnLine(CameraCmd cmd);
    //云台控制
    boolean pTZControlWithSpeed(CameraCmd cmd);
    boolean pTZControl(CameraCmd cmd);
    //设置聚焦值
    boolean setFocusPos(CameraCmd cmd);
ard-work/src/main/java/com/ruoyi/device/camera/strategy/SdkStrategyFactory.java
New file
@@ -0,0 +1,43 @@
package com.ruoyi.device.camera.strategy;
import com.ruoyi.device.camera.domain.ArdCameras;
import com.ruoyi.utils.sdk.dhsdk.service.impl.DhSdkStrategy;
import com.ruoyi.utils.sdk.hiksdk.service.impl.HikSdkStrategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
 * @Description: SDK策略工厂类
 * @ClassName: SdkStrategyFactory
 * @Author: 刘苏义
 * @Date: 2023年11月07日10:53:00
 **/
@Component
public class SdkStrategyFactory {
    @Resource
    private HikSdkStrategy hikSdkStrategy;
    @Resource
    private DhSdkStrategy dhSdkStrategy;
    /**
     * 根据传入的工厂参数获取对应的Sdk策略
     *
     * @param factory 工厂参数
     * @return 对应的Sdk策略
     * @throws IllegalArgumentException 如果不支持该工厂参数
     */
    public SdkStrategy getSdkStrategy(String factory) {
        if (factory.equals("1")) {
            return hikSdkStrategy;
        } else if (factory.equals("2")) {
            return dhSdkStrategy;
        } else {
            throw new IllegalArgumentException("Unsupported device: " + factory);
        }
    }
}
ard-work/src/main/java/com/ruoyi/inspect/service/impl/ArdVideoInspectTaskServiceImpl.java
@@ -9,7 +9,6 @@
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.camera.mapper.ArdCamerasMapper;
import com.ruoyi.device.camera.service.ICameraSdkService;
import com.ruoyi.utils.sdk.hiksdk.service.IHikClientService;
import com.ruoyi.inspect.domain.ArdVideoInspectRecord;
import com.ruoyi.inspect.mapper.ArdVideoInspectRecordMapper;
import com.ruoyi.inspect.mapper.ArdVideoInspectTaskStepMapper;
ard-work/src/main/java/com/ruoyi/inspect/service/impl/InspectionTaskManager.java
@@ -1,10 +1,12 @@
package com.ruoyi.inspect.service.impl;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.camera.service.ICameraSdkService;
import com.ruoyi.device.camera.service.impl.CameraSdkServiceImpl;
import com.ruoyi.utils.sdk.common.GlobalVariable;
import com.ruoyi.utils.sdk.hiksdk.service.IHikClientService;
import com.ruoyi.inspect.domain.ArdVideoInspectTask;
import com.ruoyi.inspect.mapper.ArdVideoInspectTaskMapper;
import com.ruoyi.utils.sdk.hiksdk.service.impl.HikSdkStrategy;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@@ -28,7 +30,7 @@
    @Resource
    ArdVideoInspectTaskMapper ardVideoInspectTaskMapper;
    @Resource
    private IHikClientService hikClientService;
    private ICameraSdkService cameraSdkService;
    public static Map<String, InspectionTask> taskMap;//已启动任务map
@@ -77,7 +79,7 @@
            CameraCmd cmd = new CameraCmd();
            cmd.setCameraId(ardVideoInspectTask.getCameraId());
            cmd.setChanNo(ardVideoInspectTask.getChannel());
            hikClientService.recordStopNotToMinio(cmd);
            cameraSdkService.recordStopNotToMinio(cmd);
            GlobalVariable.previewMap.remove(cameraId);
        }
        /*停止任务*/
ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/controller/DhSdkController.java
@@ -8,7 +8,7 @@
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.utils.sdk.dhsdk.service.IDhClientService;
import com.ruoyi.utils.sdk.dhsdk.service.impl.DhSdkStrategy;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.stereotype.Controller;
@@ -36,7 +36,7 @@
public class DhSdkController extends BaseController {
    @Resource
    private IDhClientService sdk;
    private DhSdkStrategy sdk;
    @ApiOperation(value = "云台控制", notes = "Code:1-左上 2-上 3-右上 4-左 5-巡航 6-右 7-左下 8-下 9-右下 10-焦距变大 11-焦距变小\n" +
ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/IDhClientService.java
File was deleted
ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DhSdkStrategy.java
File was renamed from ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DhClientServiceImpl.java
@@ -6,52 +6,56 @@
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.common.utils.file.MimeTypeUtils;
import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.device.camera.strategy.SdkStrategy;
import com.ruoyi.device.camera.domain.ArdCameras;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.camera.service.IArdCamerasService;
import com.ruoyi.device.channel.domain.ArdChannel;
import com.ruoyi.device.channel.service.IArdChannelService;
import com.ruoyi.media.domain.Vtdu;
import com.ruoyi.media.service.IVtduService;
import com.ruoyi.utils.gis.GisUtil;
import com.ruoyi.utils.minio.MinioUtil;
import com.ruoyi.utils.sdk.common.GlobalVariable;
import com.ruoyi.utils.sdk.dhsdk.lib.NetSDKLib;
import com.ruoyi.utils.sdk.dhsdk.lib.NetSDKLib.LLong;
import com.ruoyi.utils.sdk.dhsdk.lib.enumeration.EM_NEW_CONFIG;
import com.ruoyi.utils.sdk.dhsdk.lib.enumeration.NET_EM_CFG_OPERATE_TYPE;
import com.ruoyi.utils.sdk.dhsdk.lib.structure.CFG_VIDEO_IN_FOCUS;
import com.ruoyi.utils.sdk.dhsdk.lib.structure.DH_OUT_PTZ_VIEW_RANGE_STATUS;
import com.ruoyi.utils.sdk.dhsdk.module.*;
import com.ruoyi.utils.sdk.dhsdk.service.IDhClientService;
import com.ruoyi.utils.sdk.common.GlobalVariable;
import com.ruoyi.media.domain.Vtdu;
import com.ruoyi.media.service.IVtduService;
import com.ruoyi.utils.gis.GisUtil;
import com.ruoyi.utils.minio.MinioUtil;
import com.sun.jna.Pointer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.io.*;
import java.text.DecimalFormat;
import java.util.*;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.PriorityBlockingQueue;
import static com.ruoyi.utils.sdk.dhsdk.lib.NetSDKLib.*;
import static com.ruoyi.utils.sdk.dhsdk.lib.NetSDKLib.NET_DEVSTATE_PTZ_VIEW_RANGE;
import static com.ruoyi.utils.sdk.dhsdk.lib.NetSDKLib.NET_PTZ_ControlType.NET_PTZ_POINT_MOVE_CONTROL;
import static com.ruoyi.utils.sdk.dhsdk.lib.NetSDKLib.NET_PTZ_ControlType.NET_PTZ_POINT_SET_CONTROL;
import static com.ruoyi.utils.sdk.dhsdk.lib.ToolKits.getErrorCodePrint;
import static com.ruoyi.utils.sdk.dhsdk.module.LoginModule.netsdk;
/**
 * @ClassName DhSdkServiceImpl
 * @Description:
 * @Author 刘苏义
 * @Date 2023/10/13 21:19
 * @Version 1.0
 */
@Service
 * @Description: 大华sdk策略
 * @ClassName: DhSdkStrategy
 * @Author: 刘苏义
 * @Date: 2023年11月07日10:51:09
 **/
@Slf4j(topic = "dhSdk")
public class DhClientServiceImpl implements IDhClientService {
@Service
public class DhSdkStrategy implements SdkStrategy {
    @Resource
    private IArdCamerasService ardCamerasService;
    @Resource
@@ -60,7 +64,7 @@
    private IVtduService vtduService;
    @Value("${minio.endpoint}")
    private String minioEndPoint;
    private final Object lock = new Object();
    // 设备断线通知回调
    private static DisConnect disConnect = new DisConnect();
@@ -72,17 +76,21 @@
     * 登录
     * 刘苏义
     * 2023/10/17 8:28:13
     * @return
     */
    @Override
    public Boolean login(ArdCameras camera) {
    public boolean login(ArdCameras camera) {
        LoginModule.init(disConnect, haveReConnect);
        NetSDKLib.NET_DEVICEINFO_Ex m_stDeviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex();
        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(-1);
            camera.setState("0");
            ardCamerasService.updateArdCameras(camera);
            //删除管理通道
            ardChannelService.deleteArdChannelByDeviceId(camera.getId());
            return false;
        }
        if (GlobalVariable.loginMap.containsKey(camera.getId())) {
@@ -100,7 +108,7 @@
        //获取最新通道
        for (int i = 1; i < m_stDeviceInfo.byChanNum + 1; i++) {
            ArdChannel channel = new ArdChannel();
            AV_CFG_ChannelName av_cfg_channelName = new AV_CFG_ChannelName();
            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) {
                String chanName = null;
@@ -154,17 +162,101 @@
        return true;
    }
    @Override
    @Async("loginExecutor")
    public void asyncLogin(ArdCameras camera){
        LoginModule.init(disConnect, haveReConnect);
        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);
        if (loginId.longValue() <= 0) {
            camera.setChanNum(0);
            camera.setLoginId(-1);
            camera.setState("0");
            ardCamerasService.updateArdCameras(camera);
            //删除管理通道
            ardChannelService.deleteArdChannelByDeviceId(camera.getId());
            return;
        }
        if (GlobalVariable.loginMap.containsKey(camera.getId())) {
            GlobalVariable.loginMap.remove(camera.getId());
        }
        //删除管理通道
        ardChannelService.deleteArdChannelByDeviceId(camera.getId());
        camera.setState("1");
        camera.setChanNum(m_stDeviceInfo.byChanNum);
        camera.setStartDChan(1);
        camera.setLoginId((int) loginId.longValue());
        ardCamerasService.updateArdCameras(camera);
        GlobalVariable.loginMap.put(camera.getId(), loginId);
        //获取最新通道
        for (int i = 1; i < m_stDeviceInfo.byChanNum + 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) {
                String chanName = null;
                try {
                    chanName = new String(av_cfg_channelName.szName, "GBK").trim();
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                channel.setName(chanName);
            } else {
                channel.setName("通道" + i);
            }
            channel.setDeviceId(camera.getId());
            channel.setChanNo(i);
            ardChannelService.insertArdChannel(channel);
        }
        //配置到流媒体
        for (int i = 1; i < m_stDeviceInfo.byChanNum + 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) {
                vtduService.deleteVtduByName(name);
            }
            //添加到流媒体
            CameraCmd cmd = new CameraCmd(camera.getId(), i);
            Map<String, Object> videoCompressionCfg = getVideoCompressionCfg(cmd);
            vtdu = new Vtdu();
            if (videoCompressionCfg.get("videoEncType") != null) {
                if (videoCompressionCfg.get("videoEncType").equals("标准h264")) {
                    vtdu.setIsCode("0");//默认不转码
                } else {
                    vtdu.setIsCode("1");//默认转码
                }
            } else {
                vtdu.setIsCode("0");//默认不转码
            }
            vtdu.setRtspSource(rtspSource);
            vtdu.setName(camera.getId() + "_" + i);
            vtdu.setMode("1");//默认CPU软解码
            vtdu.setCameraId(camera.getId());
            vtduService.insertVtdu(vtdu);
        }
        //创建引导队列
        if (!GuidePriorityQueue.cameraQueueMap.containsKey(camera.getId())) {
            Comparator<GuideTask> comparator = GuidePriorityQueue.getComparator();
            PriorityBlockingQueue<GuideTask> priorityQueue = new PriorityBlockingQueue<>(1000, comparator);
            GuidePriorityQueue.cameraQueueMap.put(camera.getId(), priorityQueue);
        }
    }
    /**
     * 注销
     * 刘苏义
     * 2023/10/17 8:28:13
     * @return
     */
    @Override
    public Boolean logout(String cameraId) {
    public boolean logout(String cameraId) {
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
        NetSDKLib.LLong loginId = (NetSDKLib.LLong) GlobalVariable.loginMap.get(cameraId);
        return LoginModule.logout(loginId);
    }
@@ -180,7 +272,7 @@
            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
                return false;
            }
            LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
            NetSDKLib.LLong loginId = (NetSDKLib.LLong) GlobalVariable.loginMap.get(cameraId);
            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) {
@@ -193,13 +285,13 @@
        return true;
    }
    /**
     * 云台控制
     * 刘苏义
     * 2023/10/17 8:28:13
     */
    @Override
    @SdkOperate
    public boolean pTZControl(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        boolean enable = cmd.isEnable();
@@ -209,7 +301,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
        NetSDKLib.LLong loginId = (NetSDKLib.LLong) GlobalVariable.loginMap.get(cameraId);
        int dwStop;
        if (enable) {
            dwStop = 0;//开启
@@ -220,55 +312,55 @@
        switch (code) {
            /*方向*/
            case 1:
                dwPTZCommand = NET_EXTPTZ_ControlType.NET_EXTPTZ_LEFTTOP;
                dwPTZCommand = NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_LEFTTOP;
                break;
            case 2:
                dwPTZCommand = NET_PTZ_ControlType.NET_PTZ_UP_CONTROL;
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_UP_CONTROL;
                break;
            case 3:
                dwPTZCommand = NET_EXTPTZ_ControlType.NET_EXTPTZ_RIGHTTOP;
                dwPTZCommand = NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_RIGHTTOP;
                break;
            case 4:
                dwPTZCommand = NET_PTZ_ControlType.NET_PTZ_LEFT_CONTROL;
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_LEFT_CONTROL;
                break;
            case 5:
                dwPTZCommand = NET_PTZ_ControlType.NET_PTZ_POINT_LOOP_CONTROL;
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_POINT_LOOP_CONTROL;
                break;
            case 6:
                dwPTZCommand = NET_PTZ_ControlType.NET_PTZ_RIGHT_CONTROL;
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_RIGHT_CONTROL;
                break;
            case 7:
                dwPTZCommand = NET_EXTPTZ_ControlType.NET_EXTPTZ_LEFTDOWN;
                dwPTZCommand = NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_LEFTDOWN;
                break;
            case 8:
                dwPTZCommand = NET_PTZ_ControlType.NET_PTZ_DOWN_CONTROL;
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_DOWN_CONTROL;
                break;
            case 9:
                dwPTZCommand = NET_EXTPTZ_ControlType.NET_EXTPTZ_RIGHTDOWN;
                dwPTZCommand = NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_RIGHTDOWN;
                break;
            /*焦距*/
            case 10:
                dwPTZCommand = NET_PTZ_ControlType.NET_PTZ_ZOOM_ADD_CONTROL;
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_ZOOM_ADD_CONTROL;
                break;
            case 11:
                dwPTZCommand = NET_PTZ_ControlType.NET_PTZ_ZOOM_DEC_CONTROL;
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_ZOOM_DEC_CONTROL;
                break;
            /*焦点*/
            case 12:
                dwPTZCommand = NET_PTZ_ControlType.NET_PTZ_FOCUS_ADD_CONTROL;
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_FOCUS_ADD_CONTROL;
                break;
            case 13:
                dwPTZCommand = NET_PTZ_ControlType.NET_PTZ_FOCUS_DEC_CONTROL;
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_FOCUS_DEC_CONTROL;
                break;
            /*光圈*/
            case 14:
                dwPTZCommand = NET_PTZ_ControlType.NET_PTZ_APERTURE_ADD_CONTROL;
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_APERTURE_ADD_CONTROL;
                break;
            case 15:
                dwPTZCommand = NET_PTZ_ControlType.NET_PTZ_APERTURE_DEC_CONTROL;
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_APERTURE_DEC_CONTROL;
                break;
            case 16:
                dwPTZCommand = NET_PTZ_ControlType.NET_PTZ_LAMP_CONTROL;
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_LAMP_CONTROL;
                break;
        }
        boolean bool = PtzControlModule.ptzControl(loginId, chanNo - 1, dwPTZCommand, speed, speed, 0, dwStop);
@@ -290,7 +382,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return null;
        }
        LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
        NetSDKLib.LLong loginId = (NetSDKLib.LLong) GlobalVariable.loginMap.get(cameraId);
        NetSDKLib.NET_PTZ_LOCATION_INFO dh_ptz_location_info = new NetSDKLib.NET_PTZ_LOCATION_INFO();
        boolean b = ConfigModule.queryDevState(loginId, NET_DEVSTATE_PTZ_LOCATION, dh_ptz_location_info);
        if (b) {
@@ -306,6 +398,11 @@
        return ptzMap;
    }
    @Override
    public Map<String, Object> getPtzScope(CameraCmd cmd) {
        return null;
    }
    /**
     * @描述 设置ptz信息
     * @参数 [userId, channelNum]
@@ -315,7 +412,6 @@
     * @修改人和其它信息 注意俯仰角度负值需要加上360得到的正值进行设置
     */
    @Override
    @SdkOperate
    public boolean setPtz(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        Integer chanNo = cmd.getChanNo();
@@ -532,6 +628,11 @@
        return result;
    }
    @Override
    public List<ArdChannel> getCameraChannelList(ArdCameras camera) {
        return null;
    }
    /**
     * 引导目标位置
     * 刘苏义
@@ -691,6 +792,26 @@
        }
        return mode;
    }
    @Override
    public boolean controlPTHeateRpwron(CameraCmd cmd) {
        return false;
    }
    @Override
    public boolean controlCameraDeicing(CameraCmd cmd) {
        return false;
    }
    @Override
    public int getPTZLockInfo(CameraCmd cmd) {
        return 0;
    }
    @Override
    public String captureJPEGPicture(CameraCmd cmd) {
        return null;
    }
    //透雾
@@ -938,4 +1059,5 @@
            }
        }
    }
}
ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/controller/HikSdkController.java
@@ -8,9 +8,9 @@
import com.ruoyi.device.camera.domain.ArdCameras;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.camera.service.IArdCamerasService;
import com.ruoyi.utils.sdk.hiksdk.service.IHikClientService;
import com.ruoyi.common.annotation.Anonymous;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.utils.sdk.hiksdk.service.impl.HikSdkStrategy;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.stereotype.Controller;
@@ -35,7 +35,7 @@
public class HikSdkController extends BaseController {
    @Resource
    private IHikClientService sdk;
    private HikSdkStrategy sdk;
    @Resource
    private IArdCamerasService ardCamerasService;
@@ -85,7 +85,7 @@
    public @ResponseBody
    AjaxResult PTZControlWithSpeed(@RequestBody CameraCmd cmd) {
        cmd.setOperator(SecurityUtils.getUserId());
        return toAjax(sdk.pTZControlWithSpeed(cmd));
        return toAjax(sdk.pTZControl(cmd));
    }
    @ApiOperation("调用预置点")
ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/lib/LoginResultCallBack.java
@@ -9,12 +9,11 @@
import com.ruoyi.device.channel.domain.ArdChannel;
import com.ruoyi.device.channel.service.IArdChannelService;
import com.ruoyi.utils.sdk.common.GlobalVariable;
import com.ruoyi.utils.sdk.hiksdk.service.IHikClientService;
import com.ruoyi.media.domain.Vtdu;
import com.ruoyi.media.service.IVtduService;
import com.ruoyi.utils.sdk.hiksdk.service.impl.HikSdkStrategy;
import com.sun.jna.Pointer;
import lombok.extern.slf4j.Slf4j;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.PriorityBlockingQueue;
@@ -39,7 +38,7 @@
    public int invoke(int lUserID, int dwResult, HCNetSDK.NET_DVR_DEVICEINFO_V30 lpDeviceinfo, Pointer pUser) {
        IVtduService vtduService = SpringUtils.getBean(IVtduService.class);
        IArdChannelService ardChannelService = SpringUtils.getBean(IArdChannelService.class);
        IHikClientService hikClientService = SpringUtils.getBean(IHikClientService.class);
        HikSdkStrategy hikClientService = SpringUtils.getBean(HikSdkStrategy.class);
        IArdCamerasService ardCamerasService = SpringUtils.getBean(IArdCamerasService.class);
        if (GlobalVariable.loginMap.containsKey(camera.getId())) {
            GlobalVariable.loginMap.remove(camera.getId());
ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikSdkStrategy.java
File was renamed from ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikClientServiceImpl.java
@@ -6,28 +6,27 @@
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.common.utils.file.MimeTypeUtils;
import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.camera.service.IArdCamerasService;
import com.ruoyi.device.camera.strategy.SdkStrategy;
import com.ruoyi.device.camera.domain.ArdCameras;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.channel.domain.ArdChannel;
import com.ruoyi.device.channel.service.IArdChannelService;
import com.ruoyi.utils.sdk.common.GlobalVariable;
import com.ruoyi.device.camera.domain.ArdCameras;
import com.ruoyi.utils.sdk.hiksdk.lib.ExceptionCallBack;
import com.ruoyi.media.domain.Vtdu;
import com.ruoyi.media.service.IVtduService;
import com.ruoyi.utils.gis.GisUtil;
import com.ruoyi.utils.sdk.hiksdk.lib.HCNetSDK;
import com.ruoyi.utils.sdk.hiksdk.service.IHikClientService;
import com.ruoyi.utils.sdk.hiksdk.lib.LoginResultCallBack;
import com.ruoyi.utils.minio.MinioUtil;
import com.ruoyi.utils.sdk.common.GlobalVariable;
import com.ruoyi.utils.sdk.hiksdk.lib.ExceptionCallBack;
import com.ruoyi.utils.sdk.hiksdk.lib.HCNetSDK;
import com.sun.jna.NativeLong;
import com.sun.jna.Platform;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.util.Base64;
import javax.annotation.Resource;
import java.io.*;
import java.math.BigDecimal;
@@ -37,28 +36,26 @@
import java.util.concurrent.PriorityBlockingQueue;
import static com.ruoyi.utils.sdk.hiksdk.lib.HCNetSDK.*;
import static com.ruoyi.utils.sdk.hiksdk.lib.HCNetSDK.NET_DVR_GET_GISINFO;
/**
 * @ClassName: hikClientServiceImpl
 * @Description: 海康操作客户端实现类
 * @Author: Administrator
 * @Date: 2023年01月17日 11:25
 * @Version: 1.2
 * @Description: 海康sdk策略
 * @ClassName: DhSdkStrategy
 * @Author: 刘苏义
 * @Date: 2023年11月07日10:51:09
 **/
@Slf4j(topic = "hikSdk")
@Service
public class HikClientServiceImpl implements IHikClientService {
@Slf4j(topic = "hikSdk")
public class HikSdkStrategy implements SdkStrategy {
    @Resource
    private IArdCamerasService ardCamerasService;
    @Resource
    private IArdChannelService ardChannelService;
    @Resource
    private IVtduService vtduService;
    private final Object lock = new Object();
    public static HCNetSDK hCNetSDK = HCNetSDK.hCNetSDK;
    private static FExceptionCallBack fExceptionCallBack;//异常回调
    public static HCNetSDK hCNetSDK = HCNetSDK.hCNetSDK;
    private static HCNetSDK.FExceptionCallBack fExceptionCallBack;//异常回调
    /**
     * @描述 注册登录 只支持同步登陆,且官方不建议直接在此接口下写耗时操作
@@ -69,7 +66,7 @@
     * @修改人和其它信息
     */
    @Override
    public void login(ArdCameras camera) {
    public boolean login(ArdCameras camera) {
        try {
            // 初始化
            if (!hCNetSDK.NET_DVR_Init()) {
@@ -113,6 +110,139 @@
                camera.setChanNum(0);
                camera.setLoginId(-1);
                camera.setState("0");
                //删除管理通道
                ardChannelService.deleteArdChannelByDeviceId(camera.getId());
                ardCamerasService.updateArdCameras(camera);
                return false;
            }
            log.debug("Login Success [ " + camera.getIp() + ":" + camera.getPort() + " ]");
            if (fExceptionCallBack == null) {
                fExceptionCallBack = new ExceptionCallBack();//异常回调
                //设置异常回调函数(可在回调函数中获取设备上下线状态等)
                if (!hCNetSDK.NET_DVR_SetExceptionCallBack_V30(0, 0, fExceptionCallBack, null)) {
                    log.debug("Set fExceptionCallBack function fail");
                    return false;
                } else {
                    log.debug("Set fExceptionCallBack function successfully!");
                }
            }
            if (GlobalVariable.loginMap.containsKey(camera.getId())) {
                GlobalVariable.loginMap.remove(camera.getId());
            }
            //删除管理通道
            ardChannelService.deleteArdChannelByDeviceId(camera.getId());
            GlobalVariable.loginMap.put(camera.getId(), lUserID);
            GlobalVariable.loginCameraMap.put(lUserID, camera);
            camera.setLoginId(lUserID);
            camera.setState("1");
            camera.setChanNum((int) m_strDeviceInfo.struDeviceV30.byChanNum);
            camera.setStartDChan((int) m_strDeviceInfo.struDeviceV30.byStartDChan);
            ardCamerasService.updateArdCameras(camera);
            //获取最新通道
            List<ArdChannel> cameraChannelList = getCameraChannelList(camera);
            if (cameraChannelList.size() > 0) {
                for (ArdChannel channel : cameraChannelList) {
                    channel.setId(IdUtils.simpleUUID());
                    ardChannelService.insertArdChannel(channel);
                }
                //添加到流媒体
                for (ArdChannel channel : cameraChannelList) {
                    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) {
                        vtduService.deleteVtduByName(name);
                    }
                    //添加到流媒体
                    vtdu = new Vtdu();
                    vtdu.setRtspSource(rtspSource);
                    vtdu.setName(camera.getId() + "_" + channel.getChanNo());
                    CameraCmd cmd = new CameraCmd(camera.getId(), channel.getChanNo());
                    Map<String, Object> videoCompressionCfg = getVideoCompressionCfg(cmd);
                    if (videoCompressionCfg.get("videoEncType").equals("标准h264")) {
                        vtdu.setIsCode("0");//默认不转码
                    } else {
                        vtdu.setIsCode("1");//默认转码
                    }
                    vtdu.setMode("1");//默认CPU软解码
                    vtdu.setCameraId(camera.getId());
                    vtduService.insertVtdu(vtdu);
                }
            }
            //创建引导队列
            if (!GuidePriorityQueue.cameraQueueMap.containsKey(camera.getId())) {
                Comparator<GuideTask> comparator = GuidePriorityQueue.getComparator();
                PriorityBlockingQueue<GuideTask> priorityQueue = new PriorityBlockingQueue<>(1000, comparator);
                GuidePriorityQueue.cameraQueueMap.put(camera.getId(), priorityQueue);
            }
        } catch (Exception ex) {
            log.error("注册设备异常", ex);
        }
        return true;
    }
    /**
     * @描述 注册登录 集成于NET_DVR_Login_V30,支持同步和异步登录
     * @参数 [dvrLogin]
     * @返回值 java.lang.Integer
     * @创建人 刘苏义
     * @创建时间 2023/1/17 16:12
     * @修改人和其它信息
     */
    @Override
    @Async("loginExecutor")
    public void asyncLogin(ArdCameras camera) {
        try {
            // 初始化
            if (!hCNetSDK.NET_DVR_Init()) {
                log.error("SDK初始化失败");
            }
            //打印海康sdk日志
            if (Platform.isWindows()) {
                String WIN_PATH = System.getProperty("user.dir") + File.separator + "ardLog" + File.separator + "logs" + File.separator;
                hCNetSDK.NET_DVR_SetLogToFile(3, WIN_PATH, true);
            } else {
                hCNetSDK.NET_DVR_SetLogToFile(3, "/home/ardLog/hiklog", true);
            }
            String m_sDeviceIP = camera.getIp();
            String m_sUsername = camera.getUsername();
            String m_sPassword = camera.getPassword();
            short m_sPort = camera.getPort().shortValue();
            //设置连接时间与重连时间
            hCNetSDK.NET_DVR_SetConnectTime(2000, 1);
            hCNetSDK.NET_DVR_SetReconnect(5000, true);
            //设备信息, 输出参数
            HCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();
            HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();
            // 注册设备-登录参数,包括设备地址、登录用户、密码等
            m_strLoginInfo.sDeviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN];
            System.arraycopy(m_sDeviceIP.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, m_sDeviceIP.length());
            m_strLoginInfo.sUserName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN];
            System.arraycopy(m_sUsername.getBytes(), 0, m_strLoginInfo.sUserName, 0, m_sUsername.length());
            m_strLoginInfo.sPassword = new byte[HCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN];
            System.arraycopy(m_sPassword.getBytes(), 0, m_strLoginInfo.sPassword, 0, m_sPassword.length());
            m_strLoginInfo.wPort = m_sPort;
            m_strLoginInfo.byVerifyMode = 0;
            m_strLoginInfo.byLoginMode = 0;
            //是否异步登录:0- 否,1- 是  windowsSDK里是true和false
            m_strLoginInfo.bUseAsynLogin = false;
            m_strLoginInfo.write();
            //同步登录
            int lUserID = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo);
            if (lUserID < 0) {
                log.debug("Login Failed [ " + camera.getIp() + ":" + camera.getPort() + " ],错误码:" + hCNetSDK.NET_DVR_GetLastError());
                camera.setChanNum(0);
                camera.setLoginId(-1);
                camera.setState("0");
                //删除管理通道
                ardChannelService.deleteArdChannelByDeviceId(camera.getId());
                ardCamerasService.updateArdCameras(camera);
                return;
            }
@@ -186,62 +316,6 @@
    }
    /**
     * @描述 注册登录 集成于NET_DVR_Login_V30,支持同步和异步登录
     * @参数 [dvrLogin]
     * @返回值 java.lang.Integer
     * @创建人 刘苏义
     * @创建时间 2023/1/17 16:12
     * @修改人和其它信息
     */
    @Override
    public void asyncLogin(ArdCameras camera) {
        // 初始化
        if (!hCNetSDK.NET_DVR_Init()) {
            log.error("SDK初始化失败");
        }
        //打印海康sdk日志
        if (Platform.isWindows()) {
            String WIN_PATH = System.getProperty("user.dir") + File.separator + "ardLog" + File.separator + "logs" + File.separator;
            hCNetSDK.NET_DVR_SetLogToFile(3, WIN_PATH, true);
        } else {
            hCNetSDK.NET_DVR_SetLogToFile(3, "/home/ardLog/hiklog", true);
        }
        String m_sDeviceIP = camera.getIp();
        String m_sUsername = camera.getUsername();
        String m_sPassword = camera.getPassword();
        short m_sPort = camera.getPort().shortValue();
        //设置连接时间与重连时间
        hCNetSDK.NET_DVR_SetConnectTime(2000, 1);
        hCNetSDK.NET_DVR_SetReconnect(100000, true);
        //设备信息, 输出参数
        HCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();
        HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();
        // 注册设备-登录参数,包括设备地址、登录用户、密码等
        m_strLoginInfo.sDeviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN];
        System.arraycopy(m_sDeviceIP.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, m_sDeviceIP.length());
        m_strLoginInfo.sUserName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN];
        System.arraycopy(m_sUsername.getBytes(), 0, m_strLoginInfo.sUserName, 0, m_sUsername.length());
        m_strLoginInfo.sPassword = new byte[HCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN];
        System.arraycopy(m_sPassword.getBytes(), 0, m_strLoginInfo.sPassword, 0, m_sPassword.length());
        m_strLoginInfo.wPort = m_sPort;
        m_strLoginInfo.byVerifyMode = 0;
        m_strLoginInfo.byLoginMode = 0;
        //是否异步登录:0- 否,1- 是  windowsSDK里是true和false
        m_strLoginInfo.bUseAsynLogin = true;
        //异步登录回调
        m_strLoginInfo.cbLoginResult = new LoginResultCallBack(camera);
        m_strLoginInfo.write();
        int i = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo);
        if (i < 0) {
            int errorCode = hCNetSDK.NET_DVR_GetLastError();
            log.error("登录异常:" + errorCode);
        }
    }
    /**
     * @描述 注销登录
     * @参数 [dvrLogin]
     * @返回值 java.lang.Integer
@@ -293,8 +367,7 @@
     * @修改人和其它信息
     */
    @Override
    @SdkOperate
    public boolean pTZControlWithSpeed(CameraCmd cmd) {
    public boolean pTZControl(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        boolean enable = cmd.isEnable();
        Integer channelNum = cmd.getChanNo();
@@ -934,7 +1007,6 @@
     * @创建时间 2023/1/17 16:36
     * @修改人和其它信息 0-解锁 1-锁定
     */
    @Override
    public int getPTZLockInfo(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        Integer channelNum = cmd.getChanNo();
@@ -966,7 +1038,6 @@
     * @修改人和其它信息 注意俯仰角度负值需要加上360得到的正值进行设置
     */
    @Override
    @SdkOperate
    public boolean setZeroPtz(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        Integer channelNum = cmd.getChanNo();
ruoyi-common/src/main/java/com/ruoyi/common/filter/MyI18nInterceptor.java
@@ -17,7 +17,7 @@
        final String key = "language";
        String language = "en_US";//request.getHeader(key);
        // 前端传递的language必须是zh-CN格式的,中间的-必须要完整,不能只传递zh或en
        log.info("当前语言={}",language);
        log.debug("当前语言={}",language);
        Locale locale = new Locale(language.split("_")[0],language.split("_")[1]);
        // 这样赋值以后,MessageUtils.message方法就不用修改了
        LocaleContextHolder.setLocale(locale);
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SyncTask.java
@@ -1,25 +1,20 @@
package com.ruoyi.quartz.task;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.device.camera.domain.ArdCameras;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.camera.service.IArdCamerasService;
import com.ruoyi.device.channel.domain.ArdChannel;
import com.ruoyi.utils.sdk.dhsdk.service.IDhClientService;
import com.ruoyi.utils.sdk.hiksdk.service.IHikClientService;
import com.ruoyi.media.domain.Items;
import com.ruoyi.media.domain.JsonsRoot;
import com.ruoyi.media.domain.Vtdu;
import com.ruoyi.media.service.IMediaService;
import com.ruoyi.media.service.IVtduService;
import com.ruoyi.rongcloud.service.RongCloudService;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.utils.sdk.dhsdk.service.impl.DhSdkStrategy;
import com.ruoyi.utils.sdk.hiksdk.service.impl.HikSdkStrategy;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
/**
@@ -38,9 +33,9 @@
    @Resource
    IArdCamerasService iArdCamerasService;
    @Resource
    IHikClientService hikClientService;
    HikSdkStrategy hikClientService;
    @Resource
    IDhClientService dhClientService;
    DhSdkStrategy dhClientService;
    @Resource
    IVtduService vtduService;
    @Resource