上一篇提出的問題,在前幾天解決了。
海康的技術人員給出了指導,在Linux庫加載失敗的時候,需要在代碼中手動指定配置文件。
庫文件加載說明】
// 1. lib文件夾里面所有庫文件libhcnetsdk.so、libHCCore.so、libssl.so、libcrypto.so以及HCNetSDKCom文件夾都需要加載到工程中。
//
// 2. HCNetSDKCom文件夾如果和libhcnetsdk.so、libhpr.so、libHCCore文件、可執行文件不在同級目錄,或者加載失敗,可以調用NET_DVR_SetSDKInitCfg(enumType類型賦值為2,lpInBuff對應結構體NET_DVR_LOCAL_SDK_PATH)設置組件庫所在路徑。
//
// 3. libcrypto.so和libssl.so是開源庫,如果庫文件加載失敗,可以調用NET_DVR_SetSDKInitCfg(enumType類型賦值為3,lpInBuff對應libcrypto.so所在的路徑字符串)、NET_DVR_SetSDKInitCfg(enumType類型賦值為4,lpInBuff對應libssl.so所在的路徑字符串)指定下這些庫文件加載路徑。
//設置HCNetSDKCom組件庫所在路徑
String strPathCom = hkSdkLinuxHome;
HkSdkLinux.NET_DVR_LOCAL_SDK_PATH struComPath = new HkSdkLinux.NET_DVR_LOCAL_SDK_PATH();
System.arraycopy(strPathCom.getBytes(), 0, struComPath.sPath, 0, strPathCom.length());
struComPath.write();
hCNetSDK.NET_DVR_SetSDKInitCfg(2, struComPath.getPointer());
//設置libcrypto.so所在路徑
HkSdkLinux.BYTE_ARRAY ptrByteArrayCrypto = new HkSdkLinux.BYTE_ARRAY(256);
String strPathCrypto = hkSdkLinuxHome + "libcrypto.so";
System.arraycopy(strPathCrypto.getBytes(), 0, ptrByteArrayCrypto.byValue, 0, strPathCrypto.length());
ptrByteArrayCrypto.write();
hCNetSDK.NET_DVR_SetSDKInitCfg(3, ptrByteArrayCrypto.getPointer());
//設置libssl.so所在路徑
HkSdkLinux.BYTE_ARRAY ptrByteArraySsl = new HkSdkLinux.BYTE_ARRAY(256);
String strPathSsl = hkSdkLinuxHome + "libssl.so";
System.arraycopy(strPathSsl.getBytes(), 0, ptrByteArraySsl.byValue, 0, strPathSsl.length());
ptrByteArraySsl.write();
hCNetSDK.NET_DVR_SetSDKInitCfg(4, ptrByteArraySsl.getPointer());
注冊的時候也需要注意,不能用windows的注冊方式。
需要copy windows的注冊方法、注冊類,如 NET_DVR_USER_LOGIN_INFO
、NET_DVR_DEVICEINFO_V40
這兩個類。
private void registerLinux(String m_sDeviceIP,String m_sUsername,String m_sPassword) {
HkSdkLinux.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new HkSdkLinux.NET_DVR_USER_LOGIN_INFO();//設備登錄信息
HkSdkLinux.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new HkSdkLinux.NET_DVR_DEVICEINFO_V40();//設備信息
//---------------------------------------
//登錄參數,包括設備地址、登錄用戶、密碼等
//注冊之前先注銷已注冊的用戶,預覽情況下不可注銷
int userId = -1;
//注冊
m_strLoginInfo.sDeviceAddress = new byte[HkSdkLinux.NET_DVR_DEV_ADDRESS_MAX_LEN];
System.arraycopy(m_sDeviceIP.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, m_sDeviceIP.length());
m_strLoginInfo.sUserName = new byte[HkSdkLinux.NET_DVR_LOGIN_USERNAME_MAX_LEN];
System.arraycopy(m_sUsername.getBytes(), 0, m_strLoginInfo.sUserName, 0, m_sUsername.length());
m_strLoginInfo.sPassword = new byte[HkSdkLinux.NET_DVR_LOGIN_PASSWD_MAX_LEN];
System.arraycopy(m_sPassword.getBytes(), 0, m_strLoginInfo.sPassword, 0, m_sPassword.length());
m_strLoginInfo.wPort = (short)8000;// 設備端口,默認8000
m_strLoginInfo.bUseAsynLogin = false; //是否異步登錄:0- 否,1- 是
m_strLoginInfo.write();
userId = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo);
// userId存入緩存
redisService.put(EasyConstants.HK_SDK.USER + m_sDeviceIP,userId);
if (userId < 0) {
Logger.info("海康SDK注冊失敗,ip:{},錯誤號:{}",m_sDeviceIP,hCNetSDK.NET_DVR_GetLastError());
} else {
Logger.info("海康SDK注冊成功,ip:{},userId:{}",m_sDeviceIP,userId);
// 注冊成功后,直接布防
setupAlarmChan(m_sDeviceIP);
}
}