引言

在Ovif入门之实现Probe命令来进行设备发现(discover)我们已经大概知道了ONVIF开发的一般步骤了,而且已经可以搜索到IPC摄像头了,搜索出IPC之后,就有了IPC的
Web Services地址,接下来就能够通过一系列的ONVIF接口访问IPC。

我们要做的第一件事情就是获取IPC摄像头的基本信息,即调用GetDeviceInformation接口。

有关GetDeviceInformation接口的描述,可以参阅devicemgmt.wsdl文档(https://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl),如下图所示:

ps:一般我们进行Onvif对接,只需要扮演客户端的角色,因此我们在生成框架代码的时候可以不生成服务端代码。

实践

生成框架

(1) 准备原材料
创建目录onvif-discover-devinfo, 目录下有两个目录bingsoap

  • 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) 编写脚本gen_code.sh, 根据上面生成的头文件生成源文件

  • -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、为了方便,我们将所有需要的代码放到同一个目录中。我们在刚才建立的onvif-discover-devinfo目录下创建一个application目录,存放我们需要的所有代码。

  • 从刚刚生成的soap目录下拷贝wsdd.nsmap和所有的.c.h以及onvif_head目录下的头文件onvif.h
  • 从gsoap目录下复制stdsoap2.cppstdsoap2.h到application下

    2、在application目录创建一个CMakeLists.txt文件,CMakeLists.txt文件内容如下:

然后我们就可以用CLion打开这个工程了。

3、在application创建一个build目录,进入build目录之后:


4、编写客户端源码: 在application目录创建一个deviceclient.cpp,内容为

onvif学习笔记4:Windows环境使用gsoap生成onvif框架代码