dlna发现设备

前言:

之前有专文介绍了minidlna中的UPNP功能,内中介绍其中包含的SSDP(简单发现协议),SOAP(简单对象访问协议)等几个协议(http://blog.csdn.net/sakaue/article/details/19070735)。本文将根据minidlna的程序流程,概述SSDP的流程,为下一部分ACE实现做铺垫。

设备发现的大致流程:

首先,根据UPNP的规范:

在设备加入网络,UPnP发现协议允许设备向控制点广告它的服务。它使用向一个标准地址和端口多址传送发现消息来实现。控制点在此端口上侦听是否有新服务加入系统。为了通知所有设备,一个设备为每个其上的嵌入设备和服务发送一系列相应的发现消息。每个消息也包含它表征设备或服务的特定信息。

我们需要在服务(设备)开始时定时多播一个ssdp::alive给各个加入组播的用户(控制点),信息个格式如下:

 

view source print ?
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
这种定时的的ssdp::alive消息需要发送以下几种类型的USN(统一服务名):

 

 

view source print ?
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作为客户端(接入点)。其格式如下:

 

view source print ?
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回应响应消息,其格式如下:

 

view source print ?
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的监控端口收到客户端的单址讯息,其格式如下:

 

view source print ?
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

收到该讯息后,我们需要向客户端会送(单址)一则服务端(设备)的根信息,其格式如下:

 

 

view source print ?
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>   
在VLC的“本地网络”->"通用即插即播"下应该能看到我们的设备,这里的设备名(friendlyName)叫Jane

你可能感兴趣的:(dlna发现设备)