Onvif在Windows下的开发 -- 准备工作

 

1.1使用工具gsoap (gSOAP 2.8.19)

http://www.cs.fsu.edu/~engelen/soap.html

可以下载到最新的版本,windows的版本带有编译好的exe文件不需要重新编译

1.2添加对Onvif协议的支持

根据http://www.cs.fsu.edu/~engelen/soap.html下FAQ的描述,添加gSOAP中typemap.dat对Onvif协议的支持。在gSOAP 2.8.19版本中typemap.dat已经对onvif的支持了。

#     ONVIFrecommended prefixes

tds   ="http://www.onvif.org/ver10/device/wsdl"

tev   ="http://www.onvif.org/ver10/events/wsdl"

tls   ="http://www.onvif.org/ver10/display/wsdl"

tmd   ="http://www.onvif.org/ver10/deviceIO/wsdl"

timg  ="http://www.onvif.org/ver20/imaging/wsdl"

trt   ="http://www.onvif.org/ver10/media/wsdl"

tptz  ="http://www.onvif.org/ver20/ptz/wsdl"

trv   ="http://www.onvif.org/ver10/receiver/wsdl"

trc   ="http://www.onvif.org/ver10/recording/wsdl"

tse   ="http://www.onvif.org/ver10/search/wsdl"

trp   ="http://www.onvif.org/ver10/replay/wsdl"

tan   ="http://www.onvif.org/ver20/analytics/wsdl"

tad   ="http://www.onvif.org/ver10/analyticsdevice/wsdl"

tdn   ="http://www.onvif.org/ver10/network/wsdl"

tt    ="http://www.onvif.org/ver10/schema"

#     OASISrecommended prefixes

wsnt  ="http://docs.oasis-open.org/wsn/b-2"

wsntw ="http://docs.oasis-open.org/wsn/bw-2"

wsrfbf          ="http://docs.oasis-open.org/wsrf/bf-2"

wsrfr ="http://docs.oasis-open.org/wsrf/r-2"

wsrfrw = "http://docs.oasis-open.org/wsrf/rw-2"

wstop ="http://docs.oasis-open.org/wsn/t-1"

#     WS-Discovery1.0 remapping

wsdd10__HelloType                   = | wsdd__HelloType

wsdd10__ByeType                     = | wsdd__ByeType

wsdd10__ProbeType                   = | wsdd__ProbeType

wsdd10__ProbeMatchesType  = | wsdd__ProbeMatchesType

wsdd10__ProbeMatchType              = | wsdd__ProbeMatchType

wsdd10__ResolveType                 = | wsdd__ResolveType

wsdd10__ResolveMatchesType          = | wsdd__ResolveMatchesType

wsdd10__ResolveMatchType  = | wsdd__ResolveMatchType

#     SOAP-ENVmapping

SOAP_ENV__Envelope        = struct SOAP_ENV__Envelope { struct SOAP_ENV__Header*SOAP_ENV__Header; _XML SOAP_ENV__Body; }; | struct SOAP_ENV__Envelope

SOAP_ENV__Header          = | struct SOAP_ENV__Header

SOAP_ENV__Fault           = | struct SOAP_ENV__Fault

SOAP_ENV__Detail          = | struct SOAP_ENV__Detail

SOAP_ENV__Code            = | struct SOAP_ENV__Code

SOAP_ENV__Subcode         = | struct SOAP_ENV__Subcode

SOAP_ENV__Reason          = | struct SOAP_ENV__Reason

 

1.3使用wsdl2h生成对应的头文件

所需的wsdl文件

#       http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl

#       http://www.onvif.org/onvif/ver10/event/wsdl/event.wsdl

#       http://www.onvif.org/onvif/ver10/display.wsdl

#       http://www.onvif.org/onvif/ver10/deviceio.wsdl

#       http://www.onvif.org/onvif/ver20/imaging/wsdl/imaging.wsdl

#       http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl

#       http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl

#       http://www.onvif.org/onvif/ver10/receiver.wsdl

#       http://www.onvif.org/onvif/ver10/recording.wsdl

#       http://www.onvif.org/onvif/ver10/search.wsdl

#       http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl

#       http://www.onvif.org/onvif/ver10/replay.wsdl

#       http://www.onvif.org/onvif/ver20/analytics/wsdl/analytics.wsdl

#       http://www.onvif.org/onvif/ver10/analyticsdevice.wsdl        

#       http://www.onvif.org/onvif/ver10/schema/onvif.xsd

 

1.4运行wddl2h.exe

根据所需的要问wsdl生成h文件,命令如下:

Wsdl2h –P –x –c –o onvif.hhttp://.../..wsdl http://../..wsdl

其中–c 是为了生成纯c的头文件,如果生成c和 c++的头文件结构会很混乱

-o onvif.h是生成所需要的头文件

-P 和 –x 是为了不生成一些其他的东西

http://../.wsdl就是你所需要的实现的功能的wsdl可以多选

 

1.5修改onvif.h

为了增加对加密过程——openssl的支持,需修改onvif.h在其增加#import “wsse.h”

 

1.6运行soapcpp2

根据生成的onvif.h的头文件生成相应的c文件。命令如下:

soapcpp2 -2 -x-I../../;../../import onvif.h

其中:-x是不生成xml文件

-I增加所需文件的路径

-2生成1.2 版本的文件。因为如果有多个wsdl同时生成的时候产生的namspace为1.1版本的nsmap文件中SOAP-ENV和SOAP-ENC会有所不同,如下:

1.1版本中:

{"SOAP-ENV","http://schemas.xmlsoap.org/soap/envelope/","http://www.w3.org/*/soap-envelope", NULL},

{"SOAP-ENC","http://schemas.xmlsoap.org/soap/encoding/","http://www.w3.org/*/soap-encoding", NULL},

 

而1.2版本中为

{"SOAP-ENV","http://www.w3.org/2003/05/soap-envelope","http://schemas.xmlsoap.org/soap/envelope/", NULL},

{"SOAP-ENC","http://www.w3.org/2003/05/soap-encoding","http://schemas.xmlsoap.org/soap/encoding/", NULL},

 

主要是这两处不同,如果使用1.1版本的会在后续的开发中出现错误,因此使用1.2版本的。如果单独一个wddl文件生成的自动就是1.2版本的。(一定要改过来,折磨我了好几天才发现)。

生成的文件有:

soapC.c 、soapClient.c、soapClientLib.c 、sopH.h 、soapServer.c 、soapServerLib.c 、soapStub.h和许多nsmap文件

其中soapClientLib.c 、soapServerLib.c没有用可以删除;

Nsmap文件内容一样。保留一个wsdd.namsp文件就行,可以将该文件重命名为nsmp.h

 

1.7新建工程

根据以上生成的文件,新建工程将上述soapC.c 、soapClient.c 、sopH.h 、soapServer.c 、soapStub.h 、nsmap.h拷贝到工程目录

并从gsoap的根目录中拷入stdsoap2.h 、stdsoap2.c文件可能还需要custom下的duration.h 和 duration.c文件。

此时就可以根据接口进行开发,还有一点要注意如果开发客户端 不要引入soapServer.c因为里面有许多接口需要在开发server端时进行实现。

你可能感兴趣的:(Onvif)