‘liusuyi’
2023-08-11 1e89a0c2fc96040ba50d0fe4305ace22f3daa6cf
src/main/java/com/ard/utils/hiksdk/service/impl/HikClientUtil.java
@@ -2,19 +2,22 @@
import com.ard.alarm.camera.domain.ArdCameras;
import com.ard.alarm.camera.domain.CameraCmd;
import com.ard.alarm.external.domain.ArdEquipExternal;
import com.ard.config.MinioClientSingleton;
import com.ard.utils.other.ByteUtils;
import com.ard.utils.hiksdk.common.GlobalVariable;
import com.ard.utils.hiksdk.domain.DeviceInfo;
import com.ard.utils.hiksdk.util.hikSdkUtil.HCNetSDK;
import com.ard.utils.hiksdk.util.minio.MinioUtils;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import lombok.extern.slf4j.Slf4j;
import java.io.*;
import java.nio.ByteBuffer;
import java.util.*;
import static com.ard.utils.hiksdk.common.GlobalVariable.cameraMap;
/**
@@ -118,14 +121,10 @@
    /**
     * @描述 注册登录 集成于NET_DVR_Login_V30,支持同步和异步登录
     * @参数 [dvrLogin]
     * @返回值 java.lang.Integer
     * @创建人 刘苏义
     * @创建时间 2023/1/17 16:12
     * @修改人和其它信息
     */
    public static void login(ArdCameras camera) {
    public static void login(DeviceInfo deviceInfo) {
        // 初始化
        if (!hCNetSDK.NET_DVR_Init()) {
            log.error("SDK初始化失败");
@@ -137,10 +136,10 @@
        } 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();
        String m_sDeviceIP = deviceInfo.getIp();
        String m_sUsername = deviceInfo.getUsername();
        String m_sPassword = deviceInfo.getPassword();
        short m_sPort = deviceInfo.getPort().shortValue();
        //设置连接时间与重连时间
        hCNetSDK.NET_DVR_SetConnectTime(2000, 1);
        hCNetSDK.NET_DVR_SetReconnect(100000, true);
@@ -161,7 +160,7 @@
        //是否异步登录:0- 否,1- 是  windowsSDK里是true和false
        m_strLoginInfo.bUseAsynLogin = true;
        //异步登录回调
        m_strLoginInfo.cbLoginResult = new LoginResultCallBack(camera);
        m_strLoginInfo.cbLoginResult = new LoginResultCallBack(deviceInfo);
        m_strLoginInfo.write();
        int i = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo);
        if (i < 0) {
@@ -171,22 +170,48 @@
    }
    /**
     * @描述 用户注销
     * @创建人 刘苏义
     * @创建时间 2023/1/17 16:12
     */
    public static void logout(DeviceInfo deviceInfo) {
        String deviceIpPort = deviceInfo.getIp() + ":" + deviceInfo.getPort();
        //撤防
        if (GlobalVariable.alarmMap.containsKey(deviceInfo.getDeviceId())) {
            Integer lAlarmHandle = GlobalVariable.alarmMap.get(deviceInfo.getDeviceId());
            boolean b = hCNetSDK.NET_DVR_CloseAlarmChan_V30(lAlarmHandle);
            if (b) {
                log.debug("设备【" + deviceIpPort + "】撤防成功");
            }
        }
        //登出
        if (GlobalVariable.loginMap.containsKey(deviceInfo.getDeviceId())) {
            Integer lUserID = GlobalVariable.loginMap.get(deviceInfo.getDeviceId());
            boolean b = hCNetSDK.NET_DVR_Logout(lUserID);
            if (b) {
                log.debug("设备【" + deviceIpPort + "】注销成功");
            }
        }
    }
    /**
     * @描述 登录所有相机
     * @参数 []
     * @返回值 void
     * @创建人 刘苏义
     * @创建时间 2023/2/3 10:10
     * @修改人和其它信息
     */
    public static void loginAll(List<ArdCameras> ardCameras) {
    public static void loginAllCamera(List<ArdCameras> ardCameras) {
        try {
            log.debug("加载lib完成!");
            for (ArdCameras camera : ardCameras) {
                Thread.sleep(100);
                login(camera);
                String ip = camera.getIp();
                cameraMap.put(ip,camera);
                DeviceInfo info = new DeviceInfo();
                info.setDeviceId(camera.getId());
                info.setIp(camera.getIp());
                info.setPort(camera.getPort());
                info.setUsername(camera.getUsername());
                info.setPassword(camera.getPassword());
                login(info);
                String key = camera.getIp() + ":" + camera.getPort();
                GlobalVariable.cameraMap.put(key, camera);
            }
        } catch (Exception ex) {
            log.error("初始化登录相机异常:" + ex.getMessage());
@@ -194,41 +219,126 @@
    }
    /**
     * @描述 注销登录
     * @参数 [dvrLogin]
     * @返回值 java.lang.Integer
     * @描述 登出所有相机
     * @创建人 刘苏义
     * @创建时间 2023/1/17 16:12
     * @修改人和其它信息
     * @创建时间 2023/2/3 10:10
     */
    public static boolean loginOut(String cameraId) {
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
    public static void logoutAllCamera(List<ArdCameras> ardCameras) {
        try {
            for (ArdCameras camera : ardCameras) {
                Thread.sleep(100);
                DeviceInfo info = new DeviceInfo();
                info.setDeviceId(camera.getId());
                info.setIp(camera.getIp());
                info.setPort(camera.getPort());
                info.setUsername(camera.getUsername());
                info.setPassword(camera.getPassword());
                logout(info);
                String key = camera.getIp() + ":" + camera.getPort();
                GlobalVariable.cameraMap.remove(key);
            }
        } catch (Exception ex) {
            log.error("初始化登录相机异常:" + ex.getMessage());
        }
        Integer userId = GlobalVariable.loginMap.get(cameraId);
        boolean b = hCNetSDK.NET_DVR_Logout(userId);
        if (b) {
            GlobalVariable.loginMap.remove(cameraId);
        }
        return b;
    }
    /**
     * 是否在线
     *
     * @param cmd
     * @描述 登录所有报警主机
     * @创建人 刘苏义
     * @创建时间 2023/2/3 10:10
     */
    public static boolean isOnLine(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
    public static void loginAllAlarmHost(List<ArdEquipExternal> ardEquipExternals) {
        try {
            for (ArdEquipExternal alarmHost : ardEquipExternals) {
                Thread.sleep(100);
                DeviceInfo info = new DeviceInfo();
                info.setDeviceId(alarmHost.getId());
                info.setIp(alarmHost.getIp());
                info.setPort(alarmHost.getPort());
                info.setUsername(alarmHost.getUsername());
                info.setPassword(alarmHost.getPassword());
                login(info);
//                String key=alarmHost.getIp()+":"+alarmHost.getPort();
//                GlobalVariable.alarmHostMap.put(key, alarmHost);
            }
        } catch (Exception ex) {
            log.error("初始化报警主机异常:" + ex.getMessage());
        }
        Integer userId = GlobalVariable.loginMap.get(cameraId);
        boolean isOnLine = hCNetSDK.NET_DVR_RemoteControl(userId, HCNetSDK.NET_DVR_CHECK_USER_STATUS, null, 0);
        return isOnLine;
    }
    /**
     * @描述 登出所有报警主机
     * @创建人 刘苏义
     * @创建时间 2023/2/3 10:10
     */
    public static void logoutAllAlarmHost(List<ArdEquipExternal> ardEquipExternals) {
        try {
            for (ArdEquipExternal alarmHost : ardEquipExternals) {
                Thread.sleep(100);
                DeviceInfo info = new DeviceInfo();
                info.setDeviceId(alarmHost.getId());
                info.setIp(alarmHost.getIp());
                info.setPort(alarmHost.getPort());
                info.setUsername(alarmHost.getUsername());
                info.setPassword(alarmHost.getPassword());
                logout(info);
//                String key=alarmHost.getIp()+":"+alarmHost.getPort();
//                GlobalVariable.alarmHostMap.remove(key);
            }
        } catch (Exception ex) {
            log.error("初始化登录相机异常:" + ex.getMessage());
        }
    }
    /**
     * @描述 登录所有门禁主机
     * @创建人 刘苏义
     * @创建时间 2023/2/3 10:10
     */
    public static void loginAllAccessControlHost(List<ArdEquipExternal> ardEquipExternals) {
        try {
            for (ArdEquipExternal accessControlHost : ardEquipExternals) {
                Thread.sleep(100);
                DeviceInfo info = new DeviceInfo();
                info.setDeviceId(accessControlHost.getId());
                info.setIp(accessControlHost.getIp());
                info.setPort(accessControlHost.getPort());
                info.setUsername(accessControlHost.getUsername());
                info.setPassword(accessControlHost.getPassword());
                login(info);
//
//                String key=accessControlHost.getIp()+":"+accessControlHost.getPort();
//                GlobalVariable.accessHostMap.put(key, accessControlHost);
            }
        } catch (Exception ex) {
            log.error("初始化报警主机异常:" + ex.getMessage());
        }
    }
    /**
     * @描述 登出所有门禁主机
     * @创建人 刘苏义
     * @创建时间 2023/2/3 10:10
     */
    public static void logoutAllAccessControlHost(List<ArdEquipExternal> ardEquipExternals) {
        try {
            for (ArdEquipExternal accessControlHost : ardEquipExternals) {
                Thread.sleep(100);
                DeviceInfo info = new DeviceInfo();
                info.setDeviceId(accessControlHost.getId());
                info.setIp(accessControlHost.getIp());
                info.setPort(accessControlHost.getPort());
                info.setUsername(accessControlHost.getUsername());
                info.setPassword(accessControlHost.getPassword());
                logout(info);
//                String key=accessControlHost.getIp()+":"+accessControlHost.getPort();
//                GlobalVariable.accessHostMap.remove(key);
            }
        } catch (Exception ex) {
            log.error("初始化报警主机异常:" + ex.getMessage());
        }
    }
    /**
     * 建立布防上传通道,用于传输数据
@@ -236,10 +346,10 @@
     * @param lUserID      唯一标识符
     * @param lAlarmHandle 报警处理器
     */
    public static int setupAlarmChan(int lUserID, int lAlarmHandle) {
    public static int setupAlarmChan(String deviceIpPort, int lUserID, int lAlarmHandle) {
        // 根据设备注册生成的lUserID建立布防的上传通道,即数据的上传通道
        if (lUserID == -1) {
            log.info("请先注册");
            log.error("请先注册");
            return lUserID;
        }
        if (lAlarmHandle < 0) {
@@ -247,14 +357,14 @@
            if (fMSFCallBack_V31 == null) {
                fMSFCallBack_V31 = new FMSGCallBack();
                if (!hCNetSDK.NET_DVR_SetDVRMessageCallBack_V50(0, fMSFCallBack_V31, null)) {
                    log.info("设置回调函数失败!错误码==========》" + hCNetSDK.NET_DVR_GetLastError());
                    log.error("设置回调函数失败!错误码==========》" + hCNetSDK.NET_DVR_GetLastError());
                }
            }
            // 这里需要对设备进行相应的参数设置,不设置或设置错误都会导致设备注册失败
            HCNetSDK.NET_DVR_SETUPALARM_PARAM m_strAlarmInfo = new HCNetSDK.NET_DVR_SETUPALARM_PARAM();
            m_strAlarmInfo.dwSize = m_strAlarmInfo.size();
            // 智能交通布防优先级:0 - 一等级(高),1 - 二等级(中),2 - 三等级(低)
            m_strAlarmInfo.byLevel = 1;
            m_strAlarmInfo.byLevel = 2;
            // 智能交通报警信息上传类型:0 - 老报警信息(NET_DVR_PLATE_RESULT), 1 - 新报警信息(NET_ITS_PLATE_RESULT)
            m_strAlarmInfo.byAlarmInfoType = 1;
            // 布防类型(仅针对门禁主机、人证设备):0 - 客户端布防(会断网续传),1 - 实时布防(只上传实时数据)
@@ -263,14 +373,9 @@
            // 布防成功,返回布防成功的数据传输通道号
            lAlarmHandle = hCNetSDK.NET_DVR_SetupAlarmChan_V41(lUserID, m_strAlarmInfo);
            if (lAlarmHandle == -1) {
                log.error("设备布防失败,错误码==========》" + hCNetSDK.NET_DVR_GetLastError());
                log.error("设备布防失败,错误码==========》" + hCNetSDK.NET_DVR_GetLastError());
                // 注销 释放sdk资源
                logout(lUserID);
                return lAlarmHandle;
                log.error("设备【" + deviceIpPort + "】布防失败,错误码==========》" + hCNetSDK.NET_DVR_GetLastError());
            } else {
                log.info("相机布防成功");
                return lAlarmHandle;
                log.debug("设备【" + deviceIpPort + "】布防成功");
            }
        }
        return lAlarmHandle;
@@ -287,6 +392,7 @@
        // 释放sdk资源
        hCNetSDK.NET_DVR_Cleanup();
    }
    /**
     * 抓图
     *
@@ -316,11 +422,11 @@
        //设置图片大小
        ByteBuffer jpegBuffer = ByteBuffer.allocate(1024 * 1024);
        // 抓图到内存,单帧数据捕获并保存成JPEG存放在指定的内存空间中
        log.debug("-----------这里开始封装 NET_DVR_CaptureJPEGPicture_NEW---------");
        // log.debug("-----------这里开始封装 NET_DVR_CaptureJPEGPicture_NEW---------");
        boolean is = hCNetSDK.NET_DVR_CaptureJPEGPicture_NEW(userId, channelNum, jpeg, jpegBuffer, 1024 * 1024, a);
        log.debug("-----------这里开始图片存入内存----------" + is);
        //log.debug("-----------这里开始图片存入内存----------" + is);
        if (is) {
            log.debug("hksdk(抓图)-结果状态值(0表示成功):" + hCNetSDK.NET_DVR_GetLastError());
            //  log.debug("hksdk(抓图)-结果状态值(0表示成功):" + hCNetSDK.NET_DVR_GetLastError());
            byte[] array = jpegBuffer.array();
            //存储到minio
@@ -328,13 +434,14 @@
            InputStream input = new ByteArrayInputStream(array);
            String url = "";
            try {
                boolean b = MinioUtils.uploadObject(cmd.getBucketName(), cmd.getObjectName(), input, input.available(), ContentType);
                boolean b = MinioUtils.uploadObject(cmd.getBucketName(), cmd.getObjectName(), input, ContentType);
                if (b) {
                    url = MinioUtils.getBucketObjectUrl(cmd.getBucketName(), cmd.getObjectName());
                    url = url.indexOf('?') != -1 ? url.substring(0, url.indexOf('?')) : url;
                    // url = MinioUtils.getBucketObjectUrl(cmd.getBucketName(), cmd.getObjectName());
                    // url = url.indexOf('?') != -1 ? url.substring(0, url.indexOf('?')) : url;
                    url = MinioClientSingleton.domainUrl + "/" + cmd.getBucketName() + "/" + cmd.getObjectName();
                    log.debug("上传文件成功!" + url);
                }
            } catch (IOException ex) {
            } catch (Exception ex) {
                log.error("上传文件异常:" + ex.getMessage());
            }
            return url;
@@ -344,4 +451,39 @@
            return "";
        }
    }
    /**
     * 获取防区名称
     * 通道号==防区号 从0开始
     * 刘苏义
     * 2023/7/6 10:48
     */
    public static String getDefenseZoneName(CameraCmd cmd) {
        String name = "";
        try {
            String cameraId = cmd.getCameraId();
            Integer channelNum = cmd.getWZoneIndex();//通道号==防区号
            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
                return name;
            }
            Integer userId = GlobalVariable.loginMap.get(cameraId);
            HCNetSDK.NET_DVR_ALARMIN_PARAM netDvrAlarminParam = new HCNetSDK.NET_DVR_ALARMIN_PARAM();
            Pointer point = netDvrAlarminParam.getPointer();
            IntByReference ibrBytesReturned = new IntByReference();
            netDvrAlarminParam.write();
            boolean b = hCNetSDK.NET_DVR_GetDVRConfig(userId, HCNetSDK.NET_DVR_GET_ALARMIN_PARAM, channelNum, point, netDvrAlarminParam.size(), ibrBytesReturned);
            if (b) {
                netDvrAlarminParam.read();
                name = ByteUtils.bytesToStringZh(netDvrAlarminParam.byName);
            } else {
                int error = hCNetSDK.NET_DVR_GetLastError();
                log.info("获取防区名称失败:" + error);
            }
        } catch (Exception ex) {
            log.error("获取防区名称异常:" + ex.getMessage());
        }
        return name;
    }
}