ONVIF系列二:Ubuntu安装gSOAP、生成ONVIF代码框架

        ONVIF系列:

        ONVIF系列一:ONVIF介绍

        ONVIF系列二:Ubuntu安装gSOAP、生成ONVIF代码框架

        ONVIF系列三:ONVIF客户端实现

一、安装

1、安装依赖

apt install bison
apt install flex 
apt install libssl-dev
apt install automake

2、下载gsoap源码:https://sourceforge.net/projects/gsoap2/

        下载2.8.134版本

3、编译安装

        创建/work/onvif,把源码放到/work/onvif下面解压

cd /work/onvif/
unzip gsoap_2.8.134.zip

        创建gsoap安装目录

mkdir /work/onvif/gsoap-install

        进入源码目录

cd /work/onvif/gsoap-2.8

        配置

./configure  --prefix  /work/onvif/gsoap-install

        编译

make

        不要使用make -j,可能出错。

        安装

make install

        在/work/onvif/gsoap-install下面由四个文件夹,bin包含两个可执行程序soapcpp2  wsdl2h,wsdl2h:根据WSDL文件生成头文件,soapcpp2:根据wsdl2h生成的头文件(或者自己写的头文件)生成SOAP Web Services代码框架(RPC + HTTP + XML);share在后面生成ONVIF服务端/客户端代码框架的时候会用到。

二、gSOAP生成ONVIF服务端/客户端代码框架

        创建/work/onvif/onvif-code目录,用来生成onvif服务端客户端代码

mkdir /work/onvif/onvif-code
cd /work/onvif/onvif-code

         把安装目录的bin和share里面的gsoap文件夹拷贝到/work/onvif/onvif-code下面

cp -r /work/onvif/gsoap-install/bin .
cp -r /work/onvif/gsoap-install/share/gsoap .

        还需要把源码里面gsoap(/work/onvif/gsoap-2.8/gsoap/)里面的dom.c  dom.cpp stdsoap2.c  stdsoap2.cpp  stdsoap2.h拷贝到/work/onvif/onvif-code/gsoap下面

root@www.100ask.org:/work/onvif/onvif-code# cp /work/onvif/gsoap-2.8/gsoap/dom.c ./gsoap/
root@www.100ask.org:/work/onvif/onvif-code# cp /work/onvif/gsoap-2.8/gsoap/dom.cpp ./gsoap/
root@www.100ask.org:/work/onvif/onvif-code# cp /work/onvif/gsoap-2.8/gsoap/stdsoap2.c ./gsoap/
root@www.100ask.org:/work/onvif/onvif-code# cp /work/onvif/gsoap-2.8/gsoap/stdsoap2.cpp ./gsoap/
root@www.100ask.org:/work/onvif/onvif-code# cp /work/onvif/gsoap-2.8/gsoap/stdsoap2.h ./gsoap/

1、生成头文件

        在/work/onvif/onvif-code目录下创建一个脚本onvif_head.sh,用来生成头文件

#!/bin/bash
mkdir onvif_head
cd onvif_head
../bin/wsdl2h -o  onvif.h  -s -c -d -x -t ../gsoap/WS/typemap.dat \
http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl \
https://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl \
http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl \
http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl 

        wsdl2h可以根据在线文档生成头文件,不需要我们把WSDL文档下载下来,视频监控,一般需要的模块有:remotediscovery.wsdl-设备发现模块;devicemgmt.wsdl-设备管理模块;media.wsdl-媒体模块;ptz.wsdl-ptz控制模块

        wsdl2h参数说明:

        -o:生成头文件名字

        -s:不生成STL代码

        -c:生成C代码

        -c++:生成C++代码(默认)

        -x:不生成XML文件,如果不加-x会生成一堆XML文件,就是ONVIF请求相求的SOAP消息示例,想学习ONVIF的XML消息结构可以生成,但是这些XML在我们写ONVIF服务端和客户端的时候没有用

        -t:指定typemap.dat位置

        -C(大写):仅生成客户端代码

        -S(大写):仅生成服务端代码

        执行onvif_head.sh脚本,会在onvif_head文件夹下生成头文件onvif.h

        ONVIF是需要鉴权的,需要修改一下头文件onvif.h,增加一行代码#import "wsse.h"

        wsse.h在gsoap/import/下面

        打开wsse.h文件可以看到,wsse.h依赖一些源文件,在写onvif服务端/客户端代码的时候需要把源文件添加到工程里面才行,但是现在生成ONVIF SOAP Web Services代码框架时不需要

2、生成onvif代码框架

        在/work/onvif/onvif-code目录下创建gen_code.sh脚本根据头文件 onvif.h生成代码框架

