一、理论概述
通过使用 Web Services,应用程序可以向整个网络中发布信息,或提供某项功能,Web Service采用WSDL描述,WSDL就是xml语言。服务端和客户端通过SOAP消息也就是远程调用来通讯SOAP 提供了一种标准的方法,使得运行在不同的操作系统并使用不同的技术和编程语言的应用程序可以互相进行通信,一条 SOAP 消息就是一个普通的 XML 文档,SOAP可以使得应用程序在通讯协议http之上进行传输。可以通过gSOAP把WSDL也就是xml语言转换成C/C++语言的SOAP消息。
ONVIF引入的就是上面提到的Web Service的概念。ONVIF规范中设备管理和控制部分所定义的接口均以Web Services的形式提供。ONVIF规范涵盖了完全的XML及WSDL的定义。每一个支持ONVIF规范的终端设备均须提供与功能相应的Web Service。服务端与客户端的数据交互采用SOAP协议。ONVIF中的其他部分比如音视频流则通过RTP/RTSP进行。
使用gSOAP如何生成服务器端和客户端代码框架:
第一种方式:编写WSDL,使用wsdl2h生成头文件,再soapcpp2生成框架代码,ONVIF就是通过WSDL这种方式;
第二种方式:编写头文件,使用soapcpp2生成框架代码;
这两种方式,结果是一样的,最终都有产生头文件,并生成代码。不同在于,在项目的开发中需要维护的文件不同,前者是需要维护WSDL文件,后者维护头文件。
二、代码框架分析
由WSDL生成的函数,函数声明都在soapStub.h文件中,soapServer.c中会把WSDL生成的函数封装成带SOAP消息的函数去跟客户端通信。stdsoap2.h和stdsoap2.c提供了soap协议的简单操作,比如soap_init() soap_end()等函数,把客户端的调用和soap联系起来,然后客户端调用应用功能函数就可以通过soap消息远程调用服务端对应的函数。
soap 相关的接口调用参考: https://www.genivia.com/doc/guide/html/index.html
onvif 服务端操作索引https://www.onvif.org/onvif/ver20/util/operationIndex.html