Onvif协议学习:15、预置位控制

Onvif协议学习:15、预置位控制



原文链接:https://blog.csdn.net/u013566528/article/details/102144711

一、介绍

球机的云台预置位控制主要包含的内容有:预置位的设置、预置位的调用、预置位的删除以及预置位的名称修改等
云台预置位的设置:调用Onvif协议中云台预置位设置接口,对应预置位名称的入参可以根据情况输入,字符编码必须是UTF-8格式,只是此时不给输入参数token赋值,因为当设置一个新的云台预置位时,Onvif服务端会返回一个预置位的token,如果我们需要调用这个设置的预置位时则需要使用服务端返回的这个token。这个token关系到后面对于云台预置位的所有操作内容。

云台预置位的调用:如上面所说的,调用云台预置位时需要知道该预置位的token值。按照正常的规律,一般都是1、2、3等数值,一般和云台预置位列表对应,前提是云台预置位列表是按照顺序排列中间没有预置位被删除。

云台预置位的删除:同样删除预置位需要先前服务端返回的token,入参同样是需要删除预置位的token。

云台预置位的修改:根据wsdl生成的接口文件,预置位的修改入参需要有预置位修改后的名称已经对应的token值,这个token值同样是设置预置位返回的值,修改后的预置位名称如果是中文应该将字符编码转成UTF-8格式,否则会出现乱码。

二、代码实现

1、预置位的设置、修改
struct soap *stSoapNew = soap_new();
if (stSoapNew == nullptr)
{
	return ;
}
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);//对用户名密码进行加密

struct _tptz__SetPreset stSetPresetReq;
struct _tptz__SetPresetResponse stSetPresetRes;
memset(&stSetPresetReq, 0x00, sizeof(stSetPresetReq));
memset(&stSetPresetRes, 0x00, sizeof(stSetPresetRes));
stSetPresetReq.ProfileToken = pMainStreamToken;		// 和获取RTSP地址的token

#ifdef MODIFY			// 如果是修改预置位名字,则对应token进行赋值
char sToken[12] = { 0 };
sprintf(sToken, "%d", 1);
stSetPresetReq.PresetToken = sToken;
#endif

stSetPresetReq.PresetName = "Undef";
// pProfilesAddr 是soap_call___tds__GetCapabilities接口获取到的Ptz地址,具体实现参见:[获取设备能力](https://blog.csdn.net/u013566528/article/details/102070372)
nRet = soap_call___tptz__SetPreset(stSoapNew, pProfilesAddr , nullptr, &stSetPresetReq, &stSetPresetRes);
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;
}
stSetPresetRes.PresetToken;			//这个就是设置预置位返回的token

2、预置位的调用
struct soap *stSoapNew = soap_new();
if (stSoapNew == nullptr)
{
	return ;
}
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);//对用户名密码进行加密

char sToken[12] = { 0 };
sprintf(sToken, "%d", 1);

struct _tptz__GotoPreset stGotoPresetReq;
struct _tptz__GotoPresetResponse stGotoPresetRes;
memset(&stGotoPresetReq, 0x00, sizeof(stGotoPresetReq));
memset(&stGotoPresetRes, 0x00, sizeof(stGotoPresetRes));
stGotoPresetReq.PresetToken = sToken;
stGotoPresetReq.ProfileToken =  pMainStreamToken;		// 和获取RTSP地址的token一致
// pProfilesAddr 是soap_call___tds__GetCapabilities接口获取到的Ptz地址,具体实现参见:[获取设备能力](https://blog.csdn.net/u013566528/article/details/102070372)
nRet = soap_call___tptz__GotoPreset(stSoapNew, pProfilesAddr , nullptr, &stGotoPresetReq, &stGotoPresetRes);
if (nRet != SOAP_OK || stSoapInfo->error != SOAP_OK)
{
	return;
}

3、预置位删除

char sToken[12] = { 0 };
sprintf(sToken, "%d", 1);

struct _tptz__RemovePreset stRemovePtzReq;
struct _tptz__RemovePresetResponse stRemovePtzRes;
memset(&stRemovePtzReq, 0x00, sizeof(stRemovePtzReq));
memset(&stRemovePtzRes, 0x00, sizeof(stRemovePtzRes));
stRemovePtzReq.PresetToken = sToken;
stRemovePtzReq.ProfileToken = pMainStreamToken;		// 和获取RTSP地址的token一致
// pProfilesAddr 是soap_call___tds__GetCapabilities接口获取到的Ptz地址,具体实现参见:[获取设备能力](https://blog.csdn.net/u013566528/article/details/102070372)
nRet = soap_call___tptz__RemovePreset(stSoapNew, pProfilesAddr , nullptr, &stRemovePtzReq, &stRemovePtzRes);
if (nRet != ONVIFSDK_NOERROR || stSoapInfo->error != SOAP_OK)
{
	return;
}
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值