1. 程式人生 > >始則轉俗成真,終乃回真向俗!

始則轉俗成真,終乃回真向俗!

UPnP的工作過程分為6步:

(1)定址(Addressing)。

 地址是整個UPnP系統工作的基礎條件,每個裝置都應當是DHCP(Dynamic Host Configuration Protocol動態主機配置協議)的客戶。當裝置首次與網路建立連線後,利用DHCP服務,使裝置得到一個IP地址。這個IP地址可以是DHCP系統指定的,也可以是由裝置選擇的。當局域網內沒有提供DHCP服務時,UPnP裝置將按照Auto-IP的協議,從169.254/169.16地址範圍獲取一個區域網內唯一的IP地址。裝置還可以使用friendlyname,這就需要域名解析服務(DNS)來轉換name和IP。這個過程用到的東西都是現存的,而且是很普及的,市面上買的路由器都會有。

(2)發現(Discovery)。

       發現是 UPnP工作第一步。 當一個 裝置被新增到網路後,UPnP的發現協議允許該裝置向網路上的ControlPoints(CPs)通知(advise)自己擁有的服務同樣,當一個CP被新增到網路後, UPnP發現協議允許該CP 搜尋網路上可用的裝置  這兩種情況下的組播訊息一般是裝置和服務的基本資訊,如它的型別 唯一識別符號,當前狀態引數等等。要注意裝置資訊和服務資訊都是要組播出去的。發現的過程可以用下面Figure1-1來描述。

        下面詳細敘述UPnP發現裝置用到的協議:SSDP(Simple Service DiscoveryProtocol,簡單服務發現協議),說明裝置是怎樣向網路通知或者撤銷自己可以提供的服務;CP是如何搜尋裝置以及裝置是如何迴應搜尋的。

        SSDP格式套用HTTP1.1的部分訊息頭欄位,但是和HTTP不同,SSDP是採用UDP傳輸的,而且SSDP沒有MessageBody,就是說SSDP只有信頭而沒有信件內容的。

SSDP第一個要填充的欄位是star - line,說明這是個什麼型別的訊息。

比如填"NOTIFY *HTTP/1.1/r/n",就說明這個SSDP訊息是個通知訊息,一般裝置加入網路或者離開網路都要NOTIFY,更新自己的服務後也要NOTIFY一下。別的裝置看見這個訊息的star- line就知道有裝置狀態變了,自己就開啟這個訊息看一下有沒有需要更新的。如果填"NOTIFY *HTTP/1.1/r/n",就要填LOCATION欄位,填一個descriptionURL,CP可以通過這個地址來取得裝置的詳細資訊。

填"M-SEARCH * HTTP/1.1/r/n"就是要搜尋了;respone別人的搜尋就填"HTTP/1.1 200OK/r/n"。

      SSDP第二個要填充的欄位是目的地址HOST。比如填上"HOST:239.255.255.250:1900",就是組播(multicast)搜尋,這裡239.255.255.250是組播地址,就是說這條訊息會給網路裡面該組地址的裝置發,1900是SSDP協議的埠號。如果HOST地址是特定地址,那這就是單播(unicast)。Respone不填這個欄位,他會在ST欄位裡面填responeaddress,就是發來搜尋資訊的裝置的地址,Respone訊息的話還會發送一個包含自己地址URL的欄位,Respone的意思就是跟Searcher說:我好像是你要找的人,我的電話是XXX,詳細情況請CALL我。Respone也是UDP單播。

往後的欄位就不細說了。通過欄位的組合可以傳送很多不同的資訊。

(3)描述(Description)

      前面我們說了CP想要一個device更詳細的資訊,就打給它的URL跟它要。返回來的東西一般是個XML(ExtensibleMarkupLanguage,是種結構化的資料。和HTML比較像,有tag和data,具體不說了自己去查),描述分為兩部分:一個是devicedescription,是device的物理描述,就是說這個device是什麼;還有一個是servicedescriptions,就是device的服務描述了,就是device能幹些什麼。這些device和deviceservice的描述的格式也是有要求的,開發商也可以自定義,只要符合UPnP Forum的規範。

       這裡稍微解釋一下裝置描述和服務描述。

       首先說裝置,比如一個家庭影院,有顯示屏,有功放音響,還有藍光機。那麼這個家庭影院home threatre,就是一個根裝置(rootdevice),它下屬有Screen,Amplifier,BDplayer這些從裝置。homethreatre的描述XML中會有一個device list,列出Screen,Amplifier,BDplayer這些裝置的基本資訊及這些裝置描述的URL,以及裝置的presentationURL(這類似於web伺服器,通過訪問presentationURL,本地會載入一個網頁,在這個網頁上可以操作裝置及其它擁有的服務);還會有一個sevicelist,裡面列出home threatre可呼叫的服務基本資訊及服務描述URL。

      再來是服務,通過訪問服務描述URL,可以取得服務描述XML,裡面會詳細介紹服務的資訊,包括幹什麼用的,屬於哪個裝置,有哪些action,需要哪些引數,怎麼呼叫等等。

(4)控制(Control)

      拿到device description和servicedescriptions以後,那我們怎麼去遙控這些裝置呢?

      在裝置描述部分,device description還有關於如何控制device的描述,會給出一個ControlURL,CP可以向這個URL傳送不同的控制資訊就可以控制device了,然後device也可以返回一個資訊反饋。

