WS-Discovery适用于不同逻辑网络上的摄像机

spi*_*nt0 1 ws-discovery

我有一个运行python的单元,需要使用ws-discovery来定位可能位于不同逻辑网络上的onvif摄像机。有人知道这是否可能吗?

(我在使用此库的相同逻辑网络上得到了发现:https : //github.com/hlamer/python-ws-discovery/blob/master/WSDiscovery.py

经过一番搜索,我遇到了听起来很有希望的“远程发现代理”,但我无法弄清楚它们到底是什么。

Vla*_*sev 5

我无意间偶然发现了这个问题,并为Ron Woods的答案是不正确和明显的误导而感到困扰,但仍然被标记为可接受的答案。因此,尽管这个问题已经存在三年了,但我还是决定为将来打算阅读的任何人提供正确的答案。

ONVIF核心规范提供了关于什么是发现代理的简明描述,并且未提供有关其操作的完整详细信息。原因很简单:ONVIF规范没有定义它。ONVIF只是另一个标准的用户:Web服务动态发现(WS-Discovery)1.1版。反过来,该规范使用另一个标准:SOAP-over-UDP Version 1.1。而且,由于ONVIF与发现代理无关(除了使用它),因此不需要摄像机即可充当代理协议的网关。实际上,发现代理只是在本地网络上的某些系统上运行的另一项服务。

让我们看看为什么要跨局域网边界发现Web服务(而ONVIF只是其中之一),为什么可能需要发现代理,它是一个很好的解决方案。

WS-Discovery的核心是使用多播IP地址的SOAP-over-UDP协议。该技术的选择很简单:UDP是轻量级的,不需要建立连接,IP多播是一种将数据报从一个发送者传递到多个接收者的非常有效的方法。不幸的是,IP多播数据包通常不会被路由并留在本地网络中。另外,如果组播过多使用,可能会对本地网络造成压力。但是尽管有不利的一面,我们仍然拥有:终端设备需要侦听UDP / IP传递的多播消息并做出相应的响应。这将WS-Discovery仅限于本地网络。

另外,每个终端设备都必须在加入多播组时发送多播消息“ Hello”,并希望(但不是必需)在离开多播组时发送多播消息“ Bye”。

在本地网络上跟踪这些“ Hello”和“ Bye”消息的服务自然是很自然的,并且可以定期探查本地网络,但不要太频繁地探查以将网络负载降至最低。该服务称为发现代理。

实际上,Discovery Proxy几乎是WS-Discovery客户端,但增加了两个主要功能:

  1. 发现代理必须在收到多播探测消息后立即发送“ Hello”消息。这使新客户端知道网络上存在可用的发现代理,并且客户端可以节省一些资源并询问发现代理,而不用下次进行多播探测。

  2. 向所有请求该设备的人提供有关所有设备的信息(那些被发现代理事先发现的设备),但这一次它使用HTTP上的SOAP(因此通过单播TCP / IP)。这减少了最终客户端的负载,因为它们所需要做的就是通过可靠的TCP连接连接到发现代理,并一次性获取所有可用终端设备的列表。

作为副作用,Discovery Proxy使用HTTP使得可以通过Internet执行WS Discovery探针。发现代理只是另一个Web服务器!

Discovery Proxy使用与任何终端设备完全相同的SOAP WSDL,因此WS-Discovery客户端需要做的就是使用HTTP SOAP绑定而不是UDP SOAP绑定来达到相同的结果,但要更有效且遍及Internet。

因此,您会在哪里找到发现代理。拥有它的方法是:

  1. 它可能是您路由器中的一项服务(除非您拥有高端路由器,否则这几天并不常见)
  2. 您可以轻松地创建自己的(已经使用WSDiscovery.py创建了自己的WS-Discovery客户端)。在这种情况下,您已经具有所有本地发现的服务的列表。现在,您需要做的就是使HTTP绑定SOAP服务器将这些发现的服务发送到在其他地方运行的WS-Discovery客户端。