‘liusuyi’
2024-03-07 38eaaa87743252da53851047bd15b089ccf9697b
ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java
@@ -3,6 +3,8 @@
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.annotation.SdkOperate;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.common.utils.file.MimeTypeUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
@@ -18,6 +20,7 @@
import com.ruoyi.utils.gis.GisUtil;
import com.ruoyi.utils.minio.MinioUtil;
import com.ruoyi.utils.sdk.common.GlobalVariable;
import com.ruoyi.utils.sdk.common.SdkErrorCodeEnum;
import com.ruoyi.utils.sdk.hiksdk.lib.ExceptionCallBack;
import com.ruoyi.utils.sdk.hiksdk.lib.HCNetSDK;
import com.sun.jna.NativeLong;
@@ -57,7 +60,7 @@
    @Resource
    private QueueHandler queueHandler;
    public Object _lock=new Object();
    public Object _lock = new Object();
    public static HCNetSDK hCNetSDK = HCNetSDK.hCNetSDK;
    private static HCNetSDK.FExceptionCallBack fExceptionCallBack;//异常回调
@@ -219,7 +222,10 @@
            //同步登录
            int lUserID = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo);
            if (lUserID < 0) {
                log.debug("Login Failed 【 " + camera.getIp() + ":" + camera.getPort() + " 】,Error Code:" + hCNetSDK.NET_DVR_GetLastError());
                int errorCode = hCNetSDK.NET_DVR_GetLastError();
                log.debug("Login Failed 【 " + camera.getIp() + ":" + camera.getPort() + " 】," +
                        "Error Code:" + errorCode + " " +
                        "Error Info:" + SdkErrorCodeEnum.getDescByCode(errorCode));
                camera.setChanNum(0);
                camera.setLoginId(-1);
                camera.setState("0");
@@ -278,7 +284,7 @@
    //创建引导队列
    private void createGuideQueue(ArdCameras camera) {
        if(camera.getCamAlarmGuideEnable()!=null) {
        if (camera.getCamAlarmGuideEnable() != null) {
            if (camera.getCamAlarmGuideEnable() == 1) {
                if (!GuidePriorityQueue.cameraQueueMap.containsKey(camera.getId())) {
                    Comparator<GuideTask> comparator = GuidePriorityQueue.getComparator();
@@ -290,6 +296,7 @@
            }
        }
    }
    //添加到流媒体
    private void addVtdu(ArdCameras camera) {
        try {
@@ -373,14 +380,15 @@
     * @修改人和其它信息
     */
    @Override
    public boolean pTZControl(CameraCmd cmd) {
    @SdkOperate
    public AjaxResult pTZControl(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        boolean enable = cmd.isEnable();
        Integer channelNum = cmd.getChanNo();
        Integer speed = cmd.getSpeed();
        Integer code = cmd.getCode();
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
            return AjaxResult.error("相机未登录");
        }
        Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
        int dwStop;
@@ -449,8 +457,9 @@
        if (!bool) {
            int errorCode = hCNetSDK.NET_DVR_GetLastError();
            log.error("控制失败,请稍后重试" + errorCode);
            return AjaxResult.error("errorCode:" + errorCode + "errorInfo:" + SdkErrorCodeEnum.getDescByCode(errorCode));
        }
        return bool;
        return AjaxResult.success();
    }
    /**
@@ -888,8 +897,7 @@
     * @创建时间 2023/1/17 16:36
     * @修改人和其它信息
     */
    @Override
    public Map<String, Object> getPtz(CameraCmd cmd) {
    public Map<String, Object> getPtz1(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        Integer channelNum = cmd.getChanNo();
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
@@ -930,6 +938,57 @@
    }
    /**
     * @描述 获取高精度ptz信息
     * @参数 [userId, chanNo]
     * @返回值 boolean
     * @创建人 刘苏义
     * @创建时间 2023/1/17 16:36
     * @修改人和其它信息
     */
    @Override
    public Map<String, Object> getPtz(CameraCmd cmd) {
        Map<String, Object> ptzMap = new HashMap<>();
        try {
            String cameraId = cmd.getCameraId();
            Integer chanNo = cmd.getChanNo();
            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
                return new HashMap<>();
            }
            IntByReference pchannel = new IntByReference(chanNo);
            Pointer pChannelNum = pchannel.getPointer();
            Integer lUserID = (Integer) GlobalVariable.loginMap.get(cameraId);
            HCNetSDK.NET_DVR_STD_CONFIG lpConfigParam6696 = new HCNetSDK.NET_DVR_STD_CONFIG();
            HCNetSDK.NET_DVR_PTZABSOLUTEEX_CFG lpPTZAbsoluteEX_cfg = new HCNetSDK.NET_DVR_PTZABSOLUTEEX_CFG();
            lpConfigParam6696.lpCondBuffer = pChannelNum;
            lpConfigParam6696.dwCondSize = 4;
            lpConfigParam6696.lpInBuffer = null;
            lpConfigParam6696.dwInSize = 0;
            lpConfigParam6696.lpOutBuffer = lpPTZAbsoluteEX_cfg.getPointer();
            lpConfigParam6696.dwOutSize = lpPTZAbsoluteEX_cfg.size();
            lpConfigParam6696.write();
            boolean res = hCNetSDK.NET_DVR_GetSTDConfig(lUserID, HCNetSDK.NET_DVR_GET_PTZABSOLUTEEX, lpConfigParam6696);
            if (!res) {
                log.error("获取高精度PTZ绝对位置配置失败,错误号:" + hCNetSDK.NET_DVR_GetLastError());
            } else {
                lpPTZAbsoluteEX_cfg.read();
                //log.debug("P:" + lpPTZAbsoluteEX_cfg.struPTZCtrl.fPan + " T:" + lpPTZAbsoluteEX_cfg.struPTZCtrl.fTilt + " Z:" + lpPTZAbsoluteEX_cfg.struPTZCtrl.fZoom
                //        + " 聚焦参数:" + lpPTZAbsoluteEX_cfg.struPTZCtrl.dwFocus + " 聚焦范围:" + lpPTZAbsoluteEX_cfg.dwFocalLen + " 水平转动速度:" + lpPTZAbsoluteEX_cfg.fHorizontalSpeed
                //        + " 垂直转动速度:" + lpPTZAbsoluteEX_cfg.fVerticalSpeed + " 镜头变倍配置类型:" + lpPTZAbsoluteEX_cfg.byZoomType);
                float p = lpPTZAbsoluteEX_cfg.struPTZCtrl.fPan;
                float fTilt = lpPTZAbsoluteEX_cfg.struPTZCtrl.fTilt;
                float t = fTilt < 0 ? fTilt + 360 : fTilt;
                float z = lpPTZAbsoluteEX_cfg.struPTZCtrl.fZoom;
                ptzMap.put("p", p);
                ptzMap.put("t", t);
                ptzMap.put("z", z);
            }
        } catch (Exception ex) {
            log.error("获取高精度PTZ绝对位置异常:" + ex.getMessage());
        }
        return ptzMap;
    }
    /**
     * @描述 设置ptz信息
     * @参数 [userId, channelNum]
     * @返回值 boolean
@@ -937,13 +996,14 @@
     * @创建时间 2023/1/17 16:36
     * @修改人和其它信息 注意俯仰角度负值需要加上360得到的正值进行设置
     */
    public boolean setPtz1(CameraCmd cmd) {
    @Override
    @SdkOperate
    public AjaxResult setPtz1(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        Integer channelNum = cmd.getChanNo();
        Map<String, Double> ptz = cmd.getPtzMap();
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
            return AjaxResult.error("设备未登录");
        }
        Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
        NET_DVR_PTZPOS m_ptzPosCurrent = new NET_DVR_PTZPOS();
@@ -959,13 +1019,14 @@
            m_ptzPosCurrent.write();
            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);
                int errorCode = hCNetSDK.NET_DVR_GetLastError();
                log.error("设置PTZ参数失败,请稍后重试:" + errorCode);
                return AjaxResult.error("errorCode:" + errorCode + "errorInfo:" + SdkErrorCodeEnum.getDescByCode(errorCode));
            }
            return bool;
            return AjaxResult.success();
        } catch (Exception ex) {
            log.error(ex.getMessage());
            return false;
            return AjaxResult.error("设置PTZ参数异常:" + ex.getMessage());
        }
    }
@@ -978,13 +1039,14 @@
     * @修改人和其它信息 注意俯仰角度负值向下负值
     */
    @Override
    public boolean setPtz(CameraCmd cmd) {
    @SdkOperate
    public AjaxResult 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;
                return AjaxResult.error("设备未登录");
            }
            Integer lUserID = (Integer) GlobalVariable.loginMap.get(cameraId);
            IntByReference pchannel = new IntByReference(chanNo);
@@ -1016,22 +1078,23 @@
            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);
                int errorCode = hCNetSDK.NET_DVR_GetLastError();
                log.error("设置高精度PTZ参数失败,请稍后重试:" + errorCode);
                return AjaxResult.error("errorCode:" + errorCode + "errorInfo:" + SdkErrorCodeEnum.getDescByCode(errorCode));
            }
            return bool;
            return AjaxResult.success();
        }catch (Exception ex)
        {
            log.error("设置高精度PTZ参数异常",ex);
            return false;
        } catch (Exception ex) {
            log.error("设置高精度PTZ参数异常", ex);
            return AjaxResult.error("设置高精度PTZ参数异常:" + ex);
        }
    }
    @Override
    @SdkOperate
    public boolean guideTargetPosition(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        Integer channelNum = cmd.getChanNo();
        Integer chanNo = cmd.getChanNo();
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
@@ -1051,7 +1114,7 @@
            m_ptzPosCurrent.wZoomPos = (short) (Integer.parseInt(z, 16));
            Pointer point = m_ptzPosCurrent.getPointer();
            m_ptzPosCurrent.write();
            boolean bool = hCNetSDK.NET_DVR_SetDVRConfig(userId, NET_DVR_SET_PTZPOS, channelNum, point, m_ptzPosCurrent.size());
            boolean bool = hCNetSDK.NET_DVR_SetDVRConfig(userId, NET_DVR_SET_PTZPOS, chanNo, point, m_ptzPosCurrent.size());
            if (!bool) {
                int code = hCNetSDK.NET_DVR_GetLastError();
                log.error("设置ptz失败,请稍后重试" + code);
@@ -1103,6 +1166,7 @@
     * @修改人和其它信息 注意俯仰角度负值需要加上360得到的正值进行设置
     */
    @Override
    @SdkOperate
    public boolean setZeroPtz(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        Integer channelNum = cmd.getChanNo();