Linux c++ onvif客户端开发(8):GetServices

 本文是Linux c++ onvif客户端开发系列文章之一:

  • Linux c++ onvif客户端开发(1): 根据wsdl生成cpp源文件
  • Linux c++ onvif客户端开发(2): 获取摄像头H264/H265 RTSP地址
  • Linux c++ onvif客户端开发(3): 扫描设备
  • Linux c++ onvif客户端开发(4): 扫描某个设备是否支持onvif
  • Linux c++ onvif客户端开发(5):gsoap内存管理
  • Linux c++ onvif客户端开发(6):获取设备信息

  • Linux c++ onvif客户端开发(7):struct soap包装类

1. 接口作用

返回设备支持的服务和能力集合。

服务:就是这个设备支持什么功能。每个服务都有一个固定的命名空间namespace,这个命名空间是有规范定义的不可修改的;还有一个对应设备服务的url地址,这个是设备商可以自定义的。

能力:就是这个服务的功能细节,比如视频服务是否支持rtsp协议等等。

典型的数据格式

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<s:Envelopexmlns:s="http://www.w3.org/2003/05/soap-envelope"xmlns:sc="http://www.w3.org/2003/05/soap-encoding"xmlns:tt="http://www.onvif.org/ver10/schema"xmlns:tds="http://www.onvif.org/ver10/device/wsdl"xmlns:trt="http://www.onvif.org/ver10/media/wsdl"xmlns:tr2="http://www.onvif.org/ver20/media/wsdl"xmlns:tev="http://www.onvif.org/ver10/events/wsdl"xmlns:timg="http://www.onvif.org/ver20/imaging/wsdl"xmlns:tmd="http://www.onvif.org/ver10/deviceIO/wsdl"xmlns:tan="http://www.onvif.org/ver20/analytics/wsdl"><s:Body><tds:GetServicesResponse><tds:Service><tds:Namespace>http://www.onvif.org/ver10/device/wsdl</tds:Namespace><tds:XAddr>http://10.10.10.13/onvif/device_service</tds:XAddr><tds:Version><tt:Major>1</tt:Major><tt:Minor>0</tt:Minor></tds:Version></tds:Service><tds:Service><tds:Namespace>http://www.onvif.org/ver20/analytics/wsdl</tds:Namespace><tds:XAddr>http://10.10.10.13/onvif/Analytics_service</tds:XAddr><tds:Version><tt:Major>1</tt:Major><tt:Minor>0</tt:Minor></tds:Version></tds:Service><tds:Service><tds:Namespace>http://www.onvif.org/ver20/imaging/wsdl</tds:Namespace><tds:XAddr>http://10.10.10.13/onvif/imaging_service</tds:XAddr><tds:Version><tt:Major>2</tt:Major><tt:Minor>0</tt:Minor></tds:Version></tds:Service><tds:Service><tds:Namespace>http://www.onvif.org/ver10/media/wsdl</tds:Namespace><tds:XAddr>http://10.10.10.13/onvif/media_service</tds:XAddr><tds:Version><tt:Major>1</tt:Major><tt:Minor>0</tt:Minor></tds:Version></tds:Service><tds:Service><tds:Namespace>http://www.onvif.org/ver20/media/wsdl</tds:Namespace><tds:XAddr>http://10.10.10.13/onvif/media2_service</tds:XAddr><tds:Version><tt:Major>2</tt:Major><tt:Minor>0</tt:Minor></tds:Version></tds:Service><tds:Service><tds:Namespace>http://www.onvif.org/ver10/events/wsdl</tds:Namespace><tds:XAddr>http://10.10.10.103/onvif/event_service</tds:XAddr><tds:Version><tt:Major>1</tt:Major><tt:Minor>0</tt:Minor></tds:Version></tds:Service><tds:Service><tds:Namespace>http://www.onvif.org/ver10/deviceIO/wsdl</tds:Namespace><tds:XAddr>http://10.10.10.13/onvif/deviceIO_service</tds:XAddr><tds:Version><tt:Major>1</tt:Major><tt:Minor>0</tt:Minor></tds:Version></tds:Service></tds:GetServicesResponse></s:Body>
</s:Envelope>

2. 掏出ONVIF Device Test Tool测试一番

1.打开测试工具,选中网卡

2. Device IP填写好设备地址,probe获取服务地址

3. password填写密码,check 获取设备信息

 获取信息是需要密码的。

