【问题标题】:How to discover onvif devices in C#如何在 C# 中发现 onvif 设备
【发布时间】:2012-11-05 03:43: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 设备?

【问题讨论】:

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


    【解决方案1】:

    只需使用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.
    
        }
    }
    

    【讨论】:

    • 亲爱的西蒙,我试过了,但没有得到任何回应。我对这个 SOAP 元素感到困惑 dn:NetworkVideoTransmitter 如何在 FindCriteria 中添加它?
    • 将其添加到查找条件的合同类型名称中。 FindCriteria.ContractTypeNames。根据 onvif 的版本,NetworkVideoTransmitter 可能被指定为范围而不是类型。尝试在没有条件的情况下进行异步查找。使用回调,这将允许您检查所有可发现设备的响应,您的 onvif 设备应包括在内。根据这些信息,您应该能够执行更有针对性的查找。
    • 万岁....!我收到了来自我的 ONVIF 设备的响应。非常感谢西蒙的指导。
    • 注意:根据 WS-Discovery 规范,即使没有“ContractTypeNames”标准,您的 ONVIF 设备也应该响应。标准的目的是减少响应的数量,而不是启用响应。然而,许多设备对规范的解释过于严格。一些应用会发送具有不同标准的探测,希望找到他们真正关心的所有设备,而忽略他们并不真正关心的设备的响应。
    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多