一.前言
简单介绍一下涉及到的名称。SOAP是一种基于XML的RPC协议规范,gSOAP是一个开发SOAP和XML应用(它们组成了webservice)的工具。ONVIF协议就是在SOAP协议规范的基础之上定义的一套用于网络摄像机的标准协议。
二.gsoap工具
gsoap包含wsdl2h和soapcpp2两个工具和一些拓展功能源码。wsdl2h顾名思义,通过下载onvif协议规范wsdl文件来产生c代码头文件。soapcpp2是通过头文件生成合适的代码。工具下载地址:https://sourceforge.net/projects/gsoap2/files/latest/download
三.生成代码
1.生成onvif头文件 -c 表示生成c代码,-s 表示不生成STL代码(使用系统标准库), -t 指定typemap.dat文件(数据类型定义) 这里面一个URL可以认为是摄像头的一个Profile。比如云台就需要用到ptz.wsdl,多播搜索设备用到remotediscovery.wsdl。
bash
wsdl2h -o onvif.h -c -s -t ./typemap.dat \
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 \
http://www.onvif.org/ver10/actionengine.wsdl
2.生成框架代码和业务代码。 -C 仅生成客户端代码 -S 仅生成服务端代码(这里用不上) -x 不生成xml文件 -L 不生成lib文件 -I 指定onvif.h依赖的头文件路径,不指定可能会报错。
bash
./soapcpp2 -x -L -C -I../gsoap-2.8/gsoap/import:../gsoap-2.8/gsoap onvif.h
四.开发和整合代码
上面生成的代码用起来还是比较麻烦,可以先封装一下接口提供给上层应用调用。最后把自己封装好的代码和生成的代码提取出来,这里还会用到一些gsoap插件也要加进去(位于gsoap工具包的plugin目录),如果需要ssl支持还需要把ssl库加进来,把这些文件放一起就可以生成库文件。
bash
.
├── build.sh
├── CMakeLists.txt
├── config
│ └── RTSP_CAP.cfg
├── include
│ ├── httpda.h
│ ├── mecevp.h
│ ├── onvif.h
│ ├── openssl
│ │ ├── aes.h
│ │ ├── asn1.h
│ │ ├── asn1_mac.h
│ │ ├── asn1t.h
│ │ ├── bio.h
│ │ ├── blowfish.h
│ │ ├── bn.h
│ │ ├── buffer.h
│ │ ├── camellia.h
│ │ ├── cast.h
│ │ ├── cmac.h
│ │ ├── cms.h
│ │ ├── comp.h
│ │ ├── conf_api.h
│ │ ├── conf.h
│ │ ├── crypto.h
│ │ ├── des.h
│ │ ├── des_old.h
│ │ ├── dh.h
│ │ ├── dsa.h
│ │ ├── dso.h
│ │ ├── dtls1.h
│ │ ├── ebcdic.h
│ │ ├── ecdh.h
│ │ ├── ecdsa.h
│ │ ├── ec.h
│ │ ├── engine.h
│ │ ├── e_os2.h
│ │ ├── err.h
│ │ ├── evp.h
│ │ ├── hmac.h
│ │ ├── idea.h
│ │ ├── krb5_asn.h
│ │ ├── kssl.h
│ │ ├── lhash.h
│ │ ├── md4.h
│ │ ├── md5.h
│ │ ├── mdc2.h
│ │ ├── modes.h
│ │ ├── objects.h
│ │ ├── obj_mac.h
│ │ ├── ocsp.h
│ │ ├── opensslconf.h
│ │ ├── opensslv.h
│ │ ├── ossl_typ.h
│ │ ├── pem2.h
│ │ ├── pem.h
│ │ ├── pkcs12.h
│ │ ├── pkcs7.h
│ │ ├── pqueue.h
│ │ ├── rand.h
│ │ ├── rc2.h
│ │ ├── rc4.h
│ │ ├── ripemd.h
│ │ ├── rsa.h
│ │ ├── safestack.h
│ │ ├── seed.h
│ │ ├── sha.h
│ │ ├── srp.h
│ │ ├── srtp.h
│ │ ├── ssl23.h
│ │ ├── ssl2.h
│ │ ├── ssl3.h
│ │ ├── ssl.h
│ │ ├── stack.h
│ │ ├── symhacks.h
│ │ ├── tls1.h
│ │ ├── ts.h
│ │ ├── txt_db.h
│ │ ├── ui_compat.h
│ │ ├── ui.h
│ │ ├── whrlpool.h
│ │ ├── x509.h
│ │ ├── x509v3.h
│ │ └── x509_vfy.h
│ ├── plc_driver.h
│ ├── plcdrv.h
│ ├── PTZBinding.nsmap
│ ├── smdevp.h
│ ├── soapH.h
│ ├── soapStub.h
│ ├── stdsoap2.h
│ ├── struct_timeval.h
│ ├── threads.h
│ ├── wsaapi.h
│ └── wsseapi.h
├── lib
│ ├── libcrypto.a
│ ├── libcrypto.so
│ ├── libcrypto.so.1.0.0
│ ├── libssl.a
│ ├── libssl.so
│ └── libssl.so.1.0.0
└── src
├── dom.c
├── httpda.c
├── mecevp.c
├── plc_driver.c
├── plcdrv.c
├── ptzctrl.c
├── smdevp.c
├── soapC.c
├── soapClient.c
├── stdsoap2.c
├── struct_timeval.c
├── threads.c
├── wsaapi.c
└── wsseapi.c