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控球命令时,鉴权就是用这种方式。
  要注意的是,每次鉴权后,其包含验证信息的头部就会被置空,所以每次操作前都需要加上鉴权操作。推荐的做法是:将鉴权语句加入到每个需要鉴权的命令前,并封装起来成为自己的命令。

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
gSOAP是一个C/C++的SOAP (Simple Object Access Protocol)开发工具箱,可以用来实现Web Services以及SOAP消息的编解码。通过使用gSOAP,可以方便快捷地实现ONVIF服务。 以下是实现ONVIF服务的步骤: 1. 下载和安装gSOAP工具箱。 2. 生成服务端代码。使用gSOAP提供的命令行工具wsdl2h,将ONVIF的WSDL文件转换为gSOAP的头文件。例如: ``` wsdl2h -o onvif.h http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl ``` 3. 生成客户端代码。使用gSOAP提供的命令行工具soapcpp2,将ONVIF的WSDL文件转换为gSOAP的客户端代码。例如: ``` soapcpp2 -i -C onvif.h ``` 4. 实现服务端程序。在服务端程序中,需要实现ONVIF的各个接口函数,并使用gSOAP提供的API进行SOAP消息的编解码和发送。例如: ```c++ #include "soapH.h" #include "onvif.nsmap" int main(int argc, char** argv) { struct soap soap; soap_init(&soap); // 实现ONVIF的各个接口函数 soap_serve(&soap); soap_destroy(&soap); soap_end(&soap); soap_done(&soap); return 0; } ``` 5. 实现客户端程序。在客户端程序中,需要使用gSOAP提供的API进行SOAP消息的编解码和发送,并调用ONVIF的各个接口函数。例如: ```c++ #include "soapH.h" #include "onvif.nsmap" int main(int argc, char** argv) { struct soap soap; soap_init(&soap); // 调用ONVIF的各个接口函数 soap_destroy(&soap); soap_end(&soap); soap_done(&soap); return 0; } ``` 6. 编译和运行程序。使用gSOAP提供的命令行工具soapcpp2,将生成的客户端和服务端代码编译成可执行程序。例如: ``` soapcpp2 -i -C onvif.h gcc -o onvif_server onvif_server.cpp onvif_serverC.cpp soapC.cpp stdsoap2.cpp gcc -o onvif_client onvif_client.cpp onvif_clientC.cpp soapC.cpp stdsoap2.cpp ``` 7. 测试程序。运行服务端程序,并使用客户端程序调用ONVIF的各个接口函数进行测试。例如: ``` ./onvif_server & ./onvif_client ``` 以上就是使用gSOAP实现ONVIF服务的基本步骤。需要注意的是,gSOAP提供了丰富的API和工具,可以根据具体的需求进行定制和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值