一、查看摄像仪是否支持报警输出节点控制
1.1登录海康摄像仪平台界面-->报警配置
-->报警输出
--报警状态
说明该摄像仪支持节点控制
二、下载海康sdk(官网地址)
2.1获取设备报警输出。
主要用到NET DVR GetAlarmOut V30方法,返回的是bool值。
2.2代码示例:
public static void getAlarmOutStatus(int iUserID, int alarmOutIndex, HCNetSDK.NET_DVR_ALARMOUTCFG_V30 cfg) { HCNetSDK.NET_DVR_ALARMOUTSTATUS status = new HCNetSDK.NET_DVR_ALARMOUTSTATUS(); status.write(); boolean ret = hCNetSDK.NET_DVR_GetAlarmOut(iUserID, status); if (!ret) { System.out.println("获取报警输出状态失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); return; } status.read(); byte rawStatus = status.Output[alarmOutIndex]; System.out.println("报警输出口[" + alarmOutIndex + "] 原始状态:" + rawStatus); if (openAlarmOut(iUserID, alarmOutIndex)) { try { Thread.sleep(5 * 1000L); } catch (InterruptedException ignored) {} closeAlarmOut(iUserID, alarmOutIndex); } // ====== 结合常开 / 常闭判断“真实逻辑状态” ====== //if (cfg.byNormalSatus == 0) { // // 常开(NO) // if (rawStatus == 1) { // System.out.println("报警输出:已触发(NO 闭合)"); // closeAlarmOut(iUserID, alarmOutIndex); // } else { // System.out.println("报警输出:未触发(NO 断开)"); // openAlarmOut(iUserID, alarmOutIndex); // } //} else { // // 常闭(NC) // if (rawStatus == 0) { // System.out.println("报警输出:已触发(NC 断开)"); // openAlarmOut(iUserID, alarmOutIndex); // } else { // System.out.println("报警输出:未触发(NC 闭合)"); // } //} }2.2调用该方法,首先要登录
public static void main(String[] args) throws IOException, InterruptedException { if (hCNetSDK == null) { System.out.println("init sdk"); if (!createSDKInstance()) { System.out.println("Load SDK fail"); return; } } //linux系统建议调用以下接口加载组件库 if (osSelect.isLinux()) { HCNetSDK.BYTE_ARRAY ptrByteArray1 = new HCNetSDK.BYTE_ARRAY(256); HCNetSDK.BYTE_ARRAY ptrByteArray2 = new HCNetSDK.BYTE_ARRAY(256); //这里是库的绝对路径,请根据实际情况修改,注意改路径必须有访问权限 String strPath1 = System.getProperty("user.dir") + "/lib/libcrypto.so.1.1"; String strPath2 = System.getProperty("user.dir") + "/lib/libssl.so.1.1"; System.arraycopy(strPath1.getBytes(), 0, ptrByteArray1.byValue, 0, strPath1.length()); ptrByteArray1.write(); hCNetSDK.NET_DVR_SetSDKInitCfg(HCNetSDK.NET_SDK_INIT_CFG_LIBEAY_PATH, ptrByteArray1.getPointer()); System.arraycopy(strPath2.getBytes(), 0, ptrByteArray2.byValue, 0, strPath2.length()); ptrByteArray2.write(); hCNetSDK.NET_DVR_SetSDKInitCfg(HCNetSDK.NET_SDK_INIT_CFG_SSLEAY_PATH, ptrByteArray2.getPointer()); String strPathCom = System.getProperty("user.dir") + "/lib/"; HCNetSDK.NET_DVR_LOCAL_SDK_PATH struComPath = new HCNetSDK.NET_DVR_LOCAL_SDK_PATH(); System.arraycopy(strPathCom.getBytes(), 0, struComPath.sPath, 0, strPathCom.length()); struComPath.write(); hCNetSDK.NET_DVR_SetSDKInitCfg(HCNetSDK.NET_SDK_INIT_CFG_SDK_PATH, struComPath.getPointer()); } //SDK初始化,一个程序进程只需要调用一次 hCNetSDK.NET_DVR_Init(); if (fExceptionCallBack == null) { fExceptionCallBack = new FExceptionCallBack_Imp(); } Pointer pUser = null; if (!hCNetSDK.NET_DVR_SetExceptionCallBack_V30(0, 0, fExceptionCallBack, pUser)) { return; } System.out.println("设置异常消息回调成功"); //启用SDK写日志 hCNetSDK.NET_DVR_SetLogToFile(3, "./sdkLog", false); //登录设备,每一台设备只需要登录一次 lUserID = TestDemo.loginDevice("192.168.10.61", (short) 8000, "admin", "htdq0557"); for (boolean exit = false; !exit; ) { System.out.println("请输入您想要执行的demo实例! (退出请输入yes)"); Scanner input = new Scanner(System.in); String str = input.next(); // 转换为标准输入 str = str.toLowerCase(); if (str.equals("yes")) { // 退出程序 exit = true; break; } switch (str) { case "1": { int alarmOutIndex = 0; // 第 1 路报警输出 HCNetSDK.NET_DVR_ALARMOUTCFG_V30 cfg = new HCNetSDK.NET_DVR_ALARMOUTCFG_V30(); cfg.dwSize = cfg.size(); cfg.write(); //日志查找 System.out.println("\n报警状态输出信息"); SdkSysCfg.getAlarmOutStatus(lUserID, alarmOutIndex, cfg); break; } default: { System.out.println("\n未知的指令操作!请重新输入!\n"); } } } Thread.sleep(2000); //程序退出的时候调用注销登录接口,每一台设备分别调用一次 if (hCNetSDK.NET_DVR_Logout(lUserID)) { System.out.println("注销成功"); } //释放SDK资源,程序退出时调用,只需要调用一次 hCNetSDK.NET_DVR_Cleanup(); return; }三、调用完成
调用完成之后就可以根据业务需求去控制节点输出。发送脉冲信号
san NET_DVR_GetAlarmOut_V30NET_DVR_GetAlarmOut_VNET_DVR_GetAlarmOut_V30