目录
1. 介绍
2. GetPreset
3. SetPreset
4.预置位的索引
5. GotoPreset
1. 介绍
球机的云台预置位控制主要包含的内容有:预置位的设置、预置位的调用、预置位的删除以及预置位的名称修改等
云台预置位的设置:调用Onvif协议中云台预置位设置接口,对应预置位名称的入参可以根据情况输入,字符编码必须是UTF-8格式,只是此时不给输入参数token赋值,因为当设置一个新的云台预置位时,Onvif服务端会返回一个预置位的token,如果我们需要调用这个设置的预置位时则需要使用服务端返回的这个token。这个token关系到后面对于云台预置位的所有操作内容。
云台预置位的调用:如上面所说的,调用云台预置位时需要知道该预置位的token值。按照正常的规律,一般都是1、2、3等数值,一般和云台预置位列表对应,前提是云台预置位列表是按照顺序排列中间没有预置位被删除。
云台预置位的删除:同样删除预置位需要先前服务端返回的token,入参同样是需要删除预置位的token。
云台预置位的修改:根据wsdl生成的接口文件,预置位的修改入参需要有预置位修改后的名称已经对应的token值,这个token值同样是设置预置位返回的值,修改后的预置位名称如果是中文应该将字符编码转成UTF-8格式,否则会出现乱码。
其实通过前面的学习,onvif操作是比较简单的。调一下相应的接口即可。
2. GetPreset
获取请求有1个参数:ProfileToken。
首先获取ProfileToken
_trt__GetProfiles profiles;
_trt__GetProfilesResponse profileresp;
result = soap1.GetProfiles(&profiles, profileresp);
if(result==401)
{
http_da_save(&soap1,&daInfo, soap1.authrealm, User, Pass);
soap1.GetProfiles(&profiles, profileresp);
http_da_release(&soap1,&daInfo);
}
然后根据结果,创建请求
_tptz__GetPresets GetPresetsReq;
_tptz__GetPresetsResponse GetPresetsResp;
GetPresetsReq.ProfileToken = profileresp.Profiles[0]->token;
result = Ptz.GetPresets(&GetPresetsReq, GetPresetsResp);
if(result==401)
{
http_da_save(&Ptz,&daInfo, Ptz.authrealm, User, Pass);
Ptz.GetPresets(&GetPresetsReq, GetPresetsResp);
http_da_release(&Ptz,&daInfo);
}
返回的GetPresetsResp,中的GetPresetsResp.Preset是个数组指针,GetPresetsResp.__sizePreset指明了有多少个preset。根据个数,遍历包含了哪些Name,Token。
3. SetPreset
REQUEST:
- ProfileToken [tt:ReferenceToken] Reference to an existing media profile.
- PresetToken - optional [tt:ReferenceToken] Optional existing preset token to update a preset position.
- PresetName - optional [xs:string] Optional name to be assigned to the preset position.
RESPONSE:
- PresetToken [tt:ReferenceToken] Reference token assigned by the device to the preset.
创建和修改preset时,调用SetPreset。请求有3个参数:ProfileToken, PresetToken, PresetName。
同get操作相同,先获取ProfileToken,设置时,如果不指定PresetToken,会返回一个新的PresetToken,这就相当于创建新的preset。如果指定了PresetToken,那么该PresetToken,必须存在,否则将返回错误,这就是修改preset。PresetName随便定义,如果想用中文,那么要开启UTF8格式,方法是使能SOAP_C_UTFSTRING,如下。
_tptz__SetPreset SetPresetReq;
_tptz__SetPresetResponse SetPresetResp;
。。。
soap_set_mode(&Ptz, SOAP_C_UTFSTRING);
Ptz.SetPreset(&SetPresetReq, SetPresetResp);
执行Ptz.SetPreset(&SetPresetReq, SetPresetResp);。
4.预置位的索引
这其实是个问题,onvif没有定义索引,这需要自己维护。onvif只靠PresetToken来管理相应的预置位,PresetToken值,基本上定义的是字符串“1”,“2”,“100”等。获取时是按token的数字排序的。如果满配置了预置位,那么索引号基本与token一致了。如果删除一个预置位,将会出现不匹配的问题。
好的办法就是,自己维护一个索引表。比如你的预置位索引号1,对应的presettoken是“5”,那么操作索引1时,查找到的token是5,那么操作token=5的就行了。
5. GotoPreset
_tptz__GotoPreset GotoPresetReq;
_tptz__GotoPresetResponse GotoPresetResp;
GotoPresetReq.ProfileToken = profileresp.Profiles[0]->token;
GotoPresetReq.PresetToken = token;
Ptz.GotoPreset(&GotoPresetReq, GotoPresetResp);
参考:
Onvif协议2:使用wsdl生成onvif代码(wsse和digest鉴权)
https://blog.csdn.net/proing/article/details/135839214
Onvif协议1:gSOAP是什么
https://blog.csdn.net/proing/article/details/135827546