dlna发现设备

  • Post author:
  • Post category:其他



前言:

之前有专文介绍了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


这种定时的的ssdp::alive消息需要发送以下几种类型的USN(统一服务名):


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>


在VLC的“本地网络”->”通用即插即播”下应该能看到我们的设备,这里的设备名(friendlyName)叫Jane