‘liusuyi’
2023-05-31 3280739f26b778b59e2588d8f08012c31f79174b
ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java
@@ -40,7 +40,7 @@
 * @Description: 海康操作客户端实现类
 * @Author: Administrator
 * @Date: 2023年01月17日 11:25
 * @Version: 1.0
 * @Version: 1.1
 **/
@Slf4j(topic = "hikSdk")
@Service
@@ -129,14 +129,13 @@
        hCNetSDK.NET_DVR_SetReconnect(100000, true);
        //设备信息, 输出参数
        HCNetSDK.NET_DVR_DEVICEINFO_V30 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();
        int lUserID = hCNetSDK.NET_DVR_Login_V30(m_sDeviceIP,m_sPort,m_sUsername,m_sPassword, m_strDeviceInfo);
        int lUserID = hCNetSDK.NET_DVR_Login_V30(m_sDeviceIP, m_sPort, m_sUsername, m_sPassword, m_strDeviceInfo);
        if (lUserID < 0) {
            //释放SDK资源
            hCNetSDK.NET_DVR_Cleanup();
            camera.setLoginId(-1);
        }
        if(globalVariable.loginMap.containsKey(camera.getId()))
        {
        if (globalVariable.loginMap.containsKey(camera.getId())) {
            globalVariable.loginMap.remove(camera.getId());
        }
        globalVariable.loginMap.put(camera.getId(), lUserID);
@@ -223,6 +222,7 @@
        boolean isOnLine = hCNetSDK.NET_DVR_RemoteControl(userId, HCNetSDK.NET_DVR_CHECK_USER_STATUS, null, 0);
        return isOnLine;
    }
    /**
     * @描述 带速度的云台控制操作
     * Code:1-左上 2-上 3-右上 4-左 5-巡航 6-右 7-左下 8-下 9-右下 10-焦距变大 11-焦距变小
@@ -240,7 +240,7 @@
        boolean enable = cmd.isEnable();
        Integer channelNum = cmd.getChannelNum();
        Integer speed = cmd.getSpeed();
        Integer code=cmd.getCode();
        Integer code = cmd.getCode();
        if (!globalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
@@ -251,30 +251,61 @@
        } else {
            dwStop = 1;//关闭
        }
        Integer dwPTZCommand=-1;
        switch (code)
        {
        Integer dwPTZCommand = -1;
        switch (code) {
            /*方向*/
            case 1:dwPTZCommand=HCNetSDK.UP_LEFT;break;
            case 2:dwPTZCommand=HCNetSDK.TILT_UP;break;
            case 3:dwPTZCommand=HCNetSDK.UP_RIGHT;break;
            case 4:dwPTZCommand=HCNetSDK.PAN_LEFT;break;
            case 5:dwPTZCommand=HCNetSDK.RUN_SEQ;break;
            case 6:dwPTZCommand=HCNetSDK.PAN_RIGHT;break;
            case 7:dwPTZCommand=HCNetSDK.DOWN_LEFT;break;
            case 8:dwPTZCommand=HCNetSDK.TILT_DOWN;break;
            case 9:dwPTZCommand=HCNetSDK.DOWN_RIGHT;break;
            case 1:
                dwPTZCommand = HCNetSDK.UP_LEFT;
                break;
            case 2:
                dwPTZCommand = HCNetSDK.TILT_UP;
                break;
            case 3:
                dwPTZCommand = HCNetSDK.UP_RIGHT;
                break;
            case 4:
                dwPTZCommand = HCNetSDK.PAN_LEFT;
                break;
            case 5:
                dwPTZCommand = HCNetSDK.RUN_SEQ;
                break;
            case 6:
                dwPTZCommand = HCNetSDK.PAN_RIGHT;
                break;
            case 7:
                dwPTZCommand = HCNetSDK.DOWN_LEFT;
                break;
            case 8:
                dwPTZCommand = HCNetSDK.TILT_DOWN;
                break;
            case 9:
                dwPTZCommand = HCNetSDK.DOWN_RIGHT;
                break;
            /*焦距*/
            case 10:dwPTZCommand=HCNetSDK.ZOOM_IN;break;
            case 11:dwPTZCommand=HCNetSDK.ZOOM_OUT;break;
            case 10:
                dwPTZCommand = HCNetSDK.ZOOM_IN;
                break;
            case 11:
                dwPTZCommand = HCNetSDK.ZOOM_OUT;
                break;
            /*焦点*/
            case 12:dwPTZCommand=HCNetSDK.FOCUS_NEAR;break;
            case 13:dwPTZCommand=HCNetSDK.FOCUS_FAR;break;
            case 12:
                dwPTZCommand = HCNetSDK.FOCUS_NEAR;
                break;
            case 13:
                dwPTZCommand = HCNetSDK.FOCUS_FAR;
                break;
            /*光圈*/
            case 14:dwPTZCommand=HCNetSDK.IRIS_OPEN;break;
            case 15:dwPTZCommand=HCNetSDK.IRIS_CLOSE;break;
            case 14:
                dwPTZCommand = HCNetSDK.IRIS_OPEN;
                break;
            case 15:
                dwPTZCommand = HCNetSDK.IRIS_CLOSE;
                break;
            /*雨刷*/
            case 16:dwPTZCommand=HCNetSDK.WIPER_PWRON;break;
            case 16:
                dwPTZCommand = HCNetSDK.WIPER_PWRON;
                break;
        }
        boolean bool = hCNetSDK.NET_DVR_PTZControlWithSpeed_Other(userId, channelNum, dwPTZCommand, dwStop, speed);
        if (!bool) {
@@ -560,7 +591,7 @@
    public boolean setPtz(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        Integer channelNum = cmd.getChannelNum();
        Map<String,Double> ptz = cmd.getPtzMap();
        Map<String, Double> ptz = cmd.getPtzMap();
        if (!globalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
@@ -589,6 +620,7 @@
    }
    @Override
    @SdkOperate
    public boolean setTargetPosition(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        Integer channelNum = cmd.getChannelNum();
@@ -602,9 +634,9 @@
            double[] cameraPositon = cmd.getCamPosition();
            double[] targetPositions = cmd.getTargetPosition();
            double[] cameraPTZ = GisUtil.getCameraPTZ(cameraPositon, targetPositions, 20, 150);
            String p = String.valueOf((int) ( cameraPTZ[0] * 10));
            String t = String.valueOf((int) ( cameraPTZ[1] * 10));
            String z = String.valueOf((int) (cameraPTZ[2]* 10));
            String p = String.valueOf((int) (cameraPTZ[0] * 10));
            String t = String.valueOf((int) (cameraPTZ[1] * 10));
            String z = String.valueOf((int) (cameraPTZ[2] * 10));
            m_ptzPosCurrent.wPanPos = (short) (Integer.parseInt(p, 16));
            m_ptzPosCurrent.wTiltPos = (short) (Integer.parseInt(t, 16));
            m_ptzPosCurrent.wZoomPos = (short) (Integer.parseInt(z, 16));
@@ -621,6 +653,7 @@
            return false;
        }
    }
    /**
     * @描述 操控锁定
     * @参数 [userId, channelNum]
@@ -637,31 +670,27 @@
            return false;//找不到相机拒绝操控
        }
        Integer expired = cmd.getExpired();//申请控制时长
        String operator=cmd.getOperator();//申请者
        String operator = cmd.getOperator();//申请者
        String currentOperator = ardCameras.getOperatorId();//相机当前控制者
        Date currentExpired = ardCameras.getOperatorExpired();//相机当前过期时间
        if(currentExpired==null)
        {
        if (currentExpired == null) {
            //设置当前操作用户ID
            ardCameras.setOperatorId(operator);
            //设置当前过期时间
            Date now = new Date();
            now.setTime(now.getTime() + expired * 1000*60);
            now.setTime(now.getTime() + expired * 1000 * 60);
            ardCameras.setOperatorExpired(now);
            ardCamerasMapper.updateArdCameras(ardCameras);
        }
         else {
        } else {
            //如果过期时间有值
            //如果是本人直接修改
            if(currentOperator.equals(operator))
            {
            if (currentOperator.equals(operator)) {
                //设置当前过期时间
                Date now = new Date();
                now.setTime(now.getTime() + expired * 1000*60);
                now.setTime(now.getTime() + expired * 1000 * 60);
                ardCameras.setOperatorExpired(now);
                ardCamerasMapper.updateArdCameras(ardCameras);
            }
            else {
            } else {
                //如果非本人比较优先级
                Integer currentLevel = 0;//当前操作者的优先级
                if (sdkPriority.priorityMap.containsKey(currentOperator)) {
@@ -936,7 +965,7 @@
        if (enable) {
            struFocusMode.byFocusMode = 1;//手动聚焦
        } else {
            struFocusMode.byAutoFocusMode=1;
            struFocusMode.byAutoFocusMode = 1;
            struFocusMode.byFocusMode = 2;//自动聚焦
        }
        struFocusMode.byFocusDefinitionDisplay = 1;
@@ -1062,7 +1091,7 @@
        BASE64Encoder encoder = new BASE64Encoder();
        String png_base64 =  encoder.encodeBuffer(jpegBuffer);//转换成base64串
        String png_base64 = encoder.encodeBuffer(jpegBuffer);//转换成base64串
        png_base64 = png_base64.replaceAll("\n", "").replaceAll("\r", "");//删除 \r\n
        log.info("-----------处理完成截图数据----------");
        return png_base64;
@@ -1227,15 +1256,14 @@
            recordInfo info = user_real_Map.get(userId);
            if (!hCNetSDK.NET_DVR_SaveRealData_V30(info.getLRealHandle(), 1, info.getRecordPath())) {
                log.error("保存视频文件到临时文件夹失败 错误码为:  " + hCNetSDK.NET_DVR_GetLastError());
                return "保存视频文件到临时文件夹失败 错误码为:"   + hCNetSDK.NET_DVR_GetLastError();
                return "保存视频文件到临时文件夹失败 错误码为:" + hCNetSDK.NET_DVR_GetLastError();
            }
            log.info("录像开始");
            //return info.getRecordPath();
            return "";
        } else {
            recordInfo info = user_real_Map.get(userId);
            if(StringUtils.isNull(info))
            {
            if (StringUtils.isNull(info)) {
                return "";
            }
            hCNetSDK.NET_DVR_StopRealPlay(info.getLRealHandle());
@@ -1266,4 +1294,81 @@
            return url;
        }
    }
    @Override
    @SdkOperate
    public void recordToMinio(CameraCmd cmd) {
        try {
            String cameraId = cmd.getCameraId();
            Integer channelNum = cmd.getChannelNum();
            boolean enable = cmd.isEnable();
            if (!globalVariable.loginMap.containsKey(cameraId)) {
                return;
            }
            Integer userId = globalVariable.loginMap.get(cameraId);
            String path = "";
            //预览参数
            NET_DVR_PREVIEWINFO previewinfo = new NET_DVR_PREVIEWINFO();
            previewinfo.read();
            previewinfo.lChannel = channelNum;
            previewinfo.dwStreamType = 0;//码流类型:0-主码流,1-子码流,2-三码流,3-虚拟码流,以此类推
            previewinfo.dwLinkMode = 0;//连接方式:0-TCP方式,1-UDP方式,2-多播方式,3-RTP方式,4-RTP/RTSP,5-RTP/HTTP,6-HRUDP(可靠传输),7-RTSP/HTTPS,8-NPQ
            previewinfo.hPlayWnd = null;//播放窗口的句柄,为NULL表示不解码显示。
            previewinfo.bBlocked = 0;//0- 非阻塞取流,1-阻塞取流
            previewinfo.byNPQMode = 0;//NPQ模式:0-直连模式,1-过流媒体模式
            previewinfo.write();
            int lRealHandle;
            if (enable) {
                if (!user_real_Map.containsKey(userId)) {
                    lRealHandle = hCNetSDK.NET_DVR_RealPlay_V40(userId, previewinfo, null, null);
                    if (lRealHandle == -1) {
                        int iErr = hCNetSDK.NET_DVR_GetLastError();
                        log.error("取流失败" + iErr);
                        return;
                    }
                    log.info("取流成功");
                    File file = new File("D:/recordTemp/" + cameraId + ".mp4");
                    if (!file.exists()) {
                        File fileParent = file.getParentFile();
                        if (!fileParent.exists()) {
                            fileParent.mkdirs();
                        }
                        file.createNewFile();
                    }
                    path = file.getCanonicalPath();
                    recordInfo info = new recordInfo();
                    info.setLRealHandle(lRealHandle);
                    info.setRecordPath(path);
                    user_real_Map.put(userId, info);
                }
                recordInfo info = user_real_Map.get(userId);
                if (!hCNetSDK.NET_DVR_SaveRealData_V30(info.getLRealHandle(), 1, info.getRecordPath())) {
                    log.error("保存视频文件到临时文件夹失败 错误码为:  " + hCNetSDK.NET_DVR_GetLastError());
                    return;
                }
                log.info("录像开始");
            } else {
                recordInfo info = user_real_Map.get(userId);
                if (StringUtils.isNull(info)) {
                    return;
                }
                hCNetSDK.NET_DVR_StopRealPlay(info.getLRealHandle());
                log.info("录像停止");
                //存入minio
                String BucketName = cmd.getRecordBucketName();
                String ObjectName = cmd.getRecordObjectName();
                String ContentType = "video/MP4";
                FileInputStream stream = new FileInputStream(info.getRecordPath());
                String url = "";
                boolean b = MinioUtils.uploadObject(BucketName, ObjectName, stream, stream.available(), ContentType);
                if (b) {
                    url = BucketName + ObjectName;
                    log.info("上传文件成功!" + url);
                    user_real_Map.remove(userId);
                }
            }
        } catch (Exception ex) {
            log.error("录像异常" + ex.getMessage());
        }
    }
}