开源工具:ONVIF协议实现搜索局域网摄像机(IPC)+RTSP地址获取

2023-05-16

Onvif协议做安防监控的人应该都很熟悉,它广泛被用在各种安防设备中,比如IPC、DVR、NVR。在局域网中发现IPC设备很多就是基于Onvif协议实现的。本文章给大家介绍QuickGBLink开源的一个工具,该工具能够通过Onvif的设备发现将局域网内的Onvif IPC枚举出来,显示到界面的列表中,并且可以获得每个IPC设备的RTSP流地址。该工具界面截图如下:

1. Onvif搜索设备的原理

Onvif客户端向网段内固定的某个组播地址发送一段广播报文,这个组播地址就是:239.255.255.250,端口:3702。而Onvif服务端(响应消息的设备)在固定端口上监听,接收到广播消息之后向发送者回复消息,回复的消息里返回设备自己的IP、UUID、EP Address、Type等,最重要的会返回设备的Device Service Address,格如:http://192.168.0.64:8099/onvif/device_service ,此地址就是为设备提供Onvif服务的服务地址。

2. 报文发送和接收

Onvif客户端向局域网内固定组播组发送的广播报文:

<?xml version="1.0" encoding="utf-8"?>
<Envelope xmlns:dn="http://www.onvif.org/ver10/network/wsdl" 
xmlns="http://www.w3.org/2003/05/soap-envelope">
<Header>
<wsa:MessageID xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing">
uuid:25862dc4-4866-42a9-87a7-edcf2918ab10
</wsa:MessageID>
<wsa:To xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing">
urn:schemas-xmlsoap-org:ws:2005:04:discovery
</wsa:To>
<wsa:Action xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing">
http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe
</wsa:Action>
</Header>
<Body>
<Probe xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns="http://schemas.xmlsoap.org/ws/2005/04/discovery">
<Types>dn:NetworkVideoTransmitter</Types>
<Scopes />
</Probe>
</Body>
</Envelope>
 

