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、ffmpeg音视频(H264/H265/AAC)封装、解封装、编解码pipeline,支持NVIDIA硬编解码。项目地址:https://github.com/BreakingY/FFmpeg-Media-Codec-Pipeline
        4、simple rtsp server,小而高效的rtsp服务器,支持H264、H265、AAC、PCMA;支持TCP、UDP;支持鉴权。项目地址:https://github.com/BreakingY/simple-rtsp-server

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

  • 32
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用gSOAP生成ONVIF框架代码需要遵循以下步骤: 1. 下载gSOAP工具包并安装到本地。 2. 下载ONVIF设备WSDL文件,例如https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl。 3. 使用gSOAP工具包中的wsdl2h工具将WSDL文件转换为头文件。 4. 使用soapcpp2工具生成ONVIF框架代码,例如: ```bash soapcpp2 -Iimport devicemgmt.h ``` 5. 在生成代码中实现ONVIF设备的具体操作。 以下是在Linux系统中使用gSOAP生成ONVIF框架代码的示例: 1. 下载gSOAP工具包并安装到本地: ```bash wget https://sourceforge.net/projects/gsoap2/files/gSOAP/gsoap_2.8.112.zip unzip gsoap_2.8.112.zip cd gsoap-2.8 ./configure make sudo make install ``` 2. 下载ONVIF设备WSDL文件: ```bash wget https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl ``` 3. 使用wsdl2h工具将WSDL文件转换为头文件: ```bash wsdl2h -o onvif.h devicemgmt.wsdl ``` 4. 使用soapcpp2工具生成ONVIF框架代码: ```bash soapcpp2 -Iimport onvif.h ``` 5. 在生成代码中实现ONVIF设备的具体操作。 在生成代码中,每个ONVIF操作都有对应的函数,例如`SOAP_FMAC5 int SOAP_FMAC6 __tds__GetDeviceInformation(struct soap* soap, _tds__GetDeviceInformation* tds__GetDeviceInformation, _tds__GetDeviceInformationResponse &tds__GetDeviceInformationResponse)`就是获取设备信息的函数。您可以在这些函数中实现具体的操作。 另外,生成代码中还有一些辅助函数和结构体,您也可以根据需要使用它们。 例如,以下代码片段演示了如何创建一个SOAP客户端并调用`__tds__GetDeviceInformation`函数: ```c++ #include "soapDeviceBindingProxy.h" const char* endpoint = "http://192.168.1.100/onvif/device_service"; DeviceBindingProxy proxy; proxy.soap_endpoint = endpoint; _tds__GetDeviceInformation tds__GetDeviceInformation; _tds__GetDeviceInformationResponse tds__GetDeviceInformationResponse; proxy.__tds__GetDeviceInformation(&tds__GetDeviceInformation, tds__GetDeviceInformationResponse); // 处理返回值 ``` 在使用时,需要将`endpoint`替换为实际的设备IP地址和ONVIF服务端口号。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值