目录
下载wsdl源文件
wsdl文件官网: https://www.onvif.org/profiles/specifications/
可以选择将各个wsdl文件下载下来,也可以不下载, 本文采用不下载方式。
编译wsdl源文件、生成c/c++代码
准备编译环境
新建目录onvif-wsdl, 将gSOAP安装目录下的custom、import、typemap.dat、wsdl2h、soapcpp2拷贝过来,效果如下:
gSOAP的安装过程参考:gSOAP编译安装
编译
编译过程分为两步:
第一步: 生成头文件
./wsdl2h -P -x -c -s -t typemap.dat -o onvif.h https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl https://www.onvif.org/ver10/events/wsdl/event.wsdl https://www.onvif.org/ver10/actionengine.wsdl https://www.onvif.org/ver20/analytics/wsdl/analytics.wsdl https://www.onvif.org/ver10/authenticationbehavior/wsdl/authenticationbehavior.wsdl https://www.onvif.org/ver10/credential/wsdl/credential.wsdl https://www.onvif.org/ver10/deviceio.wsdl https://www.onvif.org/ver10/display.wsdl https://www.onvif.org/ver10/pacs/doorcontrol.wsdl https://www.onvif.org/ver20/imaging/wsdl/imaging.wsdl https://www.onvif.org/ver20/media/wsdl/media.wsdl https://www.onvif.org/ver10/provisioning/wsdl/provisioning.wsdl https://www.onvif.org/ver20/ptz/wsdl/ptz.wsdl https://www.onvif.org/ver10/receiver.wsdl https://www.onvif.org/ver10/recording.wsdl https://www.onvif.org/ver10/search.wsdl https://www.onvif.org/ver10/replay.wsdl https://www.onvif.org/ver10/schedule/wsdl/schedule.wsdl https://www.onvif.org/ver10/advancedsecurity/wsdl/advancedsecurity.wsdl https://www.onvif.org/ver10/thermal/wsdl/thermal.wsdl https://www.onvif.org/ver10/uplink/wsdl/uplink.wsdl
-c 产生c语言的代码,否则产生C++(默认)
-s 不使用STL代码
-t 指定typemap.dat文件
-o 指定生成的头文件名
命令执行成功后,生成onvif.h文件
第二步:编译生成c/c++源码
有些ONVIF接口调用时需要携带认证信息,要使用soap_wsse_add_UsernameTokenDigest函数进行授权,所以要在onvif.h头文件开头加入
#import "wsse.h"
如果onvif.h不加入#import "wsse.h"
,使用soap_wsse_add_UsernameTokenDigest函数会导致编译出错(错误信息如下):
wsse2api.c(183): error C2039: “wsse__Security”: 不是“SOAP_ENV__Header”的成员
执行如下命令:
./soapcpp2 -2 -C -L -c -x -Iimport -Icustom onvif.h
//soapcpp2命令的相关命令参数如下:(可以根据自己的实际需要添加不同参数,通过soapcpp2 -h来查看帮助信息)
-2 //采用SOAP1.2,和SOAP1.0版本不同,会导致搜索工具搜索不到
-x //不产生xml文件(可用可不用,xml有一定帮助,但是太多)
-I //为引入路径
-C //只产生客户端代码(注意:C是大写,不推荐有次命令)
当打印出Compilation successful,则编译成功,生成代码目录如下:
其中的*.nsmap为命名空间「namespaces变量」的定义,内容都是一样的,我们将其中一个命名为wsdd.h,后续会用到
整理文件
编译完成后的代码还不能直接使用,需要做进一步整理
1. 拷贝其他用到的源码文件到当前目录
cp stdsoap2.c stdsoap2.h plugin/wsaapi.c plugin/wsaapi.h custom/duration.c custom/duration.h ./onvif-wsdl/
以上文件可以在gSOAP的编译目录中找到。
2. 关联命名空间
在stdsoap2.h中有命名空间变量的声明,
extern SOAP_NMAC struct Namespace namespaces[];
而命名空间的实现是在wsdd.h文件中,所以,将wsdd.h包含进stdsoap2.c文件即可,在stdsoap2.c中添加:
#include "wsdd.h"
至此, wsdl框架源码准备完毕,可以编写onvif程序进行测试了。