ONVIF协议网络摄像机(IPC)客户端程序开发(11):设备能力
来源:互联网 发布:joel说软件 pdf 编辑:程序博客网 时间:2024/06/05 09:03
1 专栏导读
本专栏第一篇文章「专栏开篇」列出了专栏的完整目录,按目录顺序阅读,有助于你的理解,专栏前面文章讲过的知识点(或代码段),后面文章不会赘述。为了节省篇幅,突出重点,在文章中展示的示例代码仅仅是关键代码,你可以在「专栏开篇」中获取完整代码。
如有错误,欢迎你的留言纠正!让我们共同成长!你的「点赞」或「打赏」是对我最大的支持和鼓励!
2 原理简介
ONVIF协议接口由多个模块组成,每个模块分别对应着不同的WSDL文档,在ONVIF官网中能查看到这些模块,以及每个模块中的接口函数,这里列举几个模块:
- DeviceMgmt(设备管理)
- DeviceIO(设备IO服务)
- Event(事件处理)
- Analytics(视频分析)
- AnalyticsDevice(分析设备)
- Display(显示服务)
- Imaging(图像配置)
- Media(媒体配置)
- PTZ(PTZ控制)
- Receiver(接收端配置)
- RemoteDiscovery(设备发现)
- Recording(录像控制)
- Replay(重放控制)
- Search(记录搜索)
除了「RemoteDiscovery」模块之外,每个模块都有各自的「服务地址」,客户端要使用这些模块接口之前,必须先知道对应模块的「服务地址」。
3 编码流程
怎样才能获取这些模块的「服务地址」呢?分两步:
利用WS-Discovery搜索到IPC,就能得知该设备「DeviceMgmt」模块的「服务地址」,我们称之为「设备服务地址」。
使用「设备服务地址」调用「DeviceMgmt」模块的GetCapabilities接口,就能获取到所有模块的「服务地址」。
在我专栏前面的文章里,演示了,使用GetDeviceInformation获取设备基本信息,使用GetSystemDateAndTime和SetSystemDateAndTime对设备进行校时。这些都是「DeviceMgmt」模块的接口,使用「设备服务地址」就能搞定了,所以一直未涉及到GetCapabilities接口。
但后续的文章中,会涉及到音视频流,会用到「Media」模块的接口,这时就得先用GetCapabilities获取模块的「服务地址」了。
4 示例代码
调用GetCapabilities接口的示例代码如下:
/**************************************************************************函数:ONVIF_GetCapabilities**功能:获取设备能力信息**参数: [in] DeviceXAddr - 设备服务地址**返回: 0表明成功,非0表明失败**备注: 1). 其中最主要的参数之一是媒体服务地址************************************************************************/int ONVIF_GetCapabilities(const char *DeviceXAddr){ int result = 0; struct soap *soap = NULL; struct _tds__GetCapabilities req; struct _tds__GetCapabilitiesResponse rep; SOAP_ASSERT(NULL != DeviceXAddr); SOAP_ASSERT(NULL != (soap = ONVIF_soap_new(SOAP_SOCK_TIMEOUT))); ONVIF_SetAuthInfo(soap, USERNAME, PASSWORD); memset(&req, 0x00, sizeof(req)); memset(&rep, 0x00, sizeof(rep)); result = soap_call___tds__GetCapabilities(soap, DeviceXAddr, NULL, &req, &rep); SOAP_CHECK_ERROR(result, soap, "GetCapabilities"); dump_tds__GetCapabilitiesResponse(&rep);EXIT: if (NULL != soap) { ONVIF_soap_delete(soap); } return result;}
执行结果类似如下:
================= + dump_tds__GetCapabilitiesResponse + >>>Capabilities: (0x8788f60) |- Analytics: (0x8788f90) |- XAddr: http://100.100.100.25:80/onvif/analytics_service |- Device: (0x8788ff0) |- XAddr: http://100.100.100.25:80/onvif/device_service |- Events: (0x87892d8) |- XAddr: http://100.100.100.25:80/onvif/event_service |- Imaging: (0x8789160) |- XAddr: http://100.100.100.25:80/onvif/image_service |- Media: (0x8789378) |- XAddr: http://100.100.100.25:80/onvif/media_service |- PTZ: (0x8789470) |- XAddr: http://100.100.100.25:80/onvif/ptz_service |- Extension: (0x87894c8) |- DeviceIO: (null) |- Display: (null) |- Recording: (null) |- Search: (null) |- Replay: (null) |- Receiver: (null) |- AnalyticsDevice: (null)================= - dump_tds__GetCapabilitiesResponse - <<<
从结果看,我测试的这个摄像头,ONVIF各个模块的「服务地址」不太一样,而且不支持DeviceIO(即NULL表明不支持该功能),但是有的IPC,所有模块的「服务地址」也会设置成一样的,不同厂家的IPC情况不尽相同。
- ONVIF协议网络摄像机(IPC)客户端程序开发(11):设备能力
- ONVIF协议网络摄像机(IPC)客户端程序开发(11):设备能力
- ONVIF协议网络摄像机(IPC)客户端程序开发(7):设备搜索
- ONVIF协议网络摄像机(IPC)客户端程序开发(8):获取设备基本信息
- ONVIF协议网络摄像机(IPC)客户端程序开发(10):设备校时
- ONVIF协议网络摄像机(IPC)客户端程序开发(7):设备搜索
- ONVIF协议网络摄像机(IPC)客户端程序开发(8):获取设备基本信息
- ONVIF协议网络摄像机(IPC)客户端程序开发(10):设备校时
- ONVIF协议网络摄像机(IPC)客户端程序开发(5):门外汉理解ONVIF协议
- ONVIF协议网络摄像机(IPC)客户端程序开发(5):门外汉理解ONVIF协议
- ONVIF协议网络摄像机(IPC)客户端程序开发(2):第一次使用IPC摄像头
- ONVIF协议网络摄像机(IPC)客户端程序开发(2):第一次使用IPC摄像头
- ONVIF协议网络摄像机(IPC)客户端程序开发(9):鉴权(认证)
- ONVIF协议网络摄像机(IPC)客户端程序开发(9):鉴权(认证)
- ONVIF协议网络摄像机(IPC)客户端程序开发(1):专栏开篇
- ONVIF协议网络摄像机(IPC)客户端程序开发(3):理解什么是Web Services
- ONVIF协议网络摄像机(IPC)客户端程序开发(12):读取音视频流
- ONVIF协议网络摄像机(IPC)客户端程序开发(13):图像抓拍
- 快速排序算法的理解
- Android APP压力测试环境搭建
- FFMPEG--图像处理Swscale
- 使用CocoaPods管理依赖库
- 错误ERR_INCOMPLETE_CHUNKED_ENCODING解决方法
- ONVIF协议网络摄像机(IPC)客户端程序开发(11):设备能力
- python IDLE或shell中切换路径 使用
- apue 第九章 进程组 会话
- (转)CTA大佬Winton创始人:人工智能会颠覆传统投资吗?
- Jquery第一篇【介绍Jquery、回顾JavaScript代码、JS对象与JQ对象的区别】
- 算法作业_22(2017.5.18第十三周)
- HTML关键字<4>
- sqlmap使用笔记
- linux防火墙iptables的笔记