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

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

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

  • 写回答

1条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-07-04 22:09
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    根据提供的代码和问题,可以简单总结为以下几个问题:
    1. 当设备地址是NVR时,大华NVR平台下使用ONVIF_GotoPreset函数传入的预置位token参数为NULL,但在海康NVR平台下能够正常得出token。
    2. 怀疑是大华NVR预置位没有添加,新增加几个预置位后依旧未能解决问题。 针对这些问题,我将分别给出解决方案和可能的原因。
    3. 解决方案:
      • 可以尝试使用ONVIF开发文档中提到的函数"soap_call___tptz__GetPresets"来获取预置位信息,以确认是否能够正常获得token。
      • 检查大华NVR平台的设备文档或开发者文档,确认是否有其他可用的函数或接口来获取预置位信息。
      • 联系大华NVR平台的技术支持,询问是否有特殊的操作步骤或设置来获取预置位token。
    4. 可能的原因:
      • 大华NVR平台下确实存在预置位添加的问题,即使新增加了预置位也无法获得token。
      • 大华NVR平台对于预置位的管理方式与海康NVR平台不同,可能需要使用不同的API或接口来获取预置位信息。 下面给出一个可能的解答示例,假设已经获取到设备地址和设备类型:
    void cb_discovery_gotopreset(char *DeviceXAddr) {
        int stmno = 0; // 通道号或流的编号
        int profile_cnt = 0; // 设备配置文件个数
        struct tagProfile *profiles = NULL; // 设备配置文件列表
        struct tagCapabilities capa; // 设备能力信息
        char sToken[48] = { 0 };
        
        // 获取设备能力信息(获取媒体服务地址)
        ONVIF_GetCapabilities(DeviceXAddr, &capa);
        
        // 获取媒体配置信息
        profile_cnt = ONVIF_GetProfiles(capa.MediaXAddr, &profiles);
        
        if (profile_cnt > stmno) {
            // 控制函数:调用预置位
            ONVIF_GotoPreset(capa.PtzXAddr, profiles[stmno].token, getPresetToken(DeviceXAddr, stmno));
        }
    }
    char* getPresetToken(char* deviceAddr, int stmno) {
        char* presetToken;
        
        // 根据设备类型判断返回的预置位token
        if (isNVR(deviceAddr)) {
            // 海康NVR平台下的预置位token格式为 "PTZPresetToken<通道号>00<预置位编号>"
            presetToken = malloc(strlen("PTZPresetToken100100") + 1);
            sprintf(presetToken, "PTZPresetToken%d00%d", stmno + 1, 1);
        } else {
            // 大华NVR平台下的预置位token格式为 "1", "2", ...
            presetToken = malloc(2);
            sprintf(presetToken, "%d", stmno + 1);
        }
        
        return presetToken;
    }
    int isNVR(char* deviceAddr) {
        // 判断设备地址是否为NVR
        // 这里根据设备地址的类型或特征进行判断
        // 返回1表示是NVR,返回0表示不是NVR
        // 示例:假设NVR设备地址格式为 "NVR_xxx"
        if (strstr(deviceAddr, "NVR") != NULL) {
            return 1;
        } else {
            return 0;
        }
    }
    

    以上是一个简化的示例代码,根据提供的信息进行了一些假设和简化处理。具体的解决方案需要根据实际情况进行调整。

    评论

报告相同问题?

悬赏问题

  • ¥15 网络科学导论,网络控制
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)