当前位置: 首页 > news >正文

ONVIF协议网络摄像机(IPC)客户端程序开发(C语言实现)

一、开发框架与核心工具

  1. gSOAP工具链

    • 功能:自动生成ONVIF协议SOAP通信代码,支持C/C++

    • 关键命令

      # 生成头文件(需支持HTTPS)
      wsdl2h -P -x -c -s -t typemap.dat -o onvif.h \https://www.onvif.org/ver10/network/wsdl/remotediscovery.wsdl \https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl
      # 生成客户端代码
      soapcpp2 -2 -C -x onvif.h
      
    • 输出文件soapStub.h(接口声明)、soapClient.c(通信实现)

  2. 依赖库

    • OpenSSL:处理TLS加密(需编译时链接-lssl -lcrypto

    • libxml2:解析XML响应(需配置-lxml2


二、核心功能实现

1. 设备发现(WS-Discovery)
  • 多播探测:向239.255.255.250:3702发送Probe请求

    // 参考代码片段(基于gSOAP生成的wsdd接口)
    _wsdd__ProbeType probe;
    soap_default__wsdd__ProbeType(soap, &probe);
    probe.Types = soap_strdup(soap, "dn:NetworkVideoTransmitter");_wsdd__ProbeMatchesType matches;
    if (soap_call___wsdd__Probe(soap, "239.255.255.250", 3702, &probe, &matches) == SOAP_OK) {for (int i=0; i<matches.ProbeMatchCount; i++) {printf("发现设备:%s\n", matches.ProbeMatch[i].DeviceAddress);}
    }
    
    • 优化:设置超时重试机制,过滤非IPC设备
2. 设备认证与连接
  • WS-Security认证:在SOAP头添加UsernameToken

    // 添加认证信息
    soap_wsse_add_UsernameTokenDigest(soap, "wsse", "admin", "123456");// 调用设备管理接口
    _tds__GetCapabilities getCap;
    _tds__GetCapabilitiesResponse capResp;
    if (soap_call___tds__GetCapabilities(soap, deviceIp, 80, &getCap, &capResp) == SOAP_OK) {printf("设备型号:%s\n", capResp.Capabilities.Model);
    }
    
    • 证书验证:启用TLS时需加载CA证书
3. 媒体流获取(RTSP)
  • 调用GetStreamUri:获取RTSP地址

    _trt__GetStreamUri getStream;
    _trt__GetStreamUriResponse streamResp;
    getStream.ProfileToken = profileToken; // 从设备能力获取
    if (soap_call___trt__GetStreamUri(soap, deviceIp, 80, &getStream, &streamResp) == SOAP_OK) {printf("RTSP地址:%s\n", streamResp.MediaUri.Uri);
    }
    
    • 流媒体处理:集成FFmpeg解码(需编译libavformat

      AVFormatContext *fmt_ctx = avformat_alloc_context();
      avformat_open_input(&fmt_ctx, streamResp.MediaUri.Uri, NULL, NULL);
      avformat_find_stream_info(fmt_ctx, NULL);
      
4. PTZ控制
  • 绝对移动指令

    _trt__AbsoluteMove moveReq;
    moveReq.ProfileToken = profileToken;
    moveReq.Speed = 0.5; // 速度0-1
    moveReq.Position.PanTilt.x = 0.3; // 水平位置
    moveReq.Position.PanTilt.y = 0.2; // 垂直位置
    soap_call___trt__AbsoluteMove(soap, deviceIp, 80, &moveReq, NULL);
    
  • 预置位操作

    _trt__SetPreset setPreset;
    setPreset.ProfileToken = profileToken;
    setPreset.PresetName = "Preset1";
    soap_call___trt__SetPreset(soap, deviceIp, 80, &setPreset, NULL);
    

三、关键代码结构

#include "soapH.h"
#include "wsdd.nsmap"
#include "trt.nsmap"int main() {struct soap *soap = soap_new();soap_set_mode(soap, SOAP_C_UTFSTRING); // 解决中文乱码// 设备发现_wsdd__ProbeType probe;_wsdd__ProbeMatchesType matches;soap_call___wsdd__Probe(soap, "239.255.255.250", 3702, &probe, &matches);// 设备认证soap_wsse_add_UsernameTokenDigest(soap, "wsse", "admin", "123456");// 获取媒体流_trt__GetStreamUri getStream;_trt__GetStreamUriResponse streamResp;soap_call___trt__GetStreamUri(soap, "192.168.1.100", 80, &getStream, &streamResp);// PTZ控制_trt__AbsoluteMove moveReq;moveReq.ProfileToken = "profile0";moveReq.Position.PanTilt.x = 0.5;soap_call___trt__AbsoluteMove(soap, "192.168.1.100", 80, &moveReq, NULL);soap_destroy(soap);soap_end(soap);soap_free(soap);return 0;
}

四、开发难点与解决方案

难点 解决方案
复杂XML解析 使用gSOAP生成的序列化/反序列化函数,避免手动解析
多线程流处理 创建独立线程处理RTSP流接收,主界面线程处理控制指令
证书校验失败 soap_ssl_init中加载CA证书: soap_ssl_init(); soap_ssl_client_context(soap, SOAP_SSL_DEFAULT, NULL, NULL, "ca-cert.pem", NULL, NULL);
设备兼容性差异 通过GetCapabilities获取设备支持的接口,动态调用功能

五、调试与测试

  1. 抓包分析

    • 使用Wireshark过滤wsdlonvif协议,验证SOAP报文格式

    • 示例过滤条件:udp.port == 3702 || http.request.uri contains "onvif"

  2. 日志输出

    // 启用详细日志
    soap_set_sent_log(soap, 1);
    soap_set_sent_log_file(soap, "soap.log");
    soap_set_received_log(soap, 1);
    soap_set_received_log_file(soap, "soap.log");
    
  3. 单元测试用例

    void test_device_discovery() {_wsdd__ProbeMatchesType matches;int ret = soap_call___wsdd__Probe(soap, "239.255.255.250", 3702, &probe, &matches);CU_ASSERT(ret == SOAP_OK);CU_ASSERT(matches.ProbeMatchCount > 0);
    }
    

参考代码 ONVIF协议网络摄像机(IPC)客户端程序开发 www.youwenfan.com/contentcnr/101821.html

六、扩展功能

  1. 事件订阅

    _wsnt__Subscribe subscribeReq;
    subscribeReq.ConsumerReference.Address = "http://client-ip:8080/notifications";
    subscribeReq.InitialTerminationTime = "PT60S";
    soap_call___wsnt__Subscribe(soap, deviceIp, 80, &subscribeReq, &subResp);
    
  2. 智能分析集成

    • 通过GetEventProperties订阅人脸检测事件

    • 调用外部AI接口处理视频流(需集成OpenCV或TensorRT)

通过上述方案,开发者可系统实现基于C语言的ONVIF协议客户端,支持设备发现、流媒体控制、PTZ操作等核心功能。

http://www.jsqmd.com/news/423884/

相关文章:

  • 建议收藏|9个AI论文写作软件深度测评!本科生毕业论文+开题报告必备工具推荐
  • 2026年不锈钢膨胀螺丝工厂推荐,抗震防脱与安全性能认证 - 品牌鉴赏师
  • 巡店任务易遗漏、整改无跟进,如何开始搭建闭环巡检流程? - 搭贝
  • 导师推荐 8个AI论文网站测评:专科生毕业论文写作必备工具全解析
  • 2026年安徽楼房防水公司推荐,老旧楼房翻新防水方案 - 品牌鉴赏师
  • 北京取药取报告陪诊|守嘉代跑代办,不用你多跑一步 - 品牌排行榜单
  • 探讨福建好用的速冻胡萝卜丁预制菜原料加工厂,价格大概多少钱 - 工业品网
  • 北京陪诊哪家靠谱?认准守嘉陪诊,全程贴心陪护,少走冤枉路​ - 品牌排行榜单
  • 北京守嘉陪诊|全品类陪诊服务,一站式解决所有就医难题 - 品牌排行榜单
  • 北京住院陪诊|守嘉24小时陪护,守护你的康复之路 - 品牌排行榜单
  • 2026找口碑好的工业酒精源头厂家,这几家受关注!,工业酒精/酒精/回收酒精/回收废酒精/工业乙醇,工业酒精品牌排行 - 品牌推荐师
  • 横评后发现AI论文写作软件,千笔AI VS 灵感ai,本科生首选!
  • 携程任我行卡回收攻略,如何快速变现? - 团团收购物卡回收
  • Vitest 与Vite集成深度解析
  • 北京老人陪诊|守嘉专属陪护,让长辈就医更安心、家人更放心​ - 品牌排行榜单
  • 摆脱论文困扰! 8个AI论文工具测评:专科生毕业论文写作全攻略
  • 北京孕妇陪诊|守嘉全程护航,让孕期就医更轻松、更省心​ - 品牌排行榜单
  • 2026年新生的儿见面礼实用好物,硬核品质守护宝宝日常 - 品牌鉴赏师
  • 如何高价回收携程任我行卡? - 团团收购物卡回收
  • 少走弯路:降AIGC网站 千笔·专业降AIGC智能体 VS 学术猹
  • 斯特林数
  • 基于虎鲸优化算法的LSTM网络模型(KWA-LSTM)的一维时间序列预测matlab仿真
  • 北京体检陪诊|守嘉全程陪同,让体检更轻松、更省心 - 品牌排行榜单
  • 北京外地来京陪诊|守嘉全程接待,让异地就医更安心、更便捷 - 品牌排行榜单
  • 快速回收天猫超市购物卡:3个简单步骤搞定! - 团团收购物卡回收
  • 厦门泉州等地美术集训服务机构,纵横美术艺考口碑排名如何? - 工业推荐榜
  • 北京三甲医院陪诊|守嘉专业陪护,轻松应对复杂就诊流程 - 品牌排行榜单
  • 老兵不死,只是换了战场:从27年的企业开发转型AI应用开发
  • 北京儿童陪诊|守嘉暖心陪护,缓解孩子就医恐惧,家长更省心 - 品牌排行榜单
  • 天猫超市购物卡可以回收吗?答案让你意想不到! - 团团收购物卡回收