ONVIF系列二:Ubuntu安装gSOAP、生成ONVIF代码框架
ONVIF系列:
ONVIF系列二:Ubuntu安装gSOAP、生成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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库