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

  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入门)