ONVIF 自定义soap结构体实现用户认证

5-Onvif协议:IPC客户端之鉴权 onvif规定,有些接口需要鉴权,有些接口不需要鉴权。例如onvif规定GetDeviceInformation接口时需要鉴权的。(下图为main函数流程分析,标红的api都需要实现鉴权)市面上有些的IPC(网络摄像头),并没有严格的按照ONVIF规范执行,造成客户端不携带鉴权信息也能成功调用某些接口。 阅读详情
</pre><p>ONVIF 用户校验实现</p><p><span style="white-space:pre">	</span>ONVIF 开发使用C/C++的话,使用 gsoap 这个工具是好用的。直接生成代码框架。以下是使用 gSOAP 自己修改框架完成用户认证的方法,</p><p><ol><li>gSOAP 生成的代码框架,在stdsoap2.c 文件的 struct SOAP_STD_API soap {  ... }  结构体里面添加一个结构体  struct WS_UsernameToken SUsernameToken;  用来保存每条指令传过来的用户名,密码校验等信息。</li></ol></p><p></p><pre name="code" class="cpp">#define AUTHENTICATION_NAME_LEN 64
struct WS_UsernameToken
{
    char m_acSoapUsername[AUTHENTICATION_NAME_LEN];
    char m_acSoapPassword[AUTHENTICATION_NAME_LEN];
    char m_acSoapPasswordType[AUTHENTICATION_NAME_LEN*2];
    char m_acSoapNonce[AUTHENTICATION_NAME_LEN];
    char m_acSoapCreated[AUTHENTICATION_NAME_LEN];
};

因为gSOAP生成的代码框架,每条请求都携带一个 struct  soap *  指针,所以把结构体存在这个 结构很合理。回调函数指针也应该存储在这个结构体。


2. 从请求指令里获取客户端传过来的用户名密码等信息

soapC.c 文件的 soap_in_SOAP_ENV__Header() 这个函数 (这个函数是gSOAP生成),是请求消息头域分析函数,从这里可以得到ONVIF定义的SOAP头域的所有字段。

仿照 soap_in_SOAP_ENV__Header()  函数内部的写法,添加以下代码,获取用户名密码头域。

//Michael Add
size_t  soap_flag_auth = 1;
//Michael Add

//Michael Add
if ( soap_flag_auth && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG )	
{
	if ( soap_in_PointerTo_Authentication(soap) == 0 )
	{
		soap_flag_auth--;
		continue;
	}
}
//Michael Add

soap_in_PointerTo_Authentication()这个函数也是仿照 gSOAP 生成框架的代码格式编写的,如下:

