SSDP設備發現的大致流程

前言:

之前有專文介紹了minidlna中的UPNP功能,內中介紹其中包含的SSDP(簡單發現協議),SOAP(簡單對象訪問協議)等幾個協議(http://blog.csdn.net/sakaue/article/details/19070735)。本文將根據minidlna的程序流程,概述SSDP的流程,爲下一部分ACE實現做鋪墊。

設備發現的大致流程:

首先,根據UPNP的規範:

在設備加入網絡,UPnP發現協議允許設備向控制點廣告它的服務。它使用向一個標準地址和端口多址傳送發現消息來實現。控制點在此端口上偵聽是否有新服務加入系統。爲了通知所有設備,一個設備爲每個其上的嵌入設備和服務發送一系列相應的發現消息。每個消息也包含它表徵設備或服務的特定信息。

我們需要在服務(設備)開始時定時多播一個ssdp::alive給各個加入組播的用戶(控制點),信息個格式如下:

NOTIFY * HTTP/1.1  
HOST:239.255.255.250:1900                                    #協議保留多播地址和端口,必須是239.255.255.250:1900  
CACHE-CONTROL:max-age=1810                           #max-age指定通知消息存活時間,如果超過此時間間隔,控制點可以認爲設備不存在  
LOCATION:http://192.168.1.20:8200/rootDesc.xml     #包含根設備描述得URL地址  
SERVER: 3.4.72-rt89 DLNADOC/1.50 UPnP/1.0 SakaueDLNA/1.1.0  
NT:upnp:rootdevice   #在此消息中,NT頭必須爲服務的服務類型  
USN:uuid:4d696e69-444c-164e-9d41-001ec92f0378::upnp:rootdevice   #表示不同服務的統一服務名,它提供了一種標識出相同類型服務的能力  
NTS:ssdp:alive   #表示通知消息的子類型,必須爲ssdp:alive  

這種定時的的ssdp::alive消息需要發送以下幾種類型的USN(統一服務名):

static const char * const known_service_types[] =
{
    "upnp:rootdevice",                                                              //網絡中的根設備
    "urn:schemas-upnp-org:device:MediaServer:",                      //媒體服務器
    "urn:schemas-upnp-org:service:ContentDirectory:",               //內容管理服務
    "urn:schemas-upnp-org:service:ConnectionManager:",          //連接管理服務
    "urn:microsoft.com:service:X_MS_MediaReceiverRegistrar:",
    0
};

其次

當一個控制點加入到網絡中時,設備發現過程允許控制點尋找網絡上感興趣的設備。發現消息包括設備的一些特定信息或者某項服務的信息,例如它的類型、標識符、和指向XML設備描述文檔的指針。從設備獲得響應從本質上說,內容與多址傳送的設備廣播相同,只是採用單址傳送方式。設備查詢通過HTTP協議擴展M-SEARCH方法實現的。

客戶端(接入點)接入網絡後,會通過組播方式回傳給服務端(設備)ssdp:discover消息,在這裏,我們使用VLC作爲客戶端(接入點)。其格式如下:

M-SEARCH * HTTP/1.1  
Host: 239.255.255.250:1900  #設置爲協議保留多播地址和端口,必須是239.255.255.250:1900。  
Man: "ssdp:discover"           #設置協議查詢的類型,必須是"ssdp:discover"。  
MX: 5                                 #設置設備響應最長等待時間,設備響應在0和這個值之間隨機選擇響應延遲的值。這樣可以爲控制點響應平衡網絡負載。  
ST: upnp:rootdevice             #設置服務查詢的目標

在設備接收到查詢請求並且查詢類型(ST字段值)與此設備匹配時,設備必須向多播地址239.255.255.250:1900迴應響應消息,其格式如下:

HTTP/1.1 200 OK
CACHE-CONTROL: max-age=1810
DATE: Wed, 21 May 2014 03:54:53 GMT         #指定響應生成的時間
ST: urn:schemas-upnp-org:device:MediaServer:1                              #內容和意義與查詢請求的相應字段相同
USN: uuid:4d696e69-444c-164e-9d41-001ec92f0378::urn:schemas-upnp-org:device:MediaServer:1  #表示不同服務的統一服務名,它提供了一種標識出相同類型服務的能力。
EXT:                                                                                              #向控制點確認MAN頭域已經被設備理解
SERVER: 3.2.0-61-generic DLNADOC/1.50 UPnP/1.0 SakaueDLNA/1.1.2   #飽含操作系統名,版本,產品名和產品版本信息
LOCATION: http://192.168.1.20:8200/rootDesc.xml                            #包含根設備描述得URL地址
Content-Length: 0

一切順利的話,我們會在8200的監控端口收到客戶端的單址訊息,其格式如下:

GET /rootDesc.xml HTTP/1.1
HOST: 192.168.1.20:8200
DATE: Wed, 28 May 2014 05:15:02 GMT
CONNECTION: close
USER-AGENT: 6.1.7600 2/, UPnP/1.0, Portable SDK for UPnP devices/1.6.14

收到該訊息後,我們需要向客戶端會送(單址)一則服務端(設備)的根信息,其格式如下:

HTTP/1.1 200 OK
Content-Type: text/xml; charset="utf-8"
Connection: close
Content-Length: 2189
Server: 3.2.0-61-generic DLNADOC/1.50 UPnP/1.0 SakaueDLNA/1.1.2
Date: Thu, 22 May 2014 05:29:30 GMT
EXT:

<?xml version="1.0"?>
<root xmlns="urn:schemas-upnp-org:device-1-0">
    <specVersion>
        <major>1</major>
        <minor>0</minor>
    </specVersion>
    <device>
        <deviceType>urn:schemas-upnp-org:device:MediaServer:1</deviceType>
        <friendlyName>Jane</friendlyName>
        <manufacturer>Justin Maggard</manufacturer>
        <manufacturerURL>http://www.netgear.com/</manufacturerURL>
        <modelDescription>SakaueDLNA on <a href="http://www.it165.net/os/oslin/" target="_blank" class="keylink">Linux</a></modelDescription>
        <modelName>Windows Media Connect compatible (SakaueDLNA)</modelName>
        <modelNumber>1</modelNumber>
        <modelURL>http://www.netgear.com</modelURL>
        <serialNumber>12345678</serialNumber>
        <UDN>uuid:4d696e69-444c-164e-9d41-001ec92f0378</UDN>
        <dlna:X_DLNADOC xmlns:dlna="urn:schemas-dlna-org:device-1-0">DMS-1.50</dlna:X_DLNADOC>
        <presentationURL>/</presentationURL>
        <iconList>
            <icon>
                <mimetype>image/png</mimetype>
                <width>48</width>
                <height>48</height>
                <depth>24</depth>
                <url>/icons/sm.png</url>
            </icon>
            <icon>
                <mimetype>image/png</mimetype>
                <width>120</width>
                <height>120</height>
                <depth>24</depth>
                <url>/icons/lrg.png</url>
            </icon>
            <icon>
                <mimetype>image/jpeg</mimetype>
                <width>48</width>
                <height>48</height>
                <depth>24</depth>
                <url>/icons/sm.jpg</url>
            </icon>
            <icon>
                <mimetype>image/jpeg</mimetype>
                <width>120</width>
                <height>120</height>
                <depth>24</depth>
                <url>/icons/lrg.jpg</url>
            </icon>
        </iconList>
        <serviceList>
            <service>
                <serviceType>urn:schemas-upnp-org:service:ContentDirectory:1</serviceType>
                <serviceId>urn:upnp-org:serviceId:ContentDirectory</serviceId>
                <controlURL>/ctl/ContentDir</controlURL>
                <eventSubURL>/evt/ContentDir</eventSubURL>
                <SCPDURL>/ContentDir.xml</SCPDURL>
            </service>
            <service>
                <serviceType>urn:schemas-upnp-org:service:ConnectionManager:1</serviceType>
                <serviceId>urn:upnp-org:serviceId:ConnectionManager</serviceId>
                <controlURL>/ctl/ConnectionMgr</controlURL>
                <eventSubURL>/evt/ConnectionMgr</eventSubURL>
                <SCPDURL>/ConnectionMgr.xml</SCPDURL>
            </service>
            <service>
                <serviceType>urn:microsoft.com:service:X_MS_MediaReceiverRegistrar:1</serviceType>
                <serviceId>urn:microsoft.com:serviceId:X_MS_MediaReceiverRegistrar</serviceId>
                <controlURL>/ctl/X_MS_MediaReceiverRegistrar</controlURL>
                <eventSubURL>/evt/X_MS_MediaReceiverRegistrar</eventSubURL>
                <SCPDURL>/X_MS_MediaReceiverRegistrar.xml</SCPDURL>
            </service>
        </serviceList>
    </device>
</root>    

在VLC的“本地網絡”->”通用即插即播”下應該能看到我們的設備,這裏的設備名(friendlyName)叫Jane。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章