网上使用Onvif调用预置位的代码:
void cb_discovery_gotopreset(char *DeviceXAddr)
{
int stmno = 0;
int profile_cnt = 0; // 设备配置文件个数
struct tagProfile *profiles = NULL; // 设备配置文件列表
struct tagCapabilities capa; // 设备能力信息
char sToken[48] = { 0 };
//sprintf(sToken, "%s", id);
sprintf(sToken, "PTZPresetToken%d00%d", stmno + 1, 1);//海康NVR presetToken
//ONVIF_GetDeviceInformation(DeviceXAddr);
ONVIF_GetCapabilities(DeviceXAddr, &capa); // 获取设备能力信息(获取媒体服务地址)
profile_cnt = ONVIF_GetProfiles(capa.MediaXAddr, &profiles);// 获取媒体配置信息
if (profile_cnt > stmno) {
char buf[10];
ONVIF_GotoPreset(capa.PtzXAddr, profiles[stmno].token, sToken);
}
}
若传入的设备地址是NVR,&profiles传出NVR所有通道流的配置信息(与通道号对应,初始值是0,累加)。若传入的设备地址是IPC摄像头,&profiles传出IPC主码流和子码流的配置(0 or 1)。
控制函数ONVIF_GotoPreset函数参数一为控制服务地址;参数二为配置文件token,即指定哪一个视频流;参数三为预置位token,即指定调用哪一个预置位。
当设备地址是ipc时,参数三presetToken的值是"1"、"2"...(不管海康还是大华设备都是这样)。但当设备地址是NVR时,参数三的海康NVR presetToken是"PTZPresetToken1001",表示通道34摄像头的第一个预置位。而当设备地址是大华NVR时,参数三不管填"PTZPresetToken1001",还是"1",都不好使。。(错误信息都是不存在该预置位token)
在我看ONVIF开发文档,有一个函数
int SOAP_FMAC6 soap_call___tptz__GetPresets(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct _tptz__GetPresets *tptz__GetPresets, struct _tptz__GetPresetsResponse *tptz__GetPresetsResponse)
可以输出预置位信息,好家伙可把我高兴的。但是在大华NVR平台下,返回的token为NULL????
初始我以为是函数不管用,实验在海康NVR,海康IPC,大华IPC都能正常得出token。怀疑是不是大华NVR预置位没有添加,新增加几个后依旧未果。
困扰很久,希望高人解答!