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

海康威视摄像头开发第一次做确实有点恶心,我把我用到的写一下,方便以后学习
首先把所有摄像头安装到录像机上我是通过交换机,与服务器同一网络下看是否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;
	}
发布了47 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_37460672/article/details/102480663