正常情况下,知道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。所以就出现了上述现象。
通过这件事情,总结下下面几点:
- 海康的Demo不全,特别是对于C#,Java 的支持严重不足。
- 遇到问题先用4200软件,以及官方的clinetDemo.exe 软件试一试。
- 还是解决不了问题,一定要及时向SDK的技术邮箱寻问。
最后还有个问题,为什么有些例子已经有了,海康就是不把它整体更新到SDK的Demo中,非要我们遇到问题了,写邮件才提供出来。之前与海康的售后沟通过,SDK开发人员比较混乱,技术栈比较落后,可能是真的吧。