浅析UPnP协议
UPnP首先是由微软公司于1999年提出,现今已经是开放的标准,由非盈利的论坛组织UPnP F orum 负责体系架构和标准的维护和更新升级。至2003年末,世界范围内宣称支持它的组织 已经达到600多家。目前UPnP尚处于1.0版本已经实现了智能设备的互联互用。 1UPnP结构规范 1.1UPnP基本单元
组成UPnP的基本单元主要有以下3种: 1.1.1设备(Devices)。在U PnP规范中设备是最基本单元。设备代表了一个物理设备或包含多个物理设备的逻辑设 备,它是U PnP服务或嵌入设备的载体, 不同类型的设备对应一组不同的服务和嵌入设备。 1.1.2服务(Services)。在U PnP规范中服务是最小控制单元。服务是设备所能向外提供的功能,定义了设备的功能调 用接口以及描述设备状态的变量。服务由一个状态表、一个控制服务期和一个事件服务期构 成。 1.1.3控制点(Control Points)。在U PnP规范中控制点是U PnP网络中的控制者,能发现和控制网络中其他U PnP设备。当然在 物理实现上,设备一般充当了控制点的角色。 1.2UPnP协议结构
UPnP协议结构最底层的TCP/IP协议是UPnP协议结构的基础。IP层进行数据的发送与接受。对 于那些需要可靠传送的信息, UPnP使用TCP进行传送, 反之则使用UDP进行传送。UPnP对网络 物理设备没有要求,可以使用以太网、无线网、IEEE1394、红外进行连接, 只要支持IP协议 即可。同时UPnP还可以使用TCP/IP协议族中的其他协议, 如ARP、IGMP、DHCP、DNS等。
构建在TCP/IP协议之上的是HTTP 协议及其变种,这一部分是UPnP协议的核心部分, 所有UPnP 消息都被封装在HTTP协议及其变种之中。HTTP协议的变种是HTTPU和HTTPMU, 这些协议的格 式沿袭了HTTP协议,只不过与HTTP协议不同的是它们通过UDP而不是TCP来发送消息,并且可以 用于多播通信。
UPnP不同类别的应用使用不同的上层协议进行控制。其中简单服务发现协议(Simple Servic e Discovery Protocol)定义了UPnP控制点如何发现网络上的UPnP服务, 以及UPnP设备如何 向网络发布自己所能提供的服务; 普通事件架构协议 (Generic Event Notification Archi tecture)定义了UPnP设备如何利用UDP和TCP来接受和发送事件通知,以及定义了通知预订者 和发布者的概念以启动事件; 简单对象访问协议(Simple Object Access Protocol) 定义了 可扩展标记语言(XML)和HTTP的使用来执行远程调用,每个UPnP控制请求以及响应都是一个S OAP消息。
在UPnP协议结构的上层是UPnP自己定义的标准,其中对于UPnP的共有信息放在设备体系结构 中定义;不同类型的设备部分由不同类型的工作组定义; UPnP设备制造商定义自己设备的相 关信息,比如设备名称、型号、序列号、厂商信息等等。 1.3UPnP工作流程
UPnP工作流程分析如下: 1.3.1寻址(Addressing)。UPnP协议的基础是TCP/IP,这就决定了每一个UPnP必须分配一个IP地址。当一个UPnP设备或 控制点接入网络时, 它能通过DHCP从网络上获取一个IP 地址。当网络中不存在DHCP 服务器 时,它能通过Auto-Ip自动分配一个IP地址。 1.3.2发现(Discovery)。当UPnP设备或控制点获得IP 地址以后, 设备可以通过网络向控制点提供自己的相关信息;而 控制点可以从网络上获取自己感兴趣的设备的信息。这一切都是通过SSDP协议实现的。
------------------oddy-----2010-06-10------------------------------------------------------
多播的地址 239.255.255.254,
通过抓包工具抓到的数据。格式如下:
GET /igd.xml HTTP/1.1
Host: 192.168.1.1:1900
ACCEPT-LANGUAGE: en
HTTP/1.1 200 OK
CONTENT-LENGTH: 2746
CONTENT-TYPE: text/xml
DATE: Wed, 09 Jun 2010 10:01:03 GMT
LAST-MODIFIED: Tue, 28 Oct 2003 08:46:08 GMT
SERVER: TP-LINK Router R478, UPnP/1.0
CONNECTION: close
<?xml version="1.0"?> <root xmlns="urn:schemas-upnp-org:device-1-0"> <specVersion> <major>1</major> <minor>0</minor> </specVersion> <URLBase></URLBase> <device> <deviceType>urn:schemas-upnp-org:device:InternetGatewayDevice:1</deviceType> <presentationURL>http://192.168.1.1:80 </presentationURL> <friendlyName >TP-LINK Router R478</friendlyName> <manufacturer >TP-LINK</manufacturer> <manufacturerURL >http://www.tp-link.com</manufacturerURL> <modelDescription >TP-LINK TL-R478 1.0</modelDescription> <modelName >TL-R478</modelName> <modelNumber >1.0</modelNumber> <UDN>uuid:upnp-InternetGatewayDevice-192168115678900001</UDN> <UPC>123456789001</UPC> <serviceList> <service> <serviceType>urn:schemas-upnp-org:service:Layer3Forwarding:1</serviceType> <serviceId>urn:upnp-org:serviceId:L3Forwarding1</serviceId> <controlURL>/l3f</controlURL> <eventSubURL>/l3f</eventSubURL> <SCPDURL>/l3f.xml</SCPDURL> </service> </serviceList> <deviceList> <device> <deviceType>urn:schemas-upnp-org:device:WANDevice:1</deviceType> <friendlyName>WAN Device</friendlyName> <manufacturer >TP-LINK</manufacturer> <manufacturerURL >http://www.tp-link.com</manufacturerURL> <modelDescription>WAN Device</modelDescription> <modelName>WAN Device</modelName> <modelNumber>1</modelNumber> <modelURL></modelURL> <serialNumber>12345678900001</serialNumber> <UDN>uuid:upnp-WANDevice-192168115678900001</UDN> <UPC>123456789001</UPC> <serviceList> <service> <serviceType>urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1</serviceType> <serviceId>urn:upnp-org:serviceId:WANCommonInterfaceConfig</serviceId> <controlURL>/ifc</controlURL> <eventSubURL>/ifc</eventSubURL> <SCPDURL>/ifc.xml</SCPDURL> </service> </serviceList> <deviceList> <device> <deviceType>urn:schemas-upnp-org:device:WANConnectionDevice:1</deviceType> <friendlyName>WAN Connection Device</friendlyName> <manufacturer >TP-LINK</manufacturer> <manufacturerURL >http://www.tp-link.com</manufacturerURL> <modelDescription>WAN Connection Device</modelDescription> <modelName>WAN Connection Device</modelName> <modelNumber>1</modelNumber> <modelURL></modelURL> <serialNumber>12345678900001</serialNumber> <UDN>uuid:upnp-WANConnectionDevice-192168115678900001</UDN> <UPC>123456789001</UPC> <serviceList> <service> <serviceType>urn:schemas-upnp-org:service:WANIPConnection:1</serviceType> <serviceId>urn:upnp-org:serviceId:WANIPConnection</serviceId> <controlURL>/ipc</controlURL> <eventSubURL>/ipc</eventSubURL> <SCPDURL>/ipc.xml</SCPDURL> </service> </serviceList> </device> </deviceList> </device> </deviceList> </device> </root>
接下来 设备 有开始请求IPC.XML
POST /ipc HTTP/1.1
HOST: 192.168.1.1:1900
Content-Length: 624
Content-Type: text/xml; charset="utf-8"
SOAPACTION:"urn:schemas-upnp-org:service:WANIPConnection:1#AddPortMapping"
<?xml version="1.0"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<s:Body>
<u:AddPortMapping xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1">
<NewRemoteHost></NewRemoteHost>
<NewExternalPort>9888</NewExternalPort>
<NewProtocol>TCP</NewProtocol>
<NewInternalPort>9888</NewInternalPort>
<NewInternalClient>192.168.1.238</NewInternalClient>
<NewEnabled>1</NewEnabled>
<NewPortMappingDescription>[IMAGIATEK IPCAM]</NewPortMappingDescription>
<NewLeaseDuration>0</NewLeaseDuration>
</u:AddPortMapping>
</s:Body>
</s:Envelope>
HTTP/1.1 200 OK
CONNECTION: close
SERVER: TP-LINK Router R478, UPnP/1.0
CONTENT-LENGTH: 332
CONTENT-TYPE: text/xml; charset="utf-8"
<?xml version="1.0"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <u:AddPortMappingResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"></u:AddPortMappingResponse></SOAP-ENV:Body> </SOAP-ENV:Envelope>
最后,设备就发了一个加入该多播组的包
哈哈哈哈 我抓包的完成了 回到理论上的------------------oddy-----2010-06-10
1.3.3描述(Description)。当设备和控制点取得联系后,描述可以供控制点获取设备及其服务的详细信息。这些信息以X ML 格式提供,并通过HTTP协议进行传送。 1.3.4控制(Control)。当控制点获取了设备的信息后,控制点可以对该设备进行控制。控制点通过向该设备某个服 务的URL 发送操作请求来控制该设备。请求和响应消息同样是XML 格式的,并封装在SOAP中 通过HTTP协议进行传送。 1.3.5事件( Eventing)。当设备的服务状态发生变化时设备通过事件来通知控制点。数据格式同样是XML 的,但是封 装在GENA 中通过HTTP协议进行传送。 1.3.6展示( Presentation)。UPnP规定设备制造商通过展示可以提供该设备内容和功能的相关描述信息。描述信息以HTML 格式发布, 控制点可以向设备的展示URL发送HTTP GET请求来获得相关信息。 2UPnP开发流程 2.1基于Windows的UPnP开发流程 Intel为Windows下的U PnP程序开发提供了自动开发工具Intel Authoring Tools for UPnP, 开发过程如下: 2.1.1使用Server Author生成XML格式的服务描述文件。 2.1.2使用Device Builder生成设备,载入已生成设备的服务描述文件。 2.1.3输入设备信息,然后使用Device Builder生成设备的UPnP框架代码。 2.1.4在UPnP框架代码中添加自定义处理程序,编译后即可。 Intel Authoring Tools for UPnP可以极大地提高开发效率, 它可以自动生成U PnP协议代 码,让开发者无需关心SSDP、GENA、SOAP等等协议细节,并且会提示开发者在自动生成的框架 代码中, 哪些地方需要插入自定义处理程序。 2.2基于LINUX的UPnP开发流程
Intel为Linux下的UPnP 开发提供了SDK (Linux SDK for UPnP Devices) ,该SDK使用C语言 开发,并且是开源的。SDK封装了UPnP涉及的众多协议,涵盖从寻址、发现到展示各个过程,并 提供了简单的开发接口。这样,开发人员就摆脱了各种协议的细节,只需进行服务或者控制所 需的具体开发,简化了UPnP应用的设计开发。另外, SDK还包括多线程支持库、XML解释器、 迷你Web服务器等。 基于Intel的SDK开发UPnP应用, 以服务设备为例,主要有以下几个基本步骤: 2.21UPnP设备初始化。首先调用UPnPInit ( ) , 初始化SDK; 调用UPnPSetWeb Server Root Dir( )注册设备描述 文档存放的目录;调用UPnPRegister Root Device( )向SDK注册设备描述文档。 2.2.2公布UPnp服务。调用UPnP Send Advertisement( )向网络公布设备及服务。然后 设备进入等待请求循环,响 应 控制点的请求。请求主要有:事件订阅、获取服务状态、设定服务状态等。当设备的服务状 态改变时,调用UPnPNotify( )通知控制点。 2.2.3关闭UPnP。UPnP设备关闭前首先需要向网络发送一个“bye- bye”的SSDP消息,然后调用UPnPUnRegiste rRoot2Device( )取消设备注册,最后调用UPnPFinish( )进行必要的清理工作,然后关闭UPnP 设备。SDK中提供了描述设备及服务的XML 文档的读写接口,但是具体格式需要由开发人员 指定。 2.3基于WinCe的UPnP开发流程 Microsoft在WinCE 5.0中为UPnP设备的开发提供了相关API, 以服务设备为例, 主要有以 下几个步骤: 2.3.1制定设备XML文档。 2.3.2制定该设备提供服务的XML文档。 2.3.3实现一个COM对象, 该对象提供IU PnP2D eviceControl接口。通过调用IU PnPDev iceControl:Initialize( )初始化设备并注册设备。当有控制点请求服务时调用IUPnPDevic eContro l:GetServiceObject( )提供设备及服务情况,并通过IDispatch接口传递服务对象 。 2.3.4为服务编写IDispatch接口。IDispatch接口实现了服务设备所提供服务的信息。 3结束语
UPnP应用主要面向当前比较热门的信息家电以及打造数字化家庭, Microsoft公司称“UPnP 将延伸到家庭中的每一个设备, 它会成为个人电脑、应用程序、智能设备集成工作所必需的 框架协议和接口标准”。举例而言,你可以通过掌上电脑控制家里的信息家电, 如设置空调 的工作状态, 让你在回家前就使室内温度达到你喜欢的状态;你可以随时让录像机录下你喜 欢的电视节目; 让微波炉、电饭煲为你进行烹调。
UPnP正是定义了实现这些功能的底层接口。当然UPnP架构的推广现在还不是十分普及,因为 传统家电厂商对计算机技术以及通讯技术还不是很熟悉。传统家电到数字化家电再到网络化 家电还有很长的路要走,但这毕竟是传统家电的进一步发展趋势,相信在不久的将来, 数字化 家庭将实实在在的出现在你的身边。 [参考文献] [1]何为.UPnP技术简介[J].数字社会与智能家居,2007,(12) [2]丁威,陈耀武.通用即插即用(UPnP)及其应用.现代机械,2006,(4) [3]吴非,吴浩,刘金玉.基于UPnP协议栈的嵌入式家庭媒体适配器的研究与设计 [J].IN TEL PRESS, 2003,(3). [4]杨志明.基于UPnP技术的媒体服务器的设计和实现[J].计算机应用与软件,20 05,(10). [5]张群哲,吴庆波.基于UPnP的数字家庭研究[J].计算机工程与科学,2007,(2) .