毕业设计(论文)UPNP协议的分析及实现

上传人:1888****888 文档编号:37781900 上传时间:2021-11-04 格式:DOC 页数:38 大小:1,023.51KB
收藏 版权申诉 举报 下载
毕业设计(论文)UPNP协议的分析及实现_第1页
第1页 / 共38页
毕业设计(论文)UPNP协议的分析及实现_第2页
第2页 / 共38页
毕业设计(论文)UPNP协议的分析及实现_第3页
第3页 / 共38页
资源描述:

《毕业设计(论文)UPNP协议的分析及实现》由会员分享,可在线阅读,更多相关《毕业设计(论文)UPNP协议的分析及实现(38页珍藏版)》请在装配图网上搜索。

1、分类号:分类号:TN915TN915 U U D D C C:D10621-408-(2010)0951-0D10621-408-(2010)0951-0密密 级:公级:公 开开 编编 号:号:20061011382006101138成成 都都 信信 息息 工工 程程 学学 院院学学 位位 论论 文文UPnPUPnP 协议的分析及实现协议的分析及实现论文作者姓名:论文作者姓名:申请学位专业:申请学位专业:通信工程通信工程申请学位类别:申请学位类别:工学学士工学学士指指导导教教师师姓姓名名(职职称称):论文提交日期:论文提交日期:20102010 年年 0606 月月 4 4 日日UPnPUPn

2、P 协议的分析及实现协议的分析及实现摘要摘要随着计算机产业以及计算机网络技术的迅猛发展,使得嵌入式系统和家庭网络通信成为了热门的研究领域。由于越来越多的嵌入式设备的出现和家庭网络的发展,实现家庭网络中的各种嵌入式设备互联互通已经成为人们的迫切需求。而实现家庭网络的关键是家庭网络中间件技术。现今世界各著名设备厂商纷纷提出了各自的新技术和解决方案,其中,微软提出的 UPnP 技术最有发展前途,得到了最广泛的支持,是当今各国研究的热点。UPnP 是通用即插即用(Universal Plug and Play)的缩写,它主要用于实现设备的智能互联互通。使用 UPnP 协议不需要设备驱动程序,它可以运行

3、在几乎所有的操作系统平台之上,使得在办公室、家庭和其它公共场所方便地构建设备相互联通的网络环境。本文介绍了 UPnP 所使用的基本协议(如 SSDP、GENA、SOAP 等) ,重点分析了 UPnP 实现的基本工作流程。然后,论文在剖析了当前最常用的 Intel SDK 的结构和功能后,以 TV 控制点和 TV 设备的开发为例,给出了如何应用该 SDK 实现UPnP 设备和控制点的设计开发技术。最后,利用 WiresharkPortable 工具捕获数据包,对各流程传递的消息包进行了详尽分析。关键词关键词:UPnP;家庭网络;XMl;工作流程;Intel SDK;数据包Analysis and

4、 realization of UPnP protocolAbstractWith the great development of computer industry and computer network technology,embedded system and the home networking communication is becoming a popular research field nowAt the same time, due to the development of home networking and the more embedded devices

5、 in use,it is urgent to explore a new way to connect all kinds of embedded devices in the home networkingThe key of home network realization is the home network middleware technologyMany famous information device corporations have provided their own new technology and new means to resolve it, Especi

6、ally, UPnP provided by Microsoft, the hot spot of research in every country now, gets the most extensive support and posseses the enormous develop prospect. UPnP is the abbreviation of Universal Plug and PlayIt is mostly used for implementing intellectual interconnecting between devicesUsing UPnP pr

7、otocol doesnt need the device driving programsIt can run over almost all operating systems UPnP will make it easy to build the network environment for devices interconnecting in the office or homeFirstly, the paper introduces on the protocols UPnP refers to (such as SSDP, GENA, SOAP) and focuses on

8、the analysis of the technological process to implement UPnP. Secondly, based on the analysis of the structure and functionality of the most commonly used Intel SDK,the paper summarizes the design and development techniques for UPnP device and control point using this SDK with the example of developi

9、ng TV control point and TV deviceFinally, utilizing the data packets caught by the WiresharkPortable, the paper analyses exhaustively the message packets of every process . Key words: UPnP; home network; XML; work process; Intel SDK; data packets目目 录录论文总页数:33 页1 引言.12 UPnP 的结构规范 .12.1 UPnP 的基本组件 .12

10、.2 UPnP 部分术语 .22.3 UPnP 设备协议栈 .32.3.1 SSDP 协议 .32.3.2 SOAP 协议 .32.3.3 GENA 协议 .32.4 基于 XML 的 upnp 描述.42.4.1 XML 简介2.42.4.2 TV 设备的设备描述编写 .53 UPnP 实现的工作流程 .73.1 寻址(Addressing).83.2 发现(Discovery).83.3 描述(Description).93.4 控制(Control).103.5 事件(Eventing).103.6 展示(Presentation).114 基于 Linux 的 UPnP 协议实现的源代

11、码模块.124.1 设备/控制点.124.2 UPnP 软件开发包 API(upnp SDK API).124.3 WEB Server.134.4 库模块.134.4.1 XML 解析模块 .134.4.2 SDK 中的线程库 .134.4.3 HTTP 解析器 .134.4.4 微型服务器(Mini Server).135 TV 控制点及设备的代码实现 .145.1 TV 控制点的代码实现 .145.1.1 发现、描述的代码实现 .145.1.2 订阅服务的代码实现.175.1.3 控制服务的代码实现.185.1.4 退出.205.2 TV 设备的代码实现 .215.2.1 设置和初始化设

