2012-11-16 11 views
9

Zajmuję się tworzeniem aplikacji, która będzie testować urządzenia ONVIF podłączone do sieci w celu automatycznego wykrywania. Zgodnie z ONVIF podstawowej specyfikacji formatu komunikatu SOAP sonda:Jak odkryć urządzenia onvif w języku C#

<?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-f</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> 

Jak mogę wysłać tę wiadomość w WCF odkryć ONVIF deivce?

Odpowiedz

16

Po prostu użyj funkcji WCF web service discovery. ONVIF jest zgodny z tym samym standardem, który jest implementowany przez WCF. Aby przesłać sondę, musisz użyć klasy DiscoveryClient.

Minęło trochę czasu, odkąd to zrobiłem, więc może nie być dokładnie w porządku, ale twój kod powinien wyglądać jak poniżej. Sonda multiemisji znajdzie wszystkie możliwe do wykrycia urządzenia. Możesz wykryć, czy urządzenie onvif zareagowało, sprawdzając metadane dla każdej odpowiedzi w module obsługi zdarzeń. Jeśli nadal nie możesz uzyskać odpowiedzi, prawdopodobnie jest to problem z siecią lub urządzeniem. Jeśli dostaniesz odpowiedź, możesz zawęzić kryteria wyszukiwania, aby powiadomić tylko o wymaganych typach.

class Program 
{ 
    static void Main(string[] args) 
    { 
     var endPoint = new UdpDiscoveryEndpoint(DiscoveryVersion.WSDiscoveryApril2005); 

     var discoveryClient = new DiscoveryClient(endPoint); 

     discoveryClient.FindProgressChanged += discoveryClient_FindProgressChanged; 

     FindCriteria findCriteria = new FindCriteria(); 
     findCriteria.Duration = TimeSpan.MaxValue; 
     findCriteria.MaxResults = int.MaxValue; 
     discoveryClient.FindAsync(findCriteria); 

     Console.ReadKey(); 
    } 

    static void discoveryClient_FindProgressChanged(object sender, FindProgressChangedEventArgs e) 
    { 
     //Check endpoint metadata here for required types. 

    } 
} 
+0

Drogi Simonie, próbowałem tego, ale nie otrzymałem żadnej odpowiedzi. Jestem mylący o ten element SOAP dn: NetworkVideoTransmitter Jak można dodać to w FindCriteria? – user1828855

+2

Dodaj go do nazw kontraktów z kryteriami wyszukiwania. FindCriteria.ContractTypeNames. W zależności od wersji onvif NetworkVideoTransmitter może być określony jako zasięg, a nie typ. Spróbuj wykonać wyszukiwanie asynchroniczne bez kryteriów. Korzystanie z oddzwonienia pozwoli ci sprawdzić odpowiedzi ze wszystkich wykrywalnych urządzeń, które powinno zawierać urządzenie onvif. Na podstawie tych informacji powinieneś być w stanie wykonać bardziej ukierunkowane wyszukiwanie. –

+0

Hurah ....! Otrzymałem odpowiedzi od mojego urządzenia ONVIF. Za dużo dla tego poradnika Szymona. – user1828855