我'm trying to do a webservice discovery using WCF' s DiscoveryClient使用此代码:
// 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);
这在具有分配给单个网络接口的单个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 Device Manager似乎有同样的问题 .
请注意,这不是将服务绑定到特定或“所有地址”IP . 它是关于发送请求的IP .
1 回答
好吧,我遇到了同样的问题,经过几天的研究,阅读ONVIF文档并学习一些关于多播的技巧,我开发了这个代码,工作正常 . 例如,我的网络适配器上的主IP地址是192.168.80.55,我还在高级设置中设置了另一个IP(192.168.0.10) . 使用此代码,我可以发现IP地址为192.168.0.12的摄像机的设备服务 . 此示例中最重要的部分是“DeepDiscovery”方法,其中包含迭代网络地址和组播正确的Probe消息的主要思想 . 我建议在“GetSocketResponse”方法中反序列化响应 . 目前,我只使用Regex提取服务URI .
如本文所述(https://msdn.microsoft.com/en-us/library/dd456791(v=vs.110).aspx):
我正在执行WS-Discovery所做的确切操作并使用标准3702端口,但我自己构建SOAP信封并使用Socket类为所有已为网络接口控制器设置的IP地址发送数据包 .