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