| | |
| | | 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; |
| | |
| | | import java.io.*; |
| | | import java.nio.ByteBuffer; |
| | | import java.util.*; |
| | | |
| | | |
| | | /** |
| | | * @ClassName: hikClientServiceImpl |
| | |
| | | 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; |
| | |
| | | //异步登录回调 |
| | | 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; |
| | | } |
| | | |
| | | /** |
| | |
| | | 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()); |
| | | } |
| | | } |
| | | |
| | |
| | | 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()); |
| | | } |
| | | } |
| | | /** |
| | | * @描述 登录所有外联设备 |
| | | * @创建人 刘苏义 |
| | |
| | | log.error("登录所有外联设备异常:" + ex.getMessage()); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * @描述 登出所有外联设备 |
| | | * @创建人 刘苏义 |
| | |
| | | logout(info); |
| | | } |
| | | } catch (Exception ex) { |
| | | log.error("登出所有超脑异常:" + ex.getMessage()); |
| | | log.error("登出所有外联设备异常:" + ex.getMessage()); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | |
| | | 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); |
| | |
| | | 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()); |
| | | } |
| | | } |
| | | } |