本文为转载文章,文章出处为:https://www.cnblogs.com/rongpmcu/p/10351204.html

如果有侵权请及时联系删除,如想转载请先去联系原作者

onvif客户端

前言

做开发有8年时间了,ffmpeg和onvif与我是特别有缘的了(说着玩的,我更认为是因为他们确实强大^_^)。 ffmpeg在毕业设计时就有用到,5年后做windows、linux播放库时又有用到,于是又重新研究!!! onvif是我在毕业第二年的时候,有从0开始写过一个onvif服务端NVT,没想到6年后,项目中的客户端又需要用到它!!!其实本来不想开发它的,但是因为客户端依赖的onvif部分是别人的库,我们需要onvif抓图功能,结果对方没时间做,也不愿意把代码开放给我们,我特郁闷,这个又没什么技术含量,没必要当个宝藏着吧! 于是花了一周时间开发了自己的onvif客户端(这里不是从0开发,而是基于现有的开源onvif客户端开发的)。

onvif客户端开发过程

开发这类东西一般有两条路可选择,要么从0开始编码(当然,也不全是从0开始,可以基于onvif的wsdl来生成一些调用类,这样至少不用自己实现底层通讯及协议封装了,更多的只是为上层接口具体功能做封装,填充结构成员,调用对应的方法等),要么基于现有的开源代码进行改进,完善(开源的代码一般也是通过从wsdl生成的代码为基础而做的封装)。我通常会先尝试后者,没有合适的开源代码可参考时,才会从0开始编码,没必要发明轮子。下面记录下我的开发过程。

首先,用搜索引擎搜索onvif客户端,去github或者gitlab上搜索onvif客户端,从找到的结果中刷选出一些可能合适的,我最开始得出以下可能:

  • onvif-qt-server-client
  • qt-onvif-client
  • clientlib
  • OnvifClient
  • ONVIF Device Manager
  • rapidonvif

我主要的过滤条件包括:

  1. 我们项目是C++的,我希望是onvif客户端库也是c/c++开发的
  2. 我希望该onvif库的最后维护时间尽可能新,因为onvif有很多版本,不同版本的wsdl生成的最终文件包含的功能有很大不同
  3. 能够在1天内编译通过该开源的代码,因为很多开源的项目不够完善,别人很难很快的将其用起来
  4. 代码写的尽量的标准、规范,换句话说,要写的好看

经过以上几个过滤实施后,我选择了 rapidonvif,它是c++开发的,而且和最新的onvif几乎同步,也是一次就编译通过了,通过简单的代码阅读,觉得代码写的挺漂亮的^_^

进一步了解代码后,发现rapidonvif所提供的开源部分只是包含了onvif客户端的开发框架,很多功能都没有完全实现,但是很容易的进行完善,这得益于它漂亮的代码编写!这里简单的描述下我二次开发的过程,目录结构图如下:

onvif客户端功能的核心部分都是在onvifgen目录里面实现的(当然,很多都没写完,但是很容易补充全),它对应了onvifcpplib工程,生成onvifclient.lib静态库
example\client\onvifclientwin32里面包含了一个onvifclient.lib静态库对应的测试demo

分析出以上两部分之后,就可以得出二次开发的方案了,我采用的修改example\client\onvifclientwin32,将它变成自己onvif客户端对外的导出层,将编译生成exe改成生成dll,然后根据需求完善onvifcpplib。

举例说明1:onvif搜索实现

搜索的实现是通过OnvifClientSearch类来完成的,该类已定义,但是功能需要自己补充,对应的头文件onvifclientsearch.hpp,它内部是通过wsddProxy代理来实现搜索的,该代理封装了soap,代理部分的大部分功能这个开源库已经实现了,也就是说学会怎么使用该类即可。

举例说明2:onvif ptz实现

