C # Onvif discovery request - ответы, отправленные с сетевых камер, не получены - PullRequest
0 голосов
/ 04 сентября 2018

Мы пытаемся получить базовую программу 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>

Есть идеи относительно того, что здесь происходит - почему наше приложение не видит ответы на свой запрос на обнаружение?

...