#!/bin/bash
DIR=soap
mkdir $DIR
cd $DIR
 ../bin/soapcpp2 -2 -x -c ../onvif_head/onvif.h  -L -I ../gsoap/import -I ../gsoap/

        这个脚本会根据onvif.h生成代码框架,代码放在soap文件夹下面

        soapcpp2 参数说明

        -1:生成soap1.1版本代码。

        -2:生成soap1.2版本代码。

        -x:不生成XML文件

        -C(大写):仅生成客户端代码

        - S(大写):仅生成服务端代码

        -c(小写):生成C语言代码

        -c++:生成C++代码

        -L:不生成soapClientLib/soapServerLib (一般不用)

        -I(大写的i):指定路径

        不指定-C或者-S会生成客户端和服务端代码

        执行gen_code.sh脚本,会报错,如下:

        解决办法:修改/work/onvif/onvif-code下面的gsoap/import/wsa5.h

        把SOAP_ENV__Fault注释掉即可

        重新执行gen_code.sh脚本,在soap目录下生成了onvif的代码框架

        其中.nsmap中定义了onvif xml中的命名空间,DeviceBinding.nsmap  MediaBinding.nsmap  PTZBinding.nsmap  RemoteDiscoveryBinding.nsmap wsdd.nsmap里面的内容完全一样。        

        soapC.c:指定数据结构的序列化和反序列化
        soapClient.c:客户端代码
        soapH.h:主头文件,所有客户机和服务器源代码都要包括他
        soapServer.c:服务器端代码
        soapStub.h:从输入头文件(onvif.h)生成的经过修改且带命名空间前缀的头文件

3、soapStub.h介绍

        soapStub.h保存了客户端的stub(存根)代理函数、服务端服务(RPC)函数。对stub概念不明白的,请看ONVIF系列一中关于RPC的介绍。

        soapStub.h中Externals表示下面就是客户端和服务端的stub(存根函数)。

3.1 客户端部分

        Client-Side Call Stub Functions:客户端stub(存根)函数,开发客户端程序只需要把soapC.c、soapClient.c、soapH.h、soapStub.h包含到项目中,并调用这些函数就可以实现onvif客户端功能。

3.2 服务端部分

        Server-Side Operations表示下面的函数是服务端的RPC函数,开发服务端就需要实现这个函数(业务部分)

        Server-Side Skeletons to Invoke Service Operations:用于调用服务操作的服务器端骨架,这是soap代码框架提供给服务端的API,简单理解这些API就是服务端用来处理客户端请求的。服务端只需要调用即可。

        包含soapC.c、soapServer.c、soapH.h、soapStub.h就可以实现服务端,服务端需要实现Server-Side Operations定义的API。

        我们一般是开发客户端,服务端由IPC制造商实现(华康、大华等)。

        至此,我们生成了onvif的SOAP Web Services框架

        bin:来源于gsoap安装目录

        gsoap:来源于gsoap安装目录中的share目录

        onvif_head.sh:生成头文件的脚本

        onvif_head:存放头文件的目录

        gen_code.sh:生成ONVIF Web Services框架的脚本

        soap:生成的ONVIF框架代码,包含客户端和服务端代码,也可只生成客户端或者只生成服务端代码,修改onvif_head.sh和gen_code.sh脚本即可(添加-C或-S参数)。

        系列三中将实现ONVIF客户端。

 

         我的开源:

         1、Nvidia视频硬解码、渲染、软/硬编码并写入MP4文件。项目地址:https://github.com/BreakingY/Nvidia-Video-Codec
        2、Jetson Jetpack5.x视频编解码。项目地址:https://github.com/BreakingY/jetpack-dec-enc
        3、音视频(H264/H265/AAC)封装、解封装、编解码pipeline,支持NVIDIA、昇腾DVPP硬编解码。项目地址:https://github.com/BreakingY/Media-Codec-Pipeline
        4、simple rtsp server,小而高效的rtsp服务器,支持H264、H265、AAC、PCMA;支持TCP、UDP;支持鉴权。项目地址:https://github.com/BreakingY/simple-rtsp-server

        5、simple rtsp client,rtsp客户端,支持TCP、UDP、H264、H265、AAC、PCMA,支持鉴权。项目地址:https://github.com/BreakingY/simple-rtsp-client

        6、libflv,flv muxer/demuxer,支持H264/H265、AAC。项目地址:https://github.com/BreakingY/libflv

        7、mpeg2 ts ps muxer/demuxer,支持H264/H265/MPEG1 audio/MP3/AAC/AAC_LATM/G711。项目地址:https://github.com/BreakingY/libmpeg2core

posted @   BreakingY  阅读(41)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示