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-gccCFLAGS=-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-prototypesSFLAGS=-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 -ESTATICLIB=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接口即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/760959.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【嵌入式学习】Qtday03.21

一、思维导图 二、练习 自由发挥登录窗口的应用场景,实现一个登录窗口界面。(不要使用课堂上的图片和代码,自己发挥,有利于后面项目的完成) 要求: 1. 需要使用Ui界面文件进行界面设计 2. ui界面上的组件…

Spring Framework UriComponentsBuilder URL解析不当漏洞复现(CVE-2024-22259)

免责声明 由于传播、利用本CSDN所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任,一旦造成后果请自行承担! 一、产品介绍 Spring Framework 是一个开源的Java应用程序框架,UriComponentsBuilder是Spring Web中用于构建和操作…

C语言之---柔性数组

1.1前记 也许你从来没有听说过柔性数组这个概念,但是它是确实存在的。 C99中,结构中的最后一个元素允许是未知大小的数组,这就是柔性数组成员。 例如: struct st_type {int i;int a[0]; }; 有些编译器会报错无法编译可以改为&#xff1a…

深入了解 Spring boot的事务管理机制:掌握 Spring 事务的几种传播行为、隔离级别和回滚机制,理解 AOP 在事务管理中的应用

🎉🎉欢迎光临,终于等到你啦🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟持续更新的专栏《Spring 狂野之旅:从入门到入魔》 &a…

Python基础----字符串(持续更新中)

字符串的介绍 定义:是python中常用的数据类型之一,可以使用单引号、双引号、三引号来进行创建 字符串的标识类型:str 字符串的特性 字符串属于不可变数据类型,不能直接修改字符串的本身 数字、元组也属于不可变数据类型 字符串…

LeetCode 热题 100 | 堆(一)

目录 1 什么是堆排序 1.1 什么是堆 1.2 如何构建堆 1.3 举例说明 2 215. 数组中的第 K 个最大元素 2.1 子树大根化 2.2 遍历所有子树 2.3 弹出栈顶元素 2.4 完整代码 菜鸟做题,语言是 C 1 什么是堆排序 1.1 什么是堆 堆的定义和分类&#xff…

【c++入门】命名空间,缺省参数与函数重载

🔥个人主页: Quitecoder 🔥专栏:c笔记仓 朋友们大家好!本篇内容我们进入一个新的阶段,进入c的学习!希望我的博客内容能对你有帮助! 目录 1.c关键字2.第一个c代码3.命名空间3.1 nam…

CTF-辨别细菌

题目描述&#xff1a;try your best to find the flag. 进入靶场后发现是一个游戏&#xff0c;需要全部答对才可以得到最后的flag 查看了一下源码&#xff0c;发现有一个答案模板的模块 尝试解释一下代码 <!-- 答案模版 --> <script id"template_game_pi…

数据结构/C++:红黑树

数据结构/C&#xff1a;红黑树 概念实现基本结构插入uncle为红色节点uncle为黑色节点 总代码展示 概念 红黑树是一种二叉搜索树&#xff0c;一般的二叉搜索会发生不平衡现象&#xff0c;导致搜索效率下降&#xff0c;于是学者们开始探索如何让二叉搜索树保持平衡&#xff0c;这…

Agent驱动的RPA——实在Agent(智能体):自动化时代的新引擎

随着人工智能和机器学习技术的快速发展&#xff0c;智能Agent在 RPA领域扮演了革命性的角色。 Agent驱动的RPA不仅实现了传统规则导向自动化工具的功能升级&#xff0c;而且通过引入自主、智能决策与协作能力&#xff0c;为现代企业带来了更高程度的灵活性与智能化水平。随着数…

【python】(03)初识生成器Generator

系列文章回顾 【python】(01)初识装饰器Decorator 【python】(02)初识迭代器Iterator 【python】(03)初识生成器Generator 文章目录 一.生成器的定义二.生成器的作用三.实际代码示例四.常见问题生成器在 Python 中是非常强大和灵活的工具,可以帮助我们高效地处理大型数据集合或…

C. Lexicographically Largest - 思维

题面 分析 如果没有相同的数那么一定是从最后一个开始向前一个个放入集合&#xff0c;这样不会损失&#xff0c;一旦有相同的&#xff0c;从右向左依次放入&#xff0c;那么一旦遇到集合里已经有的元素&#xff0c;此时最优策略就是将当前这个数减一再放进去&#xff0c;那么…

tensorflow中显存分配

tensorflow中显存分配 问题&#xff1a;使用tensorflow-gpu训练模型&#xff0c;GPU的显存都是占满的。 # GPU 1的显存将占满 os.environ["CUDA_VISIBLE_DEVICES"] "1" 原因&#xff1a;默认情况下&#xff0c;tensorflow会把可用的显存全部占光&#…

第1章 计算机系统概述

王道学习 1.1 操作系统的基本概念 1.1.1 操作系统的概念 1.1.2 操作系统的特征 操作系统是一种系统软件&#xff0c;但与其他系统软件和应用软件有很大的不同&#xff0c;它有自己的特殊性即基本特征。操作系统的基本特征包括并发、共享、虚拟和异步。这些概念对理解和掌握…

网站打开慢有哪些原因造成的?该如何优化

网站打开慢可能有多种原因造成&#xff0c;以下是一些常见的导致网站打开慢的原因以及对应的优化方法&#xff1a; 服务器性能不足&#xff1a; 优化方法&#xff1a; 升级服务器配置、使用CDN加速、优化服务器软件和设置、减少服务器负载等。 大量图片和多媒体文件&#xff1…

python中的面向对象特性

面向对象编程&#xff08;Object-Oriented Programming&#xff0c;简称OOP&#xff09;是一种编程范式&#xff0c;它使用“对象”来设计软件。面向对象编程的主要特性包括封装、继承、多态性和抽象。这些特性使得OOP特别适合处理大型、复杂的软件系统。 特性 1. 封装&#…

kail linux破解密码--- 详细过程(配合图文让你看了就会)

1.准备工作 1.vmware虚拟机 2.kali的系统 3.无线网卡一张(这个是必须的我买的是30多块) 4.这里为了实验&#xff0c;和直观的看到效果&#xff0c;用手机开了一个wifi然后使用kali进行破解 2.下载kali然后安装到虚拟机vmware 直接在官网下载 Get Kali | Kali Linux 我选…

WebXR实践——利用aframe框架浏览器展示全景图片

一、效果 话不多说&#xff0c;先上效果 二、代码 index.html <!DOCTYPE html> <html><head><meta charset"utf-8"><title>360&deg; Image</title><meta name"description" content"360&deg; Imag…

面试算法-64-零钱兑换

题目 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认为每种硬币的数量是无限的…

【机器学习】深入解析线性回归模型

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…