這種CP和device之間溝通訊息按照Simple Object Access Protocol(SOAP)的格式來寫。SOAP通過HTTP來傳,現在的版本是1.1,叫做SOAP 1.1 UPnPProfile。這個Profile把控制/反饋資訊分成三種:UPnP Control Request,UPnP ControlResponse和UPnP Control ErrorResponse,都比較好理解。SOAP協議是有信內容Body的,和SSDP不一樣。訊息Body裡面就可以寫想呼叫的動作了,叫做Actioninvocation,可能還要傳引數,比如想播放一個視訊,要把視訊的URL傳過去;device收到後要respone,表示能不能執行呼叫,出錯的話會返回一個錯誤程式碼。

(5)事件(Eventing)

         在服務進行的整個時間內,只要變數值發生了變化或者模式的狀態發生了改變,就產生了一個事件,該事件服務提供者(某裝置的某個服務)會把該事件向整個網路進行多播(multicast)。而且,CP也可以事先向事件伺服器訂閱事件資訊,就像RSS訂閱一樣,保證將該CP感興趣的事件及時準確地單播傳送過來(unicast)。

下面是一個Unicast eventing的architecture圖,CP是subscriber,伺服器是publisher。

Unicast eventing architecture

     subscriber(通常是個CP)向publisher(通常是個service)傳送訂閱訊息(subscribe),更新訂閱訊息(renewal),退訂訊息(cancel)。publisher向subscriber推送訂閱(event:SIDX)。

     事件的訂閱和推送這塊用的通訊協議是GENA(General EventNotification Architecture),通過HTTP/TCP/IP傳送。GENA的格式就不細說了,詳細請參閱UPnP-arch-DeviceArchitecture-v1.1。下面列出訂閱過程供參考:

1.訂閱。subscriber傳送訂閱訊息主要包含事件URL(evenURL),服務ID號(serviceidentifier),這兩個可以在裝置服務描述資訊中找到,以及寄送地址(deliveryURL)。還會包含一個訂閱期限(duration)。

2.成功訂閱。publisher收到訂閱資訊,如果同意訂閱的話就會為每個新subscriber 生成一個唯一的subscriber identifier並記錄subscriber 的duration和deliveryURL。還會記錄一個順序增長eventkey用來保證事件確實推送到subscriber那裡。比如說有個新事件,key是6,然後把這個事件推送給某個subscriber那裡,subscriber那裡記錄的eventkey是4,現在收到的事件key是6,他就知道他沒收到key為5的事件,這樣他就向publisher索要漏收的事件,從而保證雙方變數值或狀態的一致。

3.首次推送。訂閱同意訂閱之後還會向subscriber傳送一組初始變數或狀態值,進行首次同步。

4.續訂。subscriber必須在訂閱到期前傳送renewal續訂。

5.訂閱到期。訂閱到期後publisher會把subscriber的資訊刪除,subscriber又回到訂閱前的狀態。

6.退訂。subscriber傳送cancel資訊將會取消訂閱。subscriber因非正常退出網路的話,則不會退訂直到訂閱到期。

7.訂閱操作失敗資訊。當訂閱、續訂和退訂不能被publisher接收或者出現錯誤時,publisher會發送一個錯誤程式碼。

        再簡單說下多播(multicast,或者叫組播,本文中兩者等同)和單播。even的組播採用UDP/IP,和SSDP一樣,就是埠號變成了7900。下圖是幾個協議的所處層的位置,可以清楚地看到它們之間的差別。首先關於IP多播,要知道只存在UDP多播,沒有TCP多播這回事。為什麼呢?多播的重點是提高網路效率,將同一資料包傳送給儘可能多的可能未知的計算機。像這種對網內所有裝置的頻繁訊息通知採用多播是為了減小網路負擔,SSDP也是一樣。

      但是SSDP和multicast這種採用UDP方式的協議存在一個問題,就是可靠性不夠。解決的辦法就是多次通知,但是一般不會超過三次以免增加網路負擔,這樣就得不償失了。像SSDP的話會採用定期廣播advertice的方式,使各種各樣原因而沒收到advertice的CP重新獲得advertice,又解決了UDP丟包的問題。

      前面在定址的時候用到的DHCP用的是UDP廣播(broadcast)。當一個新的裝置加入網路時,他想要分個IP,但又不知道DHCP伺服器的IP地址,所以他就在網內廣播,用255.255.255.255地址來通知所有計算機。DHCP伺服器收到請求後會為他申請並返回一個IP地址。

(6)表達(Presentation)

 只要得到了裝置的URL,就可以取得該裝置表達的URL,取得該裝置表達的HTML,然後可以將此HTML納入CP的本地瀏覽器上。這部分還包括與使用者對話的介面,以及與使用者進行會話的處理。因此裝置表達可以理解成“遙控器”。這部分定義描述介面,規範介面以及傳輸介面內容。遠端介面是供CP使用者使用的,CP使用者通過遠端介面完成裝置描述的獲取,控制裝置,訂閱收取裝置事件等等。

好了, 到此,UPnP的工作過程的講解就結束了。總結一下:

UPnP分為6個步驟:

先是Addressing,裝置加入網路,通過DHCP或者Auto-IP獲得IP;這部分在閃聯IGRS中是沒有定義的。

然後是Discovery,採用SSDP協議(UDP),用multicast/unicast可以完成裝置的上線和離線通知和組播搜尋裝置,裝置用unicast(單播,UDP)響應CP的搜尋。

往下是Description,通過HTTP協議(TCP)取回來是一個XML文件,包含物理描述和服務描述;

再來是Control,採用SOAP協議(HTTP/TCP),完成CP和devices之間的互動;

Eventing,採用GENA協議(HTTP/TCP),完成裝置事件訊息的訂閱和推送,為保證可靠性,故是TCP傳輸;事件的推送還有multicast(UDP)。

最後是Presentation。UPnP並沒有定義Presentation應該有哪些東西。一個HTML嘛,哪樣寫得好哪樣來!