最新看海康设备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. 2097352GB地图数据,AI技术酷炫渲染,《微软飞行模拟器》游戏即将上线
  2. 做完小程序项目、老板给我加了6k薪资~
  3. 科大讯飞年报出炉,2018每天赚148万元,53%是政府补助
  4. 【未来研究】城市云脑是互联网云脑的节点,城市云脑之间如何互补与支撑
  5. SharePoint 2007 SDK v1.5
  6. DDos攻击的一些领域知识——(流量模型针对稳定业务比较有效)不稳定业务采用流量成本的检测算法,攻击发生的时候网络中各个协议的占比发生了明显的变化...
  7. Failed to convert property value of type java.lang.String to required type java.lang.Integer for pro
  8. MySQL【案例讲解】分组函数
  9. Python爬虫(二十一)_Selenium与PhantomJS
  10. 用正则表达式抓取网络连接的简单实现
  11. 基础集合论 第一章 7 交集 8 差集
  12. ArcGIS制图之地形图制作
  13. win7 无线网卡无法连接,启动wlan autoconfig 服务报错误1:函数不正确
  14. jQuery02(达)
  15. 算法笔记方法论4 枚举法 详细笔记
  16. 如何参与淘宝活动?活动怎样做才能快速爆单?
  17. 测试前置条件及测试点
  18. mybatis拦截器实现update之前根据pk字段校验数据有效性
  19. python高级绘图师_matplotlib库-python中的绘图师
  20. 中国红牛新生产基地投入使用,东北第一条新生产线建成

热门文章

  1. python tuple基本用法
  2. 腾讯笔试:满二叉排序树问题
  3. Go 语言重要知识点:字符串、UTF-8 编码、rune
  4. 基于JAVA学生信息管理和新生报到系统(Springboot框架) 开题报告
  5. AI换脸教程——DeepFaceLab_NVIDIA_RTX3000_series
  6. Python+pymupdf处理PDF文档案例6则
  7. 云台山风景区,来安化邂逅最美的景色
  8. matlab 实现向量归一化,向量X的归一化及其Matlab简单示例
  9. data在python_python中的data[:, :-1]和data[:, -1]什么意思?
  10. 词频统计(30 分)