最新看海康设备SDK demo,感觉有点问题,现在把它记录写下来,做个记录。这个事情从本质上来说,不值得说,但还是详细分享一下。

BOOL CRealPlayDlg::DoLogin()
{UpdateData(TRUE);CString DeviceIp;BYTE nField0,nField1,nField2,nField3; m_ctrlDevIp.GetAddress(nField0,nField1,nField2,nField3);DeviceIp.Format("%d.%d.%d.%d",nField0,nField1,nField2,nField3);NET_DVR_DEVICEINFO_V30 DeviceInfoTmp;memset(&DeviceInfoTmp,0,sizeof(NET_DVR_DEVICEINFO_V30));LONG lLoginID = NET_DVR_Login_V30(DeviceIp.GetBuffer(DeviceIp.GetLength()),m_nDevPort, \m_csUser.GetBuffer(m_csUser.GetLength()),m_csPWD.GetBuffer(m_csPWD.GetLength()),&DeviceInfoTmp);if(lLoginID == -1){MessageBox("Login to Device failed!\n");return FALSE;}m_struDeviceInfo.lLoginID = lLoginID;m_struDeviceInfo.iDeviceChanNum = DeviceInfoTmp.byChanNum;m_struDeviceInfo.iIPChanNum = DeviceInfoTmp.byIPChanNum;m_struDeviceInfo.iStartChan  = DeviceInfoTmp.byStartChan;m_struDeviceInfo.iIPStartChan  = DeviceInfoTmp.byStartDChan;return TRUE;
}

其中NET_DVR_Login_V30,这个接口是登陆设备的时候调用的,只要是登陆设备成功就能知道设备是否支持IP通道。查看NET_DVR_Login_V30中结构体NET_DVR_DEVICEINFO_V30,有个byIPChanNum参数,这个参数表示设备最大数字通道个数,低8位,高8位见byHighDChanNum。可以根据IP通道个数来判断是否调用NET_DVR_GetDVRConfig(配置命令NET_DVR_GET_IPPARACFG_V40)获取模拟和数字通道相关参数(NET_DVR_IPPARACFG_V40)。如果是这个参数不为0的情况下,才能说明这个设备是支持IP通道的。在支持设备通道的情况下,再去NET_DVR_GetDVRConfig这个接口,可以获得IP通道相关信息,这次是正确的方法。而在demo中写的就是有点问题,没有进行判断是否支持IP通道就直接调用NET_DVR_GetDVRConfig这个接口。

void CRealPlayDlg::OnButtonLogin()
{if(!m_bIsLogin)    //login{if(!DoLogin())return;DoGetDeviceResoureCfg();  //获取设备资源信息   CreateDeviceTree();        //创建通道树GetDecoderCfg();                           //获取云台解码器信息InitDecoderReferCtrl();         //初始化解码器相关控件      GetDlgItem(IDC_BUTTON_LOGIN)->SetWindowText("Logout");m_bIsLogin = TRUE;}else      //logout{if(m_bIsPlaying|| m_bIsRecording){MessageBox("Stop Play or record first!");return;}NET_DVR_Logout_V30(m_struDeviceInfo.lLoginID); GetDlgItem(IDC_BUTTON_LOGIN)->SetWindowText("Login");m_ctrlTreeChan.DeleteAllItems();m_struDeviceInfo.lLoginID = -1;m_bIsLogin = FALSE;}
}

其中DoGetDeviceResoureCfg();  //获取设备资源信息,这个是获取IP通道的设备,在这个里面调用NET_DVR_GetDVRConfig。