12、备.215.2.2 处理异步请求.225.2.3 发送事件通知.235.2.4 关闭设备.246 UPnP 协议消息分析 .246.1 发现设备的消息分析.246.1.1 SSDP 发现请求 .246.1.2 SSDP 存在宣告 .256.2 描述数据包分析.256.2.1 获取设备描述的请求消息.256.2.2 TV 设备的设备描述消息 .266.3 事件数据包分析.266.3.1 订阅请求的消息分析.266.3.2 续订请求的消息分析.276.3.3 NOTIFY 事件通知消息分析 .276.4 控制数据包分析.286.4.1 动作调用的消息分析.286.4.2 查询变量的消息分析.29参

13、考文献.31致 谢.32声 明.33第 1 页 共 33 页1 1 引言引言UPnP 全名是Universal Plug and Play,主要是微软在推行的一个标准。简单的来说,UPnP 最大的愿景就是希望任何设备只要一接上网络,所有在网络上的设备马上就能知道有新设备加入,这些设备彼此之间能互相沟通,更能直接使用或控制它,一切都不需要设定,完全的Plug and Play。举个例子来说:Mary在她的计算机中存储了大量数码相机拍摄的照片。当朋友Karen 来拜访时, Mary在起居室拿起与等离子电视机配套的红外线(IR)遥控器,从电视所显示的列表中挑选她感兴趣的照片,向Karen在电视屏幕上

14、展示一下这些照片。这过程中就使用了UPnP协议。2 2 UPnPUPnP 的结构规范的结构规范2.12.1 UPnPUPnP 的基本组件的基本组件服务、设备和控制点是UPnP网络的基本组件。其组件图如图1所示:图1 UPnP组件图 服务(Service)在UPnP网络中,最小的控制单元就是服务。服务描述的是设备在不同的情况下的活动和设备的状态。例如,时钟服务可以表述为时间变化(状态变化)、当前的时间(时钟的状态)以及设置时间和读取时间两个活动,通过这两个活动你就可以控制服务。 设备(Device)UPnP网络中定义的设备具有很广泛的含义,各种各样的家电、电脑外设、智能设备、无线设备、个人电脑等

15、等都可以成为其中一员。一个UPnP设备可以是多个服务的载体和多个子设备的嵌套集。例如一台印表机有提供列印这样的服务;一台电视有提供收讯的服务,这些都属于设备。 控制点(ControlPoint)第 2 页 共 33 页在UPnP网络中,控制点指的是可以发现并控制其它设备的控制设备。在UPnP网络中,设备可以和控制点合并。也就是说,同一个设备,可以同时具有设备的功能和控制点的功能,即可以作为设备提供服务,也可以作为控制点发现和控制其它设备。2.22.2 UPnPUPnP 部分术语部分术语 UUIDUUID含义是通用唯一识别码(Universally Unique Identifier) ,其目的

16、是让分布式系统中的所有元素,都有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。其格式为xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx(8-4-4-16),分别为当前日期和时间,时钟序列,全局唯一的IEEE机器识别号,如果有网卡,从网卡mac地址获得,没有网卡以其他方式获得。 UDN单一设备名(Unique Device Name) ,基于UUID,表示一个设备。在不同的时间,对于同一个设备此值应该是唯一的。 URI Web上可用的每种资源 - HTML文档、图像、视频片段、程序等 - 由一个通用资源标志符(Universal Resource Identif

17、ier, 简称URI)进行定位。 URI一般由三部分组成:访问资源的命名机制;存放资源的主机名;资源自身的名称,由路径表示。考虑下面的URI,它表示了当前的HTML 4.0规范:http:/ URLURL是URI命名机制的一个子集,URL是Uniform Resource Location的缩写,译为“统一资源定位符” 。通俗地说,URL是Internet上用来描述信息资源的字符串,主要用在各种www客户程序和服务器程序上。采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。 URNURN:URL的一种更新形式,统一资源名称(URN, Uniform Resour

18、ce Name)。唯一标识一个实体的标识符,但是不能给出实体的位置。标识持久性 Internet 资源。URN可以提供一种机制,用于查找和检索定义特定命名空间的架构文件。尽管普通的URL可以提供类似的功能,但是在这方面,URN 更加强大并且更容易管理,因为 URN 可以引用多个 URL。第 3 页 共 33 页2.32.3 UPnPUPnP 设备协议栈设备协议栈UPnP定义了设备之间、设备和控制点、控制点之间通讯的协议。完整的UPnP由设备寻址、设备发现、设备描述、设备控制、事件通知和基于Html的描述界面几部分构成。UPnP设备协议栈如下图所示:图2 UPnP协议栈1UPnP协议结构最底层的

19、TCP/IP协议是UPnP协议结构的基础。IP层用于数据的发送与接收。对于需要可靠传送的信息,使用TCP进行传送, 反之则使用UDP。UPnP对网络物理设备没有要求,可以使用以太网、无线网、IEEE1394、红外进行连接, 只要支持IP协议即可。同时UPnP还可以使用TCP/IP协议族中的其他协议, 如ARP、IGMP、DHCP、DNS等。构建在TCP/IP协议之上的是HTTP协议及其变种,这一部分是UPnP协议的核心部分, 所有UPnP消息都被封装在HTTP协议及其变种之中。HTTP协议的变种是HTTPU和HTTPMU, 这些协议的格式沿袭了HTTP协议,只不过与HTTP协议不同的是它们通过

