我正在开发一个应用程序,它将探测连接在网络上的ONVIF设备以进行自动发现.根据ONVIF Core规范,Probe消息的SOAP格式为:
<?xml version="1.0" encoding="UTF-8"?>
<e:Envelope xmlns:e="http://www.w3.org/2003/05/soap-envelope"
xmlns:w="http://schemas.xmlsoap.org/ws/2004/08/addressing"
xmlns:d="http://schemas.xmlsoap.org/ws/2005/04/discovery"
xmlns:dn="http://www.onvif.org/ver10/network/wsdl">
<e:Header>
<w:MessageID>uuid:84ede3de-7dec-11d0-c360-f01234567890</w:MessageID>
<w:To e:mustUnderstand="true">urn:schemas-xmlsoap-org:ws:2005:04:discovery</w:To>
<w:Action
a:mustUnderstand="true">http://schemas.xmlsoap.org/ws/2005/04/discovery/Pr
obe</w:Action>
</e:Header>
<e:Body>
<d:Probe>
<d:Types>dn:NetworkVideoTransmitter</d:Types>
</d:Probe>
</e:Body>
</e:Envelope>
Run Code Online (Sandbox Code Playgroud)
如何在WCF中发送此消息以发现onvif deivce?
我简要说明:
如何让wsdl2java生成SOAP 1.2绑定?
详细说明:
我使用工具(apache cxf 3.0.2)为wsdl生成了java服务类wsdl2java:
MBA-Anton:bin asmirnov$ ./wsdl2java -server -catalog /tmp/wsdl/catalog -d /tmp/onvif/server http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl
Run Code Online (Sandbox Code Playgroud)
然后我创建了服务代码并运行它,它正在运行:
public static void main(String args[]) throws InterruptedException {
System.out.println("Starting Server");
Endpoint.publish("udp://239.255.255.250:3702", new DiscoveryService());
System.out.println("Server ready...");
Thread.sleep(10 * 60 * 1000); // 10 min
System.out.println("Server exiting");
System.exit(0);
}
Run Code Online (Sandbox Code Playgroud)
开始记录:
Starting Server
28.11.2014 19:51:59 org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean buildServiceFromClass
INFO: Creating Service {http://www.onvif.org/ver10/network/wsdl}DiscoveryService from class org.onvif.ver10.network.wsdl.DiscoveryLookupPort
28.11.2014 19:52:00 org.apache.cxf.endpoint.ServerImpl initDestination
INFO: Setting the server's publish address to be udp://239.255.255.250:3702
28.11.2014 19:52:00 org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean buildServiceFromWSDL
INFO: …Run Code Online (Sandbox Code Playgroud) 我需要在android上使用WS-Discovery.我用谷歌搜索了将近一天但没有找到任何东西.
如果你在我的情况下你会怎么做?
我正在尝试DiscoveryClient使用此代码使用WCF进行Web服务发现:
// Setup the discovery client (WSDiscovery April 2005)
DiscoveryEndpoint discoveryEndpoint = new UdpDiscoveryEndpoint(DiscoveryVersion.WSDiscoveryApril2005);
DiscoveryClient discoveryClient = new DiscoveryClient(discoveryEndpoint);
// Setup the wanted device criteria
FindCriteria criteria = new FindCriteria();
criteria.ScopeMatchBy = new Uri("http://schemas.xmlsoap.org/ws/2005/04/discovery/rfc3986");
criteria.Scopes.Add(new Uri("onvif://www.onvif.org/"));
// Go find!
criteria.Duration = TimeSpan.FromMilliseconds(duration);
discoveryClient.FindAsync(criteria, this);
Run Code Online (Sandbox Code Playgroud)
这在具有分配给单个网络接口的单个IP地址(10.1.4.25)的计算机上非常有效.广播从10.1.4.25发送到239.255.255.250,我从同一子网上的5台设备获得响应.
但是,当机器在同一个接口上有多个IP时,它似乎选择一个源IP并从中发送请求.在这种情况下,我从单个设备获得一个169.254地址的回复.
我已经尝试设置UdpDiscoveryEndpoint.TransportSettings.MulticastInterfaceId一个合适的接口ID,但它没有帮助,因为它识别单个接口,而不是特定的IP.该UdpDiscoveryEndpoint.ListenUri属性还返回多播地址,因此不会影响源IP.
UdpDiscoveryEndpoint.Address是发现协议的URN.
有什么办法可以强制它从特定的IP地址发送,或理想情况下,在每个配置的IP上发送多个请求?
我也尝试过ONVIF设备管理器似乎有同样的问题.
请注意,这不是将服务绑定到特定或"所有地址"IP.它是关于发送请求的IP.
是否有针对JAX-WS RI,Axis2,CXF或其他工具包的WS-Discovery规范的任何实现?
我正在尝试使用一些 Java 代码发现 ONVIF 设备。具体来说,我试图获取他们的设备服务地址(我相信这只是他们的 IP 地址?),正如ONVIF 核心规范指出(第 4.3 节)“成功的发现提供了设备服务地址。一旦客户端拥有设备服务地址它可以通过设备服务接收详细的设备信息...”。最终获得网络上 ONVIF 设备的详细信息是我的目标。一般来说,我也在寻找一些与使用 ONVIF 规范相关的指南。
我对网络服务世界(以及一般的网络)还是个新手,所以如果我说了什么蠢话,请原谅我。不过,我自己也为此付出了很多努力:我阅读了大量的ONVIF Core Spec、ONVIF Application Programmer's Guide和WS-Discovery Specific。如果可以的话,我会总结一下我所知道的,以便您可以告诉我我是否走在正确的道路上:
wsimport(由 JDK 提供)生成 WSDL 中的 Java 类以在我的代码中使用。但我知道调用这些方法将在设备发现之后进行,对吗? 我需要发现支持onvif协议的局域网中的所有ip摄像头.我尝试使用WSDiscoveryClient,但它没有发现onvif服务,尽管它发现了其他服务.它就像onvif没有响应来自WSDiscoveryClient的探测.Onvif设备管理器可以进行发现,所以我知道可以做到这一点.有谁知道怎么做?
我有一个运行python的单元,需要使用ws-discovery来定位可能位于不同逻辑网络上的onvif摄像机。有人知道这是否可能吗?
(我在使用此库的相同逻辑网络上得到了发现:https : //github.com/hlamer/python-ws-discovery/blob/master/WSDiscovery.py)
经过一番搜索,我遇到了听起来很有希望的“远程发现代理”,但我无法弄清楚它们到底是什么。
ws-discovery ×8
java ×3
onvif ×3
c# ×2
wcf ×2
web-services ×2
android ×1
cxf ×1
ip-camera ×1
networking ×1
soap ×1
wsdl ×1
wsdl2java ×1
xml ×1