/*************************************************
函数名:        DoGetDeviceResoureCfg
函数描述:   获取设备的通道资源
输入参数:
输出参数:
返回值:
**************************************************/
void CRealPlayDlg::DoGetDeviceResoureCfg()
{NET_DVR_IPPARACFG_V40 IpAccessCfg;memset(&IpAccessCfg,0,sizeof(IpAccessCfg));  DWORD  dwReturned;m_struDeviceInfo.bIPRet = NET_DVR_GetDVRConfig(m_struDeviceInfo.lLoginID,NET_DVR_GET_IPPARACFG_V40,0,&IpAccessCfg,sizeof(NET_DVR_IPPARACFG_V40),&dwReturned);int i;if(!m_struDeviceInfo.bIPRet)   //不支持ip接入,9000以下设备不支持禁用模拟通道{for(i=0; i<MAX_ANALOG_CHANNUM; i++){if (i < m_struDeviceInfo.iDeviceChanNum){sprintf(m_struDeviceInfo.struChanInfo[i].chChanName,"camera%d",i+m_struDeviceInfo.iStartChan);m_struDeviceInfo.struChanInfo[i].iChanIndex=i+m_struDeviceInfo.iStartChan;  //通道号m_struDeviceInfo.struChanInfo[i].bEnable = TRUE;}else{m_struDeviceInfo.struChanInfo[i].iChanIndex = -1;m_struDeviceInfo.struChanInfo[i].bEnable = FALSE;sprintf(m_struDeviceInfo.struChanInfo[i].chChanName, "");   }}}else        //支持IP接入,9000设备{for(i=0; i<MAX_ANALOG_CHANNUM; i++)  //模拟通道{if (i < m_struDeviceInfo.iDeviceChanNum){sprintf(m_struDeviceInfo.struChanInfo[i].chChanName,"camera%d",i+m_struDeviceInfo.iStartChan);m_struDeviceInfo.struChanInfo[i].iChanIndex=i+m_struDeviceInfo.iStartChan;if(IpAccessCfg.byAnalogChanEnable[i]){m_struDeviceInfo.struChanInfo[i].bEnable = TRUE;}else{m_struDeviceInfo.struChanInfo[i].bEnable = FALSE;}}else//clear the state of other channel{m_struDeviceInfo.struChanInfo[i].iChanIndex = -1;m_struDeviceInfo.struChanInfo[i].bEnable = FALSE;sprintf(m_struDeviceInfo.struChanInfo[i].chChanName, "");    }       }//数字通道for(i=0; i<MAX_IP_CHANNEL; i++){if(IpAccessCfg.struStreamMode[i].uGetStream.struChanInfo.byEnable)  //ip通道在线{m_struDeviceInfo.struChanInfo[i+MAX_ANALOG_CHANNUM].bEnable = TRUE;m_struDeviceInfo.struChanInfo[i+MAX_ANALOG_CHANNUM].iChanIndex = i+IpAccessCfg.dwStartDChan;sprintf(m_struDeviceInfo.struChanInfo[i+MAX_ANALOG_CHANNUM].chChanName,"IP Camera %d",i+1);}else{m_struDeviceInfo.struChanInfo[i+MAX_ANALOG_CHANNUM].bEnable = FALSE;m_struDeviceInfo.struChanInfo[i+MAX_ANALOG_CHANNUM].iChanIndex = -1;}}}}

这个代码看起来都是正确的,但是在下面函数中调用是有瑕疵的,

m_struDeviceInfo.bIPRet = NET_DVR_GetDVRConfig(m_struDeviceInfo.lLoginID,NET_DVR_GET_IPPARACFG_V40,0,&IpAccessCfg,sizeof(NET_DVR_IPPARACFG_V40),&dwReturned);

应该是

m_struDeviceInfo.bIPRet = ( m_struDeviceInfo.iIPChanNum ==0)? (false:true);

这样就能知道是否支持IP通道,在支持IP通道的情况下,再次调用NET_DVR_GetDVRConfig,才是最稳妥的。

其次还有个问题要搞清楚,就是NET_DVR_GetDVRConfig这个函数返回的结果true或者false,是说明函数是否调用成功的,与其是否支持IP通道不存在必然关系,虽然最后的返回结果可以用来表示设备是否支持IP通道。

多说两句,虽然这个事情很小,但是接口在调用的时候,还是要遵守其说明文档来使用。不要总说,最后能达到目标就行了。话虽如此,我自己是不希望当别人去维护我的代码,看到我写的代码或者设计方案,第一反应就是这个是哪个傻蛋写的,看起来就像刚刚毕业的学生写的。当你工作了好几年了,已不在年轻,但是做的事情还像初出茅庐的时候,那样不觉得可笑吗?

海康威视设备SDK调用,是否支持IP通道的思考相关推荐

  1. 海康威视错误代码0xf_调用海康威视sdk获取车牌号

    环境: win10(10.0.16299.0)+ vs2017 sdk版本:CH-HCNetSDK_Win32_V5.3.2.15_build20171122https://download.csdn ...

  2. 海康威视 设备网络SDK

    海康威视 设备网络SDK 运行clientDemo时,报 java.lang.UnsatisfiedLinkError: Unable to load library 'PlayCtrl': ???? ...

  3. WIZnet芯片和支持IP分片的设备通讯的时候怎么办?

    解决方案: 所谓的IP分片是指:当IP数据报超过帧的MTU(最大传输单元)时,它将会被分片传输.分片能发生在发送端或者中转路由器,且在传输过程中可能被多次分片.在最后的目标机器上这些分片才会被内核的的 ...

  4. 海康威视工业相机SDK二次开发(VS+Opencv+QT+海康SDK+C++)(一)

    最近在做一个项目,涉及到工业相机,需要对其进行二次开发.相机方面选择了海康威视,网上关于海康威视工业相机SDK的开发资料很少,官方文档里面虽然写的是支持C++开发的,但其实是C.自己也摸索了一段时间, ...

  5. Linux环境中对海康威视工业相机SDK进行二次开发(QT+CMake+Opencv+海康SDK)

    关于在Windows环境中对海康威视工业相机SDK进行二次开发的话,可以参考这两篇博客. 海康威视工业相机SDK二次开发(VS+Opencv+QT+海康SDK+C++)(一) 海康威视工业相机SDK二 ...

  6. 海康威视摄像机SDK二次开发--指定云台位置,焦距放大倍数,拍摄时长,并拆分保存为视频文件

    按照config.txt配置,出现的效果是有几组参数就录制几个视频,视频时长按照配置文件录制 config.txt的内容,请参照海康威视摄像机SDK二次开发–实时预览视频流保存到指定文件中 java实 ...

  7. Android 集成海康威视监控 SDK,实现监控录像的查看

    Android 集成海康威视监控 SDK,实现监控录像的查看 配置 切换Android studio 到project目录下,分别将jar包与armeabi包复制进去lib文件夹下: 设置app bu ...

  8. ubuntu 通过 海康sdk调用摄像头抓图片

    https://blog.csdn.net/ding977921830/article/details/75272384 在本文中我的电脑是使用的Ubuntu16.04 64位,使用工具是QT5.7. ...

  9. 海康威视摄像机SDK二次开发--提取音频保存至文件

    由于最近在开发海康威视摄像头,特此记录一下如何提取音频数据,这里主要依靠语音对讲返回的音频数据,通过回调函数写入文件中,加个WAV头即可播放,编码格式可以自己设置在代码中有注释 文件结构 其中Came ...

最新文章

  1. 学习 ARM 系列 -- FS2410 开发板上 Nand Flash 到内存的代码搬移
  2. wifi信号桥怎么设置_iPhone信号差怎么办?这样设置,信号满分,网速如飞
  3. Ctrl+E快捷键,一键批量解决Excel中90%的问题!
  4. Java Web编程的主要组件技术——MVC设计模式
  5. 寒霜朋克计算机丢失,寒霜朋克玩不了怎么办 寒霜朋克进不去解决方法
  6. java宋江,Java编程内功-数据结构与算法「单链表」,
  7. shell 删除七日内日志_SHELL脚本:定期清理日志文件
  8. android获取程序名称,Android获取应用程序名称(ApplicationName)示例
  9. 110道Java初级面试题及答案(最新Java初级面试题大汇总)
  10. i350在linux系统刷MAC,MAC 10.14 安装教程10-基于黑果小兵大神EFI文件的修改过程
  11. 极光推送java demo_极光推送JAVA代码示例
  12. 程序员电脑屏保画面,显示时间
  13. 用C语言实现FlappyBird
  14. Grasshopper显示配色
  15. 召唤神龙~让我们来看看源码及简单的修改分析,讲的很清楚哦
  16. mx450属于什么档次的显卡
  17. 解决studio 3T时间到期方法
  18. 2020 0414对象的多态
  19. 中高级Java开发应该要了解!我用2个月的时间破茧成蝶,醍醐灌顶!
  20. Virtual Private Network虚拟专用网

热门文章

  1. elasticsearch 基础 —— _mget取回多个文档及_bulk批量操作
  2. 计算机环境安全容器服务未启动怎么解决,音频服务未运行|音频服务未启动 - 音频服务未运行的解决办法 - 安全专题...
  3. C++编程 打印三角形的各种玩法
  4. 在java中,OOA是什么?OOD是什么?OOP是什么?
  5. Jmeter录制接口自动化
  6. 关闭中国电信的绿色上网服务
  7. 为什么相同资源 IDM 感觉比迅雷快好多?
  8. 反转链表——《剑指offer》
  9. TCGA各种肿瘤数据的20多种不同玩法/挖掘方法
  10. 「常见面试题」Java基础之IO模型连环炮