20、UDP而不是TCP来发送消息,并且可以用于多播通信。2.3.12.3.1 SSDPSSDP 协议协议简单服务发现协议(Simple Service Discovery Protocol:SSDP),内建在HTTPU/HTTPMU 里,定义如何让网络上有的服务被发现的协议。包括控制点如何发现网络上有哪些服务,并取得这些服务的资讯,还有装置本身宣告他提供哪些服务。该协议运用在UPnP工作流程的设备发现部分。2.3.22.3.2 SOAPSOAP 协议协议简易对象访问协议(Simple Object Access Protocol:SOAP)定义如何使用XML与HTTP来执行远端程序呼叫(Remot

21、e Procedure Call)。包括控制点如何发送命令消息给设备,及设备接收到命令消息后如何发送响应消息给控制点。该协议运用在UPnP工作流程的设备控制部分。2.3.32.3.3 GENAGENA 协议协议一般事件通知架构(Generic Event Notification Architecture:GENA)定义在控制点想要监听设备的某个服务状态变量的状况时,控制点如何传送订阅讯第 4 页 共 33 页息并如何接收通知讯息用的。该协议运用在UPnP工作流程的事件订阅部分。2.42.4 基于基于 XMLXML 的的 UPnPUPnP 描述描述2.4.12.4.1 XMLXML 简介简介2

22、XML(Extensible Markup Language)即可扩展标记语言,它与 HTML 一样,都是 SGML(Standard Generalized Markup Language,标准通用标记语言)。XML是 Internet 环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具。扩展标记语言 XML 是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然 XML 占用的空间比二进制数据要占用更多的空间,但 XML 极其简单易于掌握和使用。与HTML类似,XML描述的内容封装在开始标签和结束标签之间,一对标签及其封装的内容,如G

23、one with the Wind,被称为一个元素。元素可以嵌套,一个XML文档正是由许多这样的元素嵌套而成的。元素可以有属性,可赋予属性值。在实际应用中,人们常常根据需要自定义元素名和属性名,这些名字具有明确易懂的含义。但是由于应用的繁多,所定义的名字很有可能发生冲突,为此XML引入了命名空间(namespace)的概念,它给出元素名和属性名定义的来源处,允许不同应用使用相同的名字,不致引起混淆。XML命名空间采用“两段式命名法”定义所谓的“合法名称”,例如“学生:姓名”。其中第一段是指代特定命名空间的“命名空间前缀”,第二段是元素或属性的名字,两段之间用西文冒号“:”分隔。需要注意的是,“

24、学生:姓名”和“班主任:姓名”虽然名称都是“姓名”,但却是两个不同的元素名,因为它们分别由“学生”和“班主任”命名空间定义。命名空间用URI标识,具有唯一性和持久性,所谓命名空间前缀就是命名空间的缩写表示,XML采用下述“命名空间声明来绑定命名空间前缀和命名空间:xmlns:【命名空间前缀】=【命名空间名】其中,xmlns就是XML命名空间的缩写。例如:xmlns:学生=http:/ 5 页 共 33 页三年级二班135楼210室上述XML文档描述了关于学生的相关信息,所采用的元素名和属性名均源自“学生”命名空间。上面的描述使用了“学生”命名空间定义的4个元素名:学生、姓名、班级和住址,1个属

25、性名:数字类型,并对于“学生:班级”元素的“数字类型”属性赋予属性值“中文”,对于“学生:住址元素的“数字类型属性赋予属性值”阿拉伯”。类似地,可以用XML文档描述关于班主任的相关信息,只是需采用“班主任“命名空间定义的名字。只要不被其他命名空间声明所覆盖,命名空间声明对于它所说明的所有元素以及这些元素包含的所有内容都有效,这就是所谓命名空间的作用域范围。2.4.22.4.2 TVTV 设备的设备描述编写设备的设备描述编写在UPnP协议中,要实现控制点和设备之间的互相通信,设备的描述文件起着很重要的作用。对于设备的描述文件,是以XML文件形式存在的。在论文的第五节,我们会讨论TV设备的代码实现

26、,在这我们就对TV设备的设备描述文件编写进行介绍。一般来说,设备描述都是基于UPnP论坛上己定义的模板,这些标准化的模板提供一系列基本的服务和预定义的设备类型,厂商可以在其中作出自己的扩充。对于后面开发的TV设备,因为只是为了阐述UPnP协议的实现,所以自行开发其设备模板及其XML文档,以使其最简化。根据UPnP规范,包括两个主要部分。第一部分包括根设备类型、特定厂商、制造商信息,如模块名称和编号、序列号、制造商名称、特定厂商网站URL等。第二部分包括设备所支持服务的信息。对于第一部分,为了使设备描述文件更简单,为简单计,省略了厂商名、厂商网址等可选元素,这些省略并不会对系统运行产生任何影响。

27、下面就是TV设备的设备描述文件:第 6 页 共 33 页图3 TV设备的设备描述2.4.2.12.4.2.1 基本信息编写基本信息编写 设备类型设备类型元素的格式如下:命名空间:设备类型:版本号对于基于标准设备模板的设备,描述文件中这一属性为:我们把设备类型叫做tvdevice,版本号定为1,于是我们得到了一个完整的设备类型元素: urn:schemas-upnp-org:device:tvdevice:1 friendlyname我们为设备取了一个相对简单的用户友好的别名:UPnP Television Emulator,于是得到了元素:UPnP Television Emulator UD

