‘liusuyi’
2023-12-14 2d7896ecd6bcafb4c0457a83ee254ff2006481ce
ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java
@@ -2,8 +2,10 @@
import com.ruoyi.alarm.global.domain.GuidePriorityQueue;
import com.ruoyi.alarm.global.domain.GuideTask;
import com.ruoyi.alarm.global.service.impl.QueueHandler;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.common.utils.file.MimeTypeUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.device.camera.service.IArdCamerasService;
import com.ruoyi.device.camera.factory.CameraSDK;
@@ -52,7 +54,10 @@
    private IArdChannelService ardChannelService;
    @Resource
    private IVtduService vtduService;
    @Resource
    private QueueHandler queueHandler;
    public Object _lock=new Object();
    public static HCNetSDK hCNetSDK = HCNetSDK.hCNetSDK;
    private static HCNetSDK.FExceptionCallBack fExceptionCallBack;//异常回调
@@ -176,7 +181,6 @@
    @Async("loginExecutor")
    public void asyncLogin(ArdCameras camera) {
        try {
            Thread.sleep(100);
            // 初始化
            if (!hCNetSDK.NET_DVR_Init()) {
                log.error("SDK初始化失败");
@@ -226,17 +230,18 @@
            }
            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;
                } else {
                    log.debug("Set fExceptionCallBack function successfully!");
            synchronized (_lock) {
                if (fExceptionCallBack == null) {
                    fExceptionCallBack = new ExceptionCallBack();//异常回调
                    //设置异常回调函数(可在回调函数中获取设备上下线状态等)
                    if (!hCNetSDK.NET_DVR_SetExceptionCallBack_V30(0, 0, fExceptionCallBack, null)) {
                        log.debug("Set fExceptionCallBack function fail");
                        return;
                    } else {
                        log.debug("Set fExceptionCallBack function successfully!");
                    }
                }
            }
            if (GlobalVariable.loginMap.containsKey(camera.getId())) {
                GlobalVariable.loginMap.remove(camera.getId());
            }
@@ -265,16 +270,26 @@
            //添加到流媒体
            addVtdu(camera);
            //创建引导队列
            if (!GuidePriorityQueue.cameraQueueMap.containsKey(camera.getId())) {
                Comparator<GuideTask> comparator = GuidePriorityQueue.getComparator();
                PriorityBlockingQueue<GuideTask> priorityQueue = new PriorityBlockingQueue<>(1000, comparator);
                GuidePriorityQueue.cameraQueueMap.put(camera.getId(), priorityQueue);
            }
            createGuideQueue(camera);
        } catch (Exception ex) {
            log.error("注册设备异常", ex);
        }
    }
    //创建引导队列
    private void createGuideQueue(ArdCameras camera) {
        if(camera.getCamAlarmGuideEnable()!=null) {
            if (camera.getCamAlarmGuideEnable() == 1) {
                if (!GuidePriorityQueue.cameraQueueMap.containsKey(camera.getId())) {
                    Comparator<GuideTask> comparator = GuidePriorityQueue.getComparator();
                    PriorityBlockingQueue<GuideTask> priorityQueue = new PriorityBlockingQueue<>(1000, comparator);
                    GuidePriorityQueue.cameraQueueMap.put(camera.getId(), priorityQueue);
                    //启动队列处理器
                    queueHandler.process(camera.getId());
                }
            }
        }
    }
    //添加到流媒体
    private void addVtdu(ArdCameras camera) {
        try {
@@ -922,8 +937,8 @@
     * @创建时间 2023/1/17 16:36
     * @修改人和其它信息 注意俯仰角度负值需要加上360得到的正值进行设置
     */
    @Override
    public boolean setPtz(CameraCmd cmd) {
    public boolean setPtz1(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        Integer channelNum = cmd.getChanNo();
        Map<String, Double> ptz = cmd.getPtzMap();
@@ -945,7 +960,7 @@
            boolean bool = hCNetSDK.NET_DVR_SetDVRConfig(userId, NET_DVR_SET_PTZPOS, channelNum, point, m_ptzPosCurrent.size());
            if (!bool) {
                int code = hCNetSDK.NET_DVR_GetLastError();
                log.error("设置ptz失败,请稍后重试" + code);
                log.error("设置PTZ参数失败,请稍后重试:" + code);
            }
            return bool;
        } catch (Exception ex) {
@@ -954,6 +969,65 @@
        }
    }
    /**
     * @描述 设置高精度ptz信息
     * @参数 [userId, channelNum]
     * @返回值 boolean
     * @创建人 刘苏义
     * @创建时间 2023/1/17 16:36
     * @修改人和其它信息 注意俯仰角度负值向下负值
     */
    @Override
    public boolean setPtz(CameraCmd cmd) {
        try {
            String cameraId = cmd.getCameraId();
            Integer chanNo = cmd.getChanNo();
            Map<String, Double> ptz = cmd.getPtzMap();
            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
                return false;
            }
            Integer lUserID = (Integer) GlobalVariable.loginMap.get(cameraId);
            IntByReference pchannel = new IntByReference(chanNo);
            Pointer pChannelNum = pchannel.getPointer();
            HCNetSDK.NET_DVR_STD_CONFIG lpConfigParam6697 = new HCNetSDK.NET_DVR_STD_CONFIG();
            HCNetSDK.NET_DVR_PTZABSOLUTEEX_CFG lpPTZAbsoluteEX_cfgInfo = new HCNetSDK.NET_DVR_PTZABSOLUTEEX_CFG();
            lpConfigParam6697.lpCondBuffer = pChannelNum;
            lpConfigParam6697.dwCondSize = 4;
            HCNetSDK.BYTE_ARRAY m_szStatusBuf = new HCNetSDK.BYTE_ARRAY(4096 * 4);
            lpConfigParam6697.lpStatusBuffer = m_szStatusBuf.getPointer();
            lpConfigParam6697.dwStatusSize = 4096 * 4;
            lpPTZAbsoluteEX_cfgInfo.dwSize = lpPTZAbsoluteEX_cfgInfo.size();
            lpPTZAbsoluteEX_cfgInfo.struPTZCtrl.fPan = new Double(ptz.get("p")).floatValue();
            float t = new Double(ptz.get("t")).floatValue();
            float t1 = t > 300 ? (t - 360) : t;
            BigDecimal bigDecimal = new BigDecimal(t1);
            float t2 = bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP).floatValue();
            lpPTZAbsoluteEX_cfgInfo.struPTZCtrl.fTilt = t2;
            lpPTZAbsoluteEX_cfgInfo.struPTZCtrl.fZoom = new Double(ptz.get("z")).floatValue();
            lpPTZAbsoluteEX_cfgInfo.struPTZCtrl.dwFocus = 399;
            lpPTZAbsoluteEX_cfgInfo.dwFocalLen = 1250;
            lpPTZAbsoluteEX_cfgInfo.fHorizontalSpeed = (float) 10;
            lpPTZAbsoluteEX_cfgInfo.fVerticalSpeed = (float) 10;
            lpPTZAbsoluteEX_cfgInfo.byZoomType = 0;
            lpPTZAbsoluteEX_cfgInfo.write();
            lpConfigParam6697.lpInBuffer = lpPTZAbsoluteEX_cfgInfo.getPointer();
            lpConfigParam6697.dwInSize = lpPTZAbsoluteEX_cfgInfo.dwSize;
            lpConfigParam6697.write();
            boolean bool = hCNetSDK.NET_DVR_SetSTDConfig(lUserID, NET_DVR_SET_PTZABSOLUTEEX, lpConfigParam6697);
            if (!bool) {
                int code = hCNetSDK.NET_DVR_GetLastError();
                log.error("设置高精度PTZ参数失败,请稍后重试:" + code);
            }
            return bool;
        }catch (Exception ex)
        {
            log.error("设置高精度PTZ参数异常",ex);
            return false;
        }
    }
    @Override
    public boolean guideTargetPosition(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();