基于Atinav SDK的UPnP设计

原创 2006年05月22日 16:22:00
 

    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, 
setTime, incrChannel, decrChannel, setChannel, setBand, setMode 。
在VC环境下建立一个工作区,并添加Atinav SDK中的aveupnp.h,aveupnp1.lib和aveupnp1.dll文件。这三个文件是实现UPnP的关键。用户可以利用SDK的模型编写自己的UPnP设备。然后,建立用户的C文件。在该文件中,用户要设计动作函数,以及设备实现主函数。下面,我们会详细介绍用户C文件的实现。

    (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的订阅,所有不能实现事件触发功能。

 

 

相关文章推荐

java for UPNP SDK

  • 2012年02月09日 16:09
  • 179KB
  • 下载

Upnp SDK +开发指南

  • 2015年05月08日 11:07
  • 1.62MB
  • 下载

NDK下 将Platinum SDK 编译成so库 (android - upnp)

Platinum UPnP SDK 是一个跨平台的C++库,利用该库,可以很容易就构建出DLNA/UPnP控制点(DLNA/UPnP Control Point)和DLNA/UPnP设备(DLNA/U...

Android设计模式系列(5)--SDK源码之备忘录模式

原文链接:http://www.cnblogs.com/qianxudetianxia/archive/2011/08/09/2133049.html 备忘录模式,在工作代码中,要么不用,要么经常用...

TYPESDK手游聚合SDK客户端设计思路与架构之三:iOS平台统一化接口结构及思路

在上一篇《TypeSDK安卓平台统一化接口结构及思路》中我们阐述了安卓平台的接口结构和思路。在这里我们将阐述iOS平台下的接口结构和思路。        ios平台主要是基于Objective-...

Android设计模式系列(2)--SDK源码之观察者模式

观察者模式,是一种非常常见的设计模式,在很多系统中随处可见,尤其是涉及到数据状态发生变化需要通知的情况下。 本文以AbstractCursor为例子,展开分析。 观察者模式,Observer Pa...

Android设计模式系列(6)--SDK源码之享元模式

享元模式,给我的感觉就是对象池,缓存单例对象。 java中的享元模式最经典的例子就是String类了,还有一个最容易理解的就是word文档字符共享的例子,也是享元模式的经典应用。 本文对andro...

Visual C++程序设计中的API和SDK

我们在编写标准C程序的时候,经常会调用各种库函数来辅助完成某些功能;初学者使用得最多的C库函数就是printf了,这些库函数是由你所使用的编译器厂商提供的。在Windows平台下,也有类似的函数可供调...

Android设计模式系列(9)--SDK源码之适配器模式

原文链接:http://www.cnblogs.com/qianxudetianxia/archive/2012/02/27/2010965.html 对于android开发者来说起,适配器模式简直...

Android Wear SDK 中文 ---- 表盘设计 [Designing Watch Face]

表盘设计 [Designing Watch Face]英文原版 Designing Watch Face翻译项目GitHub 欢迎更多有兴趣的小伙伴一起加入~在Android Wear设计一个传统表盘...
  • pwh0996
  • pwh0996
  • 2016年04月12日 17:42
  • 892
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于Atinav SDK的UPnP设计
举报原因:
原因补充:

(最多只允许输入30个字)