WS-Discovery的全称为Web Services Dynamic Discovery,这个技术规范定义了一套多播发现协议来定位服务,它工作在TCP和UDP的DISCOVERY_PORT为3702,其使用IP组播地址为239.255.255.250(IPV4)或FF02::C(IPV6)。传统的Web Services服务调用的模式都是这样的:客户端在设计时就预先知道目标服务的地址(IP地址或者域名),客户端基于这个地址进行服务调用。那如果客户端预先不知道目标服务的地址该怎么办?WS-Discovery标准就是用于解决该问题的,遵循该标准,客户端预先不知道目标服务地址的情况下,可以动态地探测到可用的目标服务,以便进行服务调用。这个过程就是「设备发现」的过程。本文的主角ONVIF就使用了WS-Discovery作为其设备发现协议。
在介绍WS-Discovery发现原理之前,我们先对WS-Discovery使用到的多播进行介绍。下图所示是单播多播和广播的示意图:
单播(Unicast):每次只有两个实体相互通信,发送端和接收端都是唯一确定的。在IPv4网络中,0.0.0.0到223.255.255.255属于单播地址。你对小月月喊“小月月”,那么只有小月月回过头来答应你。
多播(Multicast):“组播”这个词通常用来指代IP组播。IP组播是一种通过使用一个组播地址将数据在同一时间以高效的方式发往处于TCP/IP网络上的多个接收者的协议。此外,它还常用来与RTP等音视频协议相结合。互联网架构师戴夫·克拉克是这样描述IP组播的:“你把数据包从一头放进去,网络就会试图将它们传递到想要得到它们的人那里。”组播报文的目的地址使用D类IP地址, D类地址不能出现在IP报文的源IP地址字段。你在大街上大喊一声“美女”, 会有一群女性回头看你。
广播(Broadcast):通常,广播都是限制在局域网中的,比如以太网或令牌环网络。因为广播在局域网中造成的影响远比在广域网中小得多。以太网和IPv4网都用全1的地址表示广播,分别是ff:ff:ff:ff:ff:ff和255.255.255.255。令牌环网络使用IEEE 802.2控制域中的一个特殊值来表示广播。你在公司大喊一声“放假了”, 全部同事都会响应,大叫爽死了。
在介绍ONVIF设备发现之前,我们先介绍WS-Discovery协议中定义的三种设备角色,设备发现的三种角色如下:
(1)目标服务(Target Service):这是一种可以使其自己被有效发现的端点(设备可为IPC);
(2)客户端(Client):这个端点主要是用来查找Target Service(比如NVR发现IPC的程序);
(3)发现代理(Discovery Proxy ):帮助client发现Target Service的端点,这个端点是可选的组件;
设备发现分为两种工作模式,分别为Ad hoc Mode 工作模式和Managed Mode工作模式。下面详细介绍两种工作模式的工作流程。
Ad hoc Mode 工作模式:
在Ad-Hoc模式下,发现消息通过多播发送,应答信息通过单播发送;具体工作流程如下:
(1)当Target Service加入到组播时(239.255.255.250),那么其通过组播的方式先发送一个HELLO一个信息,client监听组播HELLO信息;
(2)client发送一个Probe信息,如果Target Service匹配了Probe信息,那么其通过单播发送一个应答信息 Probe Match(PM);
(3)client发送一个Resolve信息,如果Target Service匹配了Resolve信息,那么其通过单播发送一个应答信息 Resolve Match(RM);
(4)当设备离开组播时,Target Service需要发送一个BYE信息。
通过上述的协议交互,client设备就可以发现Target Service设备,当然主要是需要在Hello信令和Probe应答中携带足够的信息才能使客户端发现自己。具体的信令携带的内容再文章的后面会详细介绍。
当在Ad-Hoc模式下存在发现代理时,其工作模式如下图所示:
Managed Mode工作模式:
下面以Ad hoc Mode 工作模式大概介绍一下整体的编码工作流程:
1、Target Service设备加入到多播组(239.255.255.250:3702),必须发送一个HELLO信息,同时起一个监听线程,监听3702端口的数据;
HELLO信息格式如下:
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:sc="http://www.w3.org/2003/05/soap-encoding" xmlns:dn="http://www.onvif.org/ver10/network/wsdl" xmlns:tds="http://www.onvif.org/ver10/device/wsdl" xmlns:d="http://schemas.xmlsoap.org/ws/2005/04/discovery" xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing">
<s:Header>
<a:MessageID>uuid:9328fd5b-4c83-4e4f-9850-66549c6d9136</a:MessageID>
<a:To>urn:schemas-xmlsoap-org:ws:2005:04:discovery</a:To>
<a:Action>http://schemas.xmlsoap.org/ws/2005/04/discovery/Hello</a:Action>
</s:Header>
<s:Body>
<d:Hello>
<a:EndpointReference>
<a:Address>urn:uuid:4be6bccd-81c0-436c-b55e-173b8c8ec17e</a:Address>
</a:EndpointReference>
<d:Types>dn:NetworkVideoTransmitter tds:Device</d:Types>
<d:Scopes>onvif://www.onvif.org/type/NetworkVideoTransmitter onvif://www.onvif.org/Profile/Streaming onvif://www.onvif.org/location/city/hangzhou onvif://www.onvif.org/name/ONVIF onvif://www.onvif.org/Profile/Q/Operational onvif://www.onvif.org/hardware/IPC</d:Scopes>
<d:XAddrs>http://172.16.10.6:8000/onvif/device_service</d:XAddrs>
<d:MetadataVersion>1</d:MetadataVersion>
</d:Hello>
</s:Body>
</s:Envelope>
2、Target Service开始监听Probe和Resolve信息,处理Probe和Resolve后使用单播进行应答,一般来说Resolve信息在ONVIF协议中不处理不影响设备的正常发现;
Target Service端点应答的ProbeMatch信息如下所示,d:Scopes的内容包含了所支持的规范。
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:sc="http://www.w3.org/2003/05/soap-encoding" xmlns:dn="http://www.onvif.org/ver10/network/wsdl" xmlns:tds="http://www.onvif.org/ver10/device/wsdl" xmlns:d="http://schemas.xmlsoap.org/ws/2005/04/discovery" xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing">
<s:Header>
<a:MessageID>uuid:42376302-2ea7-4de4-958b-bac7946b85ee</a:MessageID>
<a:To>urn:schemas-xmlsoap-org:ws:2005:04:discovery</a:To>
<a:Action>http://schemas.xmlsoap.org/ws/2005/04/discovery/ProbeMatches</a:Action>
<a:RelatesTo>uuid:d27939ba-5280-47aa-a96b-cadc561acc46</a:RelatesTo>
</s:Header>
<s:Body>
<d:ProbeMatches>
<d:ProbeMatch>
<a:EndpointReference>
<a:Address>ec8e74df-3f0c-4a91-8421-4015d971f98e</a:Address>
</a:EndpointReference>
<d:Types>dn:NetworkVideoTransmitter tds:Device</d:Types>
<d:Scopes>onvif://www.onvif.org/type/NetworkVideoTransmitter onvif://www.onvif.org/Profile/Streaming onvif://www.onvif.org/Profile/T onvif://www.onvif.org/hardware/yyyy onvif://www.onvif.org/name/xxxx%20yyyy onvif://www.onvif.org/location/country/chinaonvif://www.onvif.org/location/city/hangzhou</d:Scopes>
<d:XAddrs>http://172.16.10.6:9990/onvif/device_service</d:XAddrs>
<d:MetadataVersion>1</d:MetadataVersion>
</d:ProbeMatch>
</d:ProbeMatches>
</s:Body>
</s:Envelope>
3、Target Service设备退出到多播组239.255.255.250:3702(IPV4),需要发送一个BYE信息;
BYE信息详细内容如下所示:
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:sc="http://www.w3.org/2003/05/soap-encoding" xmlns:dn="http://www.onvif.org/ver10/network/wsdl" xmlns:tds="http://www.onvif.org/ver10/device/wsdl" xmlns:d="http://schemas.xmlsoap.org/ws/2005/04/discovery" xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing">
<s:Header>
<a:MessageID>uuid:a2d826b0-df8b-40f2-b8c4-9bff66a530e5</a:MessageID>
<a:To>urn:schemas-xmlsoap-org:ws:2005:04:discovery</a:To>
<a:Action>http://schemas.xmlsoap.org/ws/2005/04/discovery/Bye</a:Action>
</s:Header>
<s:Body>
<d:Bye>
<a:EndpointReference>
<a:Address>161ef348-69a8-4e6f-8165-aac29b3a7e6e</a:Address>
</a:EndpointReference>
<d:Types>dn:NetworkVideoTransmitter tds:Device</d:Types>
<d:Scopes>onvif://www.onvif.org/type/NetworkVideoTransmitter onvif://www.onvif.org/Profile/Streaming onvif://www.onvif.org/Profile/T onvif://www.onvif.org/hardware/yyyy onvif://www.onvif.org/name/xxxx%20yyyy onvif://www.onvif.org/location/country/chinaonvif://www.onvif.org/location/city/hangzhou</d:Scopes>
<d:XAddrs>http://172.16.10.6:9990/onvif/device_service</d:XAddrs>
<d:MetadataVersion>1</d:MetadataVersion>
</d:Bye>
</s:Body>
</s:Envelope>
参考文献:
《ONVIF-Core-Specification.pdf》
《wsdd-discovery-1.1-spec-os.pdf》