背景

onvif是一个SOAP服务协议,按理来说可以直接用socket、http等来逐个拼起来实现的。
只不过对于c/c++开发者来说,重复造轮子或者还要编译、调用其它一大堆的库,实在是太费劲。
用个gSOAP可以自动生成onvif的框架代码。

文章发表的顺序可能有点乱,麻烦根据《基于ONVIF协议的摄像机监控管理平台(1)概述》里面的文章目录进行阅读,抱歉了


一、下载SOAP

下载地址
《gSOAP下载》



二、怎么使用gSOAP生成头文件

  1. 解压
    在\gsoap-2.8\gsoap\bin\win32目录里面有两个文件

    • wsdl2h.exe
    • soapcpp2.exe
  2. 打开windows的命令行窗口cmd



  3. 在cmd中切换到 wsdl2h.exe 所在的目录
  4. 执行生成ONVIF框架代码的命令

    wsdl2h -P -x -c -s -t ./typemap.dat -o samples/onvif/onvif.h  https://www.onvif.org/ver10/network/wsdl/remotediscovery.wsdl  https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl  https://www.onvif.org/ver10/media/wsdl/media.wsdl
    
  5. 执行成功就可以自动生成代码了。

三、https导致的问题

  1. 按理说,上面的命令英爱会执行失败。
  2. 会提示不支持https,请重新编译
  3. 重新编译gSOAP让它支持https的步骤,请自行google查找资料
  4. 如果觉得编译麻烦或者编译不通过,我提供个别的方法:
    把编译用到的那些文件一个个全部下载下来(浏览器打开链接,然后另存为),然后直接调用本地文件



  5. 举例,我把上面用到的三个https文件下载到本地,生成代码的命令就变成了

    wsdl2h.exe -P -x -c -s -t ./typemap.dat -o samples/onvif/onvif.h  remotediscovery.wsdl  devicemgmt.wsdl media.wsdl
    
  6. 当然了,这样子还有其它问题,下面继续说



四、文件缺失导致的问题

  1. 执行上面的命令应该会失败。主要问题应该是提示文件缺失。
  2. 举个例子。提示缺失 ../../../ver10/schema/onvif.xsd文件
  3. 那就把 https://www.onvif.org/ver10/schema/onvif.xsd 保存下载下来
  4. 把这个文件保存到合适的路径里。 ../../../ 指的是wsdl2h.exe往上数三级目录,去到那个目录里面,新建一个ver10文件夹,然后再ver10文件夹里面新建个schema文件夹,然后把onvif.xsd文件保存到schema文件夹里面
  5. 然后重新执行上面的生成命令
  6. 如果提示还没找到onvif.xsd文件,请确保路径是否正确
  7. 如果提示缺失其它文件,请重复以上步骤把所有文件都下载保存好

五、用soapcpp2生成ONVIF框架代码

  1. 如果上面生成头文件成功的话,cmd窗口会提示你用soapcpp2生成代码的。另外,有个警告可以处理或者不处理也没问题。

    Warning: 2 service bindings found, but collected as one service (use option -Nname  to produce a separate service for each binding)
    
  2. 具体生成命令跟cmd窗口提示的相同。在cmd中输入运行就可以了。
    soapcpp2 samples/onvif/onvif.h
    

六、有可能遇到的import错误

  1. 例如我遇到的问题是,提示 wsdd10.h 无法打开
  2. 原因是没有指定依赖文件的路径
  3. 编译命令可以改一下,加上 -I参数指定 wsdd10.h 所在路径,具体路径请根据实际情况进行调整。
    soapcpp2 -I ../../../gsoap/import samples/onvif/onvif.h
    
  4. 然后还可能提示custom目录找不到,继续用 -I 参数指定一下custom目录所在的路径
    soapcpp2 -I ../../../gsoap/import -I ../../../gsoap -I samples/onvif/onvif.h
    
  5. 我这边还提示有一个warning,但是文件已经生成了。可以先用一下看看有没有问题再决定要不要处理那个警告。

  6. 有个关于 wsa5.h 的 error,提示报错了但是却可以生成。会被编译信息覆盖掉。
    如果生成成功但是有报错的话,很可能就是这个。

    之所有会出现这个错误,是因为onvif.h头文件中同时:

    #import "wsdd10.h" // wsdd10.h中又#import "wsa.h"
    #import "wsa5.h"   // wsa.h和wsa5.h两个文件重复定义了int SOAP_ENV__Fault
    

    解决方法:修改import\wsa5.h文件,将int SOAP_ENV__Fault修改为
    int SOAP_ENV__Fault_alex,再次使用soapcpp2工具编译就成功了。
    全部成功生成的话,会显示successfully

七、关于鉴权(认证)的 wsse.h 文件

  1. 这个问题我没深究,具体的可以参考一下下面的文章。
    《许振坪的专栏》

八、如果还需要其它ONVIF的功能支持

  1. 上面我提到的只是设备发现discovery、设备管理、还有media这几个内容,关于onvif的全部wsdl和xsd文件,可以在官网上找到。《所有的wsdl和xsd文件的列表》
    把需要用到的文件右键另存为到本地,然后按照上面的步骤继续生成就是了。

  2. 如果实在不行的话,就只能自行编译gSOAP支持https,或者用别人生成的代码了。

后记

有任何的疑问或者想法,或者对本文有质疑或者补充的话,欢迎在留言区评论,期待你的分享!


同时,也欢迎关注本人微信公众号或者打赏一下这篇文章。



http://xzh.i3geek.com

爱唠叨的老鱼

爱唠叨的老鱼

技术经理,个人站长,创业者

0 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据