背景
上一篇文章,讲述了如何搜索和发现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);
}
四、其它信息
- 关于XML中包含的其它信息,有需要的可以查看ONVIF的官方文档。
- 这里只是举个例子说明一下怎么获取所需要的节点信息,具体到某个接口的XML处理后续的文章再说。
后记
有任何的疑问或者想法,或者对本文有质疑或者补充的话,欢迎在留言区评论,期待你的分享!
同时,也欢迎关注本人微信公众号或者打赏一下这篇文章。
http://xzh.i3geek.com
0 条评论