我有一个运行python的单元需要使用ws-discovery来定位可能位于不同逻辑网络上的onvif摄像头。有谁知道这是否可行?
(我在使用此库的相同逻辑网络上发现了https://github.com/hlamer/python-ws-discovery/blob/master/WSDiscovery.py)
经过一番搜索后,我遇到了“远程发现代理”,听起来很有希望,但我无法弄清楚它们究竟是什么。
答案 0 :(得分:4)
我偶然发现了这个问题并且感到不安的是,只有罗恩·伍兹的回答是错误的,并且明显具有误导性,但仍然标记为已接受的答案。因此,尽管这个问题已经有三年了,但我还是决定为将来阅读它的人提供正确的答案。
ONVIF核心规范提供了有关Discovery Proxy的简要说明,但未提供有关其操作的完整详细信息。原因很简单:ONVIF规范没有定义它。 ONVIF仅仅是另一个标准的用户:Web Services Dynamic Discovery (WS-Discovery) Version 1.1。反过来,该规范使用另一个标准:SOAP-over-UDP Version 1.1。由于ONVIF与Discovery Proxy无关(除了使用它),因此不需要摄像头作为代理协议的网关。实际上,Discovery Proxy只是在本地网络上的某个系统上运行的另一项服务。
让我们看看为什么需要Discovery Proxy,如果你想跨本地网络的边界发现Web服务(而ONVIF只是其中之一),那么这是一个很好的解决方案。
WS-Discovery的核心是使用多播IP地址的SOAP-over-UDP协议。选择这种技术很简单:UDP很轻,不需要建立连接,IP多播是从一个发送者向多个接收者提供数据报的非常有效的方式。遗憾的是,IP多播数据包通常不会被路由并留在本地网络中。此外,如果过度使用,多播可能会对本地网络造成压力。但是尽管存在缺点,我们拥有的东西:终端设备需要监听UDP / IP传送的多播消息并做出相应的响应。这将WS-Discovery仅限制为本地网络。
此外,每个终端设备都需要发送多播消息" Hello"当它加入组播组并期望(但不是必需的)发送组播消息时#34;再见"当它离开多播组时。
在本地网络上提供一些服务是很自然的,这些服务跟踪这些服务" Hello"和"再见"消息并且可以定期探测本地网络,但不要太频繁地将网络负载降至最低。此服务称为发现代理。
事实上,Discovery Proxy几乎就是WS-Discovery客户端,但有两个主要的补充:
发现代理需要发送" Hello"在收到多播探测消息时立即发送消息。这允许新客户知道网络上有可用的Discovery Proxy,客户端可能会节省一些资源并询问Discovery Proxy,而不是下次进行多播探测。
向所有请求它的人提供有关所有设备(由Discovery Proxy发现的设备)的可用信息,但这次它使用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绑定来实现相同的结果,但更高效且跨越互联网。
因此,您可以在哪里获得Discovery Proxy。如何获得它是:
答案 1 :(得分:0)
ONVIF Core specification 7.4.2节发现代理描述了如何设置DP。但是,根据我的经验,我还没有发现任何支持远程发现的ONVIF摄像机,很可能因为这样做,摄像机必须充当支持代理协议的网关。因此,目前,在实践中,ONVIF远程发现是不可能的。