//Michael Add
int soap_in_PointerTo_Password(struct soap *soap,char **password,char **passwordType)
{
	//if (soap_element_begin_in(soap,"wsse:Password",1,NULL))
	//	return 1;
	if (soap_s2string(soap,soap_attr_value(soap,"Type",0),passwordType,0,-1))
		return 1;

	if (!soap_in_string(soap,"wsse:Password",password,"xsd:string"))
		return 1;
	//Type http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest
	//if ( soap_element_end_in(soap,"wsse:Password") )
	//		return 1;
	return SOAP_OK;
}
int soap_in_PointerTo_Authentication(struct soap *soap)
{
    size_t soap_flag_Username = 1;
    size_t soap_flag_Password = 1;
    size_t soap_flag_Nonce = 1;
    size_t soap_flag_wsu__Created = 1;

	char *username = NULL ;
	char *password = NULL ;
	char *passwordType = NULL ;
	char *nonce = NULL;
	char *created = NULL;
    struct WS_UsernameToken UsernameToken;
	memset(&UsernameToken,0,sizeof(struct WS_UsernameToken));

    if (soap_element_begin_in(soap, "wsse:Security", 1, NULL) != 0 )
        return 1;

    if ( soap_element_begin_in(soap,"wsse:UsernameToken",1,NULL) != 0 )
        return 1;

    for(;;)
    {
        soap->error = SOAP_TAG_MISMATCH;
        if ( soap_flag_Username && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG ))
            if ( soap_in_string(soap,"wsse:Username",&username,"xsd:string") )
            {
                soap_flag_Username-- ;
                continue;
            }
        if (soap_flag_Password && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG ) )
            //if ( soap_in_string(soap,"wsse:Password",&password,"xsd:string") )
			if( soap_in_PointerTo_Password(soap,&password,&passwordType))
			{
                soap_flag_Password-- ;
                continue;
            }
        if (soap_flag_Nonce && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG ) )
            if ( soap_in_string(soap,"wsse:Nonce",&nonce,"xsd:string") )
            {
                soap_flag_Nonce-- ;
                continue;
            }
        if (soap_flag_wsu__Created && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG ) )
            if ( soap_in_string(soap,"wsu:Created",&created,"xsd:string") )
            {
                soap_flag_wsu__Created-- ;
                continue;
            }
        if (soap->error == SOAP_TAG_MISMATCH)
            soap->error = soap_ignore_element(soap);
        if (soap->error == SOAP_NO_TAG)
            break;
        if (soap->error)
            return 1;
    }
    soap_element_end_in(soap, "wsse:UsernameToken");
    soap_element_end_in(soap, "wsse:Security");
	
	memset(soap->SUsernameToken.m_acSoapUsername,0,AUTHENTICATION_NAME_LEN);
	memset(soap->SUsernameToken.m_acSoapPassword,0,AUTHENTICATION_NAME_LEN);
	memset(soap->SUsernameToken.m_acSoapPasswordType,0,AUTHENTICATION_NAME_LEN*2);
	memset(soap->SUsernameToken.m_acSoapCreated,0,AUTHENTICATION_NAME_LEN);
	memset(soap->SUsernameToken.m_acSoapNonce,0,AUTHENTICATION_NAME_LEN);
	if ( username != NULL )
	{
		strcpy(soap->SUsernameToken.m_acSoapUsername,username);
	}
	if ( password != NULL )
	{
		strcpy(soap->SUsernameToken.m_acSoapPassword,password);
	}
	if ( passwordType != NULL )
	{
		strcpy(soap->SUsernameToken.m_acSoapPasswordType,passwordType);
	}
	if ( created != NULL )
	{
		strcpy(soap->SUsernameToken.m_acSoapCreated,created);
	}
	if ( nonce != NULL )
	{
		strcpy(soap->SUsernameToken.m_acSoapNonce,nonce);
	}

	return SOAP_OK;
}

//Michael Add

