Visual Studio 2019 x64 环境下onvif环境的搭建,含客户端、服务端及鉴权

onvif 框架搭建

1.访问https://sourceforge.net/projects/gsoap2/,获得gsoap框架

2.打开gsoap-2.8\gsoap\bin目录,将soapcpp2.exe 和 wsdl2h.exe移动到新目录

3.生成 onvif.h 文件  

wsdl2h -o onvif.h -s -t ./typemap.dat http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl http://www.onvif.org/onvif/ver10/event/wsdl/event.wsdl http://www.onvif.org/onvif/ver10/display.wsdl http://www.onvif.org/onvif/ver10/deviceio.wsdl http://www.onvif.org/onvif/ver20/imaging/wsdl/imaging.wsdl http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl http://www.onvif.org/onvif/ver10/receiver.wsdl http://www.onvif.org/onvif/ver10/recording.wsdl http://www.onvif.org/onvif/ver10/search.wsdl http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl http://www.onvif.org/onvif/ver10/replay.wsdl http://www.onvif.org/onvif/ver20/analytics/wsdl/analytics.wsdl http://www.onvif.org/onvif/ver10/analyticsdevice.wsdl http://www.onvif.org/ver10/actionengine.wsdl http://www.onvif.org/ver10/pacs/accesscontrol.wsdl http://www.onvif.org/ver10/pacs/doorcontrol.wsdl

文件下载可能很慢,可以先将wsdl文件下载下来,放到目录中生成。

会在wsdl2h.exe目录下生成 onvif.h 文件

4. 生成onvif框架

soapcpp2 -s -p p onvif.h -x -L -I./ -I./gsoap -I./import/ -I./custom -I./plugin         服务端生成

soapcpp2 -c -p p onvif.h -x -L -I./ -I./gsoap -I./import/ -I./custom -I./plugin         客户端生成

注意先将 gsoap-2.8\gsoap 目录下 custom import plugin 文件夹复制到 soapcpp2.exe 所在文件夹。

生成成功后目录下 pC.cpp pH.h  pServer.cpp pStub.h 迁移到自己的工程目录,同时将 gsoap-2.8\gsoap\stdsoap2.cpp gsoap-2.8\gsoap\stdsoap2.h gsoap-2.8\gsoap\custom\duration.c gsoap-2.8\gsoap\custom\duration.h 一同放到目录中

5. 可以调用完成框架的建立了。

已完成的框架文件下载地址:https://download.csdn.net/download/lz201_xxj/14141924

鉴权:

1. 不想搭建openssl环境,直接下载了已编译的好的库文件,直接使用,可在下列地址下载:https://download.csdn.net/download/jsjtsty/10854630

2. 在前面生成的onvif.h的文件中加入  #import "wsse.h"  使鉴权可以被支持。

3. 重新生成onvif框架,跟前面的步骤相同。

4. 拷贝 gsoap-2.8\gsoap\dom.cpp  gsoap-2.8\gsoap\plugin\mecevp.cpp gsoap-2.8\gsoap\plugin\smdevp.cpp  gsoap-2.8\gsoap\plugin\threads.cpp  gsoap-2.8\gsoap\plugin\wsaapi.cpp  gsoap-2.8\gsoap\plugin\wsseapi.cpp 文件到工程目录,同时将openssl库文件和头文件加入工程目录,环境搭建完成。

5. 编译后会出现一些问题,主要是CC++混合编译,我的做法是将所有的c文件强制命名成CPP文件,同时不使用预编译头。有些函数没有实体,比如soap_default_xsd__dateTime等,直接建一个空函数。在预处理器中添加WITH_DOM   和   WITH_OPENSSL,使能鉴权功能。

6. 编译通过后就是使用问题了,在客户端中直接调用 soap_wsse_add_UsernameTokenDigest 进行鉴权,注意需要在每次访问服务端前调用。在服务端中 通过soap_wsse_get_Username 和 soap_wsse_verify_Password 验证客户端发送的用户名和密码是否与服务端的匹配,将这两个函数封装到一个函数中同时判断,在需要鉴权的soap处理函数中位置加入这两个函数,未通过返回0即可。

