1. 前言
随着科技的不断发展,智能化和安防化在各个领域的应用越来越广泛,尤其是在监控领域。海康威视作为国内领先的视频监控设备提供商,提供的SDK也扮演着越来越重要的角色。但海康SDK的开发难度不小,尤其是对于初次接触的开发者来说,更是需要掌握一些基本技巧。下面是对于Java海康SDK二次开发的一些关键技巧的总结,帮助开发者能够更快更好地进行开发工作。
2. 常见问题
2.1 SDK授权问题
使用海康SDK,事先需要将程序注册授权,否则调用SDK将返回错误码。相关的授权过程详见海康官网的SDK中心,下载SDK开发文档,查找授权SDK开发说明,按照流程进行操作即可。
注意:根据海康官网相关规定,请保管好SDK的授权信息,不要将授权信息泄漏。
2.2 SDK依赖问题
使用海康SDK需要依赖很多相关的Jar包,包括海康SDK自己的Jar包,以及其他的一些依赖Jar包。具体的Jar包依赖,可以查看在下载的SDK开发文档中,查看SDK开发说明,或者参考相关Demo程序。在使用SDK过程中,需要将所有的依赖Jar包导入到项目中,否则会产生相关的运行时错误。
注意:在使用海康SDK时,请根据自己需要的功能导入相关的Jar包,以避免浪费不必要的资源。
3. 二次开发技巧
3.1 SDK初始化
在使用海康SDK之前,需要进行相关的初始化操作,初始化操作包括设备的登陆、SDK日志设置等。具体的初始化过程如下:
//SDK日志信息
HCNetSDK.NET_DVR_SetLogToFile(3, "logs", true);
//SDK初始化
boolean initResult = HCNetSDK.NET_DVR_Init();
if (!initResult) {
int errorCode = HCNetSDK.NET_DVR_GetLastError();
logger.error("Initialize HCNetSDK failed, error code: {}", errorCode);
}
//用户登录
HCNetSDK.NET_DVR_USER_LOGIN_INFO userInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();
System.arraycopy(userId.getBytes(), 0, userInfo.sUserName, 0, userId.length());
System.arraycopy(password.getBytes(), 0, userInfo.sPassword, 0, password.length());
userInfo.sDeviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN];
System.arraycopy(deviceIp.getBytes(), 0, userInfo.sDeviceAddress, 0, deviceIp.length());
userInfo.wPort = (short)port;
userInfo.bUseAsynLogin = false;
userInfo.write();
HCNetSDK.NET_DVR_DEVICEINFO_V40 deviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();
int userID = HCNetSDK.NET_DVR_Login_V40(userInfo, deviceInfo);
if (userID == -1) {
int errorCode = HCNetSDK.NET_DVR_GetLastError();
logger.error("User login failed, error code: {}", errorCode);
}
注意:对于SDK的初始化操作应该在程序的启动阶段进行,避免在程序后期对SDK进行初始化造成一定的性能消耗和代码冗余。
3.2 SDK资源释放
不管是在程序正常结束、发生错误或者其他由于异常原因退出运行时,都需要进行资源的清理和释放。对于SDK而言也同样存在这个问题。在资源释放时,需要注意释放的顺序,避免跨线程或者错误的资源释放。
//用户注销
boolean logoutResult = HCNetSDK.NET_DVR_Logout(userID);
if (!logoutResult) {
int errorCode = HCNetSDK.NET_DVR_GetLastError();
logger.error("User logout failed, error code: {}", errorCode);
}
//清除SDK配置
boolean cleanupResult = HCNetSDK.NET_DVR_Cleanup();
if (!cleanupResult) {
int errorCode = HCNetSDK.NET_DVR_GetLastError();
logger.error("Cleanup HCNetSDK failed, error code: {}", errorCode);
}
3.3 SDK错误处理
对于SDK的错误处理,需要根据错误码进行判断并对错误进行处理,具体的错误码可以查看SDK开发文档的定义。对于错误的处理,要注意及时释放申请的资源,避免内存或者其他资源的泄漏。
//根据错误码打印错误信息
int errorCode = HCNetSDK.NET_DVR_GetLastError();
logger.error("SDK error code: {}", errorCode);
//释放设备资源
if (isRealPlay) {
boolean stopRealPlayResult = HCNetSDK.NET_DVR_StopRealPlay(m_lRealHandle);
if (!stopRealPlayResult) {
logger.error("Stop real play error, error code: {}", HCNetSDK.NET_DVR_GetLastError());
}
}
//释放内存资源
if (processThread != null) {
processThread.interrupt();
}
if (playThread != null) {
playThread.interrupt();
}
4. 结语
Java海康SDK开发需要掌握的特殊技巧相对较少,但却包含着海量的知识。要完成一个稳定、高效的海康SDK应用程序是需要长期的积累和实践的。本文所提及的只是一部分的技巧和经验,也欢迎广大的开发者补充和分享更多的技巧。