北桥楠木 2021-05-09 13:51 采纳率: 0%
浏览 271

在大华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预置位没有添加,新增加几个后依旧未果。

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

  • 写回答

0条回答 默认 最新

      报告相同问题?

      悬赏问题

      • ¥20 关于#javascript#的问题:但是我写的只能接码数字和字符,帮我写一个解码JS问题
      • ¥15 prophet运行报错,如何解决?
      • ¥20 前端数据是从session等作用域拿到的,如何取值继续传递后端呢
      • ¥15 eclipse无法正常运行
      • ¥15 定义了函数,但是无法根据函数定义触发器
      • ¥20 5变量卡诺图化简得出与非门电路图
      • ¥15 Python爬取交通拥堵指数数据
      • ¥15 使用vba抓取重定向网页问题
      • ¥20 付费需求测试程序(细谈)。
      • ¥15 为什么这段c++代码会报这么多语法错误?