1、引言 UPnP是针对智能家电、无线设备以及各种个人电脑的普遍对等(peer-to-peer)网络连接而设计的一种架构。它主要用来简化家庭或商业网络中智能家电、无线设备以及PC间的网络连接。UPnP 是一个充分利用TCP/IP 和Web 技术的分布式开放型网络体系结构,能够实现异构网络的无缝连接以及网络设备间的控制和数据传输。 UPnP 不仅仅只是即插即用外设模式的简单扩展。它设计用于支持零配置、“不可见”联网,以及对众多厂商的广泛设备类型的自动发现。这就意味着,一台设备能够动态加入一个网络,获取一个IP 地址,通报其功能,以及了解其它设备的存在和功能。最后,设备能够顺利地自动离线,而不会造成任何不期望的影响。 2、UPnP技术描述 (1)UPnP网络的基本组成 UPnP网络通常由设备(Device)、服务(Service)、控制点(Control Point)三个基础部分组成。 一个UPnP设备可以看成一个包含服务并嵌套了常规设备的“容器”。设备可以是物理的设备,比如数码相机,也可以是逻辑的设备,比如运行于计算机上的软件模拟设备。即UPnP之下的设备不能仅仅理解为硬件意义上的设备,而应当包括服务功能。另外,设备也可以包括其他子设备形成嵌套。一个设备由用XML写的设备描述文档来表示,其内容包括一个或多个服务和设备的属性(如设备名、设备图标)。 设备执行用户请求的控制过程,可划分成一个个很小的阶段或单位,每个单位就称为一个服务。每一个服务,对外都表现为具体的行为和模式,而行为和模式又可以用状态和变量值进行描述。同设备描述一样,服务也是用XML写的服务描述文档来表示的。 在UPnP网络中,用户请求设备执行的控制是通过控制点实现的,控制点首先是一个有能力控制别的设备的控制者,还要具有在网络中“发现”控制目标的能力。它能在发现设备后:取得设备的描述信息并得到所关联的服务列表;取得相关服务的描述;调用控制服务。 (2)UPnP协议栈 UPnP采用了许多现存的、标准的协议以获得最广泛的设备支持。采用IP协议来保证UPnP独立于网络传输的物理介质,SOAP协议来保证UPnP设备具有互操作能力,XML来对设备和服务进行统一的描述,HTTP协议来进行UPnP设备的信息交互。采用这些协议能减少开发UPnP设备的工作量,使UPnP设备更好地融入现有网络。UPnP协议如图1所示。 其中UPnP设备架构定义是一个抽象的、公用的设备模型,任何UPnP设备都必须使用这一层。UPnP论坛工作组定义包含不同类型设备的DCP(Device Control Protocol)。最上层的UPnP厂商定义一般包含设备名称序列号、厂商信息,以及用户接口等。 (3)UPnP工作机制 控制点和设备间的交互分为六个阶段:寻址,发现,描述,控制,事件触发和展示。 寻址:每个UPnP设备都有一个DHCP(动态主机配置协议)的客户端。当设备连到网络中后,它会搜寻DHCP服务器,并请求一个IP地址。如果没有DHCP服务器的响应,设备就会使用自动IP获得一个地址。 发现:设备连到网络中后,会用简单服务发现协议(SSDP)向所有的控制点广告它拥有的服务。控制点也可以使用SSDP在网络中搜寻它感兴趣的设备及服务。在这两种情况中,最基本的交换信息是设备或者它的某种服务的特征:设备的类型,独有的标识符以及指向更多详细信息的指针。 描述: 在控制点发现设备之后,它通过包含在发现消息里的统一资源定位器(URL)向设备请求UPnP 描述。其中包括设备描述,一个或多个服务描述。设备描述包含有关厂商、制造商的信息,比如模块名称和编号,序列号,制造商的名称,厂商的专门网站URL等。在设备描述中,会一一列出它包含的每一种服务的类型、名称和指向服务描述、控制和事件触发的URLs。服务描述包含服务所响应的命令或动作,以及一系列状态变量。这些变量将服务在运行时的状态模型化,并通过数据类型、数值范围和事件特征进行描述。 控制:在得到设备及其服务的有关信息后,控制点就可以向这些服务发出动作请求。同时控制点也可以轮询服务的状态变量值。这是一种远程的过程调用:控制点把动作请求发送给设备的相关服务,当这些动作被完成之后(或失败),服务向控制点返回结果(或报告失败)。 事件触发:一个UPnP的服务描述包括服务所响应的动作列表,和状态的变量表。当这些变量改变时,服务会用事件消息的方式公布这些更新。控制点也可以订阅这些信息。如果订阅被接受,设备会返回一个唯一的标识符和订阅的有效时间。当一个事件状态变量改变时,服务会发送事件消息通知所有订阅的控制点。这些消息也就是GENA 通知消息,使用HTTP协议传送。在消息内部包含一个或多个状态变量的名称和它们的当前值。 展示:设备除了通过控制和事件触发提供功能接口外,还能提供一个展示URL作为网络接口(可以使用标准的网络浏览器进行处理)。如果在设备描述里有这样的统一资源定位器(URL),控制点就可以使用一个HTTP GET请求,从这一URL找到一个HTML网页,并把它下载到浏览器中,使用户可以控制设备并查看设备的状态。 3、基于Atinav SDK的UPnP设计 3.1 Atinav SDK介绍 Atinav SDK是美国atinav公司为UPnP架构开发的基于C的软件开发包。该SDK实现了UPnP架构,并提供设备和控制点开发工具。由于其代码全部由ASIC C生成,所以具有较好的可移植性。 3.2 设计流程 我们以一个电视机的模拟程序来演示基于Atinav SDK的设计流程。 首先,要设计电视机模拟程序所能提供的服务、动作、状态变量以及输入参数。如果要在电视机中嵌入子设备,还要考虑子设备提供的服务、动作、状态变量和输入参数。在我们的设计中,tv设备提供tvcontrol, video, audio, selectChannel, selectBand服务,tv的子设备timer具有clock服务。Tv和timer的状态变量设计为: Power, brightness, contrast, volume, channel, band, mode, time。参数列表: Hour, minute, second, selectedChannel, desiredBand, desiredMode动作列表:powerOn,powerOff,incrBrightness, decrBrightness, incrContrast, decrContrast, incrVolume, decrVolume, (1) 在C文件中加入freeAllocated(),GetStateVarValue(),GetArgumentValue()函数,分别用来释放分配的内存,获得状态变量值以及得到参数值(SDK提供,可以直接引用)。 (2) 调用SDK中的GetStateVarValue(),UpnpChangeStateVariableValueExt()函数,编写控制函数。要考虑返回信息和出错提示。 (3) 在主程序中,为设备、服务、动作和参数声明句柄变量。 (4) 分步做以下工作: 调用UpnpNewStateVariable()函数创建状态变量,并用UpnpSetStateVariableDefValue()函数设置其默认值;调用UpnpNewAction()函数创建动作;调用UpnpNewArgument()函数创建参数(输入参数对应于特定的动作,比如参数hour,minute,second对应于动作SetTime)。利用UpnpNewService()函数创建服务。若服务有多个状态变量,可用UpnpAddStateVariable()为其添加状态变量。调用UpnpNewDevice()创建动作。同时会为设备设置各种参数。调用UpnpAddArgument()函数为相关动作添加参数。调用UpnpAddAction()为服务添加相应的动作。调用UpnpSetUDN()函数为设备设置UUID。主设备和子设备都要设置。调用UpnpAddDevice()函数来设置设备间的嵌套关系(UpnpAddDevice(tv,timer); 设置timer为tv的子设备)。 编写用户接口。(本程序是在PC机上运行的,运行后要求输入IP地址。)并调用UpnpInitializeFramework()函数初始化UPnP架构(SDK提供)。若初始化成功,则将根设备注册到UPnP架构中。然后用UpnpGetDescriptionURL()函数获得设备的描述URL,并显示出来。同时给出退出提示符,并进入无限循环,若没有输入退出命令符,就一直运行。 4、设备运行界面及控制方法 设备运行后,可以有多种方法对其进行控制或查看其状态。可以利用Atinav SDK创建一个控制点程序,专门用来对设备进行控制。由于设备程序在运行时会给出设备描述URL,我们据此可以找到设备的展示页面,该页面由SDK根据用户的程序自动生成。通过展示页面,用户可以对设备进行控制和变量查询。另外一种方法跟第二种类似,但只适用于Windows XP用户。由于在Windows XP中加入了对UPnP的支持,如果用户安装了UPnP服务,就可以在网上邻居中显示网络中存在的UPnP设备,并可直接调用设备的展示页面。图2和图3分别是我们的实例的运行页面和设备展示页面。 我们在一台PC上运行实例程序后,分别选择了局域网中的两台PC(A和B)测试对设备的控制。其中,A装的是Win2000,B为Windows XP。在A的浏览器中直接输入设备展示页面的URL;在B中安装UPnP服务,通过网上邻居中显示的设备图标直接调用设备的展示页面,同样可以对设备进行控制。但由于笔者所用的SDK版本并不支持UPnP的订阅,所有不能实现事件触发功能。 |