28、N接下来需设计的是唯一设备名字(UDN),这是该实例的唯一标识符。为了保持唯一性,采用设备的名字和设备网卡的MAC地址组合而成。假设MAC地址为1234567890001,就可以把UDN元素写为:uuid:Upnp-TVEmulator-1_0-12345678900012.4.2.12.4.2.1 设备服务编写设备服务编写第 7 页 共 33 页设备所含服务是设备描述的主体部分,它们体现为设备的功能。在设计时,可根据设备的功能映射确定可提供给控制点的服务。在这里,TV设备只定义一个control服务。control服务负责处理TV的开关(power),调整音量(volume)及设置频道(ch

29、annel),其在设备描述文档中的第一个元素是serviceType,其命名原则与deviceType类似,遵从一定的约定,定义为:urn:schemas-upnp-org:service:tvcontrol:1类似地,元素定义为:urn:upnp-org:serviceId:tvcontrol1另一需要定义的是服务描述文档的地址元素,这个元素非常重要,控制点就是通过这个地址来获取后续的服务描述文档。由于本设备服务描述文档与设备描述文档位于同一目录,名为tvcontrolSCPD.xml,因此该元素为:tvcontrolSCPD.xmlTV控制相关服务最后两个子元素是控制URL和事件URL。这

30、两个URL是控制点发送动作请求和订阅请求的URL。定义为:/upnp/control/tvcontrol1/upnp/event/tvcontrol13 3 UPnPUPnP 实现的工作流程实现的工作流程图4 UPnP实现的工作流程稍微了解有哪些通讯协议后,我们来看UPnP是如何运作的。图4是UPnP的运作流程,我们先介绍各部分在做什么,再做详细介绍:0. 控制点跟设备都先取得IP地址才能做之后的沟通。1. 控制点寻找整个网络上的UPnP设备,而设备同时也要宣告他本身的存在。2. 控制点取得设备的描述,这包括设备提供什么样的服务。3. 控制点发出动作信息(对设备操作的命令信息)给设备。4. 控

