海康的IP通道SDK對接

正常情況下,知道NVR的用戶名、密碼、端口、IP地址這四個選項就可以通過海康官方的SDK調用預覽了。

但是今天出現一個很情況的現象,就是使用程序(Java版本)對接一個NVR的設備的時候,設備可以登錄成功,但是一直預覽不成功,但是使用官方的4200軟件卻又是可行。

//在此判斷是否回調預覽,0,不回調 1 回調
if(jComboBoxCallback.getSelectedIndex() == 0)
{
    m_strClientInfo.hPlayWnd = hwnd;
    lPreviewHandle = hCNetSDK.NET_DVR_RealPlay_V30(lUserID,
            m_strClientInfo, null, null, true);
}
else if(jComboBoxCallback.getSelectedIndex() == 1)
{
    m_strClientInfo.hPlayWnd = null;
    lPreviewHandle = hCNetSDK.NET_DVR_RealPlay_V30(lUserID,
            m_strClientInfo, fRealDataCallBack, null, true);
}

查看錯誤代碼返回的是9(偶爾出現4),查一下手冊:


在排查不是網絡原因,不是其它原因的後,不死心,又使用了官方的DEMO試了一下,Java版本,C#版本都有問題。而MFC版本由於環境問題,沒有調通。

最後沒法, 給海康的官方SDK郵箱發了封郵件求助。

SDK的工作人員提醒我使用官方的clientdemo.exe 軟件試一下。


試驗成功了。

由於是MFC程序,只好啃源代碼,後面發現他使用的是:NET_DVR_RealPlay_V40 函數,而我以及官網的Demo卻又是V30 函數。

但是Java的HCNetSDK 定義中卻沒有此函數,當時以爲他們不支持,無奈,只好再次求教SDK的技術郵箱。

得到的回覆是:


另外給了一個他們自己的IP通道的Demo, 正是這個Demo解決了問題。

因爲界面給的Demo程序是可以預覽的,不會出現9或者4的錯誤。查下代碼發現問題是出現在通道號上。

由於是IP通道,所以默認我們都會把通道號加上32。

但是也有情況不加32的,我們這次遇到了就是從1開始的,坑,坑,坑。

他們給的Demo查找出他們遍歷NVR設備的代碼。

for(int iChannum =0; iChannum < HCNetSDK.MAX_IP_CHANNEL; iChannum++)
{
     if(m_strIpparaCfg.struStreamMode[iChannum].byGetStreamType ==0)
     {
         m_strIpparaCfg.struStreamMode[iChannum].uGetStream.setType(HCNetSDK.NET_DVR_IPCHANINFO.class);
         m_strIpparaCfg.struStreamMode[iChannum].uGetStream.read();
         if (m_strIpparaCfg.struStreamMode[iChannum].uGetStream.struChanInfo.byEnable == 1)
         {
             DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("IPCamera" + (iChannum + m_strDeviceInfo.byStartDChan));
            TreeModel.insertNodeInto(newNode, m_DeviceRoot, m_iTreeNodeNum);
         }
     }
     if(m_strIpparaCfg.struStreamMode[iChannum].byGetStreamType ==6)
     {
         m_strIpparaCfg.struStreamMode[iChannum].uGetStream.setType(HCNetSDK.NET_DVR_IPCHANINFO_V40.class);
         m_strIpparaCfg.struStreamMode[iChannum].uGetStream.read();
         if (m_strIpparaCfg.struStreamMode[iChannum].uGetStream.struIPChan.byEnable == 1)
         {
             DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("IPCamera" + (iChannum + m_strDeviceInfo.byStartDChan));
            TreeModel.insertNodeInto(newNode, m_DeviceRoot, m_iTreeNodeNum);
         }
     }
    
}

"IPCamera" + (iChannum + m_strDeviceInfo.byStartDChan)

所以通道號是由設備的byStartDChan 決定起始位置的。之前我們遇到的都是32,而今天遇到的這個值卻是1。所以就出現了上述現象。

通過這件事情,總結下下面幾點:

  1. 海康的Demo不全,特別是對於C#,Java 的支持嚴重不足。
  2. 遇到問題先用4200軟件,以及官方的clinetDemo.exe 軟件試一試。
  3. 還是解決不了問題,一定要及時向SDK的技術郵箱尋問。

最後還有個問題,爲什麼有些例子已經有了,海康就是不把它整體更新到SDK的Demo中,非要我們遇到問題了,寫郵件才提供出來。之前與海康的售後溝通過,SDK開發人員比較混亂,技術棧比較落後,可能是真的吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章