3  得到用户名密码等信息后,校验
在每条指令调用的函数,都携带了 struct soap ×的结构体指针,获取出来之后,就可以,使用 SHA1 算法进行密码校验了。具体算法请参考ONVIF 编程手册[ONVIF_WG-APG-Application_Programmer's_Guide] ,这个文档可以从ONVIF官方下载。


需要使用 SHA1 算法,请参考我的博客文章,有SHA1的实现。base64算法在gSOAP代码里面可以找到。

继续在 struct soap结构体里定义回调函数,完成用户认证应该困难不大了。



ONVIF协议简介与协议测试工具使用详解 Onvif协议及协议测试工具使用详解 阅读详情

相关推荐

ONVIF设备发现开发实践指南

IP视频监控系统是一种基于IP网络,通过数字视频压缩、网络传输、分布式存储和视频实时监控技术,实现对视频和音频信息的监控、存储、查询和回放的系统。它将传统闭路电视监控系统(CCTV)数字化、网络化,实现了视频监控的远程传输与共享。ONVIF (Open Network Video Interface Forum) 是一种开放的工业标准协议,用于网络视频设备之间的互操作性。ONVIF协议使得不同厂商生产的网络摄像机、视频服务器等设备可以互联互通,简化了系统集成的工作。

weixin_30299319的博客 900

onvif 开发中的一些重要函数介绍

➤soap结构中count(soap->count)成员 soap结构中count(soap->count)成员记录的是http协议中Content-Length的数值。 ➤keep_alive keep_alive既是在通讯过程中的正常链接的一个状态标示也是关系到http协议中Connection:keep-alive的填写open还是close。 ...

weixin_33720452的博客 441

onvif 编译成的静态、动态库,只供海思v200的编译使用

arm下只供海思v200的编译器。把复杂的onvif,编译的onvif库,使用的时候参考makefile。openssl等库编译时也要加入。

onvif_gsoap开发中的一些疑虑

onvif_gsoap开发中的一些疑虑 原文链接:http://hi.baidu.com/gpf626487/item/77e50c57fc5e2b3e32e0a9ce     ①(*********)soap结构中count(soap->count)成员记录的是http协议中Content-Length的数值;     ②keep_alive既是在通讯过程中的正常链接的一个状态标示也是

chenben的专栏 4508

gSOAP中文文档(gSOAP参考资料)

2.2 gSOAP文档翻译计划(1、介绍) 1.介绍 gSOAP编译工具提供了一个SOAP/XML 关于C/C++ 语言的实现,从而让C/C++语言开发web服务或客户端程序的工作变得轻松了很多。绝大多数的C++web服务工具包提供一组API函数类库来处理特定的SOAP数据结构,这样就使得用户必须改变程序结构来适应相关的类库。与之相反,gSOAP利用编译器技术提供了一组透明化的SOAP API,并将与开发无关的SOAP实现细节相关的内容对用户隐藏起来。gSOAP的编译器能够自动的将用户定义的本地化的C或C++数据类型转变为符合XML语法的数据结构,反之亦然。这样,只用一组简单的API就将用户从SOAP细节实现工作中解脱了出来,可以专注与应用程序逻辑的实现工作了。gSOAP编译器可以集成C/C++和Fortran代码(通过一个Fortran到C的接口),嵌入式系统,其他SOAP程序提供的实时软件的资源和信息;可以跨越多个操作系统,语言环境以及在防火墙后的不同组织

双有源桥DC-DC变换器:原理、软开关与移相控制深度解析

隔离型DC-DC变换器是电力电子系统的核心部件,通过高频变压器实现电气隔离与电压匹配,保障系统安全与灵活适配。其工作原理基于功率半导体器件的开关动作,通过调制策略控制能量传输。该技术的核心价值在于实现高效、高功率密度的电能转换,并支持双向能量流动,这对于提升系统整体能效和运行灵活性至关重要。在新能源储能、电动汽车V2G及数据中心供电等场景中,双向能量流成为刚性需求,推动了如双有源桥等先进拓扑的应用。本文聚焦于双有源桥这一实现高效双向隔离变换的“明星”方案,深入剖析其利用移相控制实现软开关的机理。通过分析谐振

weixin_34195142的博客 378

onvif规范的实现:使用gSOAP创建SOAP调用实例

预备知识 ONVIF规范中设备管理和控制部分所定义的接口均以Web Services的形式提供。ONVIF规范涵盖了完全的XML及WSDL的定义。每一个支持ONVIF规范的终端设备均须提供与功能相应的Web Service。服务端与客户端的数据交互采用SOAP协议。【来自http://blog.youkuaiyun.com/ghostyu】 ONVIF中的其他部分比如音视频流则通过RTP/RTSP进行 。

ghostyu的专栏 4万+

H3C无线控制器二层注册实战:从零配置到AP上线全流程(附常见问题排查)

本文详细解析了H3C无线控制器二层注册的全流程,从网络基础准备、AC核心配置到AP上线,重点阐述了CAPWAP隧道建立的关键步骤。文章提供了清晰的典型配置示例,并针对AP无法上线、状态异常等常见问题,给出了六种典型故障现象的排查思路与解决命令,帮助网络工程师快速定位并解决问题。

weixin_29214199的博客 545

使用gSOAP开发实例(7) 基于HTTPS的基本认证(Basic Authentication)

在 gsoap-2.7/gsoap/wsdl/ 目录下建立两个目录: echo 和 echo_server ,按照前几节的方法分别建立 gSOAP客户端和服务端。客户端与前几节的相比,首先是增加了 soap­_ssl_client_context 处理 HTTPS 协议。其次,本案例使用的是基本认证 (Basic Authentication) ,需要在 soap 变量初始化之后给出用户名和密

无与伦比BLOG 1194

手把手教你用PLECS仿真BUCK数字电源(含DSP代码实现)

本文详细介绍了如何利用PLECS仿真软件与Visual Studio 2022搭建高保真数字电源开发环境,手把手指导从BUCK电路建模、编写硬件感知的C控制算法到参数调优的全过程。重点阐述了通过DLL接口实现软件在环仿真,模拟DSP的ADC/PWM时序,并将验证后的代码无缝迁移至TI C2000系列DSP,构建从仿真到固件的完整数字电源开发闭环,显著提升开发效率与一次成功率。

oo7890的博客 395

智能家居系统设计:基于MATLAB的智能家居系统设计和仿真,包括智能家居控制、家庭能源管理和家庭安全监控

基于 MATLAB 的智能家居系统设计方法可以有效地解决各类智能家居问题。

走向CTO的路上... 1775

onvif应用--IPC鉴权(认证)

本文介绍了onvif中IPC客户端开发中的鉴权(认证)的原理、如何实现鉴权、利用ONVIF Device Test Tool进行测试及其涉及的相关函数

janet110617的博客 3259

凝聚态物理新引擎:AI 驱动材料预测与相变识别大突破

摘要:本文深入探讨 AI 在凝聚态物理中的创新应用。在材料性质预测方面,AI 借助数据收集、特征提取和模型训练,能依据材料微观信息准确预估其宏观性质,以石墨烯为例验证了高效性。对于拓扑相变识别,AI 通过分析量子力学数据,利用机器学习算法判别相变节点,助力拓扑绝缘体研究。尽管面临数据质量、模型可解释性等挑战,但未来多模态数据融合、可解释 AI 等发展方向,将推动 AI 与凝聚态物理深度融合,助力探索物质奥秘与新材料研发。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1826

Onvif协议学习:7、鉴权认证

Onvif协议学习:7、鉴权认证 文章目录Onvif协议学习:7、鉴权认证1、前言2、ONVIF哪些接口需要认证3、如何认证4、安装OpenSSL5、实现认证6、特别注意 原文链接:https://blog.youkuaiyun.com/benkaoya/article/details/72477536 1、前言 接着上一篇文章接续,上篇文章说到,在测试ONVIF标准的GetDeviceInformation接口时,有些IPC要求鉴权(认证),有些IPC不需要。其实总结起来应该是这样: ONVIF规定,有些接口需

逍遥游的博客 3529

【YOLO11改进 - C3k2融合】C3k2融合动态蛇形卷积(Dynamic Snake Convolution)用于管状结构分割任务

【YOLO11改进 - C3k2融合】C3k2融合动态蛇形卷积(Dynamic Snake Convolution)用于管状结构分割任务

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 517

使用C#和ASP.NET创建登录页面

在Visual Studio中,右键单击项目,选择"添加",然后选择"新建项"。在对话框中选择"Web",然后选择"Web 窗体"。在Visual Studio中,右键单击项目,选择"添加",然后选择"新建项"。在Visual Studio中,选择"新建项目",然后选择"ASP.NET Web应用程序"。在上面的代码中,我们创建了一个简单的用户界面,包含一个用户名输入框、一个密码输入框和一个登录按钮。在上面的代码中,我们创建了一个简单的用户界面,包含一个用户名输入框、一个密码输入框和一个登录按钮。

TzData的博客 763

【⚡小丑竟然是我自己⚡】安防三年,今天才知道什么是ONVIF

什么是ONVIF ONVIF:Open Network Video Interface Forum,开放型网络视频接口论坛 Founder:AXIS,BOSCH,SONY 为什么选择ONVIF协议? 宗旨:帮助会员节约研发资源,更好地把精力放在产品的差异化设计上,尤其是针对众多安防中小企业而言。 网络视频产品由此所能提供的多种可能性,使终端用户、集成商、顾问和生产厂商能够轻松地从中获益,并获得高性价比、更灵活的解决方案、市场扩张的机会以及更低的风险。 ONVIF协议的目标及现状 Goal:solve a .

谁吃薄荷糖 1万+

手把手教你学Simulink--基于微电网的建模与仿真场景实例:独立运行模式下微电网的能量管理系统设计

本文详细介绍了使用Simulink对独立运行微电网能量管理系统进行建模与仿真的完整流程。主要包括:系统结构设计(分布式能源、储能系统、负荷等模块)、建模步骤(从创建项目到实现能量管理策略)、仿真设置与结果分析。通过建立基于规则的控制逻辑和优化调度算法,实现微电网的自主运行和能量优化管理。文章还提供了参数优化和多目标改进建议,为新能源和智能电网领域的研究与应用提供了实用指导。

MHD0815的博客 8582

Onvif用户验证之gSOAP插件wsseapi调用实现

一、  原理 Onvif中实现用户验证的方式主要使用用户名令牌认证(Usernametoken Authentication,以下简称usernametoken方式)。Usernametoken方式与basic方式不同的地方,在于后者会把用户名和密码以摘要(digest)的形式,置于HTTP信息头,而前者则把用户名以明文的形式、密码以明文或者摘要的形式,嵌入到一段XML文本中,再置于SOAP消息

tongxinxiao的专栏 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

从零开始精通Onvif之加密与认证

安全是Onvif规范的核心部分,它涵盖了加密和认证两大领域。在Onvif标准下,安全措施主要包括:设备访问控制、消息传输加密、以及认证机制,从而确保了视频监控系统中数据传输的可靠性和隐私性。Onvif加密与认证的目的在于:构建一个安全、可靠的网络视频监控和物理安全产品生态系统。通过实施加密与认证机制,Onvif确保了以下几个核心要点。1、互操作性与标准化。Onvif的加密与认证标准使得不同厂家的安防设备能够遵循统一的规则进行安全通信,促进了设备间的无缝集成,降低了因厂商差异导致的兼容性问题。

hope_wisdom的技术博客 1821

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

从零开始精通Onvif之用户管理

用户管理是Onvif协议的重要组成部分,它允许系统管理员通过网络接口创建、删除、修改用户账户,并分配不同的权限,以实现对设备的访问控制。在Onvif标准中,每个用户账户都关联着一组权限,这些权限决定了用户可以访问哪些服务和执行哪些操作。权限通常分为几种类型,比如:admin(管理员)、operator(操作员)、viewer(查看者)等,每种类型的权限集合由设备制造商定义。

hope_wisdom的技术博客 1825

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

ONVIF 介绍

WSDL(Web Services Description Language)是一种用于描述 Web Service 的语言。它定义了 Web Service 的接口、操作、输入输出参数等信息。通过 WSDL,客户端可以了解 Web Service 的功能和调用方式,从而实现与 Web Service 的交互。SOAP(Simple Object Access Protocol)是一种基于 XML 的协议,用于在分布式环境中交换结构化信息。

写作是为了更好的思考 1920

ONVIF协议了解

Onvif,即Open Network Video Interface Forum ,可以译为开放型网络视频接口论坛,是安迅士、博世、索尼在2008年共同成立的一个国际性、开发型网络视频产品标准网络接口的开发论坛,后来由于这个技术开发论坛共同制定的开发型行业标准,就用该论坛的大写字母命名,即ONVIF 网络视频标准规范,习惯简称为:ONVIF协议。

u014415274的博客 1万+

onvif 模拟摄像头_ONVIF协议测试工具(ONVIF Device Test Tool)

ONVIF官方发布最新版ONVIF协议测试工具,ONVIF Device Test Tool V12.12版本,只对ONVIF成员提供,美佳威迪欧友情提供。作为IP物理安防产品的领先标准化组织,ONVIF日前宣布,它已发布了一套新的工具,旨在帮助会员公司设计并在物理安防市场推出新的创新性ONVIF认证产品。更新后的测试工具以及附带的测试规范代表ONVIF的技术服务委员会继续工作,以加强和完善ONV...

weixin_39944074的博客 3011

Linux设备上的Onvif实现16:实现Onvif鉴权

2013-09-30 16:39:27 今天终于调试通过了鉴权过程,详细记录如下: 1原理 在ONVIF_WG-APG-Application_Programmer's_Guide.pdf文档中第6章描述了onvif加密方式。Soap通信的验证机制是WS_UsernameToken,流加密的方式是HTTPS。本文只研究了WS_UsernameToken方式。 我们知

快活林高老大--编码30年 9898

onvif协议介绍

摄像头在我们的日常生活中可以说时随处可见。而在当下的时代,大多数摄像头都已经,早期的网络摄像机硬件提供商都采用进行。但随着时代的发展,摄像头的应用场景越来越多,各个摄像头的厂商也是百花齐放。私有协议终究会被淘汰。为了解决这一困境,安讯士联合博世及索尼公司,共同制定了onvif(Open Network Video Interface Forum,开放型网络视频接口论坛)协议。

顺其自然~专栏 6431
上一篇: makefile 之多目录,多目标编译
下一篇: C++ primer 文本查询程序 Query
Pray90
博客等级 码龄15年 34粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值