以上功能已通过海康摄像机和ONVIF Device Manager软件分别对服务端和客户端功能进行了验证。

 

wsdl2h用作wsdl和.h文件的转换。soapcpp2用头文件生成客户端/服务端等开发需要的h和cpp文件。

1:wsdl2h指令汇总

  -o filename.h   将wsdl转化为filename.h头文件。

  -s         不生成STL代码

  -c         生成纯C风格的头文件,这将去除C++的一些特性

  -n  name      使用name代替默认前缀ns

  -t filename.dat  使用filename.dat代替默认的typemap.dat文件

  -zX        兼容之前的X版本

2:soapcpp2

  -i     生成server的proxy和object,这种object继承于soap struct。

  -j     和-i类似,区别在于生成的代理类不继承于soap struct,而是包含了包含了一个soap结构的指针。此种方式生存的代理类便于互相通信

  -c    仅生成客户端client代码

  -s    仅生成服务端server代码

  -x    不生成xml文件。不用此项的话,将对头文件中定义的每个operation生成一个描述性的xml文件

  -L    不生成soapClientLib文件和soapServerLib文件

  -p name  修改文件名前缀,代替soap

  -q name  指定代理类和对象使用的名空间name,包含文件名前缀

 

注:

1. 在服务端接收鉴权等信息时,报 wsse:Security 错误,内部发现是服务端 SOAP_SYNTAX_ERROR 错误,导致客户端错误,表现在无法进行鉴权,海康相机无此问题,自己的服务端有这个问题,经过搜索(感谢  https://blog.csdn.net/u012084827/article/details/45157923 快活林高老大)提供的解决办法,按以下方法修正后解决问题。

soap_s2byte(struct soap *soap, const char *s, char *p)
{ if (s)
  { long n;
    char *r;

    n = soap_strtol(s, &r, 10);   
    if (s == r || *r || n < -128 || n > 127)
    {         
        soap->error = SOAP_TYPE;
    }
    *p = (char)n;
  }
  return soap->error;
}

soap_s2byte这个函数调用soap_strtol进行转换,s是输入字符串,p指向转换后的单字节。但是对于s=“”空字符串无法转换成功,引起s==r成立,导致错误返回SOAP_TYPE。  看起来好像是gsoap的一个bug。修改方法是去除s==r的判断条件,避免报告错误。

if ( n < -128 || n > 127)
    {         
        soap->error = SOAP_TYPE;
    }

 

Android Onvif鉴权是指在Android设备上进行Onvif协议通信时的身份验证和访问控制。 首先,Onvif是一种开放的网络视频接口标准,旨在提供设备和客户端之间的互操作性。在Android设备上使用Onvif时,鉴权是非常重要的,以确保只有经过授权的用户才能访问设备。 在Android上进行Onvif鉴权时,通常需要使用用户名和密码进行身份验证。这些凭据可以用于验证用户是否具有访问权限。当用户尝试连接到设备时,首先会提供用户名和密码进行身份验证,如果凭据正确,才能继续访问设备的功能和服务。 鉴权的另一个重要方面是访问控制。通过鉴权,管理员可以管理用户的访问权限。在Android设备上,可以设置不同级别的用户权限,例如管理员、操作员和观察者。管理员有最高权限,可以访问和控制设备的所有功能,操作员具有较低的权限,只能执行一部分功能,而观察者则只能查看设备上的视频流。通过访问控制,可以确保只有经过授权的用户能够在Android设备上执行特定的操作。 在实现Android Onvif鉴权时,开发者需要使用支持Onvif协议的库和API。这些库和API提供了与Onvif设备进行通信的各种功能和方法,包括鉴权和访问控制。 总而言之,Android Onvif鉴权是确保在Android设备上进行Onvif协议通信时进行身份验证和访问控制的过程。它通过用户名和密码进行身份验证,并使用访问控制来管理用户权限,以确保只有经过授权的用户才能访问设备的功能和服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值