linux设备上的Onvif 实现7:编写设备能力获取程序

2024-06-23 08:38

本文主要是介绍linux设备上的Onvif 实现7:编写设备能力获取程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 背景说明 

要和摄像头直接通信,第一步必须获取webserver地址,通过该地址才能进一步获得设备的能力、提供的媒体频信息等内容。webserver地址就是在probe应答包中, 具体是XAddrs:http://192.168.15.240/onvif/device_service,接下来的获取设备能力函数将使用此地址进行通信。

 2  GetCapabilities命令说明

GetCapabilities函数在不同的版本中实际名称并不一样,我的版本中是:

SOAP_FMAC5 int SOAP_FMAC6 soap_call___ns2__GetCapabilities(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct _ns2__GetCapabilities *ns2__GetCapabilities, struct _ns2__GetCapabilitiesResponse *ns2__GetCapabilitiesResponse)

该函数需要提供请求指针、应答指针。可以指定请求设备的全部能力还是某一部分能力:

enum ns3__CapabilityCategory { ns3__CapabilityCategory__All = 0, ns3__CapabilityCategory__Analytics = 1, ns3__CapabilityCategory__Device = 2, ns3__CapabilityCategory__Events = 3, ns3__CapabilityCategory__Imaging = 4, ns3__CapabilityCategory__Media = 5, ns3__CapabilityCategory__PTZ = 6 };

以下实例中指定查询ns3__CapabilityCategory__Media能力。一般的可以选择查询ALL能力。

最后从报文中提取出媒体信息URI  :http://192.168.15.240/onvif/Media,将用于查询具体的视频源、编码器配置参数。

如果设备具备用户名、密码,那么查询设备能力可能需要鉴权过程,本文没有研究ONVIF的鉴权机制,默认摄像头无需输入用户名密码。如果出现鉴权应答,那么应答 getCapResponse.Capabilities就是NULL指针。soap_call___ns2__GetCapabilities函数返回值是501。

具体的应用实例如下:

/******************************************************************************
* Name:   MyGetCapabilities
*
* Desc:  获取指定设备节点的能力
* Param:
    struct soap *soap,
    int index, 设备序号

* Return: BOOL,  TRUE: success,  FALSE: fail
* Global:  
* Note:  
* Author:   Tom-hongtao.gao
* -------------------------------------
* Log:   2013/07/24, Create this function by Tom-hongtao.gao
 ******************************************************************************/
BOOL MyGetCapabilities(struct soap *soap, int index)
{   
    BOOL bret=FALSE;
    int result = 0;
   
    DEVICENODE * deviceode = DLFindbyIndex(index);
    if(!deviceode)
    {
        printf("--Error: DLFindbyIndex(%d) return NULL! \n", index);
        return FALSE;
    }
    if(deviceode->webserver==NULL || strlen(deviceode->webserver)==0)
    {
        printf("--Error: deviceode->webserver is NULL! \n");
        return FALSE;
    }
   
    struct _ns2__GetCapabilities getCapReq={0};
    struct _ns2__GetCapabilitiesResponse getCapResponse={0};
    enum ns3__CapabilityCategory  temp_category = ns3__CapabilityCategory__Media;
    getCapReq.__sizeCategory=1;
    getCapReq.Category=&temp_category;
      
    result = soap_call___ns2__GetCapabilities(soap, deviceode->webserver, NULL, &getCapReq, &getCapResponse);
    if(result==-1)       
    {
        printf("soap error: %d, %s, %s\n", soap->error, *soap_faultcode(soap), *soap_faultstring(soap));
        result = soap->error;
        bret = FALSE;       
    }
    else
    {       
        if(getCapResponse.Capabilities==NULL)
        {
            printf(" GetCapabilities  failed!  result=%d \n",result);
            bret = FALSE;            
        }
        else
        {
            printf(" GetCapabilities  OK! result=%d \n",result);
            //printf(" Media->XAddr=%s \n", getCapResponse.Capabilities->Media->XAddr);
            DLSetMediaUri(index, getCapResponse.Capabilities->Media->XAddr);
            //PrintfNodebyIndex(index);
            bret = TRUE;     
        }
    }

    soap_end(soap);
    return bret;
   
}

实际的数据报文如下:

这篇关于linux设备上的Onvif 实现7:编写设备能力获取程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1086663

相关文章

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

Spring Boot 结合 WxJava 实现文章上传微信公众号草稿箱与群发

《SpringBoot结合WxJava实现文章上传微信公众号草稿箱与群发》本文将详细介绍如何使用SpringBoot框架结合WxJava开发工具包,实现文章上传到微信公众号草稿箱以及群发功能,... 目录一、项目环境准备1.1 开发环境1.2 微信公众号准备二、Spring Boot 项目搭建2.1 创建

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推