海康威视设备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 ...
最新文章
- 2097352GB地图数据,AI技术酷炫渲染,《微软飞行模拟器》游戏即将上线
- 做完小程序项目、老板给我加了6k薪资~
- 科大讯飞年报出炉,2018每天赚148万元,53%是政府补助
- 【未来研究】城市云脑是互联网云脑的节点,城市云脑之间如何互补与支撑
- SharePoint 2007 SDK v1.5
- DDos攻击的一些领域知识——(流量模型针对稳定业务比较有效)不稳定业务采用流量成本的检测算法,攻击发生的时候网络中各个协议的占比发生了明显的变化...
- Failed to convert property value of type java.lang.String to required type java.lang.Integer for pro
- MySQL【案例讲解】分组函数
- Python爬虫(二十一)_Selenium与PhantomJS
- 用正则表达式抓取网络连接的简单实现
- 基础集合论 第一章 7 交集 8 差集
- ArcGIS制图之地形图制作
- win7 无线网卡无法连接,启动wlan autoconfig 服务报错误1:函数不正确
- jQuery02(达)
- 算法笔记方法论4 枚举法 详细笔记
- 如何参与淘宝活动?活动怎样做才能快速爆单?
- 测试前置条件及测试点
- mybatis拦截器实现update之前根据pk字段校验数据有效性
- python高级绘图师_matplotlib库-python中的绘图师
- 中国红牛新生产基地投入使用,东北第一条新生产线建成
热门文章
- python tuple基本用法
- 腾讯笔试:满二叉排序树问题
- Go 语言重要知识点:字符串、UTF-8 编码、rune
- 基于JAVA学生信息管理和新生报到系统(Springboot框架) 开题报告
- AI换脸教程——DeepFaceLab_NVIDIA_RTX3000_series
- Python+pymupdf处理PDF文档案例6则
- 云台山风景区,来安化邂逅最美的景色
- matlab 实现向量归一化,向量X的归一化及其Matlab简单示例
- data在python_python中的data[:, :-1]和data[:, -1]什么意思?
- 词频统计(30 分)