4. 切换到debug-Device Management - Get Services

3.  查看文档接口

 wsdl定义

https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl

 

 ONVIF-Core-Specification

https://www.onvif.org/specs/core/ONVIF-Core-Specification.pdf

4. 代码实现 

定义Service对象

struct Service {std::string ns;std::string xaddr;
};

Device对象


class Device {
public:Device(const std::string &ip, const std::string &user,const std::string &passwd, int default_timeout = 2);~Device();int Probe(int timeout = 1);std::string xaddr() const { return xaddr_; }int GetDeviceInformation(DeviceInformation &device_info,Fault *fault = nullptr);// 获取服务地址集int GetServices(std::map<std::string, Service> &services,Fault *fault = nullptr);private:std::string ip_;std::string username_;std::string password_;int default_timeout_;std::string xaddr_;
};

实现GetServices。

如果需要返回capabilities 数据,IncludeCapability 可以指定为true,默认不指定。

int Device::GetServices(std::map<std::string, Service> &services,Fault *fault) {std::unique_ptr<Soap> soap(new Soap(default_timeout_));soap_wsse_add_UsernameTokenDigest(soap->soap(), nullptr, username_.data(),password_.data());struct _tds__GetServices devsrv_req;struct _tds__GetServicesResponse devsrv_resp;// devsrv_req.IncludeCapability = true;int result = soap_call___tds__GetServices(soap->soap(), xaddr_.data(), NULL,&devsrv_req, devsrv_resp);if (SOAP_OK == result) {for (auto &i : devsrv_resp.Service) {Service ser{i->Namespace, i->XAddr};services[i->Namespace] = ser;}} else {soap->FillFault(fault);}return result;
}

Soap 和 Fault的定义参考第7篇文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2979685.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

目标检测——野火数据集

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …

八股中的记录

1. protected修饰符&#xff1a;同包或子类&#xff08;不同包&#xff09; 区分普通人和专业人调用的一些方法 2. 抽象&#xff1a;abstract修饰类和方法 抽象类不可实例化&#xff0c;避免错误的new对象 抽象方法是用abstract修饰的方法声明&#xff0c;没有方法体&#xff…

【k8s】Kubernetes 1.29.4离线安装部署(总)

&#xff08;一&#xff09;kubernetes1.29.4离线部署之-安装文件准备 &#xff08;二&#xff09;kubernetes1.29.4离线部署之-镜像文件准备 &#xff08;三&#xff09;kubernetes1.29.4离线部署之-环境初始化 &#xff08;四&#xff09;kubernetes1.29.4离线部署之-组件安装…

好看的混淆矩阵

网上绘制的混淆矩阵都不太满意。。。经过本人多次实验&#xff0c;如下混淆矩阵最为美观&#xff0c;特此记录 import matplotlib matplotlib.use(Agg) from matplotlib import rcParamsimport matplotlib.pyplot as plt import numpy as np# 给定混淆矩阵 cm np.array([[683…

使用可穿戴传感器和设备进行压力检测——综述摘录

用于压力检测的设备&#xff1a; Empatica E4腕带&#xff1a;该设备是腕带&#xff0c;是实时生理数据流和可视化传感器。作为医疗级可穿戴设备&#xff0c;它使研究人员能够收集多种生理数据&#xff0c;例如用于HRV分析的BVP&#xff0c;以及反映皮肤特定区域不断波动的电特…

2024用云渲染好还是自己渲染好!

​cg动画的渲染上经常需要使用到“云渲染”&#xff0c;当然也有小型的动画渲染使用的自己本地电脑渲染。云渲染可节省时间&#xff0c;减少硬件投资&#xff1b;本地电脑渲染就比较灵活的&#xff0c;但是需要高配置的硬件支持&#xff0c;那么两者那个好呢&#xff0c;一起来…

第一个Spring Boot程序

目录 一、Spring Boot介绍 二、创建Spring Boot项目 1、插件安装&#xff08;专业版不需要&#xff09; 2、创建SpringBoot项目 &#xff08;1&#xff09;这里如果插件下载失败&#xff0c;解决方案&#xff1a; &#xff08;2&#xff09;项目启动失败&#xff0c;解决…

skywalking-agent 代码调试

之前已经将 oap 和 ui 调试成功了&#xff0c;今天排查一个 agent 的采集问题&#xff0c;又研究了下 agent 代码如何调试&#xff0c;这下终于齐活了&#xff0c;以后 skywalking 再有问题&#xff0c;直接使用调试大法。 废话不多说&#xff0c;我们看下如何搞&#xff0c;步…