Onvif服务端回复的报文,消息格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" 
xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xs="http://www.w3.org/2000/10/XMLSchema"
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-
secext-1.0.xsd" 
xmlns:wsa5="http://www.w3.org/2005/08/addressing" 
xmlns:xop="http://www.w3.org/2004/08/xop/include" 
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"  
xmlns:tt="http://www.onvif.org/ver10/schema"  xmlns:ns1="http://www.w3.org/2005/05/xmlmime" 
xmlns:wstop="http://docs.oasis-open.org/wsn/t-1" 
xmlns:ns7="http://docs.oasis-open.org/wsrf/r-2" 
xmlns:ns2="http://docs.oasis-open.org/wsrf/bf-2" 
xmlns:dndl="http://www.onvif.org/ver10/network/wsdl/DiscoveryLookupBinding" 
xmlns:dnrd="http://www.onvif.org/ver10/network/wsdl/RemoteDiscoveryBinding" 
xmlns:d="http://schemas.xmlsoap.org/ws/2005/04/discovery" 
xmlns:dn="http://www.onvif.org/ver10/network/wsdl" 
xmlns:ns10="http://www.onvif.org/ver10/replay/wsdl" 
xmlns:ns11="http://www.onvif.org/ver10/search/wsdl"
xmlns:ns13="http://www.onvif.org/ver20/analytics/wsdl/RuleEngineBinding" 
xmlns:ns14="http://www.onvif.org/ver20/analytics/wsdl/AnalyticsEngineBinding" 
xmlns:tan="http://www.onvif.org/ver20/analytics/wsdl" 
xmlns:ns15="http://www.onvif.org/ver10/events/wsdl/PullPointSubscriptionBinding" 
xmlns:ns16="http://www.onvif.org/ver10/events/wsdl/EventBinding" 
xmlns:tev="http://www.onvif.org/ver10/events/wsdl" 
xmlns:ns17="http://www.onvif.org/ver10/events/wsdl/SubscriptionManagerBinding" 
xmlns:ns18="http://www.onvif.org/ver10/events/wsdl/NotificationProducerBinding" 
xmlns:ns19="http://www.onvif.org/ver10/events/wsdl/NotificationConsumerBinding" 
xmlns:ns20="http://www.onvif.org/ver10/events/wsdl/PullPointBinding" 
xmlns:ns21="http://www.onvif.org/ver10/events/wsdl/CreatePullPointBinding" 
xmlns:ns22="http://www.onvif.org/ver10/events/wsdl/PausableSubscriptionManagerBind
ing" 
xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2" 
xmlns:ns3="http://www.onvif.org/ver10/analyticsdevice/wsdl" 
xmlns:ns4="http://www.onvif.org/ver10/deviceIO/wsdl" 
xmlns:ns5="http://www.onvif.org/ver10/display/wsdl" 
xmlns:ns8="http://www.onvif.org/ver10/receiver/wsdl" 
xmlns:ns9="http://www.onvif.org/ver10/recording/wsdl" 
xmlns:tds="http://www.onvif.org/ver10/device/wsdl" 
xmlns:timg="http://www.onvif.org/ver20/imaging/wsdl" 
xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl"
xmlns:trt="http://www.onvif.org/ver10/media/wsdl" 
xmlns:trt2="http://www.onvif.org/ver20/media/wsdl" 
xmlns:ter="http://www.onvif.org/ver10/error"  xmlns:tns1="http://www.onvif.org/ver10/topics" 
xmlns:tnsn="http://www.eventextension.com/2011/event/topics">
<SOAP-ENV:Header>
<wsa:MessageID>urn:uuid:327b23c6-5566-7788-99ac-001217d7bf0f
</wsa:MessageID>
<wsa:RelatesTo>uuid:25862dc4-4866-42a9-87a7-edcf2918ab10
</wsa:RelatesTo>
<wsa:To SOAP-ENV:mustUnderstand="true">
http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
</wsa:To>
<wsa:Action SOAP-ENV:mustUnderstand="true">
http://schemas.xmlsoap.org/ws/2005/04/discovery/ProbeMatches
</wsa:Action>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<d:ProbeMatches>
<d:ProbeMatch>
<wsa:EndpointReference><wsa:Address>
urn:uuid:b12dca78-5566-7788-99aa-001217d7bf0f</wsa:Address>
</wsa:EndpointReference>
<d:Types>dn:NetworkVideoTransmitter
</d:Types>
<d:Scopes>onvif://www.onvif.org/type/video_encoder onvif://www.onvif.org/type/audio_encoder 
onvif://www.onvif.org/hardware/IPC-model onvif://www.onvif.org/location/country/china 
onvif://www.onvif.org/name/NVT onvif://www.onvif.org/Profile/Streaming
</d:Scopes>
<d:XAddrs>
http://192.168.0.64:8099/onvif/device_service
</d:XAddrs>
<d:MetadataVersion>10</d:MetadataVersion>
</d:ProbeMatch>
</d:ProbeMatches>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
 

Onvif客户端解析上面收到的数据,得到IPC摄像头的「设备服务地址」,即XAddrs字段,
 <d:XAddrs>http://192.168.0.64:8099/onvif/device_service</d:XAddrs>

3. 实现Onvif设备发现类

我们将Onvif设备发现功能的逻辑处理都放到一个类里面实现,这个类的声明如下:

class DEVICE_IPC_INFO
{
public:
	char          hardware_type[128]; //硬件型号
	char          DeviceName[64];
	char          DeviceID[128]; //uuid
	char          IP[32];
	int           Port;

	DEVICE_IPC_INFO()
	{
		memset(DeviceName, 0, sizeof(DeviceName));
		memset(DeviceID, 0, sizeof(DeviceID));
		memset(IP, 0, sizeof(IP));
		memset(hardware_type, 0, sizeof(hardware_type));
		Port = 80;
	}

	DEVICE_IPC_INFO& operator =(const DEVICE_IPC_INFO& t) 
	{
		strcpy(hardware_type, t.hardware_type);
		strcpy(DeviceName, t.DeviceName);
		strcpy(DeviceID, t.DeviceID);
		strcpy(IP, t.IP);
		Port = t.Port;

		return *this;
	}
};


typedef void (CALLBACK* DeviceDiscoverCB)(DEVICE_IPC_INFO * pInfo, LPVOID lpContext);

class COnvifDiscovery
{
public:
	COnvifDiscovery(void);
	~COnvifDiscovery(void);

	void SetDiscoveryInfoCB(DeviceDiscoverCB lpCallback, LPVOID lpContext);
	int  StartFind(void);
	void StopFind();

protected:
	static DWORD WINAPI ReceivingThrd(void * pParam);

	int probeSocketIni(int *fd);
	void probeSocketEnd(int *fd);
	int sendProbe(int fd,const char *uuid,const char *types);
	int recvProbeMatches(int fd,int timeout);

	void ReceivingLoop(void);

