Java海康SDK二次开发的高效工作流程
Java海康SDK是针对海康威视高清网络摄像机、高清数字录像机、网络视频服务器等进行远程访问和控制的开发工具包。在进行二次开发时,了解高效工作流程可以提高开发效率和代码质量。
1. SDK的获取和安装
在进行二次开发之前,需要先获得Java海康SDK并进行安装配置。
从海康威视的官网下载Java SDK开发包,并参考SDK提供的《Java Interface Developer‘s Guide》的安装配置章节进行配置。
子标题1:SDK框架介绍
Java海康SDK提供了三个主要功能模块:设备接口模块、流媒体接口模块和红外接口模块。
SDK框架如下:
├── HCNetSDK.jar
├── lib
│ └── libhcnetsdk.so
└── PlayerSDK.jar
其中,HCNetSDK.jar提供设备、报警等功能模块的接口;PlayerSDK.jar提供音视频播放、抓图等接口;libhcnetsdk.so是Linux动态链接库。
子标题2:SDK使用注意事项
在使用Java海康SDK时,需要注意以下几点:
1. SDK基于JNI(Java Native Interface)技术开发,需要进行系统相关配置。可以参考SDK提供的文档进行相关配置。
2. SDK中的接口都是同步的,调用接口时要注意不要阻塞主线程。
3. SDK提供了NET_DVR_SetExceptionCallBack_V30()
函数来设置异常回调函数,能够通过回调函数获知SDK运行时的异常状态。
2. SDK开发流程
在进行二次开发时,可以按照以下流程进行:
1. 导入SDK提供的jar包(HCNetSDK.jar和PlayerSDK.jar)。
2. 实现SDK Callback函数,处理海康设备发送的通知。
3. 连接海康设备,并进行登录。
4. 进行设备操作,例如:抓图、录像、控制云台等。
5. 登出并断开与设备的连接。
子标题1:设备操作
SDK提供了一系列设备操作接口,包括连接设备、登录设备、配置设备参数、控制设备等。
以下代码示例展示了如何通过SDK登录设备,并获取设备通道数:
public class TestSDK {
static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;
private static NativeLong lUserId;//lUserID是NET_DVR_Login_V40的返回值
public static void main(String[] args) {
//初始化
boolean initSuc = hCNetSDK.NET_DVR_Init();
if(initSuc != true) {
System.out.println("初始化失败");
return;
}
//设置连接超时和响应超时时间
hCNetSDK.NET_DVR_SetConnectTime(2000,1);//默认为3000,建议值2000-5000毫秒
hCNetSDK.NET_DVR_SetReconnect(10000,true);
//登录设备
HCNetSDK.NET_DVR_DEVICEINFO_V30 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();
lUserId = hCNetSDK.NET_DVR_Login_V40("10.0.0.2", (short)8000, "admin", "password", m_strDeviceInfo);
if (lUserId.longValue() < 0) {
System.err.println("登陆失败,错误码为"+hCNetSDK.NET_DVR_GetLastError());
hCNetSDK.NET_DVR_Cleanup();
return;
}
//获取设备通道数
HCNetSDK.NET_DVR_IPPARACFG_V40 m_strIpparaCfgV40 = new HCNetSDK.NET_DVR_IPPARACFG_V40();
IntByReference ibrBytesReturned = new IntByReference(0);
boolean getDVRConfigSuc = hCNetSDK.NET_DVR_GetDVRConfig(lUserId, HCNetSDK.NET_DVR_GET_IPPARACFG_V40, new NativeLong(-1), m_strIpparaCfgV40, m_strIpparaCfgV40.size(), ibrBytesReturned);
if (!getDVRConfigSuc) {
System.err.println("获取设备失败,错误码为:"+hCNetSDK.NET_DVR_GetLastError());
hCNetSDK.NET_DVR_Logout(lUserId);
hCNetSDK.NET_DVR_Cleanup();
return;
}
System.out.println("设备通道数为:"+m_strIpparaCfgV40.dwMaxCameraNum);
//注销登录
hCNetSDK.NET_DVR_Logout(lUserId);
hCNetSDK.NET_DVR_Cleanup();
}
}
子标题2:回调函数
在连接设备和登录设备时,可以设置回调函数来处理设备发来的通知信息。
以下代码示例展示了如何通过SDK设置报警回调函数,并打印报警信息到控制台:
public class TestCallback implements HCNetSDK.FMSGCallBack_V31 {
public void invoke(NativeLong lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser){
System.out.println("收到报警信息,lCommand为:"+lCommand);
switch(lCommand.intValue())
{
case HCNetSDK.COMM_ALARM_V40:
HCNetSDK.NET_DVR_ALARMINFO_V40 struAlarmInfoV40 = new HCNetSDK.NET_DVR_ALARMINFO_V40();
struAlarmInfoV40.write();
Pointer pInfoV40 = struAlarmInfoV40.getPointer();
pInfoV40.write(0, pAlarmInfo.getByteArray(0, struAlarmInfoV40.size()), 0, struAlarmInfoV40.size());
struAlarmInfoV40.read();
System.out.println("报警信息类型为:"+struAlarmInfoV40.struAlarmFixedHeader.dwAlarmType);
break;
default:
System.out.println("其他报警信息,lCommand为:"+lCommand);
break;
}
}
}
//设置异常回调函数,en异常类型见HCNetSDK.java中定义
boolean setExceptionCallBack = hCNetSDK.NET_DVR_SetExceptionCallBack_V30(0, null, new ExceptionCallBack());
if (setExceptionCallBack != true)
{
System.err.println("NET_DVR_SetExceptionCallBack_V30失败!");
hCNetSDK.NET_DVR_Logout(lUserId);
hCNetSDK.NET_DVR_Cleanup();
return;
}
//设置报警回调函数
TestCallback fMSFCallBack = new TestCallback();
boolean setDVRMessageCallBack_V31 = hCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(fMSFCallBack);
if (setDVRMessageCallBack_V31 != true)
{
System.err.println("设置回调函数失败!");
hCNetSDK.NET_DVR_Logout(lUserId);
hCNetSDK.NET_DVR_Cleanup();
return;
}
3. 开发工具推荐
在进行Java海康SDK二次开发时,推荐使用以下工具:
1. IDE:Eclipse或者IntelliJ IDEA。
2. 调试工具:JD-GUI,用于反编译SDK提供的动态链接库。
3. Mock工具:Mockito或PowerMock,用于快速编写单元测试。
通过使用这些工具,可以提高开发效率和代码质量。
4. 总结
本文介绍了Java海康SDK二次开发的高效工作流程,主要包括SDK的获取和安装、SDK开发流程、SDK使用注意事项以及开发工具推荐。掌握这些知识可以帮助开发者快速进行二次开发并提高开发效率。