liusuyi
2023-12-27 a20bc4abb2b913bf03dda03a45d835da090cf9aa
src/main/java/com/ard/utils/sdk/hiksdk/service/impl/HikClientUtil.java
@@ -4,10 +4,12 @@
import com.ard.alarm.camera.domain.CameraCmd;
import com.ard.alarm.external.domain.ArdEquipExternal;
import com.ard.utils.minio.MinioUtil;
import com.ard.utils.sdk.hiksdk.domain.ChannelInfo;
import com.ard.utils.util.ByteUtils;
import com.ard.utils.sdk.hiksdk.common.GlobalVariable;
import com.ard.utils.sdk.hiksdk.domain.DeviceInfo;
import com.ard.utils.sdk.hiksdk.util.hikSdkUtil.HCNetSDK;
import com.sun.jna.NativeLong;
import com.sun.jna.Platform;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
@@ -16,7 +18,6 @@
import java.io.*;
import java.nio.ByteBuffer;
import java.util.*;
/**
 * @ClassName: hikClientServiceImpl
@@ -32,60 +33,22 @@
    public static HCNetSDK.FMSGCallBack_V31 fMSFCallBack_V31;
    /**
     * @描述 注册登录 只支持同步登陆,且官方不建议直接在此接口下写耗时操作
     * @参数 [dvrLogin]
     * @返回值 java.lang.Integer
     * @创建人 刘苏义
     * @创建时间 2023/1/17 16:12
     * @修改人和其它信息
     */
    public ArdCameras login1(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_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);
        if (lUserID < 0) {
            //释放SDK资源
            hCNetSDK.NET_DVR_Cleanup();
            camera.setLoginId(-1);
        }
        if (GlobalVariable.loginMap.containsKey(camera.getId())) {
            GlobalVariable.loginMap.remove(camera.getId());
        }
        GlobalVariable.loginMap.put(camera.getId(), lUserID);
        camera.setLoginId(lUserID);
        camera.setChannel((int) m_strDeviceInfo.byStartChan);
        return camera;
    }
    /**
     * @描述 注册登录 集成于NET_DVR_Login_V30,支持同步和异步登录
     * @创建人 刘苏义
     * @创建时间 2023/1/17 16:12
     */
    public static void login(DeviceInfo deviceInfo) {
    public static int login(DeviceInfo deviceInfo) {
        // 初始化
        if (!hCNetSDK.NET_DVR_Init()) {
            log.error("SDK初始化失败");
        }
        //设置JSON透传报警数据和图片分离
        HCNetSDK.NET_DVR_LOCAL_GENERAL_CFG struNET_DVR_LOCAL_GENERAL_CFG = new HCNetSDK.NET_DVR_LOCAL_GENERAL_CFG();
        struNET_DVR_LOCAL_GENERAL_CFG.byAlarmJsonPictureSeparate = 1;   //设置JSON透传报警数据和图片分离
        struNET_DVR_LOCAL_GENERAL_CFG.write();
        Pointer pStrNET_DVR_LOCAL_GENERAL_CFG = struNET_DVR_LOCAL_GENERAL_CFG.getPointer();
        hCNetSDK.NET_DVR_SetSDKLocalCfg(17, pStrNET_DVR_LOCAL_GENERAL_CFG);
        //打印海康sdk日志
        if (Platform.isWindows()) {
            String WIN_PATH = System.getProperty("user.dir") + File.separator + "ardLog" + File.separator + "logs" + File.separator;
@@ -119,11 +82,12 @@
        //异步登录回调
        m_strLoginInfo.cbLoginResult = new LoginResultCallBack(deviceInfo);
        m_strLoginInfo.write();
        int i = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo);
        if (i < 0) {
        int loginId = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo);
        if (loginId < 0) {
            int errorCode = hCNetSDK.NET_DVR_GetLastError();
            log.error("登录异常:" + errorCode);
        }
        return loginId;
    }
    /**
@@ -166,12 +130,13 @@
                info.setPort(camera.getPort());
                info.setUsername(camera.getUsername());
                info.setPassword(camera.getPassword());
                info.setDeviceType(camera.getGdType());
                login(info);
                String key = camera.getIp() + ":" + camera.getPort();
                GlobalVariable.cameraMap.put(key, camera);
            }
        } catch (Exception ex) {
            log.error("初始化登录相机异常:" + ex.getMessage());
            log.error("登录相机异常:" + ex.getMessage());
        }
    }
@@ -195,147 +160,10 @@
                GlobalVariable.cameraMap.remove(key);
            }
        } catch (Exception ex) {
            log.error("初始化登录相机异常:" + ex.getMessage());
            log.error("注销相机异常:" + ex.getMessage());
        }
    }
    /**
     * @描述 登录所有报警主机
     * @创建人 刘苏义
     * @创建时间 2023/2/3 10:10
     */
    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());
        }
    }
    /**
     * @描述 登出所有报警主机
     * @创建人 刘苏义
     * @创建时间 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);
            }
        } 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);
            }
        } catch (Exception ex) {
            log.error("登出所有门禁主机异常:" + ex.getMessage());
        }
    }
    /**
     * @描述 登录所有超脑
     * @创建人 刘苏义
     * @创建时间 2023/2/3 10:10
     */
    public static void loginAllSuperBrainHost(List<ArdEquipExternal> ardEquipExternals) {
        try {
            for (ArdEquipExternal superBrainHost : ardEquipExternals) {
                Thread.sleep(100);
                DeviceInfo info = new DeviceInfo();
                info.setDeviceId(superBrainHost.getId());
                info.setIp(superBrainHost.getIp());
                info.setPort(superBrainHost.getPort());
                info.setUsername(superBrainHost.getUsername());
                info.setPassword(superBrainHost.getPassword());
                login(info);
            }
        } catch (Exception ex) {
            log.error("登录所有超脑异常:" + ex.getMessage());
        }
    }
    /**
     * @描述 登出所有超脑
     * @创建人 刘苏义
     * @创建时间 2023/2/3 10:10
     */
    public static void logoutAllSuperBrainHost(List<ArdEquipExternal> ardEquipExternals) {
        try {
            for (ArdEquipExternal superBrainHost : ardEquipExternals) {
                Thread.sleep(100);
                DeviceInfo info = new DeviceInfo();
                info.setDeviceId(superBrainHost.getId());
                info.setIp(superBrainHost.getIp());
                info.setPort(superBrainHost.getPort());
                info.setUsername(superBrainHost.getUsername());
                info.setPassword(superBrainHost.getPassword());
                logout(info);
//                String key=accessControlHost.getIp()+":"+accessControlHost.getPort();
//                GlobalVariable.accessHostMap.remove(key);
            }
        } catch (Exception ex) {
            log.error("登出所有超脑异常:" + ex.getMessage());
        }
    }
    /**
     * @描述 登录所有外联设备
     * @创建人 刘苏义
@@ -357,6 +185,7 @@
            log.error("登录所有外联设备异常:" + ex.getMessage());
        }
    }
    /**
     * @描述 登出所有外联设备
     * @创建人 刘苏义
@@ -375,10 +204,9 @@
                logout(info);
            }
        } catch (Exception ex) {
            log.error("登出所有超脑异常:" + ex.getMessage());
            log.error("登出所有外联设备异常:" + ex.getMessage());
        }
    }
    /**
@@ -412,6 +240,11 @@
            m_strAlarmInfo.byDeployType = 1;
            //人脸报警信息类型:1- 人脸侦测报警 0- 人脸抓拍报警
            m_strAlarmInfo.byFaceAlarmDetection = 0;
            //报警图片数据类型,按位表示:
            //bit0- 人脸抓拍(报警类型为COMM_UPLOAD_FACESNAP_RESULT)中图片数据上传类型:0- 二进制传输,1- URL传输
            //bit1- EVENT_JSON(报警类型为COMM_VCA_ALARM)中图片数据上传类型:0- 二进制传输,1- URL传输
            //bit2- 人脸比对(报警类型为COMM_SNAP_MATCH_ALARM)中图片数据上传类型:0- 二进制传输,1- URL传输
            m_strAlarmInfo.byAlarmTypeURL = 0;
            m_strAlarmInfo.write();
            // 布防成功,返回布防成功的数据传输通道号
            lAlarmHandle = hCNetSDK.NET_DVR_SetupAlarmChan_V41(lUserID, m_strAlarmInfo);
@@ -527,4 +360,67 @@
        return name;
    }
    //获取IP通道
    public static void getIPChannelInfo(String deviceId, int iUserID) {
        try {
            GlobalVariable.deviceChanMap.remove(deviceId);
            List<ChannelInfo> channelInfoList = new ArrayList<>();
            int chanNum = 64;
            IntByReference ibrBytesReturned = new IntByReference(0);//获取IP接入配置参数
            HCNetSDK.NET_DVR_IPPARACFG_V40 m_strIpparaCfg = new HCNetSDK.NET_DVR_IPPARACFG_V40();
            m_strIpparaCfg.write();
            //lpIpParaConfig 接收数据的缓冲指针
            Pointer lpIpParaConfig = m_strIpparaCfg.getPointer();
            boolean bRet = hCNetSDK.NET_DVR_GetDVRConfig(iUserID, HCNetSDK.NET_DVR_GET_IPPARACFG_V40, 0, lpIpParaConfig, m_strIpparaCfg.size(), ibrBytesReturned);
            m_strIpparaCfg.read();
            //log.debug("起始数字通道号:" + m_strIpparaCfg.dwStartDChan);
            for (int iChannum = 0; iChannum < chanNum; iChannum++) {
                int channum = iChannum + m_strIpparaCfg.dwStartDChan;
                HCNetSDK.NET_DVR_PICCFG_V40 strPicCfg = new HCNetSDK.NET_DVR_PICCFG_V40();
                strPicCfg.dwSize = strPicCfg.size();
                strPicCfg.write();
                Pointer pStrPicCfg = strPicCfg.getPointer();
                NativeLong lChannel = new NativeLong(channum);
                IntByReference pInt = new IntByReference(0);
                boolean b_GetPicCfg = hCNetSDK.NET_DVR_GetDVRConfig(iUserID, HCNetSDK.NET_DVR_GET_PICCFG_V40, lChannel.intValue(),
                        pStrPicCfg, strPicCfg.size(), pInt);
//            if (b_GetPicCfg == false) {
//                System.out.println("获取图像参数失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
//            }
                strPicCfg.read();
                m_strIpparaCfg.struStreamMode[iChannum].read();
                if (m_strIpparaCfg.struStreamMode[iChannum].byGetStreamType == 0) {
                    m_strIpparaCfg.struStreamMode[iChannum].uGetStream.setType(HCNetSDK.NET_DVR_IPCHANINFO.class);
                    m_strIpparaCfg.struStreamMode[iChannum].uGetStream.struChanInfo.read();
                    //log.debug("--------------第" + (iChannum + 1) + "个通道------------------");
                    int channel = m_strIpparaCfg.struStreamMode[iChannum].uGetStream.struChanInfo.byIPID + m_strIpparaCfg.struStreamMode[iChannum].uGetStream.struChanInfo.byIPIDHigh * 256;
                    //log.debug("channel:" + channel);
                    if (channel > 0) {
                        //log.debug("name: " + new String(strPicCfg.sChanName, "GBK").trim());
                        //log.debug("ip: " + new String(m_strIpparaCfg.struIPDevInfo[channel - 1].struIP.sIpV4).trim());
                        //log.debug("port: " + m_strIpparaCfg.struIPDevInfo[channel - 1].wDVRPort);
                        String name = new String(strPicCfg.sChanName, "GBK").trim();
                        String ip = new String(m_strIpparaCfg.struIPDevInfo[channel - 1].struIP.sIpV4).trim();
                        int port = m_strIpparaCfg.struIPDevInfo[channel - 1].wDVRPort;
                        ChannelInfo channelInfo = new ChannelInfo();
                        channelInfo.setIp(ip);
                        channelInfo.setPort(port);
                        channelInfo.setName(name);
                        channelInfoList.add(channelInfo);
                    }
                    if (m_strIpparaCfg.struStreamMode[iChannum].uGetStream.struChanInfo.byEnable == 1) {
                        //log.debug("IP通道" + channum + "在线");
                    } else {
                        //log.debug("IP通道" + channum + "不在线");
                    }
                }
            }
            if (channelInfoList.size() > 0) {
                GlobalVariable.deviceChanMap.put(deviceId, channelInfoList);
            }
        } catch (Exception ex) {
            log.error("获取IP通道异常:" + ex.getMessage());
        }
    }
}