引言
在Ovif入门之实现Probe命令来进行设备发现(discover)我们已经大概知道了
Web Services地址,接下来就能够通过一系列的ONVIF接口访问IPC。
我们要做的第一件事情就是获取IPC摄像头的基本信息,即调用GetDeviceInformation接口。
有关GetDeviceInformation接口的描述,可以参阅devicemgmt.wsdl文档(https://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl),如下图所示:
ps:一般我们进行Onvif对接,只需要扮演客户端的角色,因此我们在生成框架代码的时候可以不生成服务端代码。
实践
生成框架
(1) 准备原材料
创建目录
-
bin:放置gsoap编译后生成的两个工具wsdl2h , soapcpp2
-
gsoap:
- 编译后的gsoap文件夹,其路径为 /home/oceanstar/workspace/cpp/Onvif/gsoap/share
- gsoap源代码(/home/oceanstar/workspace/cpp/gsoap-2.8/gsoap)下的几个文件拷到我们的gsoap目录下,dom.c stdsoap2.c stdsoap2.h,stdsoap2.cpp
(2)编写脚本onvif_head.sh ,生成头文件
(3) 编写脚本
- -C 仅生成客户端client代码
执行当前脚本
报错:
解决: 将将gsoap源码的was5.h(位于gsoap\import目录)的SOAP_ENV__Fault函数改成其他名字或者直接注释掉
重新执行,生成的文件如下:
- 各种nsmap文件:命名空间,除了名字不一样,内容是一样的,里面的内容竟然是每一个xml文件里的Envelope字段内容。我们只需要留下一个就可以了,并将之改名为wsdd.nsmap
- soapC.c:指定数据结构的序列化和反序列化
- soapClient.c:客户端代码
- soapH.h:主头文件,所有客户机和服务器源代码都要包括它
- soapStub.h:从输入头文件(onvif.h)生成的经过修改且带命名空间前缀的头文件
编写代码
1、为了方便,我们将所有需要的代码放到同一个目录中。我们在刚才建立的
- 从刚刚生成的soap目录下拷贝
wsdd.nsmap 和所有的.c 和.h 以及onvif_head目录下的头文件onvif.h - 从gsoap目录下复制
stdsoap2.cpp 与stdsoap2.h 到application下
2、在application 目录创建一个CMakeLists.txt 文件,CMakeLists.txt文件内容如下:
然后我们就可以用CLion打开这个工程了。
3、在
4、编写客户端源码: 在
onvif学习笔记4:Windows环境使用gsoap生成onvif框架代码