arm-linux实现onvif server+WS-UsernameToken令牌验证

目录

一、环境搭建

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框架

5.5.1、修改gsoap-2.8.130_install/share/gsoap/import/wsa5.h

六、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接口即可。

相关推荐

  1. ACM linux 驱动验证

    2024-03-18 05:24:09       18 阅读
  2. RedisTemplate实现令牌桶限流

    2024-03-18 05:24:09       11 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-18 05:24:09       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-18 05:24:09       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-18 05:24:09       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-18 05:24:09       20 阅读

热门阅读

  1. Go语言-关于 go get 和 go install

    2024-03-18 05:24:09       22 阅读
  2. 新一代云原生数据库OLAP

    2024-03-18 05:24:09       20 阅读
  3. 微软 CEO Satya Nadella 的访谈

    2024-03-18 05:24:09       16 阅读
  4. C++/CLI学习笔记5(快速打通c++与c#相互调用的桥梁)

    2024-03-18 05:24:09       18 阅读
  5. Vue3项目随笔

    2024-03-18 05:24:09       19 阅读
  6. [C++] 实现Union

    2024-03-18 05:24:09       24 阅读
  7. struct 和 union 的区别?

    2024-03-18 05:24:09       20 阅读
  8. iOS——【Blocks】

    2024-03-18 05:24:09       21 阅读
  9. -bash-4.2$

    2024-03-18 05:24:09       23 阅读
  10. c语言:苹果和虫子

    2024-03-18 05:24:09       20 阅读
  11. 2022蓝桥杯/a进制转十进制/c\c++

    2024-03-18 05:24:09       22 阅读