	 int     m_fd;
	 BOOL    m_bIsReceiving;
	 HANDLE  m_hRcvThread;

	 DeviceDiscoverCB m_lpCallback;
	 LPVOID           m_lpContext;
};

这个类的头文件和源文件是Discover.h、Discover.cpp。具体实现过程这里略过。

4.常见问题答疑

1. 获取RTSP地址需要填写IPC的登录用户名和密码。但是,连某些摄像机,填写了用户名和密码之后,登录摄像机获取流信息失败,如下图:


错误原因可能是填写的登录IPC的用户名或密码错误,导致用户权鉴失败;也有可能是这个用户是没有Onvif访问权限(需要在IPC上做配置,这个问题多出现在海康的摄像机系列)。

关于这个问题的解决办法,请看这篇文章:

https://blog.csdn.net/QuickGBLink/article/details/103442791

2. 成功获取流信息后,可以选择流索引(流编号)从而显示不同通道的流URL,一般的摄像机有双码流,所以有两个通道的流,但是有些摄像机有三个流的。用户可以切换选择不同的流编号(通道编号),然后拷贝这个流的RTSP地址,放到VLC播放器中或我们的RTSP客户端中播放。

该工具的代码下载地址:

Github:https://github.com/QuickGBLink88/OnvifDiscoveryTool

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

开源工具:ONVIF协议实现搜索局域网摄像机(IPC)+RTSP地址获取 的相关文章

  • OpenMV的单颜色识别讲解

    OpenMV的官方教程 xff1a 寻找色块 xff1b single color rgb565 blob tracking示例讲解 xff1b 视频讲解 需要提前看的文章 xff1a 程序烧录 xff1b 颜色阈值设置 目录 thresh
  • STM32CubeMX串口通讯

    串口的简单介绍 RS 232与TTL 根据通讯使用的电平标准不同 xff0c 串口通讯可分为 TTL 标准及 RS 232 标准 而STM32的串口是TTL电平标准的 如果需要使用到RS 232则需要一个电平转换芯片 单工通信 半双工通信和
  • 自制超简易通讯协议(中断接收)

    前言 在做蓝牙语音小车时 xff0c 总遇到各式各样的问题 本文主题是笔者在解决串口不够并且数据量小的问题时突发奇想自定义一个简易的通讯协议 由于是用89c51做的主控 xff0c 外设的资源比较紧张 串口只有一个 xff0c 但两个系统需
  • 【Java杂谈】Iterator(迭代器)的使用

    x1f3b8 Iterator是什么 xff1f 迭代器是Java提供的一种访问集合的方法 xff0c Iterator 是 Java 迭代器最简单的实现 xff0c 常用来访问ArrayList HashMap等类的对象 Iterator
  • orb 纯背景物体识别

    include lt chrono gt include lt iostream gt include lt opencv2 core core hpp gt include lt opencv2 features2d features2d
  • Windows逆向安全(一)之基础知识(九)

    汇编比较三种循环 众所周知 xff0c 在C语言可以使用可以使用三种循环 xff0c 分别是 xff1a while do while和for 本文从汇编的角度出发 xff0c 观察这三种循环的差异 范例代码 先贴出三种循环的代码 xff0
  • c++读取yolov5模型进行目标检测(读取摄像头实时监测)

    文章介绍 本文是篇基于yolov5模型的一个工程 xff0c 主要是利用c 43 43 将yolov5模型进行调用并测试 xff0c 从而实现目标检测任务 任务过程中主要重点有两个 xff0c 第一 版本问题 xff0c 第二配置问题 一
  • ROS初学(二):ROS的三种基本通信机制(来自赵虚左老师)

    一 综述 ROS引入通信机制 xff0c 是为了实现ROS节点 xff08 进程 xff09 之间的通信 利用ROS进程的分布式框架 xff0c 可以使得每个进程独立的工作 xff0c 甚至分布于不同的主机工作 机器人上的各种传感器 xff
  • webpack 5.5.1 compiled with 1 error in 63 ms

    新建项目空白目录 xff0c 并运行 npm init y 命令 xff0c 初始化包管理配置文件 package json 新建 src 源代码目录 新建 src gt index html 首页和 src gt index js 脚本文
  • TypeError: Class constructor ServeCommand cannot be invoked without ‘new‘

    安装webpack插件 webpack dev server配置时将package json里面webpack改为webpack serve后 xff0c 运行npm run 脚本名 时出现 TypeError Class construc
  • Field ‘browser‘ doesn‘t contain a valid alias configuration

    意思是字段 39 browser 39 不包含有效的别名配置 意思就是说你打包的css路径不对 这个是我的代码 这里js里面导入的css路径不对 xff0c css文件夹不是和index js平级 xff0c 应该是上级所以正确的代码应该是
  • Failed to load resource: the server responded with a status of 404 (Not Found)

    问题场景 xff1a 编写路由模块 解决方法 xff1a 1 先检测路径是否有写错 2 将vscode中开的插件vetur关闭 3 上面方法不管用时 xff0c 将浏览器插件关闭 xff0c 例如油猴 有什么错误望大佬指出 xff01 xf
  • Vue3.js【未完成】

    Vue3 js 如何关闭烦人的vscode的提示框 https blog csdn net liuyuemozhu article details 101056556 ES6模块化与异步编程高级用法 ES6模块化 1 回顾 xff1a no
  • npm ERR! code ERESOLVEnpm ERR! ERESOLVE unable to resolve dependency tree

    npm下载报错 xff0c 这个是因为npm版本问题 xff0c 例如我下载element ui运行npm i element ui S 因为版本问题我就无法下载 xff0c 解决办法就是在末尾加上 legacy peer deps 即np
  • 前端面试题

    浏览器 输入一个URL到页面过程中发生了什么 xff08 高频 xff09 首先在浏览器中输入URL 查找缓存 xff1a 浏览器先查看浏览器缓存 系统缓存 路由缓存中是否有该地址页面 xff0c 如果有则显示页面内容 如果没有则进行下一步
  • MATALAB动态爱心代码

    第一步 xff1a 先下载MATLAB软件 xff08 该代码只适用于此软件 xff0c 要下载软件才可运行 xff09 第二步 xff1a 点击主页 新建脚本 xff08 可自己给脚本命名 xff0c 我命名的是aixin xff09 第
  • Linux相关博文中使用的头文件

    收录博文中看到的已经封装好的文件时 xff0c 方便各位查看 Log hpp 日志信息 pragma once include lt iostream gt include lt cstdio gt include lt cstdarg g
  • 构造函数和析构函数执行顺序

    析构函数运行顺序 xff1a 1 主函数结束 xff1b 2 函数调用结束 xff1b 3 用delete删除 xff08 new创建的 xff09 对象时 注释代码运行结果 输入坐标6 xff0c 3 xff0c 6 xff0c 2 xf
  • 27.【C/C++ 最全vector数组的用法 (详解)】

    vector动态数组 xff08 一 xff09 什么是vector xff1f xff08 二 xff09 vector的作用是什么 xff08 三 xff09 经典用法 1 vector函数的定义 代码展示 效果展示 2 vector的
  • 析构函数运行顺序

    全局变量 xff0c 静态局部变量 xff0c 局部变量空间的堆分配和栈分配 其中全局变量和静态局部变量时从 静态存储区中划分的空间 xff0c 二者的区别在于作用域的不同 xff0c 全局变量作用域大于静态局部变量 xff08 只用于声明

