海康威视设备SDK调用,是否支持IP通道的思考
最新看海康设备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通道的思考相关推荐
- 海康威视错误代码0xf_调用海康威视sdk获取车牌号
环境: win10(10.0.16299.0)+ vs2017 sdk版本:CH-HCNetSDK_Win32_V5.3.2.15_build20171122https://download.csdn ...
- 海康威视 设备网络SDK
海康威视 设备网络SDK 运行clientDemo时,报 java.lang.UnsatisfiedLinkError: Unable to load library 'PlayCtrl': ???? ...
- WIZnet芯片和支持IP分片的设备通讯的时候怎么办?
解决方案: 所谓的IP分片是指:当IP数据报超过帧的MTU(最大传输单元)时,它将会被分片传输.分片能发生在发送端或者中转路由器,且在传输过程中可能被多次分片.在最后的目标机器上这些分片才会被内核的的 ...
- 海康威视工业相机SDK二次开发(VS+Opencv+QT+海康SDK+C++)(一)
最近在做一个项目,涉及到工业相机,需要对其进行二次开发.相机方面选择了海康威视,网上关于海康威视工业相机SDK的开发资料很少,官方文档里面虽然写的是支持C++开发的,但其实是C.自己也摸索了一段时间, ...
- Linux环境中对海康威视工业相机SDK进行二次开发(QT+CMake+Opencv+海康SDK)
关于在Windows环境中对海康威视工业相机SDK进行二次开发的话,可以参考这两篇博客. 海康威视工业相机SDK二次开发(VS+Opencv+QT+海康SDK+C++)(一) 海康威视工业相机SDK二 ...
- 海康威视摄像机SDK二次开发--指定云台位置,焦距放大倍数,拍摄时长,并拆分保存为视频文件
按照config.txt配置,出现的效果是有几组参数就录制几个视频,视频时长按照配置文件录制 config.txt的内容,请参照海康威视摄像机SDK二次开发–实时预览视频流保存到指定文件中 java实 ...
- Android 集成海康威视监控 SDK,实现监控录像的查看
Android 集成海康威视监控 SDK,实现监控录像的查看 配置 切换Android studio 到project目录下,分别将jar包与armeabi包复制进去lib文件夹下: 设置app bu ...
- ubuntu 通过 海康sdk调用摄像头抓图片
https://blog.csdn.net/ding977921830/article/details/75272384 在本文中我的电脑是使用的Ubuntu16.04 64位,使用工具是QT5.7. ...
- 海康威视摄像机SDK二次开发--提取音频保存至文件
由于最近在开发海康威视摄像头,特此记录一下如何提取音频数据,这里主要依靠语音对讲返回的音频数据,通过回调函数写入文件中,加个WAV头即可播放,编码格式可以自己设置在代码中有注释 文件结构 其中Came ...
最新文章
- 学习 ARM 系列 -- FS2410 开发板上 Nand Flash 到内存的代码搬移
- wifi信号桥怎么设置_iPhone信号差怎么办?这样设置,信号满分,网速如飞
- Ctrl+E快捷键,一键批量解决Excel中90%的问题!
- Java Web编程的主要组件技术——MVC设计模式
- 寒霜朋克计算机丢失,寒霜朋克玩不了怎么办 寒霜朋克进不去解决方法
- java宋江,Java编程内功-数据结构与算法「单链表」,
- shell 删除七日内日志_SHELL脚本:定期清理日志文件
- android获取程序名称,Android获取应用程序名称(ApplicationName)示例
- 110道Java初级面试题及答案(最新Java初级面试题大汇总)
- i350在linux系统刷MAC,MAC 10.14 安装教程10-基于黑果小兵大神EFI文件的修改过程
- 极光推送java demo_极光推送JAVA代码示例
- 程序员电脑屏保画面,显示时间
- 用C语言实现FlappyBird
- Grasshopper显示配色
- 召唤神龙~让我们来看看源码及简单的修改分析,讲的很清楚哦
- mx450属于什么档次的显卡
- 解决studio 3T时间到期方法
- 2020 0414对象的多态
- 中高级Java开发应该要了解!我用2个月的时间破茧成蝶,醍醐灌顶!
- Virtual Private Network虚拟专用网
热门文章
- elasticsearch 基础 —— _mget取回多个文档及_bulk批量操作
- 计算机环境安全容器服务未启动怎么解决,音频服务未运行|音频服务未启动 - 音频服务未运行的解决办法 - 安全专题...
- C++编程 打印三角形的各种玩法
- 在java中,OOA是什么?OOD是什么?OOP是什么?
- Jmeter录制接口自动化
- 关闭中国电信的绿色上网服务
- 为什么相同资源 IDM 感觉比迅雷快好多?
- 反转链表——《剑指offer》
- TCGA各种肿瘤数据的20多种不同玩法/挖掘方法
- 「常见面试题」Java基础之IO模型连环炮