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进行

更多:https://www.onvif.org

 

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 消息的基本结构





...



...
  
  ...
  


 

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)组网:

arm-linux---ONVIF标准下SOAP简单对象访问协议gsoap工具的交叉编译_第1张图片

 

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. 测试发现设备功能

你可能感兴趣的:(arm-linux,Linux)