minidlna源码(2)

前言:

        之前有专文介绍了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(统一服务名):


 
 
  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. };

其次

       当一个控制点加入到网络中时,设备发现过程允许控制点寻找网络上感兴趣的设备。发现消息包括设备的一些特定信息或者某项服务的信息,例如它的类型、标识符、和指向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回应响应消息,其格式如下:


 
 
  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. <?xml version="1.0"?>
  9. <root xmlns="urn:schemas-upnp-org:device-1-0">
  10.      <specVersion>
  11.          <major>1 </major>
  12.          <minor>0 </minor>
  13.      </specVersion>
  14.      <device>
  15.          <deviceType>urn:schemas-upnp-org:device:MediaServer:1 </deviceType>
  16.          <friendlyName>Jane </friendlyName>
  17.          <manufacturer>Justin Maggard </manufacturer>
  18.          <manufacturerURL>http://www.netgear.com/ </manufacturerURL>
  19.          <modelDescription>SakaueDLNA on Linux </modelDescription>
  20.          <modelName>Windows Media Connect compatible (SakaueDLNA) </modelName>
  21.          <modelNumber>1 </modelNumber>
  22.          <modelURL>http://www.netgear.com </modelURL>
  23.          <serialNumber>12345678 </serialNumber>
  24.          <UDN>uuid:4d696e69-444c-164e-9d41-001ec92f0378 </UDN>
  25.          <dlna:X_DLNADOC xmlns:dlna="urn:schemas-dlna-org:device-1-0">DMS-1.50 </dlna:X_DLNADOC>
  26.          <presentationURL>/ </presentationURL>
  27.          <iconList>
  28.              <icon>
  29.                  <mimetype>image/png </mimetype>
  30.                  <width>48 </width>
  31.                  <height>48 </height>
  32.                  <depth>24 </depth>
  33.                  <url>/icons/sm.png </url>
  34.              </icon>
  35.              <icon>
  36.                  <mimetype>image/png </mimetype>
  37.                  <width>120 </width>
  38.                  <height>120 </height>
  39.                  <depth>24 </depth>
  40.                  <url>/icons/lrg.png </url>
  41.              </icon>
  42.              <icon>
  43.                  <mimetype>image/jpeg </mimetype>
  44.                  <width>48 </width>
  45.                  <height>48 </height>
  46.                  <depth>24 </depth>
  47.                  <url>/icons/sm.jpg </url>
  48.              </icon>
  49.              <icon>
  50.                  <mimetype>image/jpeg </mimetype>
  51.                  <width>120 </width>
  52.                  <height>120 </height>
  53.                  <depth>24 </depth>
  54.                  <url>/icons/lrg.jpg </url>
  55.              </icon>
  56.          </iconList>
  57.          <serviceList>
  58.              <service>
  59.                  <serviceType>urn:schemas-upnp-org:service:ContentDirectory:1 </serviceType>
  60.                  <serviceId>urn:upnp-org:serviceId:ContentDirectory </serviceId>
  61.                  <controlURL>/ctl/ContentDir </controlURL>
  62.                  <eventSubURL>/evt/ContentDir </eventSubURL>
  63.                  <SCPDURL>/ContentDir.xml </SCPDURL>
  64.              </service>
  65.              <service>
  66.                  <serviceType>urn:schemas-upnp-org:service:ConnectionManager:1 </serviceType>
  67.                  <serviceId>urn:upnp-org:serviceId:ConnectionManager </serviceId>
  68.                  <controlURL>/ctl/ConnectionMgr </controlURL>
  69.                  <eventSubURL>/evt/ConnectionMgr </eventSubURL>
  70.                  <SCPDURL>/ConnectionMgr.xml </SCPDURL>
  71.              </service>
  72.              <service>
  73.                  <serviceType>urn:microsoft.com:service:X_MS_MediaReceiverRegistrar:1 </serviceType>
  74.                  <serviceId>urn:microsoft.com:serviceId:X_MS_MediaReceiverRegistrar </serviceId>
  75.                  <controlURL>/ctl/X_MS_MediaReceiverRegistrar </controlURL>
  76.                  <eventSubURL>/evt/X_MS_MediaReceiverRegistrar </eventSubURL>
  77.                  <SCPDURL>/X_MS_MediaReceiverRegistrar.xml </SCPDURL>
  78.              </service>
  79.          </serviceList>
  80.      </device>
  81. </root>   

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

具体代码实现见下一篇文章 http://blog.csdn.net/sakaue/article/details/27492319


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值