1. 程式人生 > 實用技巧 >海康攝像頭SDK在Linux、windows下的相容問題(二)已解決

海康攝像頭SDK在Linux、windows下的相容問題(二)已解決

上一篇提出的問題,在前幾天解決了。

海康的技術人員給出了指導,在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_INFONET_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;

// int userId = redisService.getInt(EasyConstants.HK_SDK.USER + m_sDeviceIP);
// if (userId > -1) {
// //先登出
// loginOut(userId);
// redisService.remove(EasyConstants.HK_SDK.USER + m_sDeviceIP);
// }

    //註冊
    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 {

// JOptionPane.showMessageDialog(null, "註冊成功");
Logger.info("海康SDK註冊成功,ip:{},userId:{}",m_sDeviceIP,userId);

        // 註冊成功後,直接佈防
        setupAlarmChan(m_sDeviceIP);
    }
}