【流媒体】UPnP的工作过程
UPnP简介
通用即插即用(英语:Universal Plug and Play,简称UPnP)是由“通用即插即用论坛”(UPnP™ Forum)推广的一套网络协议。
该协议的目标是使家庭网络(数据共享、通信和娱乐)和公司网络中的各种设备能够相互无缝连接,并简化相关网络的实现。
UPnP通过定义和发布基于开放、因特网通讯网协议标准的UPnP设备控制协议来实现这一目标。
UPnP这个概念是从即插即用(Plug-and-play)派生而来的,即插即用是一种热拔插技术。
UPnP体系允许 PC 间的点对点连接、网际互连和无线设备。它是一种基于TCP/IP、UDP和HTTP的分布式、开放体系。
UPnP使得任意两个设备能在LAN控制设备的管理下相互通信。其特性包括:
- 传输介质和设备独立。UPnP 技术可以应用在许多媒体上,包括电话线、电线(电力线通信PLC)、以太网、红外通信技术(IrDA)、无线电(Wi-Fi,蓝牙)和Firewire(1394)。无需任务设备驱动;而是采用共同的协议。
- 用户界面(UI)控制。UPnP 技术使得设备厂商可以通过网页浏览器来控制设备并进行交互。
- 操作系统和程序语言独立。任何操作系统和程序语言均可以用于构建 UPnP产品。UPnP 并没有设定或限制运行于控制设备上的应用程序 API;OS厂商可以创建满足他们客户需求的 API。UPnP使得厂商可以像开发常规应用程序一样来控制设备 UI 和交互。
- 基于因特网技术。UPnP 构建于 IP, TCP, UDP, HTTP,和 XML 等许多协议之上。
- 编程控制。UPnP 体系同时支持常规应用程序编程控制。
- 扩展性。每个 UPnP 设备都可以有构建于基本体系之上、与具体设备相关的服务。
UPnP的工作过程分为6步。
一、寻址(Addressing)
地址是整个UPnP系统工作的基础条件,每个设备都应当是DHCP(Dynamic Host Configuration Protocol 动态主机配置协议)的客户。
当设备首次与网络建立连接后,利用DHCP服务,使设备得到一个IP地址。这个IP地址可以是DHCP系统指定的,也可以是由设备选择的。
当局域网内没有提供DHCP服务时,UPnP设备将按照Auto-IP的协议,从169.254/169.16地址范围获取一个局域网内唯一的IP地址。
设备还可以使用friendly name,这就需要域名解析服务(DNS)来转换name和IP。这个过程用到的东西都是现存的,而且是很普及的,市面上买的路由器都会有。
二、发现(Discovery)
发现是 UPnP工作第一步。
当一个 设备被添加到网络后,UPnP的发现协议允许该设备向网络上的Control Points(CPs)通知(advise)自己拥有的服务。
同样,当一个CP被添加到网络后, UPnP发现协议允许该CP 搜索网络上可用的设备 。
这两种情况下的组播消息一般是设备和服务的基本信息,如它的类型, 唯一标识符,当前状态参数等等。要注意设备信息和服务信息都是要组播出去的。
发现的过程可以用下面Figure 1-1来描述。
下面详细叙述UPnP发现设备用到的协议:SSDP(Simple Service Discovery Protocol,简单服务发现协议),说明设备是怎样向网络通知或者撤销自己可以提供的服务;CP是如何搜索设备以及设备是如何回应搜索的。
SSDP格式套用HTTP1.1的部分消息头字段,但是和HTTP不同,SSDP是采用UDP传输的,而且SSDP没有Message Body,就是说SSDP只有信头而没有信件内容的。
SSDP第一个要填充的字段是star - line,说明这是个什么类型的消息。
比如填"NOTIFY * HTTP/1.1/r/n",就说明这个SSDP消息是个通知消息,一般设备加入网络或者离开网络都要NOTIFY,更新自己的服务后也要NOTIFY一下。
别的设备看见这个消息的star - line就知道有设备状态变了,自己就打开这个消息看一下有没有需要更新的。
如果填"NOTIFY * HTTP/1.1/r/n",就要填LOCATION字段,填一个description URL,CP可以通过这个地址来取得设备的详细信息。
填"M-SEARCH * HTTP/1.1/r/n"就是要搜索了;respone别人的搜索就填"HTTP/1.1 200 OK/r/n"。
SSDP第二个要填充的字段是目的地址HOST。
比如填上"HOST: 239.255.255.250:1900",就是组播(multicast)搜索,这里239.255.255.250是组播地址,就是说这条消息会给网络里面该组地址的设备发,1900是SSDP协议的端口号。如果HOST地址是特定地址,那这就是单播(unicast)。
Respone不填这个字段,他会在ST字段里面填respone address,就是发来搜索信息的设备的地址,Respone消息的话还会发送一个包含自己地址URL的字段,Respone的意思就是跟Searcher说:我好像是你要找的人,我的电话是XXX,详细情况请CALL我。Respone也是UDP单播。
往后的字段就不细说了。通过字段的组合可以发送很多不同的信息。
三、描述(Description)
前面我们说了CP想要一个device更详细的信息,就跟返回给它的URL跟它要。
返回来的东西一般是个XML(Extensible Markup Language,是种结构化的数据。和HTML比较像,有tag和data),描述分为两部分:一个是device description,是device的物理描述,就是说这个device是什么;还有一个是service descriptions,就是device的服务描述了,就是device能干些什么。这些device和device service的描述的格式也是有要求的,开发商也可以自定义,只要符合UPnP Forum的规范。
这里稍微解释一下设备描述和服务描述。
首先说设备,比如一个家庭影院,有显示屏,有功放音响,还有蓝光机。那么这个家庭影院home threatre,就是一个根设备(root device),它下属有Screen,Amplifier,BDplayer这些从设备。home threatre的描述XML中会有一个device list,列出Screen,Amplifier,BDplayer这些设备的基本信息及这些设备描述的URL,以及设备的presentationURL(这类似于web服务器,通过访问presentationURL,本地会加载一个网页,在这个网页上可以操作设备及其它拥有的服务);还会有一个sevice list,里面列出home threatre可调用的服务基本信息及服务描述URL。
再者就是服务,通过访问服务描述URL,可以取得服务描述XML,里面会详细介绍服务的信息,包括干什么用的,属于哪个设备,有哪些action,需要哪些参数,怎么调用等等。
四、控制(Control)
拿到device description和service descriptions以后,那我们怎么去遥控这些设备呢?
在设备描述部分,device description还有关于如何控制device的描述,会给出一个Control URL,CP可以向这个URL发送不同的控制信息就可以控制device了,然后device也可以返回一个信息反馈。
这种CP和device之间沟通信息按照Simple Object Access Protocol (SOAP)的格式来写。SOAP通过HTTP来传,现在的版本是1.1,叫做SOAP 1.1 UPnP Profile。
这个Profile把控制/反馈信息分成三种:UPnP Control Request,UPnP Control Response和UPnP Control Error Response,都比较好理解。
SOAP协议是有信内容Body的,和SSDP不一样。消息Body里面就可以写想调用的动作了,叫做Action invocation,可能还要传参数,比如想播放一个视频,要把视频的URL传过去;device收到后要respone,表示能不能执行调用,出错的话会返回一个错误代码。
五、事件(Eventing)
在服务进行的整个时间内,只要变量值发生了变化或者模式的状态发生了改变,就产生了一个事件,该事件服务提供者(某设备的某个服务)会把该事件向整个网络进行多播(multicast)。
另外,CP也可以事先向事件服务器订阅事件信息,就像RSS订阅一样,保证将该CP感兴趣的事件及时准确地单播传送过来(unicast)。
下面是一个Unicast eventing 的architecture图,CP是subscriber,服务器是publisher。
subscriber(通常是个CP)向publisher(通常是个service)发送订阅消息(subscribe),更新订阅消息(renewal),退订消息(cancel)。publisher向subscriber推送订阅(event:SIDX)。
事件的订阅和推送这块用的通信协议是GENA(General Event Notification Architecture) ,通过HTTP/TCP/IP传送。GENA的格式就不细说了,详细请参阅UPnP-arch-DeviceArchitecture-v1.1。下面列出订阅过程供参考:
- 订阅。subscriber发送订阅消息主要包含事件URL(evenURL),服务ID号(service identifier),这两个可以在设备服务描述信息中找到,以及寄送地址(delivery URL)。还会包含一个订阅期限(duration)。
- 成功订阅。publisher收到订阅信息,如果同意订阅的话就会为每个新subscriber 生成一个唯一的subscriber identifier并记录subscriber 的duration和delivery URL。还会记录一个顺序增长event key用来保证事件确实推送到subscriber那里。比如说有个新事件,key是6,然后把这个事件推送给某个subscriber那里,subscriber那里记录的event key是4,现在收到的事件key是6,他就知道他没收到key为5的事件,这样他就向publisher索要漏收的事件,从而保证双方变量值或状态的一致。
- 首次推送。同意订阅之后还会向subscriber发送一组初始变量或状态值,进行首次同步。
- 续订。subscriber必须在订阅到期前发送renewal续订。
- 订阅到期。订阅到期后publisher会把subscriber的信息删除,subscriber又回到订阅前的状态。
- 退订。subscriber发送cancel信息将会取消订阅。subscriber因非正常退出网络的话,则不会退订直到订阅到期。
- 订阅操作失败信息。当订阅、续订和退订不能被publisher接收或者出现错误时,publisher会发送一个错误代码。
再简单说下多播(multicast,或者叫组播,两者等同)和单播。
event的组播采用UDP/IP,和SSDP一样,就是端口号变成了7900。
下图是几个协议的所处层的位置,可以清楚地看到它们之间的差别。
首先关于IP多播,要知道只存在UDP多播,没有TCP多播这回事。为什么呢?多播的重点是提高网络效率,将同一数据包发送给尽可能多的可能未知的计算机。像这种对网内所有设备的频繁消息通知采用多播是为了减小网络负担,SSDP也是一样。
但是SSDP和multicast这种采用UDP方式的协议存在一个问题,就是可靠性不够。解决的办法就是多次通知,但是一般不会超过三次以免增加网络负担,这样就得不偿失了。像SSDP的话会采用定期广播advertice的方式,使各种各样原因而没收到advertice的CP重新获得advertice,又解决了UDP丢包的问题。
前面在寻址的时候用到的DHCP用的是UDP广播(broadcast)。当一个新的设备加入网络时,他想要分个IP,但又不知道DHCP服务器的IP地址,所以他就在网内广播,用255.255.255.255地址来通知所有计算机。DHCP服务器收到请求后会为他申请并返回一个IP地址。
六、表达(Presentation)
只要得到了设备的URL,就可以取得该设备表达的URL,取得该设备表达的HTML,然后可以将此HTML纳入CP的本地浏览器上。
这部分还包括与用户对话的界面,以及与用户进行会话的处理。因此设备表达可以理解成“遥控器”。这部分定义描述界面,规范界面以及传输界面内容。
远程界面是供CP用户使用的,CP用户通过远程界面完成设备描述的获取,控制设备,订阅收取设备事件等等。
总结
UPnP分为6个步骤:
- 最先是Addressing,设备加入网络,通过DHCP或者Auto-IP获得IP。
- 然后是Discovery,采用SSDP协议(UDP),用multicast/unicast可以完成设备的上线和离线通知和组播搜索设备,设备用unicast(单播,UDP)响应CP的搜索。
- 往下是Description,通过HTTP协议(TCP)取回来是一个XML文档,包含物理描述和服务描述;
- 再者是Control,采用SOAP协议(HTTP/TCP),完成CP和devices之间的交互;
- 接着是Eventing,采用GENA协议(HTTP/TCP),完成设备事件消息的订阅和推送,为保证可靠性,故是TCP传输;事件的推送还有multicast (UDP)。
- 最后是Presentation。UPnP并没有定义Presentation应该有哪些东西。一个HTML嘛,哪样写得好哪样来!
【流媒体】UPnP的工作过程的更多相关文章
- 《CPU的工作过程》
本文转载自inter官方网址:https://software.intel.com/zh-cn/articles/book-Processor-Architecture_CPU_work_proces ...
- 测试或运维工作过程中最常用的几个linux命令?
大家在测试工作过程中,可能会遇到需要你去服务器修改一些配置文件,譬如说某个字段的值是1 则关联老版本,是0则关联新版本,这时候你可能就需要会下vi的命令操作:或者查看session设置的时长,可能需 ...
- 主动模式下FTP的详细工作过程(转) 挺详细
主动模式下FTP的详细工作过程 PORT FTP是常用的FTP工作方式,当客户端的连接请求到来时,FTP服务器会利用默认的21端口与客户端建立连接,该连接属于命令通道,利用该通道来下达控 制指令: ...
- Nginx reopen reload作用及工作过程
http://www.iigrowing.cn/nginx-reopen-reload-zuo-yong-ji-gong-zuo-guo-cheng.html Nginx reopen reload作 ...
- LTE工作过程
LTE工作过程 一.LTE开机及工作过程如下图所示: 二.小区搜索及同步过程 整个小区搜索及同步过程的示意图及流程图如下: 1) UE开机,在可能存在LTE小区的几个中心频点上接收信号(PSS), ...
- DHCP工作过程详解
DHCP动态主机配置协议的作用我想作为网管的兄弟们都应该知道了,这里我就不多废话了,今天我要谈的是DHCP的工作过程,了解了工作过程,要排除故障就容易了. 一.DHCP客户机初始化: 1. 寻找D ...
- OpenWrt的主Makefile工作过程
OpenWrt是一个典型的嵌入式Linux工程,了解OpenWrt的Makefile的工作过程对提高嵌入式Linux工程的开发能力有极其重要意义. OpenWrt的主Makefile文件只有100行, ...
- 《Android开发艺术探索》读书笔记 (9) 第9章 四大组件的工作过程
第9章 四大组件的工作过程 9.1 四大组件的运行状态 (1)四大组件中只有BroadcastReceiver既可以在AndroidManifest文件中注册,也可以在代码中注册,其他三个组件都必须在 ...
- Activity工作过程
Activity工作过程: Activity.startActivity--> Activity.startActivityForResult--> Instrumentation.exe ...
随机推荐
- Swift3 隐藏状态栏,修改状态栏颜色
之前做法: override func viewWillAppear(_ animated: Bool) { UIApplication.shared.isStatusBarHidden = true ...
- [SQL Server]从 varchar 数据类型到 datetime 数据类型的转换产生一个超出范围的值。
见下图sql, 使用dateadd()转换时报如题错误, 原因是数据库表中存入的数据格式不正确, 数据格式不正确, 数据格式不正确, 重要的事情讲3遍!! ca.batch_no的前8位必须是日 ...
- linux shell 脚本攻略学习15--如何只列出目录,如何快速切换目录
工作中经常遇到关于目录方面的问题,例如,如何只列出当前目录下的所有目录,以及如何快速高效的切换目录,而不需要使用鼠标,下面将简单介绍关于这两方面的解决方案: 一.如何只列出目录? 看似简单的任务,其实 ...
- 实现iOS序列化与反序列化(runtime)
一.变量声明 为便于下文讨论,提前创建父类Biology以及子类Person: Biology: @interface Biology : NSObject { NSInteger *_hairCou ...
- golang下划线(underscore) 总结
一.概述 "_" 可以简单理解为赋值但以后不再使用,在golang中使用的比较多,使用的场合也很多,稍作总结: 二.场景 1.import import _ "net/h ...
- 解决Android中多次点击(快速点击多次 )启动多个相同界面的问题
通过以下代码可以解决这个问题. /** * 防止快速点击 * @param ev * @return */ @Override public boolean dispatchTouchEvent(Mo ...
- Android上面通过URL来启动本地应用
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" ...
- sql 置顶功能的查询
sql中有置顶的需求,文章很多条,分页查询,要求置顶的在最前面: 只需要使用: order by 置顶字段 即可
- 当 Swoole 遇上 ThinkPHP5 世界你好
本文假设你已经有了 Linux 操作系统的 PHP 环境,强烈推荐使用 Vagrant 来搭建开发环境 安装 Swoole PECL 拓展 可以通过 pecl 命令或者通过源码包编译安装,本文采用 p ...
- 关于Android NDK中调用第三方的动态库
因为最近在整合Android 上RTSP播放器的网络库,因需要调用自己编译的网络库,调用一直出现问题,开始时是直接在Android.mk 中加入LOCAL_SHARED_LIBRARIES := li ...