前言:
之前有专文介绍了minidlna中的UPNP功能,内中介绍其中包含的SSDP(简单发现协议),SOAP(简单对象访问协议)等几个协议(http://blog.csdn.net/sakaue/article/details/19070735)。本文将根据minidlna的程序流程,概述SSDP的流程,为下一部分ACE实现做铺垫。
设备发现的大致流程:
首先,根据UPNP的规范:
在设备加入网络,UPnP发现协议允许设备向控制点广告它的服务。它使用向一个标准地址和端口多址传送发现消息来实现。控制点在此端口上侦听是否有新服务加入系统。为了通知所有设备,一个设备为每个其上的嵌入设备和服务发送一系列相应的发现消息。每个消息也包含它表征设备或服务的特定信息。
我们需要在服务(设备)开始时定时多播一个ssdp::alive给各个加入组播的用户(控制点),信息个格式如下:
1.
NOTIFY * HTTP/
1.1
2.
HOST:
239.255
.
255.250
:
1900
#协议保留多播地址和端口,必须是
239.255
.
255.250
:
1900
3.
CACHE-CONTROL:max-age=
1810
#max-age指定通知消息存活时间,如果超过此时间间隔,控制点可以认为设备不存在
4.
LOCATION:http:
//192.168.1.20:8200/rootDesc.xml #包含根设备描述得URL地址
5.
SERVER:
3.4
.
72
-rt89 DLNADOC/
1.50
UPnP/
1.0
SakaueDLNA/
1.1
.
0
6.
NT:upnp:rootdevice #在此消息中,NT头必须为服务的服务类型
7.
USN:uuid:4d696e69-444c-164e-9d41-001ec92f0378::upnp:rootdevice #表示不同服务的统一服务名,它提供了一种标识出相同类型服务的能力
8.
NTS:ssdp:alive #表示通知消息的子类型,必须为ssdp:alive
01.
static
const
char
*
const
known_service_types[] =
02.
{
03.
"upnp:rootdevice"
,
//网络中的根设备
04.
"urn:schemas-upnp-org:device:MediaServer:"
,
//媒体服务器
05.
"urn:schemas-upnp-org:service:ContentDirectory:"
,
//内容管理服务
06.
"urn:schemas-upnp-org:service:ConnectionManager:"
,
//连接管理服务
07.
"urn:microsoft.com:service:X_MS_MediaReceiverRegistrar:"
,
08.
0
09.
};
其次
当一个控制点加入到网络中时,设备发现过程允许控制点寻找网络上感兴趣的设备。发现消息包括设备的一些特定信息或者某项服务的信息,例如它的类型、标识符、和指向XML设备描述文档的指针。从设备获得响应从本质上说,内容与多址传送的设备广播相同,只是采用单址传送方式。设备查询通过HTTP协议扩展M-SEARCH方法实现的。
客户端(接入点)接入网络后,会通过组播方式回传给服务端(设备)ssdp:discover消息,在这里,我们使用VLC作为客户端(接入点)。其格式如下:
1.
M-SEARCH * HTTP/
1.1
2.
Host:
239.255
.
255.250
:
1900
#设置为协议保留多播地址和端口,必须是
239.255
.
255.250
:
1900
。
3.
Man:
"ssdp:discover"
#设置协议查询的类型,必须是
"ssdp:discover"
。
4.
MX:
5
#设置设备响应最长等待时间,设备响应在
0
和这个值之间随机选择响应延迟的值。这样可以为控制点响应平衡网络负载。
5.
ST: upnp:rootdevice #设置服务查询的目标
在设备接收到查询请求并且查询类型(ST字段值)与此设备匹配时,设备必须向多播地址239.255.255.250:1900回应响应消息,其格式如下:
01.
HTTP/
1.1
200
OK
02.
CACHE-CONTROL: max-age=
1810
03.
DATE: Wed,
21
May
2014
03
:
54
:
53
GMT #指定响应生成的时间
04.
ST: urn:schemas-upnp-org:device:MediaServer:
1
#内容和意义与查询请求的相应字段相同
05.
USN: uuid:4d696e69-444c-164e-9d41-001ec92f0378::urn:schemas-upnp-org:device:MediaServer:
1
#表示不同服务的统一服务名,它提供了一种标识出相同类型服务的能力。
06.
EXT: #向控制点确认MAN头域已经被设备理解
07.
SERVER:
3.2
.
0
-
61
-generic DLNADOC/
1.50
UPnP/
1.0
SakaueDLNA/
1.1
.
2
#饱含操作系统名,版本,产品名和产品版本信息
08.
LOCATION: http:
//192.168.1.20:8200/rootDesc.xml #包含根设备描述得URL地址
09.
Content-Length:
0
一切顺利的话,我们会在8200的监控端口收到客户端的单址讯息,其格式如下:
1.
GET /rootDesc.xml HTTP/
1.1
2.
HOST:
192.168
.
1.20
:
8200
3.
DATE: Wed,
28
May
2014
05
:
15
:
02
GMT
4.
CONNECTION: close
5.
USER-AGENT:
6.1
.
7600
2
/, UPnP/
1.0
, Portable SDK
for
UPnP devices/
1.6
.
14
01.
HTTP/
1.1
200
OK
02.
Content-Type: text/xml; charset=
"utf-8"
03.
Connection: close
04.
Content-Length:
2189
05.
Server:
3.2
.
0
-
61
-generic DLNADOC/
1.50
UPnP/
1.0
SakaueDLNA/
1.1
.
2
06.
Date: Thu,
22
May
2014
05
:
29
:
30
GMT
07.
EXT:
08.
09.
<?xml version=
"1.0"
?>
10.
<root xmlns=
"urn:schemas-upnp-org:device-1-0"
>
11.
<specVersion>
12.
<major>
1
</major>
13.
<minor>
0
</minor>
14.
</specVersion>
15.
<device>
16.
<deviceType>urn:schemas-upnp-org:device:MediaServer:
1
</deviceType>
17.
<friendlyName>Jane</friendlyName>
18.
<manufacturer>Justin Maggard</manufacturer>
19.
<manufacturerURL>http:
//www.netgear.com/</manufacturerURL>
20.
<modelDescription>SakaueDLNA on <a href=
"http://www.it165.net/os/oslin/"
target=
"_blank"
class
=
"keylink"
>Linux</a></modelDescription>
21.
<modelName>Windows Media Connect compatible (SakaueDLNA)</modelName>
22.
<modelNumber>
1
</modelNumber>
23.
<modelURL>http:
//www.netgear.com</modelURL>
24.
<serialNumber>
12345678
</serialNumber>
25.
<UDN>uuid:4d696e69-444c-164e-9d41-001ec92f0378</UDN>
26.
<dlna:X_DLNADOC xmlns:dlna=
"urn:schemas-dlna-org:device-1-0"
>DMS-
1.50
</dlna:X_DLNADOC>
27.
<presentationURL>/</presentationURL>
28.
<iconList>
29.
<icon>
30.
<mimetype>image/png</mimetype>
31.
<width>
48
</width>
32.
<height>
48
</height>
33.
<depth>
24
</depth>
34.
<url>/icons/sm.png</url>
35.
</icon>
36.
<icon>
37.
<mimetype>image/png</mimetype>
38.
<width>
120
</width>
39.
<height>
120
</height>
40.
<depth>
24
</depth>
41.
<url>/icons/lrg.png</url>
42.
</icon>
43.
<icon>
44.
<mimetype>image/jpeg</mimetype>
45.
<width>
48
</width>
46.
<height>
48
</height>
47.
<depth>
24
</depth>
48.
<url>/icons/sm.jpg</url>
49.
</icon>
50.
<icon>
51.
<mimetype>image/jpeg</mimetype>
52.
<width>
120
</width>
53.
<height>
120
</height>
54.
<depth>
24
</depth>
55.
<url>/icons/lrg.jpg</url>
56.
</icon>
57.
</iconList>
58.
<serviceList>
59.
<service>
60.
<serviceType>urn:schemas-upnp-org:service:ContentDirectory:
1
</serviceType>
61.
<serviceId>urn:upnp-org:serviceId:ContentDirectory</serviceId>
62.
<controlURL>/ctl/ContentDir</controlURL>
63.
<eventSubURL>/evt/ContentDir</eventSubURL>
64.
<SCPDURL>/ContentDir.xml</SCPDURL>
65.
</service>
66.
<service>
67.
<serviceType>urn:schemas-upnp-org:service:ConnectionManager:
1
</serviceType>
68.
<serviceId>urn:upnp-org:serviceId:ConnectionManager</serviceId>
69.
<controlURL>/ctl/ConnectionMgr</controlURL>
70.
<eventSubURL>/evt/ConnectionMgr</eventSubURL>
71.
<SCPDURL>/ConnectionMgr.xml</SCPDURL>
72.
</service>
73.
<service>
74.
<serviceType>urn:microsoft.com:service:X_MS_MediaReceiverRegistrar:
1
</serviceType>
75.
<serviceId>urn:microsoft.com:serviceId:X_MS_MediaReceiverRegistrar</serviceId>
76.
<controlURL>/ctl/X_MS_MediaReceiverRegistrar</controlURL>
77.
<eventSubURL>/evt/X_MS_MediaReceiverRegistrar</eventSubURL>
78.
<SCPDURL>/X_MS_MediaReceiverRegistrar.xml</SCPDURL>
79.
</service>
80.
</serviceList>
81.
</device>
82.
</root>