了解 ONVIF 规范和版本
Understanding ONVIF specifications and versions
我的目标是为 onvif ptz 摄像机编写一个客户端,以便我可以查看数据(平移/倾斜/摄像机/镜头值(、发送控制命令和查看视频。 我将 C++/gsoap 与安讯士摄像机一起使用时取得了一定的成功。然后我用另一家公司的相机尝试了一下,但没有用。我相信问题是因为其他相机使用不同版本的"东西"——我不确定它是不同的架构、不同的配置文件版本、不同版本的 ONVIF 还是不同版本的 soap。
我想创建一个支持任何ONVIF相机的客户端,或者至少支持其中的绝大多数。我不想说"对不起,您的相机已经使用了 1 年,并且不再支持该协议"。
我正在使用onvifcpplib,它似乎已经被放弃了一段时间,现在它的gitbhub项目转发到Rapidonvif,看起来完全不同。
近两天来,我一直在研究ONVIF,并试图弄清楚这将需要什么。如果我去这里:https://www.onvif.org/profiles/specifications/specification-history/我看到不少于18个不同的规格版本!
这个版本似乎会影响 wsdl 文件版本,所以例如我可以看到这里有一个媒体 wsdl 的 1.0 版本:http://www.onvif.org/ver10/media/wsdl/media.wsdl ...但是这里也有相同文件的2.0版本:http://www.onvif.org/ver20/media/wsdl/media.wsdl .
而且我不认为它们是向后兼容的。 但是我找不到 2.6 的一个 - 所以: http://www.onvif.org/ver26/media/wsdl/media.wsdl 不存在。
这只是我需要使用 gsoap 的 15 个 wsdl 文件之一。
我真的很困惑该怎么做。有没有ONVIF专家可以帮助我解决其中一些问题?
问题1(是否有一个主列表或其他东西告诉我作为客户端编写者我必须支持哪些 wsdl 版本,哪些版本不向后兼容? 尝试所有 18 个版本与所有 15 个 wsdl 文件的所有可能排列将花费很长时间! 其中一些可能是向后兼容的,而另一些则不是 - 我怎么知道哪些是哪些?
问题2(除了网络接口规格之外,还有不同的配置文件版本。其中一些也不向后兼容吗?
问题3(除了网络接口规范和配置文件版本之外,还有多个版本的 SOAP - 1.1 和 1.2。我是否需要担心某些相机使用 1.1,或者 ONVIF 是否总是使用 1.2?
问题4(我应该如何使用 gsoap 编译多个版本?例如,如果我在 ptz wsdl 的 1.0 和 2.0 版本中使用 wsdl2h,然后尝试将两者包含在同一个项目中,就会发生冲突。我不想对用户说...抱歉,但您必须研究并找出您的相机是否使用 ONVIF 版本,因此您必须使用其他可执行文件或插件。
问题5(即使我能够在同一应用程序中编译多个版本,我如何知道在连接到特定相机时使用哪个版本?我是否查询相机并说"你是哪个版本?好的,您正在使用此特定版本和配置文件,所以我将使用这组命令"?
问题6(有这么多的变化和版本,究竟如何期望编写一个支持大多数相机的ONVIF客户端而不花费数月到数年的开发时间?是否有任何第三方库或 sdk 可以抽象所有这些版本控制巫毒教?
感谢您提供的任何帮助!
1+2( 客户端可以支持它选择的任何一组 wsdl 文档,因为只进行添加,而不对类型和操作进行任何更改。如果我没记错的话,这是在核心文档中指定的。
3(据我所知,只使用SOAP 1.2。
4(我没有一个好的答案,我写了自己的C++代码生成器来处理这些问题。
5( GetServices 将返回设备提供的服务版本。
6(还不错...我认为大多数功能都可以以一种或另一种方式确定。在 2.0 版本之前肯定有很多困惑。我发现的主要问题是设备的实现不符合规范。
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 导入库可以跨dll版本工作吗
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 在clang++预处理器中确定gcc工具链版本
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 使用GSoap实现ONVIF
- 不同的Visual Studio版本中缺少.dll
- 用符号版本替换对函数的所有调用
- luaL_dofile在已知良好的字节码上失败,可以使用未编译的版本
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 我需要分发哪些版本的可再分发文件
- CV_OCL_RUN宏如何在OpenCV(版本3.4.5)的goodFeaturesToTrack实现中工作?
- 在运行时读取 libstdc++ 版本
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- Vulkan SDK 版本 1.1.85.0 在 Kubuntu 18.10 上链接
- 如何正确实现与基类不同的版本?
- 从预处理器获取 Windows 版本(C++ Win32)
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 了解 ONVIF 规范和版本