weixin_43852344
2021-05-09 13:51 阅读 24

在大华NVR平台下,Onvif协议获取不到控制预置位的presetToken。

网上使用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预置位没有添加,新增加几个后依旧未果。

困扰很久,希望高人解答!

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享