背景
onvif是一个SOAP服务协议,按理来说可以直接用socket、http等来逐个拼起来实现的。
只不过对于c/c++开发者来说,重复造轮子或者还要编译、调用其它一大堆的库,实在是太费劲。
用个gSOAP可以自动生成onvif的框架代码。
目录
文章发表的顺序可能有点乱,麻烦根据《基于ONVIF协议的摄像机监控管理平台(1)概述》里面的文章目录进行阅读,抱歉了
一、下载SOAP
下载地址
《gSOAP下载》
二、怎么使用gSOAP生成头文件
- 解压
在\gsoap-2.8\gsoap\bin\win32目录里面有两个文件- wsdl2h.exe
- soapcpp2.exe
- 打开windows的命令行窗口cmd
- 在cmd中切换到 wsdl2h.exe 所在的目录
执行生成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
- 执行成功就可以自动生成代码了。
三、https导致的问题
- 按理说,上面的命令英爱会执行失败。
- 会提示不支持https,请重新编译
- 重新编译gSOAP让它支持https的步骤,请自行google查找资料
如果觉得编译麻烦或者编译不通过,我提供个别的方法:
把编译用到的那些文件一个个全部下载下来(浏览器打开链接,然后另存为),然后直接调用本地文件
举例,我把上面用到的三个https文件下载到本地,生成代码的命令就变成了
wsdl2h.exe -P -x -c -s -t ./typemap.dat -o samples/onvif/onvif.h remotediscovery.wsdl devicemgmt.wsdl media.wsdl
- 当然了,这样子还有其它问题,下面继续说
四、文件缺失导致的问题
- 执行上面的命令应该会失败。主要问题应该是提示文件缺失。
- 举个例子。提示缺失 ../../../ver10/schema/onvif.xsd文件
- 那就把 https://www.onvif.org/ver10/schema/onvif.xsd 保存下载下来
- 把这个文件保存到合适的路径里。 ../../../ 指的是wsdl2h.exe往上数三级目录,去到那个目录里面,新建一个ver10文件夹,然后再ver10文件夹里面新建个schema文件夹,然后把onvif.xsd文件保存到schema文件夹里面
- 然后重新执行上面的生成命令
- 如果提示还没找到onvif.xsd文件,请确保路径是否正确
- 如果提示缺失其它文件,请重复以上步骤把所有文件都下载保存好
五、用soapcpp2生成ONVIF框架代码
如果上面生成头文件成功的话,cmd窗口会提示你用soapcpp2生成代码的。另外,有个警告可以处理或者不处理也没问题。
Warning: 2 service bindings found, but collected as one service (use option -Nname to produce a separate service for each binding)
- 具体生成命令跟cmd窗口提示的相同。在cmd中输入运行就可以了。
soapcpp2 samples/onvif/onvif.h
六、有可能遇到的import错误
- 例如我遇到的问题是,提示 wsdd10.h 无法打开
- 原因是没有指定依赖文件的路径
- 编译命令可以改一下,加上 -I参数指定 wsdd10.h 所在路径,具体路径请根据实际情况进行调整。
soapcpp2 -I ../../../gsoap/import samples/onvif/onvif.h
- 然后还可能提示custom目录找不到,继续用 -I 参数指定一下custom目录所在的路径
soapcpp2 -I ../../../gsoap/import -I ../../../gsoap -I samples/onvif/onvif.h
- 我这边还提示有一个warning,但是文件已经生成了。可以先用一下看看有没有问题再决定要不要处理那个警告。
有个关于 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 文件
- 这个问题我没深究,具体的可以参考一下下面的文章。
《许振坪的专栏》
八、如果还需要其它ONVIF的功能支持
- 上面我提到的只是设备发现discovery、设备管理、还有media这几个内容,关于onvif的全部wsdl和xsd文件,可以在官网上找到。《所有的wsdl和xsd文件的列表》
把需要用到的文件右键另存为到本地,然后按照上面的步骤继续生成就是了。 如果实在不行的话,就只能自行编译gSOAP支持https,或者用别人生成的代码了。
后记
有任何的疑问或者想法,或者对本文有质疑或者补充的话,欢迎在留言区评论,期待你的分享!
同时,也欢迎关注本人微信公众号或者打赏一下这篇文章。
http://xzh.i3geek.com
0 条评论