SpringBoot中异步执行事务REQUIRED和REQUIRED_NEW的区别

springboot中事务的使用方式 在spring的bean中&#xff0c;要开启数据库事务只需要在方法中标注注解 Transactional 注解常用的参数有 Class[] rollbackFor() default {} 指定回滚异常Propagation propagation() default Propagation.REQUIRED 事务的传播机制Isolation iso…

增强现实(AR)技术的应用场景

增强现实&#xff08;AR&#xff09;技术将虚拟信息与现实世界融合&#xff0c;为用户提供更加直观、交互式的体验。AR技术具有广泛的应用前景&#xff0c;可以应用于各行各业。以下是一些AR的应用场景。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0…

【Python-闭包】

Python-闭包 ■ 闭包特性■ 简单闭包■ 使用nonlocal关键字修改外部函数的值■ 使用闭包实现ATM小案例 ■ 闭包特性 ■ 简单闭包 def outer(logo):def inner(msg):print(f"<{logo}>{msg}<{logo}>")return innerfn1 outer("程序员") fn1(&quo…

node.js版本降级/升级

第一步.先清空本地安装的node.js版本 按健winR弹出窗口&#xff0c;键盘输入cmd,然后敲回车&#xff08;或者鼠标直接点击电脑桌面最左下角的win窗口图标弹出&#xff0c;输入cmd再点击回车键&#xff09; 进入命令控制行窗口&#xff0c;输入where node&#xff0c;查看本地…

2024年深圳杯东三省数学建模联赛A题论文首发+问题一代码分享

深圳杯A题论文代码分享资料链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1L2NVgoefSW-yuqZjEB3wcw 提取码&#xff1a;sxjm 基于优化模型的多个火箭残骸的准确定位 摘要 在现代航天技术中&#xff0c;火箭是实现空间探索的关键工具。由于火箭发射过程中的高成…

matlab新手快速上手3(差分进化算法)

本文用经典差分进化框架模板&#xff0c;对matlab新手友好&#xff0c;快速上手看懂matlab代码&#xff0c;快速应用实践&#xff0c;源代码在文末给出。 差分进化算法定义&#xff1a; 差分进化算法&#xff08;Differential Evolution&#xff0c;简称DE算法&#xff09;是…

RD77MS2 三菱iQ-R系列2轴简单运动模块(SSCNETⅢ/H型)

RD77MS2 三菱iQ-R系列2轴简单运动模块(SSCNETⅢ/H型) RD77MS2用户手册,RD77MS2外部连接,RD77MS2规格。RD77MS2参数说明&#xff1a;2轴;SSCNETⅢ/H连接&#xff0c;位置控制、同步控制、速度.转矩控制、轨迹控制;控制单位mm、inch、degree、pulse;定位数据600数据轴。 RD77MS2图…

导出JVM的线程信息

1. 查询出Java应用的进程的PID ps -ef|grep java 此时的PID是 33 2. 使用JDK自带的工具jstack导出日志 jstack -l 33 > 2022jstack.log 3.然后直接下载

Python 基础、流程、容器、函数

一、基础语法 1.1 前言 1.1.1 Python简介 Python是一门编程语言&#xff0c;Python的作者是Guido van Rossum&#xff08;龟叔&#xff09; Python优点&#xff1a;简单易学 Python与嵌入式、集成电路行业 强大的库和工具生态系统&#xff1a;Python拥有广泛而强大的库和…

免费GPU Google Colab保姆级使用攻略,实现数据集快速下载

Colab&#xff08;Colaboratory&#xff09;是一个基于云的交互式开发环境&#xff0c;专为数据科学、机器学习和人工智能任务设计。Colab 由 Google 提供&#xff0c;允许用户在浏览器中直接编写、运行、共享和协作处理 Python代码&#xff0c;特别是那些涉及大数据处理、计算…

semaphore信号量使用+原理分析

1.概述 Semaphore 信号量&#xff0c;相当于一个计数器&#xff0c;通常用来限制线程的数量。 每个线程操作前会先获取一个许可证&#xff0c;逻辑处理完成之后就归还这个许可证。 通俗的解释&#xff1a;相当于一个停车场&#xff0c;有10个停车位&#xff0c;进来一个车&am…