背景

上一篇文章,讲述了如何搜索和发现ONVIF设备。设备通过UDP反馈回来的应答信息,是XML格式的。
不同的开发语言,解析XML格式文件的代码自然就不一样。我这里简要的介绍一下这个应答信息的结构,以及解析设备应答的XML信息的思路。

基于ONVIF协议的摄像机监控管理平台(3)使用组播搜索发现设备WS-Discovery
基于ONVIF协议的摄像机监控管理平台(4)使用广播搜索发现设备WS-Discovery

文章发表的顺序可能有点乱,麻烦根据《基于ONVIF协议的摄像机监控管理平台(1)概述》里面的文章目录进行阅读,抱歉了




一、搜索发现ONVIF设备得到的信息

 <?xml version="1.0" encoding="utf-8"?>
 <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xop="http://www.w3.org/2004/08/xop/include" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:tns="http://schemas.xmlsoap.org/ws/2005/04/discovery" xmlns:dn="http://www.onvif.org/ver10/network/wsdl" xmlns:wsa5="http://www.w3.org/2005/08/addressing">
  <SOAP-ENV:Header>
    <tns:AppSequence MessageNumber="10920" InstanceId="1"/>
    <wsa:MessageID>urn:uuid:00010010-0001-1020-8000-48ea6329c15a</wsa:MessageID>
    <wsa:RelatesTo>uuid:b2d3105d-34a2-40cd-b23c-dd70f34b44ca</wsa:RelatesTo>
    <wsa:To SOAP-ENV:mustUnderstand="true">urn:schemas-xmlsoap-org:ws:2005:04:discovery</wsa:To>
    <wsa:Action SOAP-ENV:mustUnderstand="true">http://schemas.xmlsoap.org/ws/2005/04/discovery/ProbeMatches</wsa:Action>
  </SOAP-ENV:Header>
  <SOAP-ENV:Body>
    <tns:ProbeMatches>
      <tns:ProbeMatch>
        <wsa:EndpointReference>
          <wsa:Address>urn:uuid:00010010-0001-1020-8000-48ea6329c15a</wsa:Address>
        </wsa:EndpointReference>
        <tns:Types>dn:NetworkVideoTransmitter</tns:Types>
        <tns:Scopes>onvif://www.onvif.org/Profile/Streaming onvif://www.onvif.org/type/video_encoder onvif://www.onvif.org/type/ptz onvif://www.onvif.org/type/audio_encoder onvif://www.onvif.org/location/ onvif://www.onvif.org/name/UNIVIEW onvif://www.onvif.org/macaddr/48ea6329c15a onvif://www.onvif.org/version/IPC_G6102-B5011P10D1604 onvif://www.onvif.org/serial/210235C1X8A166000091 onvif://www.onvif.org/hardware/IPC244S-IR5-F36-DT onvif://www.onvif.org/type/IPC onvif://www.onvif.org/register_status/offline onvif://www.onvif.org/register_server/0.0.0.0:5060 onvif://www.onvif.org/regist_id/29-C1-5A</tns:Scopes>
        <tns:XAddrs>http://192.168.110.163:80/onvif/device_service</tns:XAddrs>
        <tns:MetadataVersion>1</tns:MetadataVersion>
      </tns:ProbeMatch>
    </tns:ProbeMatches>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

二、内容分析

这里面最重要的一条信息就是

<tns:XAddrs>http://192.168.110.163:80/onvif/device_service</tns:XAddrs>

这个代表的是ONVIF的服务地址。



三、把XAddrs节点提取出来。

这个就跟编程语言以及用到的解析库相关了。
我这里只说一下用C#如何实现。

        private void OnReceiveSink(IAsyncResult result)
        {
            IPEndPoint ep = null;
            var args = (object[])result.AsyncState;
            var session = (UdpClient)args[0];
            var local = (IPEndPoint)args[1];
            byte[] buffer = session.EndReceive(result, ref ep);
            Console.WriteLine("Message received from " + ep + " to " + local);
            String xmlStr = Encoding.ASCII.GetString(buffer).ToString();
            if (xmlStr.Contains("tns:XAddrs") == true)
            {
                Console.WriteLine(xmlStr);
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(xmlStr);
                XmlNodeList elemList = doc.GetElementsByTagName("tns:XAddrs");
                for (int i = 0; i < elemList.Count; i++)
                {
                    Console.WriteLine(elemList[i].InnerXml);
                }
            }
            session.BeginReceive(OnReceiveSink, args);
        }

四、其它信息

  1. 关于XML中包含的其它信息,有需要的可以查看ONVIF的官方文档。
  2. 这里只是举个例子说明一下怎么获取所需要的节点信息,具体到某个接口的XML处理后续的文章再说。

后记

有任何的疑问或者想法,或者对本文有质疑或者补充的话,欢迎在留言区评论,期待你的分享!


同时,也欢迎关注本人微信公众号或者打赏一下这篇文章。





http://xzh.i3geek.com

爱唠叨的老鱼

爱唠叨的老鱼

技术经理,个人站长,创业者

0 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据