ptz的实现是通过OnvifClientPTZ类来完成的,该类已定义,但是功能需要自己补充,对应的头文件onvifclientptz.hpp,它内部是通过PTZBindingProxy代理来实现ptz控制的,该代理封装了soap,代理部分的大部分功能这个开源库已经实现了,也就是说学会怎么使用该类即可。因此,好消息是onvif ptz协议部分基本已经实现,我们要做的就是根据PTZBindingProxy类实现一些ptz方法,然后补充到OnvifClientPTZ类中。

举例说明3:onvif 抓图实现

抓图的实现是通过OnvifClientMedia类来完成的,该类已定义,但是功能需要自己补充,对应的头文件onvifclientmedia.hpp,它内部是通过MediaBindingProxy代理来实现ptz控制的,该代理封装了soap,代理部分的大部分功能这个开源库已经实现了,也就是说学会怎么使用该类即可。我们主要需要通过onvif协议获取抓图uri,然后通过http去这个uri取抓图的数据即可。参考实现如下:

inline int OnvifClientMedia::GetSnapshotUri(_trt__GetSnapshotUriResponse &SnapshotUriResponse,string profileToken)
{string strUrl;string strUser;string strPass;if (m_Device.GetUserPasswd(strUser, strPass) == false || m_Device.GetMediaUrl(strUrl) == false){return SOAP_ERR;}mediaProxy.soap_endpoint =  strUrl.c_str();soap_wsse_add_Security(&mediaProxy);soap_wsse_add_UsernameTokenDigest(&mediaProxy, "Id", strUser.c_str() , strPass.c_str());_trt__GetSnapshotUri SnapshotUriReq;SnapshotUriReq.ProfileToken = profileToken;return mediaProxy.GetSnapshotUri(&SnapshotUriReq, &SnapshotUriResponse);
}

总结

我的onvif客户端的实现没有从0开始,而是采用基于rapidonvif二次开发实现的,该开源的代码写的非常漂亮,且onvif的功能也实现的非常全,同时,要扩展自己的功能的操作也是那固定的几步,因此我认为用它作为自己onvif客户端实现是非常适合的。


    毕业那两年在做嵌入式应用开发,主要是单片机和arm linux上的应用开发,后来又做了两年arm linux驱动开发,15年到现在在做pc端及嵌入式端开发,包括服务器系统裁剪、底层框架实现、硬件加速等。喜欢技术分享、交流!联系方式: 907882971@qq.com、rongpmcu@gmail.com

本文为转载文章,文章出处为:https://www.cnblogs.com/rongpmcu/p/10351204.html

如果有侵权请及时联系删除,如想转载请先去联系原作者

