前景提要:
我想用ONVIF开发一个client,实现最简单的发现一个IPC摄像头,但是网上找了一圈感觉没有头绪,所以绝知此事要躬行,不管三七二十一,找一个教程开干。
(1)下载gsoap
官网下载就不要想了,能慢到怀疑人生,所以我是在git上下载的(git真的是个宝藏),在git上搜索gsoap_2.8.53即可
(2)wsdl文件介绍
remotediscovery.wsdl :用于发现设备
devicemgmt.wsdl :用于获取设备参数
media.wsdl:用于获取视频流地址
ptz.wsdl:用于设备的PTZ控制
我觉得我有上述四个文件足够了
(3)下载wsdl文件
https://www.onvif.org/profiles/specifications/
选择想要的wsdl文件,右键文件链接--另存为--保存到本地(我发现最新的好像少了几个文件,所以。。。上git,下老版,搜python-onvif,第一个就是,其中的wsdl就是人家下好的,直接使用吧)
(4)新建工作空间
创建新建文件夹OnvifFramework
将goap_2.8.53\gsoap-2.8\gsoap 路径下的typemap.dat,拷贝到OnvifFramework
将gsoap_2.8.53\gsoap-2.8\gsoap\bin\win32 路径下的wsdl2h.exe soapcpp2.exe,拷贝到OnvifFramework
将下载的wsdl文件放在和wsdl2h.exe soapcpp2.exe同一路径下(注意:其中包含文件 onvif.xsd ,types.xsd ,b-2.xsd ,bf-2.xsd,r-2.xsd,t-1.xsd ,ws-addr.xsd ,ws-discovery.xsd 。这些文件和wsdl文件一样从官网上下载--可惜现在官网上木有)。
(5)生成onvif.h文件
只使用上述四个文件,生成onvif.h文件,执行命令
wsdl2h -o onvif.h -c -s -t ./typemap.dat remotediscovery.wsdl devicemgmt.wsdl media.wsdl ptz.wsdl
参数说明:
-c : 生成c风格代码(注:后缀名还是.cpp ,但实际上是.c)
-c++:生成c++风格代码(注 : 默认是生成c++代码)
-x : 表示不生成xml 文件(注:生成的xml文件,有助于了解发送是SOAP是怎样的结构,建议不使用-x)
-l : 表示指定导入路径
-C : 表示生成客户端代码
-S : 表示生成服务端代码
-s : 不使用STL代码
-o: 生成.h文件叫什么名字
-t : 后面紧跟“typemap.dat”这个批处理文件
执行完该命令后,可以在当前目录变成如下(没有如下,懒得截图),其中增加了onvif.h文件,该文件是接下来生成框架代码的前提:
(6)正式生成框架代码
在项目开发过程中,往往需要使用“鉴权”这项功能(访问或修改设备参数,需要用户名跟密码,在数据传输过程中,密码是进行了加密处理的),所以在正式生成代码之前在onvif.h文件中加上下面的代码:
#import "wsse.h"
这样在接下生成的框架代码中才有相应的加密函数接口(注意:在Linux环境下,一定要安装openssl库)。
==>准备工作
(1)将gsoap_2.8.14\gsoap-2.8\gsoap\import拷贝到同gsoapcpp2.exe文件夹下
(2)将gsoap_2.8.14\gsoap-2.8\gsoap\custom拷贝到同gsoapcpp2.exe文件夹下
==>执行命令
通过cmd进入到gsoapcpp2.exe所在文件夹,执行一下命令:soapcpp2 -2 -c onvif.h -I .\custom -I .\import -I .\import
参数解析
-c : 生成c风格的代码,因为默认是c++风格的代码
-2:采用SOAP1.2,和SOAP1.0版本不同,会导致搜索工具搜索不到
-I : 指定路径
-x : 不产生xml 文件(不建议是用该选项,xml在开发中具有参考意义)
注意:可以是用以下命令查看各个参数的详细作用
gsoapcpp2 -help
执行完以上命令后,提示Compilation successful (2 warnings),
可以看见当前文件夹下出现了很多.h文件、.c文件、.nsmap文件、.xml文件
Q:wsa5.h(288): **ERROR**: service operation name clash: struct/class 'SOAP_ENV__Fault' already declared at wsa.h:273
A:打开gsoap_2.8.17\gsoap-2.8\gsoap\import 路径下的wsa5.h, 将277行的SOAP_ENV__Fault结构体注释掉(改成其他名字亦可)
(7)提取所需文件
将soapC.c , soapH.h , soapClient.c , soapClientLib.c , soapServer.c(用于服务端/设备端的开发) , soapServerLib.c(用于服务端/设备段的开发) soapStub.h , onvif.h(该文件基本已经没有用处了)拷贝到一个单独的文件夹"ONVIF"下面。
将文件gsoap-2.8\gsoap\dom.c拷贝到ONVIF中(该文件好像没什么作用)
将文件gsoap-2.8\gsoap\custom\duration.c拷贝到ONVIF中
将文件gsoap-2.8\gsoap\custom\duration.h拷贝到ONVIF中
将文件gsoap-2.8\gsoap\plugin\mecevp.c拷贝到ONVIF中
将文件gsoap-2.8\gsoap\plugin\mecevp.h拷贝到ONVIF中
将文件gsoap-2.8\gsoap\plugin\smdevp.c拷贝到ONVIF中
将文件gsoap-2.8\gsoap\plugin\smdevp.h拷贝到ONVIF中
将文件gsoap-2.8\gsoap\stdsoap2.h拷贝到ONVIF中
将文件gsoap-2.8\gsoap\stdsoap2.c拷贝到ONVIF中
将文件gsoap-2.8\gsoap\plugin\threads.c拷贝到ONVIF中
将文件gsoap-2.8\gsoap\plugin\threads.h拷贝到ONVIF中
将文件gsoap-2.8\gsoap\plugin\wsaapi.c拷贝到ONVIF中
将文件gsoap-2.8\gsoap\plugin\wsaapi.h拷贝到ONVIF中
将文件gsoap-2.8\gsoap\plugin\wsseapi.h拷贝到ONVIF中
将文件gsoap-2.8\gsoap\plugin\wsseapi.c拷贝到ONVIF中
将生成的.nsmap文件中的任意一个(因为生成的.nsmap文件中的内容都是一样的)拷贝到ONVIF中
拷贝完成,ONVIF文件中所有文件如下所示:
dom.c
duration.c
duration.h
mecevp.c
mecevp.h
onvif.h
smdevp.c
smdevp.h
soapC.c
soapClient.c
soapClientLib.c
soapH.h
soapServer.c
soapServerLib.c
soapStub.h
stdsoap2.c
stdsoap2.h
threads.c
threads.h
wsaapi.c
wsaapi.h
wsdd.nsmap
wsdd.h
wssepi.c
wsseapi.h
(8)开发
利用以上框架代码,新建main.c就可以开始项目开发了。
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">
都走到这步了,就再找个教程开发吧。
参考文档
https://www.cnblogs.com/big-devil/p/7625763.html 不是太全,但是流程非常清晰,跟着走一遍后思维清晰很多,我就是完全按照这个生成的
https://blog.csdn.net/saloon_yuan/article/details/24901597 上面不全的地方,这篇里面刚好有补充,比如FAQ,比如wsdd.nsmap改后缀为h
原文链接: https://www.cnblogs.com/jieliujas/p/12409588.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;
也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/371159
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!