2012-11-16 10 views
9

Ich entwickle eine Anwendung zu entdecken, die auf Network Attached ONVIF-Geräte für die automatische Erkennung Sonde. Nach ONVIF Core-Spezifikation SOAP-Format der Probe Nachricht ist:Wie onvif Geräte in 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> 

Wie kann ich diese Nachricht in WCF senden onvif deivce zu entdecken?

Antwort

16

verwenden Sie einfach die WCF web service discovery Funktionen. ONVIF folgt dem gleichen Standard wie WCF. Sie müssen die DiscoveryClient-Klasse zum Senden der Probe verwenden.

Es ist eine Weile her, dass ich es getan habe, so ist es nicht ganz richtig sein könnte, aber Ihr Code soll wie folgt aussehen. Die Multicast-Sonde findet alle erkennbaren Geräte. Sie können feststellen, ob Ihr onvif-Gerät geantwortet hat, indem Sie die Metadaten für jede Antwort im Ereignishandler überprüfen. Wenn Sie immer noch keine Antwort erhalten, handelt es sich wahrscheinlich um ein Netzwerk- oder Geräteproblem. Wenn Sie eine Antwort erhalten, können Sie Ihre Suchkriterien verfeinern, um nur die erforderlichen Typen zu benachrichtigen.

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

Lieber Simon, ich habe das versucht, aber keine Antwort bekommen. Ich verwirren über dieses SOAP Element dn: NetworkVideoTransmitter Wie ist dieses Add in Findcriteria? – user1828855

+2

Fügen Sie den Namen der Vertragstypen des Suchkriteriums hinzu. FindCriteria.ContractTypeNames. Abhängig von der Version von onvif kann NetworkVideoTransmitter als ein Scope und kein Type angegeben werden. Versuchen Sie, einen asynchronen Suchvorgang ohne Kriterien durchzuführen. Mit einem Rückruf können Sie die Antworten von allen erkennbaren Geräten überprüfen, die Ihr onvif-Gerät enthalten sollte. Aus diesen Informationen sollten Sie einen gezielteren Fund durchführen können. –

+0

Hurah ....! Ich habe Antworten von meinem ONVIF-Gerät erhalten. Vielen Dank für diese Anleitung Simon. – user1828855