欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

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

程序员文章站 2022-03-20 10:54:03
1.平台信息Linux:VMware® Workstation 12 Pro + Ubuntu 12.04 64bitARM: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....

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规范涵盖了完全的XMLWSDL的定义。每一个支持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 消息的基本结构

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

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

 

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