欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

gSOAP+onvif初探(二):onvif鉴权

程序员文章站 2022-07-14 17:06:54
...

  onvif开发一个重要的部分就是鉴权,这点在前面第一篇生成soap框架代码时就有提到。在头文件里加入鉴权的包含文件:

#import "wsse.h"

  onvif要实现鉴权功能,有两种方式:

  1. 直接使用gSOAP自带的源代码文件+openssl库;
  2. 剪切部分上述文件里的必需代码,自实现鉴权功能。

  在window端就一般采用第一种方式了,比较方便,需要的函数直接调用就可以了,其实主要是一个函数:

soap_wsse_add_UsernameTokenDigest(struct soap *soap, const char *id, const char *username, const char *password)

  如果采用第一种方式,直接调用上面的函数,就实现了鉴权功能。
  但是在嵌入式端,一般存储空间有限,占用空间少的方案2当然是首选。

1、使用gSOAP自带

  • 首先要把下面跟鉴权有关的头文件都添加进去自己的工程: gsoap鉴权用到的文件:

dom.c wsseapi.c smdevp.c mecevp.c threads.c wsaapi.c

  还有对应的头文件。这些文件一般在\gsoap-2.8\gsoap\plugin\,把这些文件单独拷贝到编译目录中,无关的文件一概不拷贝;

  • 预处理加上WITH_DOM和WITH_OPENSSL;
  • wsse系列函数必须链接openssl库,如:libeay32.lib;ssleay32.lib;

调用过程:

soap_p2f = soap_new();//soap初始化
soap_set_namespaces(soap_p2f, namespaces);//命名空间,用到前面生成soap框架时生成的.namespace文件
struct _tptz__AbsoluteMove AbsoluteMove;//PTZ控球需要用到的结构体,后面会讲到
struct _tptz__AbsoluteMoveResponse AbsoluteMoveResponse;//PTZ控球返回的结构体
soap_wsse_add_UsernameTokenDigest(soap_p2f, NULL, "admin", "ADMIN123456");//wsse表示是鉴权功能函数
soap_default__tptz__AbsoluteMove(soap_p2f, &AbsoluteMove);//defualt函数的作用其实就是将后面的结构体清空
soap_default__tptz__AbsoluteMoveResponse(soap_p2f, &AbsoluteMoveResponse);
...//填充AbsoluteMove结构体
soap_call___tptz__AbsoluteMove(soap_p2f, ball_onvifserver, NULL, &AbsoluteMove, &AbsoluteMoveResponse);//发送soap调用命令

2、自鉴权的实现

  这里就需要自己实现上面说的那个函数soap_wsse_add_UsernameTokenDigest了。嵌入式设备就是用的这种方法。其实就是把源码部分代码直接拷贝到自己的工程源代码中,需要实现的函数有:

soap_wsse_add_UsernameTokenDigest(struct soap *soap, const char *id,    const char *username, const char *password)  
soap_wsse_add_UsernameTokenText(struct soap *soap, const char *id,  const char *username, const char *password) ;
soap_wsse_add_Security(struct soap *soap) ;
calc_digest(struct soap *soap, const char *created, const char *nonce, int noncelen, const char *password, char hash[SOAP_SMD_SHA1_SIZE]); 
calc_nonce(struct soap *soap, char nonce[SOAP_WSSE_NONCELEN])
SHA1PadMessage(SHA1Context *context)
SHA1ProcessMessageBlock(SHA1Context *context)
SHA1Reset(SHA1Context *context)
SHA1Input(SHA1Context  *context,const  char *message_array, unsigned  length)
SHA1Reset(SHA1Context *context)

  一般全景相机(嵌入式设备)向球机发送onvif控球命令时,鉴权就是用这种方式。
  要注意的是,每次鉴权后,其包含验证信息的头部就会被置空,所以每次操作前都需要加上鉴权操作。推荐的做法是:将鉴权语句加入到每个需要鉴权的命令前,并封装起来成为自己的命令。

相关标签: onvif gsoap