首页 UPnP编程指南

UPnP编程指南

举报
开通vip

UPnP编程指南Intel®SDKforUPnP™DevicesProgrammingGuideIntel®SDKforUPnP™DevicesVersion1.2.1November2002Intel®SDKforUPnP™Devices编程指南Intel®SDKforUPnP™DevicesVersion1.2.1November2002翻译说明:由于要研究UPnP协议并在Linux下实现其部分设备的功能,在阅读IntelSDK自带的英文文档时,顺便把该篇入门文章翻译出来,本翻译是本人的第一份完整的技术翻译文档,其中有些词的翻...

UPnP编程指南
Intel®SDKforUPnP™DevicesProgrammingGuideIntel®SDKforUPnP™DevicesVersion1.2.1November2002Intel®SDKforUPnP™Devices编程指南Intel®SDKforUPnP™DevicesVersion1.2.1November2002翻译说明:由于要研究UPnP 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 并在Linux下实现其部分设备的功能,在阅读IntelSDK自带的英文文档时,顺便把该篇入门文章翻译出来,本翻译是本人的第一份完整的技术翻译文档,其中有些词的翻译恐有不妥之处,有疑问的地方以英文文档为准,英文原文在$(LIBUPNP)/upnp/doc/UPnP_Programming_Guide.PDF.本文取自libupnp-SDK-1.3.1版本下的文档,文档中标记还是1.2.1,估计是开发包升级而文档没有升级吧,暂且以此学习之。本文档翻译为个人兴趣爱好,尚未联系原作者取得许可,也不对文中任何内容和翻译的问题负责,只作学习交流之用,如有好的建议或意见可与我联系,本文档可以任意的复制,分发,传播和改进。详情参照GPL。2006年7月1日简体中文第一版译者:Chaoshua[chaoshua@ieee.org]第1页目录1、概述..................................................................................................................................................................................................31.1、UPnP概述........................................................................................................................................................................................31.1.1、发现(Discovery)........................................................................................................................................................................31.1.2、描述(Description)...............................................................................................................................................................41.1.3、控制(Control)........................................................................................................................................................................41.1.4、事件(Eventing).........................................................................................................................................................................41.1.5、表示(Presentation)............................................................................................................................................................51.1.6、控制点和设备的交互................................................................................................................................................................51.2、SDK架构..........................................................................................................................................................................................61.2.1、设备/控制点程序........................................................................................................................................................................71.2.2、SDKAPI...........................................................................................................................................................................................71.2.3、SSDP..................................................................................................................................................................................................71.2.4、迷你Web服务器(MiniWebServer)...............................................................................................................................71.2.5、GENA..................................................................................................................................................................................................71.2.6、SOAP..................................................................................................................................................................................................81.2.7、HTTP..................................................................................................................................................................................................81.2.8、迷你服务器....................................................................................................................................................................................81.2.9、ThreadUtil库(TreadUtilLibrary)..............................................................................................................................81.3、虚拟目录........................................................................................................................................................................................82、编写一个UPnP设备...............................................................................................................................................................102.1、安装和初始化.............................................................................................................................................................................102.1.1、初始化SDK....................................................................................................................................................................................102.1.2、设置根目录...................................................................................................................................................................................112.1.3、注册一个根设备.........................................................................................................................................................................112.1.4、设备相关初始化........................................................................................................................................................................122.1.5、发布设备公告(AdvertisingtheDevice)..................................................................................................................122.2、处理请求......................................................................................................................................................................................122.2.1、订阅请求.......................................................................................................................................................................................132.2.2、获取变量请求............................................................................................................................................................................142.2.3、动作请求......................................................................................................................................................................................152.3、发送事件(SendingEvents)..........................................................................................................................................172.4、关闭(ShuttingDown).....................................................................................................................................................183、编写一个UPnP控制点..........................................................................................................................................................193.1、安装和初始化.............................................................................................................................................................................193.1.1、SDK初始化....................................................................................................................................................................................193.1.2、控制点应用相关的初始化...................................................................................................................................................203.1.3、控制点注册.................................................................................................................................................................................203.2、搜索感兴趣的事物.................................................................................................................................................................203.3、检索描述(RetrievingDescriptions)...........................................................................................................................223.4、监视事件(WatchingforEvents)...................................................................................................................................223.5、调用动作(InvokingAction)..............................................................................................................................................233.6、关闭(ShuttingDown).........................................................................................................................................................25第2页1、概述UpnP允许不经过用户干预而自动发现和控制网络上其他设备提供的可用服务。设备(Devices)作为服务器向客户端发布自己的服务。客户端系统,称为控制点(ControlPoints),能够搜索网络上特定的服务。当他们发现拥有他所期望的服务的设备时,他们就能够检索关于设备的服务的更详细的描述信息并在这个控制点上与其进行交互。本文档给出UPnP的概述并给出如何编写设备和控制点的例子,完整的描述请参见Intel®SDKforUPnPDevices函数API,参考SDK中包含的《Intel®SDKforUPnP™Devicesv1.2APIReference》。开发包(SDK)中也提供了控制点和设备的示例程序,对于如何编译和运行这些示例程序,请参看开发包对应sample目录下的README文件。1.1、UPnP概述本节简要描述UPnP,对于更详细的信息,请参见《UniversalPlugandPlayDeviceArchitecture》,该文档可在UPnP论坛找到:http://www.upnp.org/resources/documents.asp。UpnP包含一下五个基本部分/阶段(Phases):1、发现(Discovery):这是第一阶段,控制点搜索设备和服务,类似的,设备广播他所能提供的服务通告。2、描述(Description):一旦控制点发现了他感兴趣的设备或服务,他将请求该设备提供该设备本身、其他组件成员设备以及他们提供的服务的完整描述。3、控制(Control):本阶段允许控制点通过改变设备的状态来控制设备上提供的一个或多个服务。4、事件(Eventing):本阶段允许控制点与其感兴趣的服务状态保持同步,控制点向事件服务器订阅一个特定的服务,当该服务状态改变时,接收事件通告。5、表示(Presentation):表示阶段允许设备保持一份文档,该文档采用标准HTML语言编写,他可以是该设备的一个用户界面。接下来的部分将对这五个阶段分别进行描述。1.1.1、发现(Discovery)在发现阶段,控制点采用SSDP(简单服务发现协议:SimpleServiceDiscoveryProtocol)发现设备和服务而设备采用SSDP向控制点宣告他们的存在。SSDP采用HTTP的一种变体以UDP多播的方式来进行广播,并采用另一种HTTP变体通过UDP单播来进行应答。一个设备可能包含其他设备,每个设备都有他自己的服务。设备采用其类型和一个唯一的 标志 禁止坐卧标志下载饮用水保护区标志下载桥隧标志图下载上坡路安全标志下载地理标志专用标志下载 符来进行标识。服务则用他们的类型来标识。为了搜索网络上的设备或服务,控制点使用UDP多播包向地址239.255.255.250:1900发送HTTP的M-SEARCH命令。任何网络上服务控制点搜索条件的设备发回一个UDP单播进行第3页应答,该应答中包含了指向其描述文档(参加1.1.2节)的URL地址。如果一个控制点收到一个或多个可接受的应答,他将转入描述阶段(descriptionphase).一个控制点发出一个搜索请求时,该请求在SSDP头中包含了他愿意等待的时间长度。匹配的设备将在响应之前随机等待一段时间,该时间介于0和控制点指示的时间之间。如果控制点在他的搜索时间超时之前没有收到任何应答,他就认为当前网络上没有匹配的设备。设备没必要等待控制点来搜索他们的服务。他们可以采用向239.255.255.250:1900多播地址发送SSDP的NOTIFY命令来宣告他们的设备可用性。当控制点获得该NOTIFY多播,他们就可以使用标准的HTTPGET命令来向NOTIFY消息中提供的URL地址发出请求以获得设备的描述文档。设备必须在他们的服务不可用时发出一个通告信息。1.1.2、描述(Description)当控制点定位一个服务后他希望了解更多,因而他将请求描述文档。描述是一个XML文档用来描述一个设备,包括:●制造商信息,版本,其他。●可被设备采用的图标的URL地址。●嵌入式设备列表。●设备提供的服务列表。想得到关于描述文档的格式的更多信息,请参见文档《UniversalPlugandPlayDeviceArchitecture》(《通用即插即用设备架构》)。控制点采用基于TCP的HTTP来请求描述文档。控制点执行标准的HTTPGET命令(与检索Web页面类似)。在服务器端,设备运行一个标准的HTTP服务--可以是完全的Web服务器如Apache也可以是迷你服务器。描述文档中的很多条目都是URL地址。这些条目也使用HTTP/TCP检索。1.1.3、控制(Control)一旦一个控制点发现了一个设备并且检索到他的描述文档,他可能需要控制该设备包含的一个或多个服务。简单对象访问协议(SOAP:SimpleObjectAccessProtocol)允许一个访问点查询或改变服务状态表中的元素。SOAP使用基于TCP传输HTTP的POST和M-POST命令。SOAP使用XML来说明采取的活动。控制点如描述文档里指定的那样为服务创建XML文档并将其提交给控制URL。控制点能请求服务状态表中的当前值并改变他们。在服务器端,控制服务器等待控制请求。控制服务器是一个实现了SOAP协议的类似于HTTP服务器的服务器。一个设备能运行多于一个控制服务器,这取决于设备提供的服务的组合。1.1.4、事件(Eventing)一个控制点发现一个设备并检索到他的描述后,他能保持设备提供的服务的状态信息。感兴趣的控制点为特定服务订阅了从描述文档中发现的设备事件提醒服务URL。一个事件提醒在任何服务状态改变的时候发送给控制点,即使这次改变是由该控制点产生的。订阅和退订请求使用HTTP/TCP连接到事件URL,该URL包含在服务的描述文档中。在订阅时,控制点指定一个事件提醒的URL。事件以HTTP/TCP方式到达为服务注册的URL。事件提醒包含第4页一个小型的XML文档,该文档描述了实际的事件,如服务状态表的改变。在服务器端,一个事件服务器等待订阅和退订请求。事件服务器是一个类HTTP服务器的实现通用事件提醒架构协议(GENA:GeneralEventNotificationArchitecture)的服务器。一个设备将可能根据设备提供的服务的组合(情况)必须运行多于一个的事件服务器。1.1.5、表示(Presentation)由于设备需要或支持用户交互,在表示阶段一个控制点能下载一个为设备描述用户界面的HTML文档。这是一个能提供一种控制或状态显示的标准HTML文档。如检索描述文档一样,检索表示文档的协议也是基于TCP的HTTP协议。控制点使用描述文档中包含的表示URL来请求表示文档。不是所有设备都拥有表示文档也不是所有控制点能够显示包含复杂HTML对象如框架,嵌入式Javaapplets等的表示文档。1.1.6、控制点和设备的交互下图显示了前面章节描述的在UPnP各阶段控制点和设备之间进行交互的(动作)序列。图后对每一步进行了描述。这些描述指示出了控制点和设备采用的API调用和SDK中产生的网络包类型。需要注意的是,由于该序列的异步本性,交互本身并不是必须按显示的顺序发生,控制和事件步骤能以任意顺序发生。图一、控制点和设备的交互序列1.控制点使用UpnpSearchAsync()API发出一个搜索请求。UPnP设备开发包(SDK)产生一个多播M-SEARCHSSDP消息并发送到网络上。2.如果设备匹配了控制点的搜索,SDK产生一个单播UDP的NOTIFY响应,该响应包含指向设备描述文档的URL。SDK使用UpnpRegisterRootDevice()或UpnpRegisterRootDevice2()注册的设备描述文档包含的信息自动响应。3.如果控制点需要设备的更多信息,他将调用UpnpDownloadXmlDoc(),该调用使用设备响应给出的URL作为 参数 转速和进给参数表a氧化沟运行参数高温蒸汽处理医疗废物pid参数自整定算法口腔医院集中消毒供应 。UpnpDownloadXmlDoc()使用标准的HTTPGET请求下载XML描述文档并且返回一个代表设备描述的DOM文档。这一步可能重复执行以检索设备的服务描述文档。第5页4.设备上包含的Web服务器对请求作出响应并返回XML描述文档。5.为了自动接收设备变化提醒,控制点订阅他感兴趣的服务。控制点通过UpnpSubscribe()或UpnpSubscribeAsync()订阅。控制点从他想订阅的服务的设备描述文档中提取出订阅URL,并且调用其中一个订阅函数。对每一个订阅调用,SDK通过包含一个URL的HTTP发送一个SUBSCRIBE消息给发送事件者。6.设备对订阅请求进行应答并返回一个唯一的订阅标识符。7.控制点通过改变设备中包含的某个状态变量来指示设备执行某种动作。发送控制请求的URL包含在设备描述文件中。控制点调用UpnpSendAction()或UpnpSendActionAsync()来改变状态。SDK通过HTTPM-POST命令产生一个SOAP动作。8.设备更改其内部变量的状态并产生一个SOAP应答消息。9.设备能通知客户端其状态的改变,不管其改变是由于如第8步中的显示动作还是设备自身的隐式改变。设备调用UpnpNotify()或UpnpNotifyExt()来发送更新。SDK通过HTTP的单播NOTIFY消息自动通知所有已订阅的控制点。1.2、SDK架构下图显示了SDK的架构:图二、SDK架构高层示意图接下来的章节将对该图的每个部分进行描述,想了解协议有关的任何信息,请参见文档《UniversalPlugandPlayDeviceArchitecture》(《通用即插即用设备架构》)。第6页1.2.1、设备/控制点程序客户提供客户端或服务器程序运行在SDK的顶层。客户端或服务器程序实现一个特定服务的功能性。例如,一个网关服务,服务器软件实现“Internet使能”(EnableInternet)功能,控制点软件能够使用UPnP控制它。SDK包含了一个示例服务和控制点程序作为其一部分。1.2.2、SDKAPISDKAPI从控制点和服务程序中抽象出核心UPnP协议的细节并给应用程序访问功能提供一个统一的接口。这使得开发者可以从他们关注SSDP,GENA和SOAP协议细节的编码中解脱出来。API层同时维护在SDK中注册的控制点和设备句柄的表格。对于每一次API函数的调用,SDK将通过检查句柄表格来验证该句柄。目前,在一个进程中一次只能有一个控制点和一个设备句柄。换句话说,一个应用程序一次只能注册为一个设备和一个控制点。该程序的任何进一步的注册请求都将失败。关于API的更多信息,参见《Intel®SDKforUPnP™Devicesv1.2APIReference》。1.2.3、SSDPSSDP模块实现了简单服务发现协议(SimpleServiceDiscoveryProtocol),提供UPnP的发现部分(phase)。这个模块允许控制点发送多播信息搜索网络上的服务和设备并接受应答。当网络上有新服务通告时,它也提供通知提醒。该模块同时允许设备在网络上多播他们的服务通告。1.2.4、迷你Web服务器(MiniWebServer)迷你Web服务器模块处理标准的HTTPGET请求。许多UPnP元素(elements)都被用这种基本的HTTP服务请求。该模块管理那些能GET命令获得的文档的地址并实现了使用HTTP协议的实际的数据流。迷你Web服务器模块实现了HTTP/1.1的RANGE头。这个头允许一个远程客户端请求一个文件中的特定的一片(或多片)而不是整个文件。一个实现该功能的应用程序可以在一个播放列表中查找到特定的音轨或者跳到一个媒体文件中的某个偏移位置。迷你Web服务器也支持HTTPPOST请求,他只为支持虚拟目录而非其他,关于虚拟目录的定义,参见1.3节。1.2.5、GENAGENA模块实现通用事件提醒架构(GeneralEventNotificationArchitecture,他)实现UPnP的事件部分(EventingPhase)。控制点使用该模块订阅和退订感兴趣的服务。服务应用程序从该模块中接收订阅和退订提醒并产生相应的事件。第7页1.2.6、SOAPSOAP模块实现简单对象访问协议(SimpleObjectAccessProtocol),他提供UPnP的控制部分(ControlPhase)。控制点使用该模块产生相应的XML文档来检索和改变一个服务的状态表。服务器使用该模块解码控制请求并产生正确的应答。1.2.7、HTTPHTTP语法 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 模块对接收的信息的HTTP头进行语法分析同时构建相应的发送信息的头。他能够处理HTTP/1.0和HTTP/1.1头。他也支持HTTP/1.1的分块编码语法。SDK缺省不支持使用HTTP/1.1的GET请求的分块编码。不过,当接受到分块编码信息时,他完全支持对他们的解码。1.2.8、迷你服务器迷你服务器层为GENA,SOAP,SSDP和迷你Web服务器的通用功能。该层接收所有的网络连接,确定请求来自何处,将HTTP头分离出来传给HTTP模块进行语法分析,将连接转移/传递(transfer)给相应的协议(模块)进行处理。HTTP头的第一行包含了请求(信息)。迷你服务器层最少要处理以下命令:●GET:控制点使用GET命令来检索描述文档和他的任何子元素包括表示文档,服务描述文档,与设备关联的图标。使用1.3节中描述的虚拟目录,设备应用程序能够请求SDK为应用程序产生回调(函数)来为特定目录处理GET请求。参见1.3节了解更多。●POST/M-POST:一个SOAP命令是以一个POST或M-POST命令的形式出现。所有提交到(postedto)设备描述文档指定的控制URL的POST命令都被转移到SOAP模块进行进一步的处理。POST命令同样支持虚拟目录,为应用程序产生回调。详见1.3节。●SUBSCRIBE:SUBSCRIBE命令被转移/传递给GENA模块进行后期处理。控制点使用SUBSCRIBE请求来订阅或更新一个为特定服务订阅的事件提醒。●UNSUBSCRIBE:UNSUBSCRIBE命令也是传递给GENA模块进行进一步处理。控制点使用UNSUBSCRIBE命令来提醒服务器他们不再希望接收事件提醒。●NOTIFY:NOTIFY命令被传递给其他模块进行进一步处理。在采用TCP连接时,他们被传递给GENA模块(处理);当使用UDP连接时(原文用UDPconnections),他们被传递给SSDP模块(处理)。NOTIFY命令可以是从服务器发给控制点的事件提醒,他包含一个事件的描述;他或者可以是一个设备或服务出现在网络上或者从网络上消失时的提醒。1.2.9、ThreadUtil库(TreadUtilLibrary)IntelUPnPSDK广泛使用线程来尽量的并行处理UPnP事务(traffic)。ThreadUtil库为SDK提供一个类似POSIX(POSIX-like)的线程API,线程管理例程和连接和非连接的链表管理工具。1.3、虚拟目录集成在SDK中的迷你Web服务器只是一个称为虚拟目录的概念。一个虚拟目录是一个HTTP第8页客户端可访问的目录,他不是与迷你服务器的根目录结构的物理结构相匹配。通常,发给Web服务器的URL与文件在Web服务器存储的实际物理结构一致。Web服务器将客户端传来的URL前缀映射成根目录并在文件系统中打开那个文件,将数据反馈回客户端。使用一个虚拟目录,一个设备应用程序能够将它发送请求并希望接收回调的地方注册为一个特定的目录。例如,假设一个设备拥有一个如下的目录结构:index.htmldevice.xmlservice.xml为检索到index.html,一个服务器可能使用一个标准的HTTPGET请求:GET/index.htmlHTTP/1.0假如设备应用程序注册了一个虚拟目录叫“media”。一个客户端则可以使用一个请求如:GET/media/MySong.mp3HTTP/1.0设备应用程序从迷你Web服务器获得一个回调,他要求设备应用程序为客户端返回数据。迷你服务器并不关心数据来自哪里,他可能来自互联网,或者从迷你Web服务器的根目录之外读取一个文件,也可能是动态产生的。设备应用程序用来接收回调的API与标准的文件接口非常相似,他包含一个六个函数指针的结构:get_info()是请求的第一个回调函数。他将一个含有客户请求URL信息的结构体传给应用程序。应用程序将文件信息如文件大小等传回给迷你Web服务器。该信息变成了HTTP回复头的基础。open()取回一块数据。迷你Web服务器在一个HTTPGET请求中反复的调用该函数直到该函数不再返回任何数据。write()写入一块数据。迷你Web服务器在一个对一个虚拟目录的HTTPPOST请求中反复的调用该函数。seek()在一个文件中改变位置。迷你Web服务器主要使用该函数来满足请求一个文件中特定偏移的HTTPRANGE请求。close()关闭文件句柄。一个设备应用程序通过UpnpSetVirtualDirCallbacks()来注册这些回调函数。添加一个新的虚拟目录列表映射使用UpnpAddVirtualDir()。注意,传给UpnpAddVirtualDir()的目录变成了迷你Web服务器的前缀来决定他是否产生一个回调。UpnpRemoveVirtualDir()用来移除一个单一的虚拟目录映射,UpnpRemooveAllVirtualDirs()用来移除所有映射。关于这些函数的详细信息,参阅《Intel®SDKforUPnP™Devicesv1.2APIReference》。第9页2、编写一个UPnP设备使用UPnP设备开发的SDK实现一个UPnP设备有很多方法,然而,任何实现都必须完成一些基本步骤。确切来说,一个应用程序必须:1、使用以下基本步骤安装和初始化一个设备:a、使用UpnpInit()初始化SDK。b、使用UpnpRegisterWebServerRootDir()设置迷你Web服务器的根目录。c、使用UpnpRegisterRootDevice()或者UpnpRegisterRootDevice2()来注册一个设备描述文档。d、完成任何与特定设备有关的初始化工作。e、使用UpnpSendAdvertisement()在网络上发布设备通告。2、处理异步请求。设备需要处理三种不同类型的请求:a、订阅设备状态改变的提醒消息的请求。b、检索设备状态变量的当前值的请求。c、改变设备状态变量的值的请求。3、通过使用UpnpNotify()或UpnpNotifyExt()发送事件消息来保持控制点的信息为最新。4、遵循以下步骤关闭设备:a、发出SSDP的“bye-bye”消息并且使用UpnpUnRegisterRootDevice()来从SDK注销设备。b、使用UpnpFinish()关闭SDK。接下来的讨论中,我们使用/upnp/sample/tvdevice/中找到的实现一个TV设备的示例作为例子。为保持文档的清晰,部分示例代码被移除,对于SDKAPI函数的完整描述,参见SDK中包含的《Intel®SDKforUPnP™Devicesv1.2APIReference》。2.1、安装和初始化2.1.1、初始化SDK开始实现设备前,编写或获得一个将要使用的设备和服务描述文档是很重要的。他们指定了设备支持的服务的类型和数量,以及每个服务支持的动作、参数和变量。详见《通用即插即用设备架构》文档或者与特定设备有关的规范。TV设备用到的设备和服务描述文档在upnp/sample/tvdevice/web目录。需要重点注意的是,这个示例设备不是一个以认证的UPnP设备。应用程序必须在使用任何API函数前初始化SDK:if((ret=UpnpInit(ip_address,port))!=UPNP_E_SUCCESS){SampleUtil_Print("ErrorwithUpnpInit--%d\n",ret;)UpnpFinish();returnret;}应用程序在初始化时指定IP地址和端口号,这被用来设定服务器的接口和端口以侦听UPnP第10页和HTTP请求。如果IP地址为NULL,1。如果端口号为0,将使用一个随机的端口号。你可在SDK初始化之后使用UpnpGetServerIpAddress()和UpnpGetServerPort()来检索IP地址和端口号。2.1.2、设置根目录一旦SDK初始化完成,设备应用程序可以指定Web服务器的根目录。这是一个本地目录,Web服务器搜索以为应答HTTP请求提供文件。指定根目录是可选的。如果根目录未指定,则仅有对包含在虚拟目录列表中的文档的请求能够通过已注册的回调函数提供。应用程序用于确保指定目录下包含必要的文件(例如设备和服务描述文件)。本示例的Web目录是/upnp/sample/tvdevice/web.charweb_dir_path[]=“./web”;if((ret=UpnpSetWebServerRootDir(web_dir_path))!=UPNP_E_SUCCESS){SampleUtil_Print("Errorspecifyingwebserverrootdirectory--%s:%d\n",web_dir_path,ret);UpnpFinish();returnret;}需要注意的事,一旦UpnpInit()运行成功,非常重要的是当发生错误要关闭设备时,必须调用UpnpFinish以让SDK有机会清除(释放)他已分配的资源。2.1.3、注册一个根设备安装设备的下一步是在SDK中注册,有两个函数用来注册设备,UpnpRegisterRootDevice()和UpnpRegisterRootDevice2()。第一个函数采用一个完整的(fullyqualified)描述URL作为输入,第二个可采用各种不同类型的描述文档。下面的例子采用第一种 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 :if((ret=UpnpRegisterRootDevice(desc_doc_url,TvDeviceCallbackEventHandler,&Cookie,&device_handle))!=UPNP_E_SUCCESS){SampleUtil_Print("Errorregisteringtherootdevice:%d\n",ret;)UpnpFinish();returnret;}这个函数的第一个参数是描述文档URL。他必须指向设备的有效描述文档。如果描述文档是包含在SDK中的Web服务器用来服务的文件,他可能位于UpnpSetWebServerRootDir()指定的目录之外。第二个参数用SDK中注册回调函数。回调函数的原型是:intCallbackFxn(Upnp_EventTypeEventType,void*Event,void*Cookie;)每当设备从网络上接收到一个请求,例如一个订阅请求,一个获取变量请求或者一个动作1当前实现版本侦听所有接口,初始化时指定的IP地址仅影响SSDP通告阶段的被通告的IP地址和(对其)搜索的回复。第11页请求,这个函数将使用合适的参数在一个独立的线程中调用。EventType指定接收到的请求的类型,Event参数是一个结构体,他的实际类型因EventType的不同而各异。Cookie是在UpnpRegisterRootDevice()中指定的应用程序相关的数据。对于TV示例注册的回调函数是:intTvDeviceCallbackEventHandler(Upnp_EventTypeEventType,void*Event,void*Cookie)UpnpRegisterRootDevice()的第三参数是用户指定的无类型指针。他可以是任何指针并可用于指向应用程序特定的数据。他也可以为空。如果指针被使用,应用程序负责分配和回收该指针。该指针在接收到一个请求时被传回给应用程序。UpnpRegisterRootDevice()最后一个参数是一个指针,用来分配应用程序存储设备句柄的空间。设备句柄是一个其他API函数使用的参数。2.1.4、设备相关初始化到目前位置,我们都没有讨论与设备和应用程序相关的初始化(操作)。在设备发布公告之前,必须做好所有设备和应用程序相关的初始化。一旦设备被通告出去,他能立即接收请求。设备既要负责维护设备状态变量的值,也要正确的操作他们以响应动作。在TV设备示例代码中,函数TvDeviceStateTableInit()初始化内部数据结构,该数据结构用于存放状态变量,设备ID,动作指针等。2.1.5、发布设备公告(AdvertisingtheDevice)安装UPnP设备的最后一步就是发出公告:intdefault_advr_expire=100;if((ret=UpnpSendAdvertisement(device_handle,default_advr_expire))!=UPNP_E_SUCCESS){SampleUtil_Print("Errorsendingadvertisements:%d\n",ret;)UpnpFinish();returnret;}第一个参数是注册时返回的设备句柄。第二个参数是公告的超期时间。这设备的生命周期中,SDK在他超时前会自动重新发布设备公告。至此,设备以准备好接收请求了。应用程序必须将自己设在一个循环中或者等待(符合)某种条件(时)关闭(设备)。2.2、处理请求在设备的生命周期中,他的主要目的就是处理控制点发给他的各种请求。请求被SDK接收后,他们被通过设备注册时指定的回调函数转发给应用程序。根据请求的类型不同,回调函数使用适当的参数在一个独立的进程中调用。设备处理的有三种请求:●订阅请求●获取变量请求第12页●动作请求注意,设备不需要处理任何发现请求,因为SDK拥有该设备的设备描述文档(在执行UpnpRegisterRootDevice()时传递),他(SDK)能够自动判定搜索发现规则是否与该设备匹配。如果匹配,他将以设备描述文档URL作为响应。请求类型在回调函数中通过EventType变量指示。TV设备示例的回调函数如下:intTvDeviceCallbackEventHandler(Upnp_EventTypeEventType,void*Event,void*Cookie){switch(EventType{)caseUPNP_EVENT_SUBSCRIPTION_REQUEST:TvDeviceHandleSubscriptionRequest((structUpnp_Subscription_Request*)Event);break;caseUPNP_CONTROL_GET_VAR_REQUEST:TvDeviceHandleGetVarRequest((structUpnp_State_Var_Request*)Event);break;caseUPNP_CONTROL_ACTION_REQUEST:TvDeviceHandleActionRequest((structUpnp_Action_Request*)Event);break;default:SampleUtil_Print("ErrorinTvDeviceCallbackEventHandler:unknowneventtype%d\n",EventType;)}return;0}2.2.1、订阅请求当控制点产生一个订阅请求,SDK将调用注册的回调函数并将EventType变量值设为UPNP_EVENT_SUBSCRIPTION_REQUEST。设备负责通过UpnpAcceptSubscription()或者UpnpAcceptSubscriptionExt()来接受订阅。然后发送当前状态表给控制点。这两个函数的差别仅在于应用程序如何将状态表传给SDK以发送给订阅的控制点。UpnpAcceptSubscription()采用一对字符串数组来存储“变量/值”对。UpnpAcceptSubscriptionExt()采用DOM文档来存放当前变量的值。DOM文档格式在《UniversalPlugandPlayDeviceArchitecture》(《通用即插即用设备架构》)文档的4.3节中给出。TV示例使用UpnpAcceptSubscription():int
本文档为【UPnP编程指南】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
云匠
暂无简介~
格式:pdf
大小:1MB
软件:PDF阅读器
页数:25
分类:
上传时间:2022-09-20
浏览量:3