海康的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开发人员比较混乱,技术栈比较落后,可能是真的吧。

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