Onvif协议客户端开发(5)--获取设备能力

【前言】好久没更新Onvif的这个协议内容了,最近一段时间换成其他内容的开发之后,发现Onvif这部分的知识都快忘了,因此便趁着更新博客的机会重新将Onvif协议的内容再温固一下。

Onvif获取设备能力

一、介绍

Onvif获取设备能力主要是为了客户端使用能知道Onvif的服务端能够提供哪些服务功能。不仅服务端需要提供对应的服务,客户端的开发同样需要有对应的wsdl文件才能生成与服务端通信的接口。针对视频监控方面Onvif服务端主要需要使用到的服务大概能有以下几种:

  • 1、媒体功能
  • 2、事件功能
  • 3、云台功能
  • 4、录像功能
  • 5、查询功能
  • 6、显示信息功能
  • 7、取流功能
    服务端返回的每一个设备能力都是一个地址,当我们需要使用到这些功能的实现通过调用对应功能的函数而函数访问的地址则是服务端返回的地址。

获取设备能力的地址为:http://192.168.1.1:80/onvif/device_service ,其中192.168.1.1是Onvif服务端的IP地址,80是Onvif服务端提供的Onvif端口。

二、代码实现

struct soap *stSoapNew = soap_new();
if (stSoapNew == nullptr)
{
	return nullptr;
}

soap_set_namespaces(stSoapNew, namespaces);                                 // 设置soap的namespaces
stSoapNew->recv_timeout = 5;                                           					 // 设置超时5秒(超过指定时间没有数据就退出)
stSoapNew->send_timeout = 5;
stSoapNew->connect_timeout = 5;

soap_set_mode(stSoapNew, SOAP_C_UTFSTRING);                          // 设置为UTF-8编码,否则叠加中文OSD会乱码
if (stSoapNew == nullptr)
{
	printf( "Onvif New Soap error!");			
	return;
}

struct _tds__GetCapabilities            req;
struct _tds__GetCapabilitiesResponse    rep;
memset(&req, 0x00, sizeof(req));
memset(&rep, 0x00, sizeof(rep));
enum tt__CapabilityCategory emCapCategory = tt__CapabilityCategory__All;			// 获取全部的设备能力,根据自己需要选择
req.__sizeCategory = 1;
req.Category = &emCapCategory;
char tempInfo[128] = { 0 };
sprintf(tempInfo, "http://%s:%d/onvif/device_service", “192.168.1.1”, 80);
result = soap_call___tds__GetCapabilities(stSoapNew, tempInfo, NULL, &req, &rep);
if (result != SOAP_OK || rep.Capabilities == nullptr)
{
	printf("Get capability error!Error code is %d", result);
	return;
}

你可能感兴趣的:(Onvif协议)