onvif客户端(转载)相关推荐

  1. ONVIF客户端搜索设备获取rtsp地址开发笔记(精华篇)

    概要:   目前ONVIF协议家族设备已占据数字监控行业半壁江山以上,亲,作为开发者的你还在犹豫是否了解下吗?本文介绍了ONVIF客户端从设备搜索,鉴权,能力获取,媒体信息获取,URI地址获取的整套流 ...

  2. 【视频开发】ONVIF客户端搜索设备获取rtsp地址开发笔记(精华篇)

    转载地址:http://blog.csdn.net/gubenpeiyuan/article/details/25618177 概要:           目前ONVIF协议家族设备已占据数字监控行业 ...

  3. onvif学习笔记8:最近写的一个ONVIF客户端的心得小结

    最近,利用业余时间编写一个简单的ONVIF客户端MFC程序,这里记录一下过程. 语言选择 在之前调查过,有用QT实现的,有用python实现的,虽然正在学python,无奈才看了3天的书,没自信去搞. ...

  4. Go语言实现Onvif客户端:9、预置点删改查及跳转

    Go语言实现Onvif客户端:9.预置点删改查及跳转 文章目录 Go语言实现Onvif客户端:9.预置点删改查及跳转 1.前言 2.代码 3.结果 1.前言 我们可以根据摄像头的所拍的位置设置预置点. ...

  5. Go语言实现Onvif客户端:8、摄像头PTZ控制(云台控制)

    Go语言实现Onvif客户端:8.摄像头PTZ控制(云台控制) 文章目录 Go语言实现Onvif客户端:8.摄像头PTZ控制(云台控制) 1.PTZ简单再介绍 2.代码 3.结果 1.PTZ简单再介绍 ...

  6. onvif 客户端 linux,Linux下onvif客户端关于ipc摄像头的搜索

    设备搜索:要访问一个IPC摄像头,或者说要调用IPC摄像头提供的WEB服务接口,就要先知道其IP地址,这就是设备发现的过程,或者叫设备搜索的过程.IPC摄像头用的是239.255.255.250(端口 ...

  7. onvif 客户端的发现

    1.解压:unzip -X gsoap_2.8.10.zip 编译 2.下载: wget http://www.onvif.org/onvif/ver10/network/wsdl/remotedis ...

  8. linux c 读取摄像头,Linux下onvif客户端获取ipc摄像头 获取能力:GetCapabilities

    getcapabilities:获取能力,主要目的获取设备能力信息(获取媒体服务地址) 鉴权:但是在调用获取设备能力之前是需要鉴权的.onvif协议规定,部分接口需要鉴权,部分接口不需要鉴权,在调用需 ...

  9. onvif 客户端发现

    1.解压:unzip -X gsoap_2.8.10.zip 编译 2.下载: wget http://www.onvif.org/onvif/ver10/network/wsdl/remotedis ...

最新文章

  1. 李德毅院士:通用人工智能十问
  2. 骂骂咧咧的 fastreport 数据隔行换色
  3. 织梦ajax表单提交参数错误,【织梦二次开发】织梦jquery+ajax方式提交自定义表单...
  4. 如何避免JDBC内存溢出问题
  5. python读取多行json_如何在Python中读取包含多个JSON对象的JSON文件?
  6. c语言水仙桃树编程,辰颐物语编辑部整理:春季适合种植哪些花卉品种?樱花和桃花怎么区分?...
  7. 景安mysql主机_景安虚拟主机使用教程
  8. 出售永磁同步电机(pmsm)模型预测控制(MPC)matlab/simulink仿真模型,转速控制,电流控制,转矩控制,直接预测控制(有限集模型预测控制)(这单矢量和双矢量,三矢量),无差拍,foc矢
  9. 『深度实战』天池小目标检测大赛·宫颈癌风险智能诊断推荐
  10. 草稿cfmm~yuyu 22.9.26 Linux
  11. 专家访谈:Flex技术对web开发的影响
  12. 越努力越幸福—2015年度总结
  13. CVPR2017-如何在无标签数据集上训练模型
  14. 2022-2028全球与中国语音遥控器市场现状及未来发展趋势
  15. 三相永磁同步电机PMSM仿真 simulink仿真 永磁同步电机仿真,PI调节器
  16. 物联网项目(五)下单渠道
  17. WTD UI自动化和接口测试开发文档
  18. STM32入门开发--LED模块实现跑马灯
  19. 山东大学往年c语言期末试题及答案,山东大学历年C语言题库.doc
  20. 盘棋析解之”Emag eht htiw Em Pleh“

热门文章

  1. Mac应用和命令推荐
  2. 期末复习——晶体学基础(一)
  3. 一次索引搞定的调优例子
  4. 图像抖动(加入随机噪声+矩阵有序抖动)Java实现,不使用OpenCV 按照课堂中讲的两种抖动(Dithering)方法,自己编程实现(编程语言不限)。实现方法一:以加入随机噪声的方式保留信息
  5. 零基础入门数据挖掘——二手车交易价格预测:baseline
  6. React Native 之组件的定义
  7. 继红杉、诺亚撤资后,还呗解散线下业务
  8. 开博尔android播放器,开博尔q50评测 | 开博尔q50播放器评测_什么值得买
  9. 高德地图水波纹覆盖物+点击覆盖物切换弹窗显示与隐藏
  10. 2022R1快开门式压力容器操作考试试题及在线模拟考试