简介
UPnP 是针对智能家电、 无线设备以及各种外观尺寸的个人电脑的普遍对等(peer-to-peer)网络连接而设计的一种架构。它旨在为家庭、小型企业、公共场所中或连接到互联网的 ad-hoc 网或未管理网络提供易于使用、灵活且基于标准的连接。 UPnP 是一个充分利用 TCP/IP 和 Web 技术的分布式开放型网络体系结构,除能够在家中、办公室和公共场所联网设备之间的完整控制和数据传输之外,还可建立无缝紧密的连接网络。
开始
UPnP是微软推行的一个标准,它希望只要任何一个设备连接上网络,这个网络上的所有其他设备都能够知道有新的设备加入,并且这些设备能够互相沟通。如果加入的设备是专门提供服务的,那么其他有控制功能的设备就可以直接去控制使用这个设备,完全不需要其他设定,这也是其即插即用的属性(UPnP)。
UPnP设备架构
UPnP针对发现,描述,控制,事件触发和展示采用了如下协议栈:
- UPnP是一个多层协议构成的框架体系,每一层都以相邻的下层为基础,同时又是相邻上层的基础。直至达到应用层为止。该图中的最下面是就是IP和TCP,共两层,负责设备的IP地址。
- 第三层是HTTP、HTTPU、HTTPMU,这一层,属于传送协议层。传送的是内容都经过“封装”后,存放在特定的XML文件中的。对应的SSDP、GENA、SOAP指的是保存在XML文件中的数据格式。到这一层,已经解决了UPnP设备的IP地址和传送信息问题。
- 第四层是UPnP设备体系定义,仅仅是一个抽象的、公用的设备模型。任何UPnP设备都必须使用这一层。
- 第五层是UPnP论坛的各个专业委员会的设备定义层,在这个论坛中,不同电器设备由不同的专业委员会定义,例如:电视委员会只负责定义网络电视设备部分,空调器委员会只负责定义网络空调设备部分,依此类推。所有的不同类型的设备都被定义成一个专门的架构或者模板,供建立设备的时候使用。可以推知,进入这一层,设备已经被指定了明确用途。当然,这些都必须遵守标准化的规范。从目前看,UPnP已经可以支持大部分的设备:从电脑、电脑外设,移动设备和家用消费类电子设备等等,无所不包,随着这个体系的普及,将可能有更多的厂家承认这一标准,最终,可能演化为公认的行业标准。
- 最上层,也就是应用层,由UPnP设备制造厂商定义的部分。这一层的信息是由设备制造厂商来“填充” 的,这部分一般有设备厂商提供的、对设备控制和操作的底层代码,然后,就是名称序列号呀,厂商信息之类的东西。
0.寻址
IP是UPnP协议最基础的部分,一个设备必须要有IP地址才能与其他设备进行通信。所以寻找地址(IP)是UPnP协议的第一步,这部分由IP协议完成。
1.发现
当设备A添加到网络中,设备A会通过UPnP使用多播的方式,大量通知网络中所有其他设备,宣告设备A添加到网络中。网络中的任何其他设备都可以收到设备A发送的宣告消息,如果其他设备对设备A感兴趣,都可以对该信息进行回复(因为消息中已经包含了设备A的相关必要信息,所以可以回复)。
在UPnP中使用多播的地址为规定的 239.255.255.250:1900,任何设备即使不使用UPnP协议也都可以监听这个多播地址,收到其中的信息。如果你不了解多播,你可以参考这篇文章Android中实现多播。
- 控制点:拥有控制功能的设备,我们称之为控制点
- 根设备:一个设备还可能拥有其他子设备,这个设备我们称之为根设备。比如,在电脑上我们可以外接其他的显示器,音响等等
- 服务:可以为其他设备提供服务的设备,比如播放视频,图片等,任何其他控制点都可以对服务进行控制
UPnP论坛工作委员会对UPnP中的消息格式都进行了规定,例如下面为UPnP的发现搜索alive的消息格式:
NOTIFY * HTTP/1.1
HOST: 239.255.255.250:1900
CACHE-CONTROL: max-age = seconds until advertisement expires
LOCATION: URL for UPnP description for root device
NT: notification type
NTS: ssdp:alive
SERVER: OS/version UPnP/1.1 product/version
USN: composite identifier for the advertisement
BOOTID.UPNP.ORG: number increased each time device sends an initial announce or an update
message
CONFIGID.UPNP.ORG: number used for caching description information
SEARCHPORT.UPNP.ORG: number identifies port on which device responds to unicast M-SEARCH
请求行
请求行必须是“NOTIFY * HTTP/1.1”
- Notify:用于发送通知或事件的方法;消息类型应该是通用型而不是某种特定资源,必须是*
- HTTP/1.1:HTTP版本号
消息头
- HOST:必选。该字段值是互联网号码颁发机构(IANA)为SSDP保留的多播地址和端口号。必须是 239.255.255.250:1900
- CACHE-CONTROL:必选。该字段值是用于标识广播有效的时间。在这个时间时候,就表示该服务不可用,但只要收到根设备或其嵌入式设备中的任何一个服务的任何广播,那么便认为这个设备的所有服务都可用。时间应大于1800秒。
- LOCATION:设备描述文件的URL。
- NT:Notification Type,这里的值upnp:rootdevice)表明这是一个“根设备”。每个设备可以有自己的子设备。
- NTS:Notification Sub Type,标准规定必须是ssdp:alive。
- SERVER:必选。由UPnP供应商指定,标识产品名称/产品版本
- USN:Unique Service Name,是一个设备实例的标识符
2.描述
简单说,这是声明“自己”是什么样的设备,例如名称、制造厂商、序列号码等等。刚开始“发现”设备后,控制点对这个设备的“了解”还很少,需要依据ULR找到该设备的描述文件,从这些文件中读取更多的描述信息。描述信息的范围很广,一般都是由设备的制造厂商提供的。主要的描述项目有:控制的模式名称和模式号码、设备序列号、制造厂商名称、厂商的WEB的ULR等等。这些一般都存放在特定的XML文件中。
设备的描述通过HTTP协议来完成。
<?xmlversionxmlversion="1.0" encoding="utf-8"?>
<rootxmlnsrootxmlns="urn:schemas-upnp-org:device-1-0">
<specVersion>
<major>1</major>
<minor>1</minor>
</specVersion>
<device>
<deviceType>urn:schemas-upnp-org:device:BinaryLight:1</deviceType>
<friendlyName>KitchenLights</friendlyName>
<manufacturer>OpenedHand</manufacturer>
<modelName>VirtualLight</modelName>
<UDN>uuid:cc93d8e6-6b8b-4f60-87ca-228c36b5b0e8</UDN>
<serviceList>
<service>
<serviceType>urn:schemas-upnp-org:service:SwitchPower:1</serviceType>
<serviceId>urn:upnp-org:serviceId:SwitchPower:1</serviceId>
<SCPDURL>/SwitchPower1.xml</SCPDURL>
<controlURL>/SwitchPower/Control</controlURL>
<eventSubURL>/SwitchPower/Event</eventSubURL>
</service>
</serviceList>
</device>
</root>
deviceType:设备类型,格式为:“urn:schemas-upnp-org:device:deviceType:v”,这里deviceType和v是由设备定义的。
friendlyName:一个更加友好的设备名。
Manufacturer:制造商。
modeName:型号。
UDN:Unique Device Name,设备的UUID。
serviceList:服务列表。
对于每一个服务:
serviceType:与deviceType类似,这里的后两段由服务定义。
serviceId:服务ID,通常于serviceType对应。
SCPDURL:服务描述的URL。
controlURL:用于控制的URL。
eventSubURL:用于订阅事件的URL。
3.控制
控制点找到设备描述之后,会从描述中“提炼”出要进行的操作并获悉所有的服务;对每个UPnP设备来说,这些描述必须是很确切、很详细的,描述中可能包含有命令或行为列表、服务响应信息、用到的参数等等。对于服务的每个行为,也伴有描述信息:主要是整个服务进行期间的变量、变量的数据类型、可用的取值范围和事件的特征。
要控制某个设备,控制点必须先发送一个控制行为请求,要求设备开始服务,然后再按设备的ULR发送相应的控制消息,控制消息就是放置在XML文件中的那些SOAP格式的信息。最后,服务会返回响应信息,指出服务是成功或是失败。
4.事件触发
在服务进行的整个时间内,只要变量值发生了变化或者模式的状态发生了改变,就产生了一个事件,系统将修改上述提到的事件列表的内容。随之,事件服务器把事件向整个网络进行广播。另一方面,控制点也可以事先向事件服务器预约事件信息,保证将该控制点感兴趣的事件及时准确地传送过来。
广播或预约事件,传送的都是事件消息,事件消息也放在XML文件中,使用的格式是GENA。设备投入工作之前的准备―――初始化过程,也是一个事件,初始化需要的各种信息也是用事件消息传送的。包括的内容主要是:变量初始值,模式的初始状态等等。
5.展示
只要得到了设备的ULR,就可以取得该设备表达页面的ULR,然后可以将此表达纳入用户的本地浏览器上。这部分还包括与用户对话的界面,以及与用户进行会话的处理。
术语缩写
缩写 | 全称 |
---|---|
ARP | 地址解析协议 |
DHCP | 动态主机配置协议 |
DNS | 域名系统 |
FXPP | 灵活的XML处理框架 |
GENA | 通用事件通知框架 |
HTML | 超文本标记协议 |
HTTPMU | 基于UDP的HTTP多播 |
HTTPU | 基于UDP的HTTP单播 |
ICANIN | 指定名称和编号的互联网公司 |
SOAP | 简单对象访问协议 |
SSDP | 简单服务发现协议 |
UPC | 通用产品代码 |
UPnP | UPnP |
URI | 统一资源标识符 |
URL | 统一资源定位器 |
URN | 统一资源名称 |
UUID | 全球唯一标识符 |
XML | 拓展标记语言 |