如何在C#中发现onvif设备

时间:2012-11-16 12:00:14

标签: c# wcf ip-camera onvif ws-discovery

我正在开发一个应用程序,它将探测连接在网络上的ONVIF设备以进行自动发现。根据ONVIF Core规范,Probe消息的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?

1 个答案:

答案 0 :(得分:16)

只需使用WCF web service discovery功能即可。 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.

    }
}