1

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

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

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

4

2 回答 2

11

我偶然发现了这个问题,并对罗恩·伍兹的唯一回答是不正确且明显具有误导性但仍被标记为已接受的答案感到不安。因此,尽管这个问题已经存在三年了,但我决定为将来要阅读它的任何人提供正确的答案。

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

让我们看看为什么需要 Discovery Proxy,如果您想跨本地网络边界发现 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. 向任何请求它的人提供有关所有设备(发现代理事先发现的设备)的信息,但这次它使用 SOAP over HTTP(因此通过单播 TCP/IP)。这减少了终端客户端的负载,因为他们需要做的就是通过可靠的 TCP 连接连接到 Discovery Proxy,并一次性获取所有可用终端设备的列表。

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

Discovery Proxy 使用与任何终端设备完全相同的SOAP WSDL,因此 WS-Discovery 客户端所需要的只是使用 HTTP SOAP 绑定而不是 UDP SOAP 绑定来实现相同的结果,但效率更高,并且可以跨 Internet。

因此,您可以在哪里获得 Discovery Proxy。拥有它的方法是:

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

ONVIF 核心规范 第 7.4.2 节发现代理描述了如何设置 DP。但是,根据我的经验,我没有找到任何支持远程发现的 ONVIF 摄像头,很可能是因为要这样做,摄像头必须充当支持代理协议的网关。所以,目前在实践中,ONVIF远程发现是不可能的。

于 2015-06-24T16:38:15.960 回答