目录
一、环境搭建
1、安装openssl
2、安装bison
3、安装flex
二、gsoap下载
三、编译x86版本gsoap
四、编译arm-linux版本gsoap
1、交叉编译openssl
1.1、下载openssl
1.2、交叉编译
2、交叉编译zlib
2.1、下载zlib
2.2、交叉编译
3、交叉编译gsoap
3.1、编译过程中遇到的问题
五、ONVIF框架生成
5.1、开发板环境搭建
5.2、修改typemap.dat
5.3、生成onvif.h
5.4、支持 WS-UsernameToken鉴权
5.5、生成ONVIF框架
六、ONVIF功能实现
6.1、框架结构搭建
6.2、WS-UsernameToken鉴权实现
6.2.1、客户端鉴权
6.2.2、服务端鉴权
一、环境搭建
1、安装openssl
sudo apt install openssl
sudo apt install libssl-dev
2、安装bison
sudo apt install bison
3、安装flex
sudo apt install flex
二、gsoap下载
gsoap 2.8.130版本下载地址:
Download gsoap_2.8.130.zip (gSOAP Toolkit) (sourceforge.net)
gSOAP官方网址:gSOAP: SOAP/XML Web Services and XML Data Bindings for C and C++
gSOAP下载网址:gSOAP Toolkit download | SourceForge.net
下载完成,解压至两个文件夹:
三、编译x86版本gsoap
编译步骤:
cd gsoap-2.8_x86
./configure --enable-samples
make
四、编译arm-linux版本gsoap
1、交叉编译openssl
1.1、下载openssl
下载地址:[ Downloads ] - /source/index.html (openssl.org)
根据实际情况选择openssl版本,本文使用openssl 1.0.0版本
1.2、交叉编译
交叉编译与Ubuntu编译类似,配置时通过【--prefix=绝对路径】选项指定安装路径(自行创建文件夹),然后修改Makefile文件,修改方式如下:
./config no-asm no-async -shared --prefix=/home/wsk/wsk_workspace/tools/gsoap/openssl-1.0.0_install
vi Makeifle
指定交叉编译工具链
搜索-m64选项并删除,共两处。
查看交叉编译版本:
如果后面没有hf,则需要在CFLAGS后面添加:-mfloat-abi=softfp
交叉编译、安装交叉编译后的库至之前自行指定的路径。
make
make install
openssl安装失败:
解决方案:
sudo mv /usr/bin/pod2man /usr/bin/pod2man_bk
再次安装,安装成功后再修改回去。
2、交叉编译zlib
2.1、下载zlib
下载地址:Index of /fossils (zlib.net)
根据实际情况选择zlib版本,本文使用zlib 1.2.5版本
2.2、交叉编译
./configure --shared --static --prefix=/home/wsk/wsk_workspace/tools/gsoap/zlib-1.2.5_install
修改Makefile如下:
CC=arm-fsl-linux-gnueabi-gcc
CFLAGS=-O3 -D_LARGEFILE64_SOURCE=1
#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
#CFLAGS=-g -DDEBUG
#CFLAGS=-O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
# -Wstrict-prototypes -Wmissing-prototypes
SFLAGS=-O3 -fPIC -D_LARGEFILE64_SOURCE=1
LDFLAGS= -L. libz.a
TEST_LDFLAGS=-L. libz.a
LDSHARED=arm-fsl-linux-gnueabi-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map
CPP=arm-fsl-linux-gnueabi-gcc -E
STATICLIB=libz.a
SHAREDLIB=libz.so
SHAREDLIBV=libz.so.1.2.5
SHAREDLIBM=libz.so.1
LIBS=$(STATICLIB) $(SHAREDLIBV)
AR=arm-fsl-linux-gnueabi-ar rc
RANLIB=arm-fsl-linux-gnueabi-ranlib
LDCONFIG=ldconfig
LDSHAREDLIBC=-lc
TAR=tar
SHELL=/bin/sh
EXE=
make
make install
安装成功:
3、交叉编译gsoap
整体目录结构
cd gsoap-2.8
./configure --enable-samples --prefix=/home/wsk/wsk_workspace/tools/gsoap/gsoap-2.8.130_install --host=arm-fsl-linux-gnueabi --with-openssl="/home/wsk/wsk_workspace/tools/gsoap/openssl-1.0.0_install" --with-zlib="/home/wsk/wsk_workspace/tools/gsoap/zlib-1.2.5_install"
make
3.1、编译过程中遇到的问题
问题1:soapcpp2可执行文件格式错误
解决方案:
mv gsoap/src/soapcpp2 gsoap/src/soapcpp2_bk
cp ../gsoap-2.8_x86/gsoap/src/soapcpp2 gsoap/src/soapcpp2
问题2:找不到ssl库
解决方案:
mv ../openssl-1.0.0_install/lib64 ../openssl-1.0.0_install/lib
问题3:wsdl2h可执行文件格式错误
解决方案:
mv gsoap/wsdl/wsdl2h gsoap/wsdl/wsdl2h_bk
cp ../gsoap-2.8_x86/gsoap/wsdl/wsdl2h gsoap/wsdl/wsdl2h
以上问题解决后,进行安装
make install
可执行文件替换:
cp gsoap/wsdl/wsdl2h_bk ../gsoap-2.8.130_install/bin
cp gsoap/src/soapcpp2_bk ../gsoap-2.8.130_install/bin
gsoap交叉编译完成。
五、ONVIF框架生成
5.1、开发板环境搭建
将gsoap安装目录放置arm开发板上
cd /gsoap-2.8.130_install/bin/
mv soapcpp2 /usr/bin/
mv wsdl2h /usr/bin/
5.2、修改typemap.dat
修改gsoap-2.8.130_install/share/gsoap/WS/typemap.dat文件
在文件最后添加,不然后续编译框架会报错
xsd__duration = #import "custom/duration.h" | xsd__duration
5.3、生成onvif.h
cd /gsoap-2.8.130_install/share/gsoap
wsdl2h -P -x -c -s -F -Nname -t ./WS/typemap.dat -o onvif.h https://www.onvif.org/ver10/network/wsdl/remotediscovery.wsdl https://www.onvif.org/ver10/device/wsdl/device
mgmt.wsdl https://www.onvif.org/ver10/media/wsdl/media.wsdl
5.4、支持 WS-UsernameToken鉴权
因为鉴权需要,修改onvif.h文件
#import "wsse.h"
5.5、生成ONVIF框架
5.5.1、修改gsoap-2.8.130_install/share/gsoap/import/wsa5.h
把SOAP_ENV__Fault改成SOAP_ENV__Fault_alex
5.5.2、生成ONVIF框架代码
mkdir /gsoap-2.8.130_install/share/gsoap/onvif_server
mkdir /gsoap-2.8.130_install/share/gsoap/onvif_client
cd /gsoap-2.8.130_install/share/gsoap
# 生成服务端框架代码
soapcpp2 -2 -x -L -S -c onvif.h -Iimport -d onvif_server
# 生成客户端框架代码
soapcpp2 -2 -x -L -C -c onvif.h -Iimport -d onvif_client
六、ONVIF功能实现
6.1、框架结构搭建
拷贝生成的onvif_server和onvif_client至linux x86开发环境,以onvif_server框架为基础进行搭建。
拷贝gsoap-2.8.130_install/share/gsoap/custom/目录下的duration.c、duration.h、struct_timeval.c、struct_timeval.h至onvif_server目录。
拷贝gsoap-2.8.130_install/share/gsoap/plugin目录下的mecevp.c、mecevp.h、smdevp.c、smdevp.h、threads.c、threads.h、wsaapi.c、wsaapi.h、wsseapi.c、wsseapi.h至onvif_server目录。
拷贝gsoap-2.8/gsoap目录下的dom.c、stdsoap2.c、stdsoap2.h至onvif_server目录。
拷贝onvif_client目录下的soapClient.c至onvif_server目录。
新增common.c、common.h、onvif_server_interface.c、main.c
6.2、WS-UsernameToken鉴权实现
6.2.1、客户端鉴权
只需在每次发送消息前调用soap_wsse_add_UsernameTokenDigest接口即可。
soap_wsse_add_UsernameTokenDigest(soap, NULL, "admin", "123456");
6.2.2、服务端鉴权
只需调用soap_wsse_verify_Password接口即可。