java海康威视设备注册、获取摄像头、录像机在线状态,获取指定摄像头PTZ值

虾米哥 阅读:2819 2021-04-01 11:16:42 评论:0

海康威视摄像头开发第一次做确实有点恶心,我把我用到的写一下,方便以后学习
首先把所有摄像头安装到录像机上我是通过交换机,与服务器同一网络下看是否ping、telnet通
1.官网下载SDK开发包,我是Linux系统服务器开发

https://www.hikvision.com/cn/download_more_403.html#prettyPhoto 

2.64位系统,将lib动态库所有文件上传/usr/lib64下,重名文件跳过不要覆盖,否则可能服务器重启失败
3.将日志文件HCNetSDK_Log_Switch.xml放到和自己当前项目的jar项目平级目录下,当前目录下会生成日志文件夹SDKLOG
4.LinuxJavaDemo项目的HCNetSDK.java文件导入自己的项目中,同时把examples.jar和jna.jar也copy到自己的项目中,这样就可以调用海康威视的api了
5.我当时一直报错
[2019-10-10 10:47:02.047][DBG] load full path[.//HCNetSDKCom/libHCIndustry.so] failed, system error: 115
HCNetSDKCom文件夹下的所有库文件找不到,我把所有库文件包同第2步放到当前项目jar包项目平级文件夹,成功
6.获取指定摄像头的设备状态,CameraInfo对象包括摄像头ip,端口(我的默认8000),账号,密码,方法返回true状态正常,false状态异常

public boolean getDVRConfig(String subType, CameraInfo cameraInfo) { 
		log.info("ip地址:{}", cameraInfo.getIp()); 
		boolean flag = false; 
		HCNetSDK sdk = HCNetSDK.INSTANCE; 
		// 判断摄像头是否开启 
		if (!sdk.NET_DVR_Init()) { 
			log.info("SDK初始化失败"); 
			return flag; 
		} 
		NET_DVR_DEVICEINFO_V30 devinfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();// 设备信息 
		// 登录信息 
		int port = cameraInfo.getPortDev(); 
		NativeLong id = sdk.NET_DVR_Login_V30(cameraInfo.getIp(), (short) port, cameraInfo.getUser(), 
				cameraInfo.getPassword(), devinfo); 
		if (id.intValue() < 0L) { 
			log.info("设备注册失败"); 
			return flag; 
		} 
		if (EnDeviceSubType.RECORDER.id().equals(subType)) { 
			log.info("录像机能登录即在线"); 
			return true; 
		} 
		// DVR工作状态 
		NET_DVR_WORKSTATE_V30 devwork = new HCNetSDK.NET_DVR_WORKSTATE_V30(); 
		boolean net_DVR_GetDVRWorkState_V30 = sdk.NET_DVR_GetDVRWorkState_V30(id, devwork); 
		log.info("DVR工作状态:{}", net_DVR_GetDVRWorkState_V30); 
		if (!sdk.NET_DVR_GetDVRWorkState_V30(id, devwork)) { 
			// 返回Boolean值,判断是否获取设备能力 
			log.info("返回设备状态失败"); 
		} 
		IntByReference ibrBytesReturned = new IntByReference(0);// 获取IP接入配置参数 
		NET_DVR_IPPARACFG ipcfg = new NET_DVR_IPPARACFG();// IP接入配置结构 
		ipcfg.write(); 
		Pointer lpIpParaConfig = ipcfg.getPointer(); 
		// 获取相关参数配置 
		sdk.NET_DVR_GetDVRConfig(id, HCNetSDK.NET_DVR_GET_IPPARACFG, new NativeLong(0), lpIpParaConfig, ipcfg.size(), 
				ibrBytesReturned); 
		ipcfg.read(); 
		log.info("设备状态:{}", devwork.dwDeviceStatic); 
		// 显示模拟通道 
		for (int i = 0; i < devinfo.byChanNum; i++) { 
			log.info("模拟通道号名称:{}", i); 
			// 0:不录像,1:录像 
			log.info("是否录像:{}", devwork.struChanStatic[i].byRecordStatic); 
			// 0正常,1信号丢失 
			log.info("信号状态:{}", devwork.struChanStatic[i].bySignalStatic); 
			// 0正常,1异常 
			log.info("硬件状态:{}", devwork.struChanStatic[i].byHardwareStatic); 
			if (devwork.struChanStatic[i].bySignalStatic == 0 && devwork.struChanStatic[i].byHardwareStatic == 0) { 
				flag = true; 
			} 
		} 
		// 注销用户 
		// 释放SDK资源 
		sdk.NET_DVR_Logout(id); 
		sdk.NET_DVR_Cleanup(); 
		return flag; 
	} 

7.获取指定摄像头PTZ值,PTZ值转度数,10进制转十六进制字符串,按十进制解析字符串除以10即为度数,P为水平参数转度数(0-360),T为垂直参数转度数(-90-5)T值为了与前端一致度数n在(0,90]时,n=-1*n,n>90时,n=360-n;

public static void getDVRConfig(CameraInfo cameraInfo) { 
		 
		HCNetSDK sdk = HCNetSDK.INSTANCE; 
		// 判断摄像头是否开启 
		if (!sdk.NET_DVR_Init()) { 
			log.info("SDK初始化失败"); 
			return; 
		} 
		NET_DVR_DEVICEINFO_V30 devinfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();// 设备信息 
		// 登录信息 
		NativeLong id = sdk.NET_DVR_Login_V30(cameraInfo.getCameraIp(), (short) cameraInfo.getCameraPort(), 
				cameraInfo.getUserName(), cameraInfo.getUserPwd(), devinfo); 
		cameraInfo.setUserId(id);// 返回一个用户编号,同时将设备信息写入devinfo 
		log.info("UserId==:{}", cameraInfo.getUserId().intValue()); 
		log.info("ip地址:{}",cameraInfo.getCameraIp()); 
		if (cameraInfo.getUserId().intValue() < 0L) { 
			log.info("设备注册失败"); 
			return; 
		} 
		 
		// DVR工作状态 
		NET_DVR_WORKSTATE_V30 devwork = new HCNetSDK.NET_DVR_WORKSTATE_V30(); 
		boolean net_DVR_GetDVRWorkState_V30 = sdk.NET_DVR_GetDVRWorkState_V30(id, devwork); 
		int net_DVR_GetLastError1 = sdk.NET_DVR_GetLastError(); 
		if (!sdk.NET_DVR_GetDVRWorkState_V30(cameraInfo.getUserId(), devwork)) { 
			// 返回Boolean值,判断是否获取设备能力 
			log.info("返回设备状态失败"); 
		} 
 
		IntByReference ibrBytesReturned = new IntByReference(); 
		//读取PTZ 
		NET_DVR_PTZPOS ipcfg = new NET_DVR_PTZPOS(); 
		ipcfg.write(); 
		Pointer lpIpParaConfig = ipcfg.getPointer(); 
		// 获取相关参数配置 
		//这里一开始我的当前项目目录没放lib库文件,一直返回false,必须true 
		sdk.NET_DVR_GetDVRConfig(cameraInfo.getUserId(), HCNetSDK.NET_DVR_GET_PTZPOS, new NativeLong(0), 
				lpIpParaConfig, ipcfg.size(), ibrBytesReturned); 
		ipcfg.read(); 
		log.info("水平参数wPanPos:{}",ipcfg.wPanPos); 
		log.info("水平度数:{}",ptzToDegree(ipcfg.wPanPos)); 
		BigDecimal wTiltPosDegree = ptzToDegree(ipcfg.wTiltPos); 
		double value = ptzToDegree(ipcfg.wTiltPos).doubleValue(); 
		log.info("垂直参数wTiltPos:{}",ipcfg.wTiltPos); 
		log.info("垂直度数:{}",value>90?new BigDecimal(360).subtract(wTiltPosDegree):-wTiltPosDegree.doubleValue()); 
		log.info("变倍参数wZoomPos:{}",ipcfg.wZoomPos); 
		log.info("变倍度数:{}",ptzToDegree(ipcfg.wZoomPos)); 
		// 注销用户 
		sdk.NET_DVR_Logout(cameraInfo.getUserId());// 释放SDK资源 
		sdk.NET_DVR_Cleanup(); 
	} 
 
	private static BigDecimal ptzToDegree(short ptz) { 
		String hexString = Integer.toHexString(ptz); 
		int parseInt = Integer.parseInt(hexString); 
		BigDecimal aa = new BigDecimal(parseInt/10.0).setScale(1,BigDecimal.ROUND_HALF_UP); 
		return aa; 
	} 
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号