Мы пытаемся получить базовую программу Onvif discovery C # для обнаружения камер в локальной сети. Мы можем обнаружить камеры с помощью готового инструмента, такого как Onvif Device Manager . Используя Wireshark, мы можем видеть запросы UDP, которые отправляет Onvif DM, и ответы от камер.
Когда мы запускаем наше основное консольное приложение для обнаружения Onvif, Wireshark показывает нам почти идентичные запросы UDP, передаваемые в широковещательном режиме, и в течение 1 секунды мы можем видеть ответы по сети с 3 камер. Но наше приложение не видит ответов: наш обработчик событий DiscoveryClient FindProgressChanged никогда не вызывается, а коллекция конечных точек, возвращаемых методом Find DiscoveryClient, пуста.
Вот наше консольное приложение Discovery:
using System;
using System.ServiceModel.Discovery;
using System.Xml;
namespace DiscoveryClient
{
public class Program
{
public static void Main(string[] args)
{
var endPoint = new UdpDiscoveryEndpoint(DiscoveryVersion.WSDiscoveryApril2005);
var discoveryClient = new System.ServiceModel.Discovery.DiscoveryClient(endPoint);
discoveryClient.FindProgressChanged += DiscoveryClient_FindProgressChanged;
var findCriteria = new FindCriteria
{
Duration = TimeSpan.FromSeconds(10),
MaxResults = int.MaxValue
};
findCriteria.ContractTypeNames.Add(new XmlQualifiedName("NetworkVideoTransmitter", @"http://www.onvif.org/ver10/network/wsdl"));
Console.WriteLine("Initiating find operation.");
var response = discoveryClient.Find(findCriteria);
Console.WriteLine($"Operation returned - Found {response.Endpoints.Count} endpoints.");
Console.ReadKey();
}
private static void DiscoveryClient_FindProgressChanged(object sender, FindProgressChangedEventArgs e)
{
Console.WriteLine($"Found this: {e}");
}
}
}
А вот пример запроса на обнаружение UDP, сгенерированного приложением (единственная разница между этим и запросом, генерируемым Onvif DM, - это элемент Duration внутри зонда)
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing">
<s:Header>
<a:Action s:mustUnderstand="1">http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe</a:Action>
<a:MessageID>urn:uuid:3445e6a6-0751-4953-9071-394ab3f85fcb</a:MessageID>
<a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo>
<a:To s:mustUnderstand="1">urn:schemas-xmlsoap-org:ws:2005:04:discovery</a:To>
</s:Header>
<s:Body>
<Probe xmlns="http://schemas.xmlsoap.org/ws/2005/04/discovery">
<d:Types xmlns:d="http://schemas.xmlsoap.org/ws/2005/04/discovery" xmlns:dp0="http://www.onvif.org/ver10/network/wsdl">dp0:NetworkVideoTransmitter</d:Types>
<Duration xmlns="http://schemas.microsoft.com/ws/2008/06/discovery">PT10S</Duration>
</Probe>
</s:Body>
Есть идеи относительно того, что здесь происходит - почему наше приложение не видит ответы на свой запрос на обнаружение?