WS-Discovery 用于不同逻辑网络上的摄像头
WS-Discovery for cameras on different logical network
我有一个单元 运行 python 需要使用 ws-discovery 来定位可能位于不同逻辑网络上的 onvif 摄像机。有谁知道这是否可能?
(我在使用此库的相同逻辑网络上发现:https://github.com/hlamer/python-ws-discovery/blob/master/WSDiscovery.py)
经过一番搜索,我找到了 'remote discovery proxies',这听起来很有希望,但我无法弄清楚它们到底是什么。
ONVIF Core specification
第 7.4.2 节 Discovery Proxy 描述了如何设置 DP。然而,根据我的经验,我还没有发现任何支持远程发现的 ONVIF 摄像头,很可能是因为要这样做,摄像头必须充当支持代理协议的网关。因此,目前在实践中,ONVIF 远程发现是不可能的。
我偶然发现了这个问题,并且感到不安的是只有 Ron Woods 的回答是不正确的并且明显具有误导性,但仍然被标记为已接受的答案。因此,尽管这个问题已有三年历史,但我还是决定为将来要阅读它的任何人提供正确答案。
ONVIF 核心规范提供了关于什么是 Discovery Proxy 的简明描述,但没有提供关于其操作的完整细节。原因很简单:ONVIF 规范没有定义它。 ONVIF 只是另一个标准的用户:Web Services Dynamic Discovery (WS-Discovery) Version 1.1 . In turn that specification uses another standard: 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 客户端,但有两个主要的补充:
Discovery Proxy 需要在收到多播探测消息后立即发送 "Hello" 消息。这允许新客户端知道网络上有可用的发现代理,并且客户端可以节省一些资源并在下次询问发现代理而不是进行多播探测。
向任何请求它的人提供有关所有设备(之前由 Discovery Proxy 发现的设备)的信息,但这次它使用 SOAP over HTTP(因此通过单播 TCP/IP ).这减少了终端客户端的负载,因为他们需要做的就是通过可靠的 TCP 连接连接到发现代理,并一次性收集所有可用终端设备的列表。
Discovery Proxy 使用 HTTP 的副作用使得通过 Internet 执行 WS Discovery 探测成为可能。 Discovery Proxy 只是另一个网络服务器!
Discovery Proxy 使用与任何终端设备完全相同的 SOAP WSDL,因此 WS-Discovery 客户端所需要的只是使用 HTTP SOAP 绑定而不是 UDP SOAP 绑定来实现相同的结果,但效率更高以及整个互联网。
所以您会问在哪里可以获得 Discovery Proxy。获得方式有:
- 这可能是您路由器中的一项服务(除非您有高端路由器,否则现在并不常见)
- 您可以轻松创建自己的客户端(您已经使用 WSDiscovery.py 创建了自己的 WS-Discovery 客户端)。在这种情况下,您已经拥有所有本地发现的服务的列表。现在您需要做的就是创建 HTTP 绑定 SOAP 服务器,它将把这些发现的服务发送到您的 WS-Discovery 客户端 运行 别处。
我有一个单元 运行 python 需要使用 ws-discovery 来定位可能位于不同逻辑网络上的 onvif 摄像机。有谁知道这是否可能?
(我在使用此库的相同逻辑网络上发现:https://github.com/hlamer/python-ws-discovery/blob/master/WSDiscovery.py)
经过一番搜索,我找到了 'remote discovery proxies',这听起来很有希望,但我无法弄清楚它们到底是什么。
ONVIF Core specification 第 7.4.2 节 Discovery Proxy 描述了如何设置 DP。然而,根据我的经验,我还没有发现任何支持远程发现的 ONVIF 摄像头,很可能是因为要这样做,摄像头必须充当支持代理协议的网关。因此,目前在实践中,ONVIF 远程发现是不可能的。
我偶然发现了这个问题,并且感到不安的是只有 Ron Woods 的回答是不正确的并且明显具有误导性,但仍然被标记为已接受的答案。因此,尽管这个问题已有三年历史,但我还是决定为将来要阅读它的任何人提供正确答案。
ONVIF 核心规范提供了关于什么是 Discovery Proxy 的简明描述,但没有提供关于其操作的完整细节。原因很简单:ONVIF 规范没有定义它。 ONVIF 只是另一个标准的用户:Web Services Dynamic Discovery (WS-Discovery) Version 1.1 . In turn that specification uses another standard: 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 客户端,但有两个主要的补充:
Discovery Proxy 需要在收到多播探测消息后立即发送 "Hello" 消息。这允许新客户端知道网络上有可用的发现代理,并且客户端可以节省一些资源并在下次询问发现代理而不是进行多播探测。
向任何请求它的人提供有关所有设备(之前由 Discovery Proxy 发现的设备)的信息,但这次它使用 SOAP over HTTP(因此通过单播 TCP/IP ).这减少了终端客户端的负载,因为他们需要做的就是通过可靠的 TCP 连接连接到发现代理,并一次性收集所有可用终端设备的列表。
Discovery Proxy 使用 HTTP 的副作用使得通过 Internet 执行 WS Discovery 探测成为可能。 Discovery Proxy 只是另一个网络服务器!
Discovery Proxy 使用与任何终端设备完全相同的 SOAP WSDL,因此 WS-Discovery 客户端所需要的只是使用 HTTP SOAP 绑定而不是 UDP SOAP 绑定来实现相同的结果,但效率更高以及整个互联网。
所以您会问在哪里可以获得 Discovery Proxy。获得方式有:
- 这可能是您路由器中的一项服务(除非您有高端路由器,否则现在并不常见)
- 您可以轻松创建自己的客户端(您已经使用 WSDiscovery.py 创建了自己的 WS-Discovery 客户端)。在这种情况下,您已经拥有所有本地发现的服务的列表。现在您需要做的就是创建 HTTP 绑定 SOAP 服务器,它将把这些发现的服务发送到您的 WS-Discovery 客户端 运行 别处。