Onvif协议客户端开发(7)--获取前端摄像头的名称

获取前端摄像头的名称

一、介绍

摄像头的名称可能是标注摄像头位置,因此获取摄像头的名称对于对接前端摄像头是一个必须的流程。

在此作者通过Onvif协议获取前端摄像头OSD的信息获取到前端摄像头的名称,这种办法可能存在一些问题:比如如果前端摄像头有设置名称但是没有显示在界面,那通过Onvif协议获取的摄像头名称就会失败。或许还有其他问题,暂时还没遇到。如果有其他途径获取前端摄像头名称,方便的话知会一下,不胜感激。

同样通过接口获取前端OSD的信息同样需要有一个token信息,而这个token信息不同于前面的media的token,而应该是stProfilesResponse.Profiles[i].VideoSourceConfiguration->token,获取配置信息的token。

二、代码实现

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;
}

// 如果服务要求鉴权,则以下接口就需要加上用户名密码进行鉴权
soap_wsse_add_UsernameTokenDigest(stSoapNew, NULL, pUserName, pPassWord);//对用户名密码进行加密

// 构建请求的结构体
_trt__GetOSDs stGetOsdsReq;
_trt__GetOSDsResponse stGetOsdsRsp;
memset(&m_sChannelName, 0, ONVIFSDK_MAXCHANNELNAME);
memset(&stGetOsdsReq, 0x00, sizeof(stGetOsdsReq));
memset(&stGetOsdsRsp, 0x00, sizeof(stGetOsdsRsp));
stGetOsdsReq.ConfigurationToken = VideoSourceConfigurationToken;

nRet = soap_call___trt__GetOSDs(stSoapInfo, m_pMediaAddr, nullptr, &stGetOsdsReq, &stGetOsdsRsp);
if (nRet != SOAP_OK || stSoapInfo->error != SOAP_OK)
{
	printf( "Dev ip is %s,ChannelIndex is %d Gsoap return is %d labbuf is %s", m_pIpInfo, nChannelIndex, nRet, stSoapInfo->labbuf);
	return;
}

stGetOsdsRsp.OSDs[j].TextString->PlainText,		// 这个就是获取到的OSD通道名称,遍历所有stGetOsdsRsp.OSDs,直到找到非空的参数

你可能感兴趣的:(Onvif协议,Onvif,通道名称)