SSDP设备发现流程

设备发现的大体流程:html

        首先,根据UPNP的规范:服务器

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

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

  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(统一服务名):
  1. static const char * const known_service_types[] =  
  2. {  
  3.     "upnp:rootdevice",                                                              //网络中的根设备  
  4.     "urn:schemas-upnp-org:device:MediaServer:",                      //媒体服务器  
  5.     "urn:schemas-upnp-org:service:ContentDirectory:",               //内容管理服务  
  6.     "urn:schemas-upnp-org:service:ConnectionManager:",          //链接管理服务  
  7.     "urn:microsoft.com:service:X_MS_MediaReceiverRegistrar:",  
  8.     0  
  9. };  

其次url

       当一个控制点加入到网络中时,设备发现过程容许控制点寻找网络上感兴趣的设备。发现消息包括设备的一些特定信息或者某项服务的信息,例如它的类型、标识符、和指向XML设备描述文档的指针。从设备得到响应从本质上说,内容与多址传送的设备广播相同,只是采用单址传送方式。设备查询经过HTTP协议扩展M-SEARCH方法实现的。spa

        客户端(接入点)接入网络后,会经过组播方式回传给服务端(设备)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回应响应消息,其格式以下:.net

  1. HTTP/1.1 200 OK  
  2. CACHE-CONTROL: max-age=1810  
  3. DATE: Wed, 21 May 2014 03:54:53 GMT         #指定响应生成的时间  
  4. ST: urn:schemas-upnp-org:device:MediaServer:1                              #内容和意义与查询请求的相应字段相同  
  5. USN: uuid:4d696e69-444c-164e-9d41-001ec92f0378::urn:schemas-upnp-org:device:MediaServer:1  #表示不一样服务的统一服务名,它提供了一种标识出相同类型服务的能力。  
  6. EXT:                                                                                              #向控制点确认MAN头域已经被设备理解  
  7. SERVER: 3.2.0-61-generic DLNADOC/1.50 UPnP/1.0 SakaueDLNA/1.1.2   #饱含操做系统名,版本,产品名和产品版本信息  
  8. LOCATION: http://192.168.1.20:8200/rootDesc.xml                            #包含根设备描述得URL地址  
  9. 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  

收到该讯息后,咱们须要向客户端会送(单址)一则服务端(设备)的根信息,其格式以下:
  1. HTTP/1.1 200 OK  
  2. Content-Type: text/xml; charset="utf-8"  
  3. Connection: close  
  4. Content-Length: 2189  
  5. Server: 3.2.0-61-generic DLNADOC/1.50 UPnP/1.0 SakaueDLNA/1.1.2  
  6. Date: Thu, 22 May 2014 05:29:30 GMT  
  7. EXT:  
  8.   
  9. <?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 Linux</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)叫Janexml