arm-linux---ONVIF标准下SOAP简单对象访问协议gsoap工具的交叉编译
1.平台信息
Linux:VMware® Workstation 12 Pro + Ubuntu 12.04 64bit
ARM:ZLG EPC-M6G2C 工控主板
涉及工具:SecureCRT(串口终端)、ONVIF Device Test Tool(ONVIF设备测试工具,Windows下)
交叉工具链:arm-linux-gnueabihf-gcc (gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux)
协议版本:ONVIF2.4、SOAP1.2
gsoap源码版本:gsoap_2.8.1.6
相关库版本:libuuid-1.0.3、openssl-1.0.2e
2. 有关标准和协议介绍
2.1 ONVIF 开放型网络视频接口论坛开放标准
ONVIF(开放式网络视频接口论坛)是一个全球性的开放式行业论坛,其目标是促进开发和使用基于物理IP的安全产品接口的全球开放标准。ONVIF创建了一个视频监控和其他物理安全领域的IP产品如何进行相互通信的标准。ONVIF是由Axis Communications,博世安防系统和索尼于2008年创立的。
该规范描述了网络视频的模型、接口、数据类型以及数据交互的模式。并复用了一些现有的标准,如WS系列标准等。ONVIF规范的目标是实现一个网络视频框架协议,使不同厂商所生产的网络视频产品(包括摄录前端、录像设备等)完全互通。
ONVIF规范中设备管理和控制部分所定义的接口均以Web Services的形式提供。ONVIF规范涵盖了完全的XML及WSDL的定义。每一个支持ONVIF规范的终端设备均须提供与功能相应的Web Service。服务端与客户端的数据交互采用SOAP协议。ONVIF中的其他部分比如音视频流则通过RTP/RTSP进行
2.2 SOAP 简单对象访问协议
SOAP(Simple Object Access Protocol, 简单对象访问协议),是交换数据的一种协议规范,是一种轻量的、简单的、基于XML(标准通用标记语言下的一个子集)的协议,它被设计成在WEB上交换结构化的和固化的信息。
SOAP 是一种简单的基于 XML 的协议,它使应用程序通过 HTTP 来交换信息。
2.2.1 SOAP 构建模块
一条 SOAP 消息就是一个普通的 XML 文档,包含下列元素:
- 必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息
- 可选的 Header 元素,包含头部信息
- 必需的 Body 元素,包含所有的调用和响应信息
- 可选的 Fault 元素,提供有关在处理此消息所发生错误的信息
2.2.2 语法规则
- SOAP 消息必须用 XML 来编码
- SOAP 消息必须使用 SOAP Envelope 命名空间
- SOAP 消息必须使用 SOAP Encoding 命名空间
- SOAP 消息不能包含 DTD 引用
- SOAP 消息不能包含 XML 处理指令
2.2.3 SOAP 消息的基本结构
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Header>
...
</soap:Header>
<soap:Body>
...
<soap:Fault>
...
</soap:Fault>
</soap:Body>
</soap:Envelope>
2.3 关系
ONVIF = 服务端 + 客户端 =(Web Services + RTSP)+ 客户端 = ((WSDL + SOAP) + RTSP) + 客户端
WSDL是服务端用来向客户端描述自己实现哪些请求、发送请求时需要带上哪些参数xml组织格式;
SOAP是客户端向服务端发送请求时的参数的xml组织格式;
Web Services实现摄像头控制(比如一些参数配置、摄象头的上下左右(PTZ)控制);
RTSP实现报像头视频传输;
Web Services具摄像头控制具体到技术交互实现上,其实和http差不多,客户端以类似http post的格式向服务端发送请求,然后服务端响应客户端请求。
NVR(Network Video Recorder)组网:
2.4 gSOAP 编译工具
2.4.1 gSOAP 介绍
gSOAP 编译工具提供了一个SOAP/XML 关于C/C++ 语言的实现,从而让C/C++语言开发web服务或客户端程序的工作变得轻松了很多。它是用于开发Web Service服务端和客户端的跨平台工具,在Windows、Linux、MAC OS和UNIX下使用C和C++语言编码,集合了SSL功能。主要特征如下:
- C/C++数据绑定工具,支持XML-RPCfrom/to JSON from/to C/C++ serialization
- 支持WSDL 1.1,2.0, SOAP 1.1, 1.2
- 支持REST HTTP(S) 1.0/1.1 operations (GET,PUT,POST etc) for XML, JSON,etc
- 支持MIME and MTOM 附件
- 支持IPv4,IPv6, TCP 和UDP
- 支持CGI,FastCGI
- 支持嵌入到Apache,IIS中发布
- 自带了一个Web server (multithreaded, SSL, compression)用于发布
- 可适用于WinCE, Palm, Symbian, VxWorks, Andriod, iPhone等小设备
2.4.2 gSOAP 使用
通过编译gSOAP 的源码,在指定的安装目录下可以发现生成了wsdl2h 和 soapcpp2 两个工具,其中
wsdl2h 工具是可以根据输入的wsdl或XSD或URL,产生相应的C/C++形式的.h(不能直接引用),供soapcpp2使用。
wsdl2h 运行选项如下:
选项 |
描述 |
-a |
对匿名类型,产生基于顺序号的结构体名称 |
-c |
生成C代码 |
-f |
对schema扩展,产生flat C++类 |
-g |
产生全局的元素声明 |
-h |
显示帮助信息 |
-I path |
包含文件时指明路径,相当于#import |
-j |
不产生 SOAP_ENV__Header 和SOAP_ENV__Detail 定义 |
-k |
不产生 SOAP_ENV__Header mustUnderstand qualifiers |
-l |
在输出中包含license信息 |
-m |
用 xsd.h 模块来引入类型信息 |
-N name |
用name 来指定服务命名空间的前缀。 |
-n name |
用name 作为命名空间的前缀,取代缺省的ns |
-o file |
输出文件名 |
-q name |
所有的声明采用 name 作命名空间 |
-s |
不产生 STL代码 (即不用 std::string,std::vector) |
-t file |
使用自己指定的type map file而不是缺省的typemap.dat |
-u |
不生成 unions |
-v |
产生详细的输出信息 |
-w |
always wrap response parameters in a response struct |
-y |
为structs,enums产生 typedef定义 |
-_ |
不产生 _USCORE (用UNICODE _x005f代替) |
-? |
显示帮助信息 |
soapcpp2 是一个根据.h文件生成若干支持webservice的代码生成工具,生成的代码文件包括webservice客户端和服务器的实现框架,XML数据绑定等,具体说明如下:
文件 |
描述 |
soapStub.h |
根据输入的.h文件生成的数据定义文件,一般我们不直接引用它。 |
soapH.h soapC.cpp |
客户端和服务器端应包含该头文件,它包含了soapStub.h。针对soapStub.h中的数据类型,cpp文件实现了序列化、反序列化方法。 |
soapXYZProxy.h soapXYZProxy.cpp |
这两个文件用于客户端,是客户端调用webservice的框架文件,我们的代码主要在此实现或从它继承。 |
soapXYZService.h soapXYZService.cpp |
这两个文件用于服务器端,是服务器端实现webservice的框架文件,我们的代码主要在此实现或从它继承。 |
.xsd |
传输消息的schema,,我们可以看看是否满足我们的协议格式(如果有此要求) |
.wsdl |
这个就不用说了。 |
.xml |
满足webservice定义的例子message,即实际的传输消息,我们可以看看是否满足我们的协议格式(如果有此要求)。 |
.nsmap |
命名空间的定义,对命名空间不敏感的,不用关注。 |
使用soapcpp2时,可选项如下:
选项 |
描述 |
-1 |
Soap1.1绑定 |
-2 |
SOAP1.2绑定 |
-C |
只生成客户端代码 |
-S |
只生成服务器端代码 |
-T |
生成自动测试代码 |
-L |
不生成 soapClientLib/soapServerLib |
-a |
用 SOAPAction 和WS-Addressing调用服务器端方法 |
-A |
用 SOAPAction 调用服务器端方法 |
-b |
采用char[N]这样的方式来表示string |
-c |
生成的是C代码,不是C++代码 |
-d < path > |
将代码生成在 < path >下 |
-e |
生成 SOAP RPC 样式的绑定 |
-f N |
File split of N XML serializer implementations per file |
-h |
显示一个简要的用法信息 |
-i |
生成的服务代理类和对象从struct soap继承而来 |
-j |
生成的服务代理类和对象包含struct soap而来(C代码的唯一选择) |
-I < path > |
包含其他文件时使用,指明 < path > (多个的话,用`:'分割),相当于#import ,该路径一般是gSOAP目录下的import目录,该目录下有一堆文件供soapcpp2生成代码时使用。 |
-n |
用于生成支持多个客户端和服务器端(具体内容参考gSOAP文档) |
-p < name > |
生成的文件前缀采用< name > ,而不是缺省的 "soap" |
-q < name > |
C++代码中,所有声明的命名空间 |
-s |
生成的代码在反序列化时,严格检查XML的有效性 |
-t |
生成的代码在发送消息时,采用xsi:type方式 |
-u |
在 WSDL/schema 输出文件中不产生XML注释 |
-v |
显示版本信息 |
-w |
不生成 WSDL 和 schema 文件 |
-x |
不生成 XML 形式的传输消息文件 |
-y |
在XML 形式的传输消息文件中,包含 C/C++类型信息 |
3. gSOAP工具交叉编译
好了,介绍了这么多相关知识,我们开始进入正题吧!
3.1 gSOAP 源码下载
gSOAP 2.8历来版本下载地址:
https://sourceforge.net/projects/gsoap2/files/gsoap-2.8/
目前版本是一个礼拜之前发布的gsoap_2.8.104,下载速度很慢(几十KBps),最好开VPN
下载完成后是一个31.7MB 的gsoap_2.8.104.zip压缩包;
Ubuntu下使用unzip解压缩:
unzip gsoap_2.8.104.zip -d /root/hu/gSOAP/
root@Linux-host:~/hu/gSOAP/gsoap-2.8# ls
aclocal.m4 configure.ac gsoap.spec makemake
autom4te.cache configure.scan gsoapssl.pc.in missing
changelog.md depcomp gsoapssl++.pc.in mkinstalldirs
compile factsheet.pdf install-sh NOTES.txt
config.guess GPLv2_license.txt install-sh-old README.txt
config.guess.old gsoap INSTALL.txt stamp-h.in
config.h.in gsoapck.pc.in license.pdf ylwrap
config.status.old gsoapck++.pc.in LICENSE.txt
config.sub gsoap.pc.in Makefile.am
configure gsoap++.pc.in Makefile.in
Ubuntu 下,准备环境和安装gSOAP,安装所需要的依赖库和工具包:
# sudo apt-get install build-essential
# sudo apt-get install libgtk2.0-dev libglib2.0-dev
# sudo apt-get install checkinstall
# sudo apt-get install flex bison
# sudo apt-get install openssl
# sudo apt-get install libssl-dev
3.2 ./configure、make和make isntall
将解压后的源码文件夹gsoap-2.8,在同一目录下复制一份,命名为arm-gsoap-2.8
查看配置选项 ./configure --help,主要的:
System types:
--build=BUILD configure for building on BUILD [guessed]
--host=HOST cross-compile to build programs to run on HOST [BUILD]
Optional Features:
--disable-option-checking ignore unrecognized --enable/--with options
--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
--enable-silent-rules less verbose build output (undo: "make V=1")
--disable-silent-rules verbose build output (undo: "make V=0")
--enable-dependency-tracking
do not reject slow dependency extractors
--disable-dependency-tracking
speeds up one-time build
--enable-debug add debug symbols for debugging
--disable-namespaces compile library without namespaces
--enable-xlocale compile library with forced inclusion of xlocale.h
--disable-c-locale compile library without c locale usage
--enable-ipv6 compile library with IPv6 support
--enable-ipv6-v6only compile library with IPv6-v6only support
--disable-ssl build without SSL/TLS -- note: the wsse and wst
examples will fail to build
--enable-gnutls build with GNUTLS SSL/TLS
--enable-samples enable compile for the gsoap samples
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
--with-zlib=DIR zlib installation prefix
--with-openssl=DIR openssl installation prefix
3.2.0 linux x86平台下配置编译
进入gsoap-2.8目录下:
./configure --enable-samples
make
可以发现,在/gsoap/src和/gsoap/wdsl 下生成了soapcpp2 和 wsdl2h 两个工具,备用。
进入../arm-asoap.2.8目录下:
3.2.1 配置选项./configure
3.2.2 编译 make
3.2.3 安装 make install
3.3 获取gsoap 服务器和客户端所需的文件
3.4 编写服务器和客户端
3.5 修改Makefile
3.6 交叉编译
4. 移植到ARM板
5. 测试发现设备功能
本文地址:https://blog.csdn.net/sunny_hu92/article/details/107099234
下一篇: 5G优势