31、制点监听设备的状态,当状态改变时做出相应的处理动作。第 8 页 共 33 页5. 控制点利用HTML界面来控制设备和监看设备状态。3.13.1 寻址(寻址(AddressingAddressing)UPnP网络的基础是TCP/IP协议族,这就决定了每一个UPnP组件(设备和控制点)必须分配一个IP地址。一个UPnP设备寻址的一般过程是:首先向 DHCP服务器发送DHCPDISCOVER消息,如果在指定的时间内,设备没有收到DHCPOFFERS回应消息,设备必须使用 Auto-IP完成IP地址的设置。在选中一个地址之后,设备测试此地址是否在使用。为了测试选择的地址是否未被占用,设备必须使用地址分

32、辨协议(ARP)。 使用Auto IP的设备必须定时检测DHCP服务器是否存在,若存在,设备必须释放Auto IP分配的地址,此时设备必须取消所有的广告消息并重新发出新的。一个设备可以使用UPnP之外的更高层的协议,这些协议将为设备使用友好的名称。在这种情况下,将这些友好的主机名解析为IP地址就很必要了,DNS通常是用来实现此功能的。使用此功能的设备可能要包含一个DNS客户端,而且支持动态的DNS注册,通过注册将它自己的名字加入到地址分布图中。3.23.2 发现(发现(DiscoveryDiscovery)一旦设备连接到网上并且分配了地址,就要进行发现的操作了。设备发现是UPnP网络实现的第一

33、步。设备发现是由简单发现协议SSDP(Simple Service Discovery Protocol)来定义的。在设备发现操作之后,控制点可以发现感兴趣的设备,并使得控制点获得设备能力的描述,同时控制点也可以向设备发送命令,侦听设备状态的改变,并将设备展示给用户,即是描述、控制、监听、展示的基础。当一个设备加入到网络中,设备发现过程允许设备向网络上的控制点告知它提供的服务。当一个控制点加入到网络中时,设备发现过程允许控制点寻找网络上感兴趣的设备。在这两种情况下,基本的交换信息就是发现消息。发现消息包括设备的一些特定信息或者某项服务的信息,例如它的类型、标识符、和指向XML设备描述文档的指针

34、。图5画出了发现流程的框架图。第 9 页 共 33 页图5 发现过程框图3.33.3 描述(描述(DescriptionDescription)UPnP 网络结构的第二步是设备描述。在控制点发现了一个设备之后,控制点仍然对设备知之甚少,控制点可能仅仅知道设备或服务的 UPnP 类型,设备的UUID 和设备描述的 URL 地址。为了让控制点更多的了解设备和它的功能或者与设备交互,控制点必须从发现消息中得到设备描述的 URL,通过 URL 取回设备描述。设备描述的一般过程如图 6 所示:图6 获得设备描述及服务描述对于一个设备的UPnP描述一般分成两个部分:设备描述和设备的服务描述。 设备描述UP

35、nP对某一设备的描述以XML形式表示出来,设备描述包括制造商信息,包括模块名称和编号,序列号,制造商名称,制造商网站的URL等等。设备描述也包括所有嵌入设备描述和URL地址集。对于一个物理设备可以包含多个逻辑设备,多个逻辑设备既可以是一个根设备其中嵌入多个设备,也可以是多个根设备的方式实现。设备描述是由设备制造商提供的,采用XML表述,并且遵循UPnP设备模版。此模版是由UPnP工作委员会生成的。 服务描述包括一系列命令或者动作,服务响应,动作的参数。服务的描述也包含一系列变量,这些变量描述了服务运行时刻的状态,这包括数据类型、取值范围和事第 10 页 共 33 页件特性的描述。服务描述也是由

36、设备制造商提供的,采用XML方式表述,遵循UPnP服务模版。3.43.4 控制(控制(ControlControl) 在接收设备和服务描述之后,控制点可以向这些服务发出动作,同时控制点也可以轮询服务的状态变量值。发出动作实质上是一种远程过程调用;控制点将动作发送到设备服务,在动作完成(或失败)后,服务返回相应的结果或错误。状态变量值轮询是这种场景下的特例,动作及其结果都是预定义的。 其基本过程如下图所示:图 7 控制点发出动作和轮询变量为了控制一个设备,控制点向设备服务发出一个动作。这一般由控制点向服务的控制URL地址(在设备描述的服务元素controlURL子元素部分提供)发送一个适当的控制

37、消息。而服务则会对此动作做出响应,返回相关结果或错误。动作的效果可以通过改变描述服务运行时状态的变量进行建模。在这些状态变量改变时,事件将被发布到所有相关的控制点。 控制点可能会轮询服务的状态变量值以获得状态变量的当前值。与发出一个动作的过程相似,控制点向服务的控制URL发送一个适当的查询消息。而服务则返回相应的变量值;每个服务必须保持状态表的一致性,以便控制点能够轮询并接收到有意义的值。3.53.5 事件(事件(EventingEventing)正如描述部分所述,一个即插即用服务描述包括服务响应的动作列表和运行时描述服务状态的变量列表。如果一个或多个状态变量可以被事件触发,服务将会在这些变量

38、发生变化时发布更新,控制点可以订阅以获得此信息。通过这一部分,发布者指事件的来源(通常为设备服务) ,订阅者指事件目的地(通常为控制点) 。第 11 页 共 33 页图8 事件过程框图如图8所示,要订阅事件,订阅者可发送一条请求订阅消息。如果发布者收到此消息,它将以这个订阅的持续时间作为响应。要保持订阅,订阅者必须在订阅过期之前进行续订。当订阅者不再需要发布者发送的事件时,订阅者应当取消其订阅。发布者通过发送事件消息提醒订阅者状态变量改变。事件消息包含多个状态变量名称和这些变量的当前值,以XML表示。在订阅者第一次订阅时,需要发送一个专门的初始化事件消息。该事件消息包含所有事件变量的名称和值,

39、并且允许订阅者初始化其服务状态模型。为了支持多个控制点,在动作生效后所有订阅者均会收到通知。由此,将向所有订阅者发送全部事件消息,订阅者会收到所有事件触发变量的事件消息(不只是一部分)。不管状态变量因何种原因发生改变(无论为了响应所要求的动作,还是由于服务模拟的状态发生变化)均会发送事件消息。 事件消息使用HTTP协议传送,事件详细定义在通用事件通知结构(General Event Notification Architecture)协议中。3.63.6 展示(展示(PresentationPresentation) 在控制点发现设备和取得设备描述之后,控制点即准备开始提供展示。如果设备拥有进

40、行展示的URL,那么控制点就可以通过此URL取得一个页面,在浏览器中加载该页面,并根据页面功能,支持用户控制设备和/或浏览设备状态。每一项完成的程度取决于展示页面和设备的具体功能。 设备表征包含在设备描述的 presentationURL 字段。设备表征可以完全由设备制造商提供,它采用 HTML 页的形式,使用 HTTP 进行发布。图 9 画出了展示流程的示意图。第 12 页 共 33 页图9 展示(Presentation)示意图4 4 基于基于 LinuxLinux 的的 UPnPUPnP 协议实现的源代码模块协议实现的源代码模块为了促进UPnP协议的发展,信息业巨头Intel公司开放了一

41、个基于Linux的UPnP协议栈源代码,该协议栈实现了UPnP规范中SSDP协议模块,GENA协议模块,SOAP协议模块。本文后面列举的TV控制点和设备的源代码实现就是基于这个开源协议栈。本部分将对该协议栈模块的体系结构做简单分析,其协议模块的体系结构如图10所示。图 10 UPnP 协议实现的各个模块14.14.1 设备设备/ /控制点控制点客户端或服务器的申请软件均运行在软件开发包(SDK)之上。客户端或服务器的申请相当于执行了一个完成特殊服务的函数。例如,拿一个网关服务来说,服务器软件执行这个“Enable Internet”函数时,就相当于控制点软件开始能控制使用UPnP设备。4.24

42、.2 UPnPUPnP 软件开发包软件开发包 API(UPnPAPI(UPnP SDKSDK API)API)UPnP软件开发包API部分将UPnP协议核的详细内容从控制点和服务器申请中抽象如来,并且给了一个统一界面的入口函数,里面包含了SSDP,GENA和SOAP等协议。这个API层也包含了用软件开发包(SDK)注册的控制点和设备操作列表。每个对API函数的请求,软件开发包(SDK)都将会对照操作列表中的相应项,对操作列表中所包含的相应操作,在这里均会使之生效。同时,在这个过程中,只限对一个控制点或一个设备的操作进行定位。换句话说,一个申请一次要么注册一个设备,要么注册一个控制点,而一个申请

43、不能同时注册一个设备和控制点。任何想同时注册设备和控制点的申请都会失败。第 13 页 共 33 页4.34.3 WEBWEB ServerServer微型服务器模块处理一个标准的HTTP GET请求。在UPnP组成元素中,都要求使用基本的HTTP服务,所以需要使用微型服务器模块来完成基本的HTTP服务。微型服务器模块管理文档的定位,这些文档一般对GET命令有效,并且运行使用HTTP协议的数据流进行传输。微型服务器也支持虚拟路径HTTP POST请求,但不支持其他种类的请求。4.44.4 库模块库模块4.4.14.4.1 XMLXML 解析模块解析模块XML在UPnP中被广泛地使用。描述文档就是

44、XML文档。GENA使用XML来描述一个服务状态的描述变化。SOAP使用XML来格式化请求和响应。软件开发包(SDK)包含一个XML解析,这个XML解析会被UPnP协议核和客户端或服务端软件使用。4.4.24.4.2 SDKSDK 中的线程库中的线程库UPnP协议栈的实现中大量采用了多线程技术,该模块就是为了更方便高效地使用线程技术,其中包含了一个定时器线程子模块和一个线程池子模块。线程池子模块用于管理协议栈中所有的线程;定时器线程子模块用来处理协议栈中所有的定时事件。应用层在调用API UpnpInit()时会初始化两个缓冲池(由ThreadPoollnit()创建):发送缓冲池,接收缓冲池

45、。在创建每个缓冲池时都要给定一个缓冲池的属性作为参数,以确定在该缓冲池中最少,最多可以容纳的线程数,然后调用CreateWorker()创建所需的线程。当有新的任务要执行的时候,调用TPJobInit(),ThreadPooIAddPersistent()或者ThreadPoolAdd()将任务加到缓冲池的相应队列中,等待空闲的线程调用执行。4.4.34.4.3 HTTPHTTP 解析器解析器设备公告消息、设备查询消息、设备查询响应消息都是用HTTP协议来封装的,使用了SSDP协议定义的头和方法,这需要开发者自己来解释这些消息。同样,事件订阅消息和事件取消订阅消息也是用HTTP协议来封装的,使

46、用了GENA定义的头和方法,也需要开发者自己解析这些消息这里我们把这两部分的HTTP消息解析合并成一个模块:HTTP消息的解析。通常的HTTP消息是由浏览器或www服务器来解析的,这里的HTTP消息解析只对SSDP、GENA定义的特殊的HTTP消息进行解析。4.4.44.4.4 微型服务器(微型服务器(MiniMini ServerServer)Mini Server层提供GENA、SOAP、SSDP、mini web server需要的公共功能,第 14 页 共 33 页这一层接收所有的网络连接,并决定哪个请求可以进入上层,将HTTP头部交给HTTP模块去解析,并将这个连接转向合适的协议去处

47、理。5 5 TVTV 控制点及设备的代码实现控制点及设备的代码实现本部分采用一个实例对 UPnP 的代码实现进行了阐述,该例子中包括一个 TV控制点和一个 TV 设备,且只实现控制点对电视设备的搜索,无法搜索其他的UPnP 设备。该例实现了对 TV 设备的服务控制及服务订阅等流程。工作平台为Windows XP,编译环境为 Visual Studio2008,使用两台 PC,一台 PC 上运行 TV控制点,一台 PC 运行 TV 设备,且两台 PC 处于同一局域网中,操作结果在各自的执行界面上显示。5.15.1 TVTV 控制点的代码实现控制点的代码实现5.1.15.1.1 发现、描述的代码实

48、现发现、描述的代码实现初始化SDK包获得控制点操作的IP地址和端口有设备广播消息到来向SSDP多播地址:239.255.255.250.1900发送发现请求消息,搜索感兴趣的设备在miniserver中分配一个SSDPsocket监听设备消息回调函数调用处理结果,获得设备描述文件Miniserver做相应的处理传递参数给注册的回调函数注册控制点及其回调函数添加发现的设备到设备列表中YesNo图 11 发现设备及获得设备描述的实现流程图发现、描述流程的实现流程图如图 11 所示,需要说明的是,本例的发现请求消息没有收到 TV 设备的直接响应,因为考虑到本例只实现对一个 TV 设备的搜索,所以只需

49、要解析 TV 设备发送的广播消息就足以获得设备的描述文件等。5.1.1.15.1.1.1 启动及初始化启动及初始化 UpnpInit()初始化 SDK应用程序可以在初始化过程中指定IP地址和端口号。对于控制点来说,设置第 15 页 共 33 页IP地址和端口号用于监听事件消息。如果地址为空,那么第一个非空、非回路地址将被使用。你可以在初始化完成后通过UpnpGetServerlpAddress0和UpnpGetServerPort()来取得IP地址和端口号。TV控制点就是这样来实现的。在UpnpInit()函数里,创建了发送线程池和接收线程池,并启动miniserver。 UpnpRegist

50、erClient()注册控制点对于函数UpnpRegisterClient(),第一个参数是控制点希望SDK使用的回调函数。TV例子中是TvCtrlPointCallbackEventHandler()。第二个参数是指向一小段信息的指针,这段信息在回调函数被触发时会传递给回调函数。TV例子中传递的是控制点句柄。最后一个参数是指向控制点句柄的指针,这个句柄在生成后续SDK调用时会用到。TV例子使用TvCtrlPointCallbackEventHandler0处理所有异步操作,该函数处理所有的事件消息,包括SSDP,GENA,SOAP等。后续讨论在必要时会述及该函数的某些片断。在控制点调用Upn

51、pRegisterClient()注册回调函数后,所有网络上设备的设备宣告消息将会由回调函数传递给应用程序。应用程序应该准备好处理这些消息。5.1.1.25.1.1.2 发现设备发现设备当控制点应用程序初始化完成后,就可以开始在网络上搜索感兴趣的设备。TV例子是一个非常简单的控制点,它只搜索一种设备:Tv例子设备。 UpnpSearchAsync()函数发现设备例子在函数TvCtrlPointRefresh()开始搜索TV设备。UpnpSearchAsync()开始搜索设备过程。它有以下参数:控制点句柄第 16 页 共 33 页控制点等待响应的时间(以秒为单位,程序里为5)搜索目标一段可选的c

52、ookie对于TV设备而言,搜索目标定义为:char TvDeviceType=”urn:schemas-upnporg:device:tvdevice:1”; readFromSSDPSocket()接收SSDP广播消息并进行处理在该函数里会启用一个事件处理线程ssdp_event_handler_thread,在该线程里会对来自设备的广播消息会由函数ssdp_handle_ctrlpt_msg()进行处理,然后将相应参数送到TvCtrlPointCallbackEventHandler()函数进行处理,从而获得设备描述文件。 TvCtrlPointCallbackEventHandler(

53、)函数处理所有事件信息函数原型如下:int CallbackFxn(Upnp_EventType EventType,void *Event, void *Cookie);其中第一个和第二个参数均由UPnP模块在发生回调时传入,EventType表征了待处理的UPnP请求的类型,Event是指向一个结构体的指针,该结构体中包含了关于请求消息的具体信息,不同类型的请求会对应不同的结构。参数Cookie是设备应用程序中定义的数据。 发现事件消息结构体当控制点收到来自设备的响应消息后,会经由miniserver相应处理,传给回调函数一个发现事件消息,其结构体如下:该结构体里面返回了很多关于设备的重要

54、信息,包括设备类型(tvdevice) 、服务类型(tvcontrol) 、以及设备描述文件的URL位址等等。5.1.1.35.1.1.3 获得设备描述获得设备描述第 17 页 共 33 页 UpnpDownloadUrlItem()获得设备描述XML数据在该函数里,通过设备URL创建设备描述请求消息,再经过发送并等待响应消息,在响应消息里获得设备描述XML数据存在一个char* buffer里。 ixmlParseBufferEx()函数解析XML文档(首行缩进2字符)在上述函数获得XML数据后,调用该函数对其进行解析,解析的作用是将XML文件数据解析成DOMtree结构,从而可对设备描述文

55、件进行访问。5.1.25.1.2 订阅服务的代码实现订阅服务的代码实现获得服务的URL位址根据URL订阅服务订阅时间到Miniserver模块处理来自设备事件消息,交由GENA模块进行处理将来自设备的事件通知消息解析成XML文件根据订阅SID,续订服务回调函数处理解析后的事件消息,主要是更新服务的状态变量表Yes创建一个时间任务,开启自动续订功能No图12 订阅的代码实现流程图5.1.2.15.1.2.1 订阅订阅 SampleUtil_FindAndParseService()获取服务的URLint SampleUtil_FindAndParseService( IN IXML_Docume

56、nt * DescDoc,IN char *location, IN char *serviceType,OUT char *serviceId, OUT char *eventURL, OUT char *controlURL )第一个参数为以XML文件存在的设备描述文件,第二个是设备描述文件的URL,第三个是服务类型,后面三个分别是函数执行后得到的该服务的SID,事件URL和控制URL。 gena_subscribe()完成订阅任务通过上述函数得到事件URL后,就可以开始订阅任务了。订阅函数为:第 18 页 共 33 页gena_subscribe( IN char *url, INOUT

57、 int *timeout,IN char *renewal_sid, OUT char *sid )url:订阅的服务URL;timeout:订阅的截至时间;renewal_sid:用于续订,对于第一次订阅,此指针为空;sid:函数返回一个用于订阅该服务的订阅标志符SID,续订会用到;从上述参数可知,订阅一个服务,主要是通过服务的URL位址来实现。对于设备,会返回一个用于此服务订阅的SID,用于发布事件消息和续订等。 回调函数处理的事件消息结构体在控制点订阅了某服务后,设备就会立即返回一个事件通知消息,反映该服务的状态变量及其当前值,其返回的事件消息经GENA模块处理后,会得到一个由回调函数

58、处理的事件结构体,如下:5.1.2.25.1.2.2 续订续订 genaRenewSubscription()完成续订任务实现任务的续订,是通过函数ScheduleGenaAutoRenew()在gTimerThread线程池里创建一个自动续订任务,最后通过函数genaRenewSubscription()来实现的。int genaRenewSubscription( IN UpnpClient_Handle client_handle, IN const Upnp_SID in_sid, INOUT int *TimeOut )client_handle: 控制点句柄。in_sid: 订阅标

59、志符SID(在第一次订阅时获得)。TimeOut:续订的持续时间由上述参数可知,完成续订任务并不是通过服务的URL位址,而是通过在第一次订阅时取得的SID来实现的。5.1.35.1.3 控制服务的代码实现控制服务的代码实现第 19 页 共 33 页创建一个处理动作调用/查询变量的线程输入命令查询变量命令根据设备号获取设备在列表中的相应结点根据设备号获取设备在列表中的相应结点以XML文档形式创建动作调用请求消息的消息体在发送线程池里开启一个区分控制种类的线程获取变量创建动作请求消息的头部分以XML文档形式创建动作调用请求消息的消息体发送请求和等待响应从响应消息中提取变量值控制点注册的回调函数处理

60、相应结果NoYesYesNo图13 控制代码实现流程图5.1.3.15.1.3.1 动作调用的代码实现动作调用的代码实现 UpnpMakeAction()创建动作请求消息在向设备发送动作消息的函数要用到描述动作的DOM文件,SDK中有组织这些DOM文件的功能函数:UpnpMakeAction()和UpnpAddToAction0。TV例子中在TvCtrlPointSendAction0充分利用了这些函数:如果动作不需要参数,UpnpMakeAction()就已经足够构造正确的动作节点了。否则的话,将会反复调用UpnpAddToAction()往动作节点文件中添加参数。 UpnpSendActi

61、onAsync()发送动作消息控制点通过改变设备的内部状态来使设备完成某些功能。这是通过向设备发送动作消息实现的。SDK有两个函数用于改变设备的内部状态:UpnpSendAction()和UpnpSendActionAsync()。两个函数都完成相同的功能,只是后面一个是异步操作。第 20 页 共 33 页第一个参数为控制点句柄,第二个为被控制的服务类型,第三个是服务的控制URL,第四个参数是设备的UDN,此处为空;第五个是以XML文档形式存在的动作请求消息;第六个是动作完成后的回调函数,最后一个是存放用户数据的可选项,此处为空。当异步的动作消息发送完成后,响应消息通过回调函数返回,回调函数句

62、柄是由UpnpSendActionAsync()指定或由UpnpRegisterClient()注册,例子中倾向于对所有的消息用同一个句柄,所有动作完成和服务状态变量查询消息均在TvCtrlPointCallbackEventHandler()结束。5.1.3.25.1.3.2 查询变量的代码实现查询变量的代码实现 UpnpGetServiceVarStatusAsync()查询状态变量另外,要查询服务的某个状态便量的值也可以通过两个函数来实现:UpnpGetServiceVarStatusAsync()和UpnpGetServiceVarStatus()。两个函数都完成相同的功能,只是前一个

63、是异步操作。对于函数UpnpGetServiceVarStatusAsync(),和函数UpnpSendActionAsync()的参数基本上一致,最大的不同是请求查询变量不是以XML文档形式存在,而是以char型,具体的封装成XMl文档形式是在函数内部解决的。当异步的查询请求消息发送完成后,和前面的动作请求一样,响应消息通过回调函数返回。5.1.45.1.4 退出退出当控制点应用程序退出时,需要用UpnpUnRegisterClient0 SDK取消注册并用UpnpDeInit0关闭SDK。第 21 页 共 33 页5.25.2 TVTV 设备的代码实现设备的代码实现初始化协议栈开始取值事件

64、进入事件循环注册根设备初始化设备多播设备存在消息回调UPnP事件处理函数释放占用资源注销设备结束取值事件处理创建事件处理线程操作事件订阅事件处理操作事件处理结束YesNoYesNo图14 TV设备实现流程图5.2.15.2.1 设置和初始化设备设置和初始化设备 初始化UPnP协议栈与控制点一样,初始化库方法是调用库函数Upnplnit()。 设置根目录初始化UPnP协议栈后,有必要为UPnP模块中的web Server指定根目录,这样当网络中的控制点向服务器发出请求各种设备或服务描述文件资源的话,web server将在该目录下搜索。这一步通过UpnpSetWebServerRootDir()

65、完成。 注册根设备通过这一步,TV设备与UPnP库关联在一起。当miniserver服务器监听到有对应与TV设备的请求时,将回调该设备提供回调事件处理函数进行处理。其代码片段如下:第 22 页 共 33 页UpnpRegisterRootDevice()的第一个参数为设备描述文件的URL;第二个参数为设备的回调事件处理函数,为TvDeviceCallbackEventHandler()。该函数是UPnP设备的核心。最后一个参数用于接收UPnP模块为设备分配的句柄,通过该句柄可以操作设备。 特定设备的初始化在向网络声明设备之前,还需要做一些特定于设备的初始化工作,比如:对嵌套于设备中的服务的状态

66、变量的初始化。 声明设备完成上述步骤后,向网络上的控制点声明设备的存在。代码如下;至此,设备开始等待请求消息的到来,进入事件处理循环。5.2.25.2.2 处理异步请求处理异步请求设备的生命期中,最主要的任务就是处理由控制点发送过来的各种异步请求。UPnP设备在生命期内需要处理的异步请求可分三类:订阅请求,取值请求和操作请求。5.2.2.15.2.2.1 订阅请求处理订阅请求处理该请求用于订阅UPnP设备中嵌套服务的状态改变事件通知。当控制点向UPnP设备发送订阅请求时,处于监听状态miniserver服务器激发设备应用中定义的回调函数,该回调函数将在一个独立的线程中运行。而传入回调函数的EventType参数值为UPnP模块中定义的类型常量UFNP_EVENT_SUBSCRIFTION_REQUEST;参数Event指向的包含具体请求数据的结构体类型为Upnp_Subscription_Request,其定义如下:在请求的后续处理中将调用UpnpAcceptSubscription()或者UpnpAcceptSubscriptionExt()来响应控制点,这两个函数的区别在于两者以不

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!