UPnP簡介
通用即插即用(英語:Universal Plug and Play,簡稱UPnP)是由“通用即插即用論壇”(UPnP™ Forum)推廣的一套網絡協議。
該協議的目標是使家庭網絡(數據共享、通信和娛樂)和公司網絡中的各種設備能夠相互無縫連接,並簡化相關網絡的實現。
UPnP通過定義和發布基於開放、因特網通訊網協議標准的UPnP設備控制協議來實現這一目標。
UPnP這個概念是從即插即用(Plug-and-play)派生而來的,即插即用是一種熱拔插技術。
UPnP體系允許 PC 間的點對點連接、網際互連和無線設備。它是一種基於TCP/IP、UDP和HTTP的分布式、開放體系。
UPnP使得任意兩個設備能在LAN控制設備的管理下相互通信。其特性包括:
- 傳輸介質和設備獨立。UPnP 技術可以應用在許多媒體上,包括電話線、電線(電力線通信PLC)、以太網、紅外通信技術(IrDA)、無線電(Wi-Fi,藍牙)和Firewire(1394)。無需任務設備驅動;而是采用共同的協議。
- 用戶界面(UI)控制。UPnP 技術使得設備廠商可以通過網頁瀏覽器來控制設備並進行交互。
- 操作系統和程序語言獨立。任何操作系統和程序語言均可以用於構建 UPnP產品。UPnP 並沒有設定或限制運行於控制設備上的應用程序 API;OS廠商可以創建滿足他們客戶需求的 API。UPnP使得廠商可以像開發常規應用程序一樣來控制設備 UI 和交互。
- 基於因特網技術。UPnP 構建於 IP, TCP, UDP, HTTP,和 XML 等許多協議之上。
- 編程控制。UPnP 體系同時支持常規應用程序編程控制。
- 擴展性。每個 UPnP 設備都可以有構建於基本體系之上、與具體設備相關的服務。
UPnP的工作過程分為6步。
一、尋址(Addressing)
地址是整個UPnP系統工作的基礎條件,每個設備都應當是DHCP(Dynamic Host Configuration Protocol 動態主機配置協議)的客戶。
當設備首次與網絡建立連接后,利用DHCP服務,使設備得到一個IP地址。這個IP地址可以是DHCP系統指定的,也可以是由設備選擇的。
當局域網內沒有提供DHCP服務時,UPnP設備將按照Auto-IP的協議,從169.254/169.16地址范圍獲取一個局域網內唯一的IP地址。
設備還可以使用friendly name,這就需要域名解析服務(DNS)來轉換name和IP。這個過程用到的東西都是現存的,而且是很普及的,市面上買的路由器都會有。
二、發現(Discovery)
發現是 UPnP工作第一步。
當一個 設備被添加到網絡后,UPnP的發現協議允許該設備向網絡上的Control Points(CPs)通知(advise)自己擁有的服務。
同樣,當一個CP被添加到網絡后, UPnP發現協議允許該CP 搜索網絡上可用的設備 。
這兩種情況下的組播消息一般是設備和服務的基本信息,如它的類型, 唯一標識符,當前狀態參數等等。要注意設備信息和服務信息都是要組播出去的。
發現的過程可以用下面Figure 1-1來描述。
下面詳細敘述UPnP發現設備用到的協議:SSDP(Simple Service Discovery Protocol,簡單服務發現協議),說明設備是怎樣向網絡通知或者撤銷自己可以提供的服務;CP是如何搜索設備以及設備是如何回應搜索的。
SSDP格式套用HTTP1.1的部分消息頭字段,但是和HTTP不同,SSDP是采用UDP傳輸的,而且SSDP沒有Message Body,就是說SSDP只有信頭而沒有信件內容的。
SSDP第一個要填充的字段是star - line,說明這是個什么類型的消息。
比如填"NOTIFY * HTTP/1.1/r/n",就說明這個SSDP消息是個通知消息,一般設備加入網絡或者離開網絡都要NOTIFY,更新自己的服務后也要NOTIFY一下。
別的設備看見這個消息的star - line就知道有設備狀態變了,自己就打開這個消息看一下有沒有需要更新的。
如果填"NOTIFY * HTTP/1.1/r/n",就要填LOCATION字段,填一個description URL,CP可以通過這個地址來取得設備的詳細信息。
填"M-SEARCH * HTTP/1.1/r/n"就是要搜索了;respone別人的搜索就填"HTTP/1.1 200 OK/r/n"。
SSDP第二個要填充的字段是目的地址HOST。
比如填上"HOST: 239.255.255.250:1900",就是組播(multicast)搜索,這里239.255.255.250是組播地址,就是說這條消息會給網絡里面該組地址的設備發,1900是SSDP協議的端口號。如果HOST地址是特定地址,那這就是單播(unicast)。
Respone不填這個字段,他會在ST字段里面填respone address,就是發來搜索信息的設備的地址,Respone消息的話還會發送一個包含自己地址URL的字段,Respone的意思就是跟Searcher說:我好像是你要找的人,我的電話是XXX,詳細情況請CALL我。Respone也是UDP單播。
往后的字段就不細說了。通過字段的組合可以發送很多不同的信息。
三、描述(Description)
前面我們說了CP想要一個device更詳細的信息,就跟返回給它的URL跟它要。
返回來的東西一般是個XML(Extensible Markup Language,是種結構化的數據。和HTML比較像,有tag和data),描述分為兩部分:一個是device description,是device的物理描述,就是說這個device是什么;還有一個是service descriptions,就是device的服務描述了,就是device能干些什么。這些device和device service的描述的格式也是有要求的,開發商也可以自定義,只要符合UPnP Forum的規范。
這里稍微解釋一下設備描述和服務描述。
首先說設備,比如一個家庭影院,有顯示屏,有功放音響,還有藍光機。那么這個家庭影院home threatre,就是一個根設備(root device),它下屬有Screen,Amplifier,BDplayer這些從設備。home threatre的描述XML中會有一個device list,列出Screen,Amplifier,BDplayer這些設備的基本信息及這些設備描述的URL,以及設備的presentationURL(這類似於web服務器,通過訪問presentationURL,本地會加載一個網頁,在這個網頁上可以操作設備及其它擁有的服務);還會有一個sevice list,里面列出home threatre可調用的服務基本信息及服務描述URL。
再者就是服務,通過訪問服務描述URL,可以取得服務描述XML,里面會詳細介紹服務的信息,包括干什么用的,屬於哪個設備,有哪些action,需要哪些參數,怎么調用等等。
四、控制(Control)
拿到device description和service descriptions以后,那我們怎么去遙控這些設備呢?
在設備描述部分,device description還有關於如何控制device的描述,會給出一個Control URL,CP可以向這個URL發送不同的控制信息就可以控制device了,然后device也可以返回一個信息反饋。
這種CP和device之間溝通信息按照Simple Object Access Protocol (SOAP)的格式來寫。SOAP通過HTTP來傳,現在的版本是1.1,叫做SOAP 1.1 UPnP Profile。
這個Profile把控制/反饋信息分成三種:UPnP Control Request,UPnP Control Response和UPnP Control Error Response,都比較好理解。
SOAP協議是有信內容Body的,和SSDP不一樣。消息Body里面就可以寫想調用的動作了,叫做Action invocation,可能還要傳參數,比如想播放一個視頻,要把視頻的URL傳過去;device收到后要respone,表示能不能執行調用,出錯的話會返回一個錯誤代碼。
五、事件(Eventing)
在服務進行的整個時間內,只要變量值發生了變化或者模式的狀態發生了改變,就產生了一個事件,該事件服務提供者(某設備的某個服務)會把該事件向整個網絡進行多播(multicast)。
另外,CP也可以事先向事件服務器訂閱事件信息,就像RSS訂閱一樣,保證將該CP感興趣的事件及時准確地單播傳送過來(unicast)。
下面是一個Unicast eventing 的architecture圖,CP是subscriber,服務器是publisher。
subscriber(通常是個CP)向publisher(通常是個service)發送訂閱消息(subscribe),更新訂閱消息(renewal),退訂消息(cancel)。publisher向subscriber推送訂閱(event:SIDX)。
事件的訂閱和推送這塊用的通信協議是GENA(General Event Notification Architecture) ,通過HTTP/TCP/IP傳送。GENA的格式就不細說了,詳細請參閱UPnP-arch-DeviceArchitecture-v1.1。下面列出訂閱過程供參考:
- 訂閱。subscriber發送訂閱消息主要包含事件URL(evenURL),服務ID號(service identifier),這兩個可以在設備服務描述信息中找到,以及寄送地址(delivery URL)。還會包含一個訂閱期限(duration)。
- 成功訂閱。publisher收到訂閱信息,如果同意訂閱的話就會為每個新subscriber 生成一個唯一的subscriber identifier並記錄subscriber 的duration和delivery URL。還會記錄一個順序增長event key用來保證事件確實推送到subscriber那里。比如說有個新事件,key是6,然后把這個事件推送給某個subscriber那里,subscriber那里記錄的event key是4,現在收到的事件key是6,他就知道他沒收到key為5的事件,這樣他就向publisher索要漏收的事件,從而保證雙方變量值或狀態的一致。
- 首次推送。同意訂閱之后還會向subscriber發送一組初始變量或狀態值,進行首次同步。
- 續訂。subscriber必須在訂閱到期前發送renewal續訂。
- 訂閱到期。訂閱到期后publisher會把subscriber的信息刪除,subscriber又回到訂閱前的狀態。
- 退訂。subscriber發送cancel信息將會取消訂閱。subscriber因非正常退出網絡的話,則不會退訂直到訂閱到期。
- 訂閱操作失敗信息。當訂閱、續訂和退訂不能被publisher接收或者出現錯誤時,publisher會發送一個錯誤代碼。
再簡單說下多播(multicast,或者叫組播,兩者等同)和單播。
event的組播采用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地址。
六、表達(Presentation)
只要得到了設備的URL,就可以取得該設備表達的URL,取得該設備表達的HTML,然后可以將此HTML納入CP的本地瀏覽器上。
這部分還包括與用戶對話的界面,以及與用戶進行會話的處理。因此設備表達可以理解成“遙控器”。這部分定義描述界面,規范界面以及傳輸界面內容。
遠程界面是供CP用戶使用的,CP用戶通過遠程界面完成設備描述的獲取,控制設備,訂閱收取設備事件等等。
總結
UPnP分為6個步驟:
- 最先是Addressing,設備加入網絡,通過DHCP或者Auto-IP獲得IP。
- 然后是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嘛,哪樣寫得好哪樣來!