12

自動検出のためにネットワークに接続されている ONVIF デバイスをプローブするアプリケーションを開発しています。ONVIF Core 仕様によると、プローブ メッセージの SOAP 形式は次のとおりです。

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

このメッセージを WCF で送信して onvif deivce を検出するにはどうすればよいですか?

4

1 に答える 1

19

WCF Web サービス検出機能を使用するだけです。ONVIF は、WCF によって実装されているものと同じ標準に従います。プローブを送信するには、DiscoveryClient クラスを使用する必要があります。

私がそれを行ってからしばらく経っているので、正確ではないかもしれませんが、コードは次のようになります。マルチキャスト プローブは、検出可能なすべてのデバイスを検出します。イベント ハンドラーの各応答のメタデータを調べることで、onvif デバイスが応答したかどうかを検出できます。それでも応答が得られない場合は、ネットワークまたはデバイスの問題である可能性があります。応答が得られた場合は、必要なタイプのみを通知するように検索条件を絞り込むことができます。

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;
        // Edit: optionally specify contract type, ONVIF v1.0
        findCriteria.ContractTypeNames.Add(new XmlQualifiedName("NetworkVideoTransmitter",
            "http://www.onvif.org/ver10/network/wsdl"));

        discoveryClient.FindAsync(findCriteria);

        Console.ReadKey();
    }

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

    }
}
于 2012-11-16T21:46:20.017 に答える