ONVIF协议:Profile、WSDL与C++开发详解

ONVIF协议:Profile、WSDL与C++开发详解


一、ONVIF Profile与对应WSDL文件

ONVIF通过Profile定义设备功能集,每个Profile对应一组WSDL文件,描述服务接口和数据结构。以下是核心Profile及其依赖的WSDL文件:

1. Profile S(基础视频设备)
  • 功能:设备发现、视频流传输、PTZ控制、事件订阅。

  • 核心WSDL文件

    服务接口WSDL文件路径
    Device Service[http://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl](http://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl)
    Media Service[http://www.onvif.org/ver10/media/wsdl/media.wsdl](http://www.onvif.org/ver10/media/wsdl/media.wsdl)
    PTZ Service[http://www.onvif.org/ver20/ptz/wsdl/ptz.wsdl](http://www.onvif.org/ver20/ptz/wsdl/ptz.wsdl)
    Event Service[http://www.onvif.org/ver10/events/wsdl/event.wsdl](http://www.onvif.org/ver10/events/wsdl/event.wsdl)
    Imaging Service[http://www.onvif.org/ver20/imaging/wsdl/imaging.wsdl](http://www.onvif.org/ver20/imaging/wsdl/imaging.wsdl)
2. Profile T(高级视频设备)
  • 功能:H.265编码、多码流、元数据、视频分析。

  • 新增WSDL文件

    服务接口WSDL文件路径
    Analytics Service[http://www.onvif.org/ver20/analytics/wsdl/analytics.wsdl](http://www.onvif.org/ver20/analytics/wsdl/analytics.wsdl)
    Metadata Service[http://www.onvif.org/ver20/metadata/wsdl/metadata.wsdl](http://www.onvif.org/ver20/metadata/wsdl/metadata.wsdl)
    Advanced Security[http://www.onvif.org/ver10/advancedsecurity/wsdl/advancedsecurity.wsdl](http://www.onvif.org/ver10/advancedsecurity/wsdl/advancedsecurity.wsdl)
3. Profile G(存储设备扩展)
  • 功能:录像存储、回放、检索。

  • 新增WSDL文件

    服务接口WSDL文件路径
    Recording Service[http://www.onvif.org/ver10/recording/wsdl/recording.wsdl](http://www.onvif.org/ver10/recording/wsdl/recording.wsdl)
    Replay Service[http://www.onvif.org/ver10/replay/wsdl/replay.wsdl](http://www.onvif.org/ver10/replay/wsdl/replay.wsdl)
    Search Service[http://www.onvif.org/ver10/search/wsdl/search.wsdl](http://www.onvif.org/ver10/search/wsdl/search.wsdl)
4. Profile C(输入输出设备)
  • 功能:报警输入/输出控制。

  • 新增WSDL文件

    服务接口WSDL文件路径
    DeviceIO Service[http://www.onvif.org/ver10/deviceio/wsdl/deviceio.wsdl](http://www.onvif.org/ver10/deviceio/wsdl/deviceio.wsdl)
    Action Engine[http://www.onvif.org/ver10/actionengine/wsdl/actionengine.wsdl](http://www.onvif.org/ver10/actionengine/wsdl/actionengine.wsdl)

二、生成C++代码

使用gSOAP工具链解析WSDL文件,生成C++客户端代理和服务端框架代码。

1. 生成代码步骤
# 合并Profile S的WSDL文件生成头文件
wsdl2h -c -s -o onvif_s.h \
  http://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl \
  http://www.onvif.org/ver10/media/wsdl/media.wsdl \
  http://www.onvif.org/ver20/ptz/wsdl/ptz.wsdl \
  http://www.onvif.org/ver10/events/wsdl/event.wsdl

# 生成C++代码(客户端代理+服务端框架)
soapcpp2 -j -CL onvif_s.h

生成的文件包括:

  • soapStub.h:接口定义和数据结构。
  • soapDeviceBindingProxy.h:设备服务客户端代理。
  • soapMediaBindingService.h:媒体服务服务端框架。
2. 多Profile代码生成

若需支持多个Profile(如S+T),需合并所有相关WSDL文件:

wsdl2h -c -s -o onvif_st.h \
  devicemgmt.wsdl media.wsdl ptz.wsdl event.wsdl \
  analytics.wsdl metadata.wsdl
soapcpp2 -j -CL onvif_st.h

三、核心流程实现

1. 设备发现(WS-Discovery)

设备端响应Probe请求

#include <wsddapi.h>
int onvif_probe_handler(...) {
    struct wsdd__ProbeMatchesType resp;
    resp.ProbeMatch->XAddrs = "http://192.168.1.100/onvif/device_service";
    resp.ProbeMatch->Scopes = "onvif://www.onvif.org/Profile/S";
    return soap_wsdd_ProbeMatches(soap, NULL, message_id, endpoint, &resp);
}

客户端搜索设备

soap_wsdd_search(soap, SOAP_WSDD_ADHOC, "dn:NetworkVideoTransmitter", NULL);
2. 鉴权(WS-Security)

客户端添加安全头

#include <wsseapi.h>
soap_wsse_add_UsernameTokenDigest(proxy.soap, "user", "admin", "password");

服务端校验密码

int validate_user(...) {
    return (strcmp(username, "admin") == 0 && strcmp(password, "123456") == 0) ?
        SOAP_OK : SOAP_FAULT;
}
3. 媒体流获取(GetStreamUri)

设备端返回RTSP地址

int MediaServiceService::GetStreamUri(...) {
    resp->MediaUri->Uri = "rtsp://192.168.1.100:554/live/main";
    return SOAP_OK;
}

客户端拉取RTSP流

MediaBindingProxy proxy;
_trt__GetStreamUriResponse resp;
proxy.GetStreamUri(new _trt__GetStreamUri, resp);
printf("RTSP URL: %s\n", resp.MediaUri->Uri.c_str());
4. 事件订阅(CreatePullPointSubscription)

客户端订阅事件

EventBindingProxy proxy;
_tev__CreatePullPointSubscription req;
proxy.CreatePullPointSubscription(&req, resp);

设备端推送事件

void send_event(...) {
    soap_wsdd_event_ProbeMatches(soap, NULL, topic, message, &resp);
}
5. PTZ控制(ContinuousMove)

客户端控制云台转动

PTZBindingProxy proxy;
_tptz__ContinuousMove req;
req.Velocity->PanTilt->x = 0.5; // 水平速度
req.Velocity->PanTilt->y = 0.3; // 垂直速度
proxy.ContinuousMove(&req, &resp);

四、注意事项与调试

1. 内存管理
soap_destroy(soap); // 删除堆对象
soap_end(soap);     // 释放临时数据
soap_free(soap);    // 释放上下文
2. 错误处理
if (proxy.GetDeviceInformation(...) != SOAP_OK) {
    soap_stream_fault(proxy.soap, std::cerr);
}
3. 调试工具
  • ONVIF Test Tool:验证设备是否符合Profile规范。
  • Wireshark:抓包分析SOAP消息和RTSP流。
  • VLC/FFmpeg:测试RTSP流播放。

五、总结

  • Profile选择:根据设备功能选择Profile S/T/G/C,合并对应WSDL文件生成代码。
  • 核心流程:设备发现→鉴权→媒体流→事件→PTZ控制。
  • 代码生成:通过gSOAP工具链生成客户端代理和服务端框架。
  • 兼容性:动态适配命名空间,支持多版本设备。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值