随机推荐

  • 03_临界段的保护

    一 临界段的概念 所谓的临界段就是在执行时不能被中断的代码段 在FreeRTOS中 xff0c 临界段最常出现的地方就是对全局变量的操作 那么什么情况下临界段会被打断 xff1f 一个是系统调度 xff0c 还有一个是外部中断 在FreeR
  • Qt自定义窗口继承基类

    设计一个窗口基类模板 xff0c 方便子类的统一风格使用 xff0c 省略重写事件函数 xff0c 代码思路
  • ROS学习笔记4:创建工作空间和功能包

    一 linux命令行使用基础 xff1a 1 cd命令 xff08 change directory xff09 xff1a xff08 1 xff09 语法 xff1a cd dirName xff08 dirName xff1a 要切换
  • 一段代码给你讲清楚【链式存储结构】

    1 基础定义 链式存储结构 xff08 linked storage structure xff09 xff0c 是逻辑存储结构的一种 xff0c 链式存储结构中每一个逻辑元素用一个内存结点存储 xff0c 每一个结点都是单独分配的 xff
  • Flask之before_request与after_request

    Flask之before request与after request 更多的用法或说明请查看文档 xff1a https dormousehole readthedocs io en latest api html flask Flask
  • C++教程之迭代器Iterator

    前言 之前的两篇文章我们主要了解了vector和string的相关知识 xff0c 从中我们知道可以通过下标来访问vector的元素或者string的字符 xff0c 但是除了这种方式还有一种更为通用的方式获取元素 xff0c 那就是迭代器
  • Qt 绘制图表 - Qt Charts版

    一 前言 自从 Qt 发布以来 xff0c 给广大跨平台界面研发人员带来了无数的福利 但是Qt自己却一直没有提供自带的图表库 xff0c 这就使得 QWT QCustomPlot 等第三方图表库有了巨大的生存空间 xff0c 为了降低开发成
  • Qt 多线程使用moveToThread

    Qt有两种多线程的方法 xff0c 其中一种是继承QThread的run函数 xff0c 另外一种是把一个继承于QObject的类用moveToThread函数转移到一个Thread里 Qt4 8之前都是使用继承QThread的run这种方
  • Qt 之http学习

    在Qt网络编程中 xff0c 需要用到协议 xff0c 即HTTP 它是超文本传输协议 xff0c 它是一种文件传输协议 新建工程名为 http xff0c 然后选中QtNetwork模块 xff0c 最后Base class选择QWidg
  • QT之QString

    字符串类 QString xff1a 在Qt官方文档中是这样描述QString的 xff1a The QString class provides a Unicode character string 我们可以将做C 43 43 中的str
  • 什么是栈?什么是任务栈?

    在裸机系统中 xff0c 它们统统放在一个叫栈的地方 栈式单片机RAM里一段连续的内存空间 栈的大小一般在启动文件或者链接脚本里里面指定 最后由C库函数 main进行初始化 每个任务都是独立的 xff0c 互不干扰的 所以要为每个任务都分配
  • OPENMV上的目标检测,目标定位模型

    目标板定位模型 代码地址 前言 在17届省赛结束后 xff0c 因为担心国赛场地光照影响较大 xff0c 写了这个目标检测算法 但因为时间以及实力不足 xff0c 算法仅有了个雏形 xff0c 没能成功部署 xff0c 非常遗憾 今年寒假终
  • select函数当对端关闭后的状态

    struct timeval timeout 61 5 0 rset 61 allset nready 61 select maxfd 43 1 amp rset NULL NULL amp timeout 当使用select等待客户端发送
  • web渗透之攻击 Authentication-1-

    可利用常见漏洞 认证http明文传输 xff0c 未加密 xff0c 攻击者可通过中间人攻击获取默认密码弱口令 xff0c 简单的credentials xff0c 可以通过暴力破解获取通过其他漏洞绕过认证不正确的重置密码功能密码在本地存储
  • UART——学习总结

    UART 一 含义 xff1a 通用异步收发传输器 xff08 Universal Asynchronous Receiver Transmitter xff0c 通常称作UART xff09 是一种串行异步收发协议 xff0c 二 工作原
  • 海康威视web3.0+vue项目使用(踩坑之路)ps:附webVideoCtrl.js文件

    文章目录 1 海康威视web3 02 vue项目应用3 运行环境 最近公司开发了一版监控视频的vue项目 我作为实现需求的前端真的是难为我了 各种调查后知道海康威视有web开发包 跟海康威视的SDK联系后发给我两个web二次开发包 CH W
  • GB28181国标平台软件(包含服务器和客户端)

    GB28181是国家针对安防领域制定的一个通信协议标准 xff0c 目的是解决不同平台 不同设备间通信协议不统一的问题 GB28181标准从2011制定的第一个版本开始 xff0c 到最近的2016版本 xff0c 制定的协议内容越来越细
  • 国标服务器GBServerPlatform对接海康NVR的操作说明

    这一篇文章介绍QuickGBLink开发的国标服务器如何对接海康NVR xff08 网络硬盘录像机 xff09 xff0c 主要讲解相关的操作步骤 xff08 GBT28181平台软件下载地址 xff1a https github com
  • 国标服务器GBServerPlatform对接海康摄像头的操作说明

    这篇文章讲解一下QuickGBLink开发的国标服务器如何对接海康IPC xff08 GBT28181国标平台软件下载地址 xff1a https github com QuickGBLink88 GB28181 ServerPlatfor
  • 开源工具:ONVIF协议实现搜索局域网摄像机(IPC)+RTSP地址获取

    Onvif协议做安防监控的人应该都很熟悉 xff0c 它广泛被用在各种安防设备中 xff0c 比如IPC DVR NVR 在局域网中发现IPC设备很多就是基于Onvif协议实现的 本文章给大家介绍QuickGBLink开源的一个工具 xff