DLNA UPnP协议简介

DLNA-UPnP

DLNA和UPnP之间什么关系?

  • 定义了服务的功能、接口、参数。

相关名词

DLNA (Digital Living Network Alliance)数字生活网络联盟,狭义理解为家庭网络中的多屏互动,专业来说是一种媒体共享技术。按照功能分为DMS DMP DMR DMC。

UPnP(Universal Plug and Play):通用即插即用。DLNA是基于UPnP协议进行发现、选择设备的。

DMP(Digital Media Player):数字媒体播放器。能从DMS/M-DMS上查找并获取媒体内容并播放和渲染显示。比如智能电视、家庭影院等。

DMS(Digital Media Server):数字媒体服务器。提供媒体获取、记录、存储和输出功能。同时,内容保护功能是对DMS的强制要求。DMS总是包含DMP的功能,并且肯能包含其他智能功能,包括设备/用户服务的管理;丰富的用户界面;媒体管理/收集和分发功能。DMS的例子有PC、数字机顶盒(附带联网,存储功能)和摄像机等等。

DMC(Digital Media Controller):查找DMS的内容并建立DMS与DMR之间的连接并控制媒体的播放。如遥控器。

DMR(Digital Media Renderer):通过其他设备配置后,可以播放从DMS上的内容。与DMP的区别在于DMR只有接受媒体和播放功能,而没查找有浏览媒体的功能。比如显示器、音箱等。

SOAP -Simple Object Access Protocol简单对象访问协议。它是一种应用程序之间进行数据通讯的机制。它定义如何使用xml与http来执行远程过程调用,包括控制点如何发送命令消息给设备,设备收到命令消息后如何发送响应消息给控制点。

SSDP-Simple Service Discovery Protocol ,简单服务发现协议。 A multicast discovery and search mechanism that use a multicastvariant of HTTP over UDP.具体包括控制点如何发现网络上有哪些服务,以及这些服务的资讯,还有控制点本身宣告它提供哪些服务。

GENA:Generic Event Notification Architecture ,通用事件通知架构,定义在控制点想要监听设备的某个服务状态变量的状况时,控制点如何传送订阅信息并如何接收这些信息。The event subscription and notification protocol defined in “Eventing”

DLNA协议

数字生活网络联盟(英语:Digital Living Network Alliance,简称:DLNA)是一个由消费性电子、移动电话以及电脑厂商组成的联盟组织。该组织的目标在于创建一套可以使得各厂商的产品互相连接,互相适应的工业标准,从而为消费者实现数字化生活。联盟成员包括飞利浦、三星电子、松下、惠普、索尼、微软、英特尔和诺基亚在内的众多业界领袖。DLNA委员会已经于2017年1月5日正式解散,原因是旧的标准已经无法满足新设备的发展趋势,DLNA标准将来也不会再更新。但是DLNA协议的使用依然比较广泛,短时间内不会退出历史舞台,在某些情况下依然是最好的解决方案之一。DLNA不是技术,而是一种方案,一种大家可以遵守的规范,其各种技术和协议都是目前所应用很广泛的技术和协议(SSDP、SOAP等)。

DLNA协议栈

DLNP对等协议特点

  • DLNA是索尼、英特尔、微软等发起。苹果当时也是DLNA联盟的成员,而后来退出了并自立门户。 DLNA与苹果的AirPlay功能比较类似,协议也大体相同,他们都可以让你手机中的媒体内容投放到电视屏幕里。不同的是手机上的DLNA 并没有类似Apple TV的AirPlay 的镜像功能,也没有Apple TV 所支持的双屏体游戏体验。目前DLNA更多只是能将手机的照片和视频投送到大屏幕中。

  • Miracast是由Wi-Fi联盟于2012年所制定,以Wi-Fi直连为基础的无线显示标准。支持此标准的设备可通过无线方式分享视频画面,例如手机可通过Miracast将影片或照片直接在电视或其他装置。与DLNA不同的是,Miracast 也有类似于AirPlay 的镜像功能,可以将手机中屏幕内容直接投放到高清电视屏幕里,这样你也可以通过电视屏幕来玩游戏了。

  • AirPlay 是苹果开发的一种无线技术,可以通过WiFi将iPhone 、iPad、iPod touch 等iOS 设备上的包括图片、音频、视频通过无线的方式传输到支持AirPlay 设备。AirPlay 还有一个特殊的功能,这一功能叫AirPlay镜像,配合上Apple TV这以功能可以将iPhone 或者iPad 上的画面无线传输到电视上,也就是说你设备显示的是什么电视屏幕显示就就是什么,而不仅限于图片和视频。所以用这一个功能来玩游戏是非常酷的,你可以拿着iPad 来当做方向盘,然后看着大屏玩游戏。另外AirPlay镜像最强大地方是它可以实现双屏游戏,让你的游戏有更多的交互。

  • DLNA特点

    不管是UPnP还是DLNA都是不存在验证授权机制,也就是说只要进入局域网就可以任意调用。

    UPnP一般用于路由器上路由配置,链路转发,然后服务一般默认开启,这个利用场景相对风险较低一些,因为需要在其他设备存在问题,且路由器为公网ip的情况,才能实现公网直接访问的利用场景,其他场景的利用都是没有必要使用到这个场景的(也可能是我没有想到)。

    DLNA服务一般用于投屏,这个就是直接可以利用的;然后还有特殊场景,视频流拉取,操作指令控制等。

DLNA投屏流程介绍

DLNA投屏简介

UPnP协议

通用即插即用(英语:Universal Plug and Play,简称UPnP)是由“通用即插即用论坛”(UPnP™ Forum)推广的一套网络协议。该协议的目标是使家庭网络(数据共享、通信和娱乐)和公司网络中的各种设备能够相互无缝连接,并简化相关网络的实现。UPnP通过定义和发布基于开放、因特网通讯网协议标准的UPnP设备控制协议来实现这一目标。 UPnP这个概念是从即插即用(Plug-and-play)派生而来的,即插即用是一种热拔插技术。

UPnP协议栈

UPnP组件

完整的UPnP服务系统由支持UPnP的网络和符合UPnP规范的设备共同构成的。可以抽象成3BOX模型去理解。

整个系统是由Device、Service、和Control Point三部分所构成。各种状态信息,都保存在XML文件中,不同用途的信息,格式不同。保证可以各取所需,不会混淆。

  • 设备(Device)

这里是指符合UPnP规范的设备。一个UPnP设备可以看成一个包含服务并嵌套了常规设备的“容器” 。就是说,UPnP之下的设备不能仅仅理解为硬件意义上的设备,而应当包括服务功能。

  • 服务(Service)

设备执行用户请求的控制过程,可划分成一个个很小的阶段或单位,每个单位就称为一个服务。

其它设备服务,也是用这样思路来描述和定义的,一个设备也可以被定义多个服务。不论是设备的定义信息和服务的描述信息,都保存在一个XML文件中,这个文件也是UPnP协议构成的一部分。当设备建立和使用服务的时候,XML文件可以与它们进行关联。

XML文件中还有一个很关键的“状态表”,状态表可进一步分为“服务状态表”和“事件状态表”。整个UPnP设备运行的全过程内,状态表贯穿始终,当设备状态改变的时候,例如发生参数变化或状态刷新的时候,立即就在“状态表”中反映出来。

  • 控制点(Control Point):

在UPnP网络中,用户请求设备执行的控制是通过控制点实现的,控制点首先是一个有能力控制别的设备的控制者,还要具有在网络中 “发现”控制目标的能力。我理解,控制点就比如是用手机向大屏幕投屏,手机就是一个控制点。在发现(控制目标)之后,控制点应当:

①取得设备的描述信息并得到所关联的服务列表。

②取得相关服务的描述。

③调用控制服务行为。

④确定服务的事件 “源”,不论何时,只要服务状态发生改变,事件服务器会立即向控制点发送一个事件信息。

UPnP工作流程

1.寻址

❓地址的获得方式

地址是整个UPnP系统工作的基础条件,每个设备都应当是DHCP(Dynamic Host Configuration Protocol动态主机配置协议)的客户。

2.发现

可分成两种情况,一种是在有控制请求之后,在当前的网络中查找有无对应的可用设备;另一种情况是某一设备接入网络、取得IP地址之后,就开始向网络“广播”自己已经进入网络,即寻找控制请求。UPnP使用简单发现协议(SSDP)来完成发现,这是一个工作在UDP上的HTTP协议。

当一个设备加入网络,它将向组播发送消息,广播它可以提供的服务。

当控制点加入网络时,它也将组播发送消息,寻找它感兴趣的服务。

3.描述

控制点需要依据ULR找到该设备的描述文件,从这些文件中读取更多的描述信息。描述信息的范围很广,一般都是由设备的制造厂商提供的。主要的描述项目有:控制的模式名称和模式号码、设备序列号、制造厂商名称、厂商的WEB的ULR等等。这些一般都存放在特定的XML文件中。

这个描述文件的地址,会在设备对控制点的响应中传递,在回复的XML中,有一个LOCATION: http://192.168.2.3:49153/description.xml这样的字段。

img

打开网页获取描述文件:

<?xml version="1.0" encoding="utf-8"?>

<root xmlns="urn:schemas-upnp-org:device-1-0">  
  <specVersion> 
    <major>1</major>  
    <minor>0</minor> 
  </specVersion>  
  <device> 
    <deviceType>urn:schemas-upnp-org:device:MediaRenderer:1</deviceType>  
    <presentationURL>/</presentationURL>  
    <friendlyName>成精了的电视</friendlyName>  
    <manufacturer>XXXX</manufacturer>  
    <manufacturerURL>http://www.xxx.com</manufacturerURL>  
    <modelDescription>xxx Media Render</modelDescription>  
    <modelName>xxxxx</modelName>  
    <modelURL>http://www.xxx.com</modelURL>  
    <UDN>uuid:F7CA5454-3F48-4390-8009-dce3a07b5e48</UDN>  
    <UID>-1254112285</UID>  
    <serviceList> 
      <service> 
        <serviceType>urn:schemas-upnp-org:service:AVTransport:1</serviceType>
        <serviceId>urn:upnp-org:serviceId:AVTransport</serviceId>  
        <SCPDURL>/dlna/Render/AVTransport_scpd.xml</SCPDURL>  
        <controlURL>_urn:schemas-upnp-org:service:AVTransport_control</controlURL>
        <eventSubURL>_urn:schemas-upnp-org:service:AVTransport_event</eventSubURL>
      </service>  
      <service>
        <serviceType>urn:schemas-upnp-org:service:ConnectionManager:1</serviceType>
        <serviceId>urn:upnp-org:serviceId:ConnectionManager</serviceId>  
        <SCPDURL>/dlna/Render/ConnectionManager_scpd.xml</SCPDURL>
        <controlURL>_urn:schemas-upnp-org:service:ConnectionManager_control</controlURL>
        <eventSubURL>_urn:schemas-upnp-org:service:ConnectionManager_event</eventSubURL>
      </service>  
      <service> 
        <serviceType>urn:schemas-upnp-org:service:RenderingControl:1</serviceType>
        <serviceId>urn:upnp-org:serviceId:RenderingControl</serviceId>  
        <SCPDURL>/dlna/Render/RenderingControl_scpd.xml</SCPDURL>  
        <controlURL>_urn:schemas-upnp-org:service:RenderingControl_control</controlURL>
        <eventSubURL>_urn:schemas-upnp-org:service:RenderingControl_event</eventSubURL>
      </service> 
    </serviceList>  
    <av:X_RController_DeviceInfo xmlns:av="urn:mi-com:av">  
      <av:X_RController_Version>1.0</av:X_RController_Version>  
      <av:X_RController_ServiceList> 
        <av:X_RController_Service> 
          <av:X_RController_ServiceType>controller</av:X_RController_ServiceType>
          <av:X_RController_ActionList_URL>http://192.168.2.3:6095/</av:X_RController_ActionList_URL> 
        </av:X_RController_Service>  
        <av:X_RController_Service> 
          <av:X_RController_ServiceType>data</av:X_RController_ServiceType>
          <av:X_RController_ActionList_URL>http://api.tv.xx.com/bolt/3party/</av:X_RController_ActionList_URL> 
        </av:X_RController_Service> 
      </av:X_RController_ServiceList> 
    </av:X_RController_DeviceInfo> 
  </device>  
  <URLBase>http://192.168.2.3:49152/</URLBase> 
</root>

4.控制

要控制某个设备,控制点必须先发送一个控制行为请求,要求设备开始服务,然后再按设备的ULR发送相应的控制消息,控制消息就是放置在XML文件中的那些SOAP格式的信息。最后,服务会返回响应信息,指出服务是成功或是失败。UPnP使用SOAP完成控制。SOAP工作在HTTP上,使用XML来描述远程调用并返回结果。

往哪传送控制指令?在设备返回的可提供的服务列表里会有对应服务的controlURL,

5.事件

在服务进行的整个时间内,只要变量值发生了变化或者模式的状态发生了改变,就产生了一个事件,系统将修改上述提到的事件列表的内容。随之,事件服务器把事件向整个网络进行广播。另一方面,控制点也可以事先向事件服务器预约事件信息,保证将该控制点感兴趣的事件及时准确地传送过来。

这些消息也是通过XML传递的。控制点从哪里订阅这个设备的某个服务的事件呢?在ServiceList里,有一个eventSubURL。eventSubURL是用来向目标设备订阅该服务相关的事件回调的,需要控制端运行一个ServerSocket监听tcp请求。控制方监听事件,有事件发生就对事件进行回调处理。

6.展示presentation

HTML

被控制的设备有了URL可以展示运行的情况,可以让控制点去网页上看状态或进行控制。

SSDP message format

Simple Service Discovery Protocol ,简单服务发现协议。

SSDP使用了HTTP1.1的部分header,但并不是全部因为它是基于UDP实现的,所以有一些自己的规则。

SSDP消息必须有一条起始行start-line、消息头header fields。不能有消息体message body,如果接受到的SSDP message有消息体,要忽略掉。

1 Discovery

设备:Advertisement

指的是一个设备进入到家庭网络后,要向控制点广播它能提供的服务。它需要向一个标准地址和端口239.255.255.250:1900进行广播,控制点也是监听这个地址和端口的,

Advertisement protocol stack
设备的Notify消息

设备:就是自己告诉别人,让别人来找自己,需要广播什么信息呢?以下字段都是必选项。

NOTIFY * HTTP/1.1
HOST: 239.255.255.250:1900
CACHE-CONTROL: max-age=66
LOCATION: http://192.168.2.3:49153/description.xml
NT: upnp:rootdevice
NTS: ssdp:alive
SERVER: Linux/3.10.79, UPnP/1.0, Portable SDK for UPnP devices/1.6.13
USN: uuid:F7CA5454-3F48-4390-8009-2c3aed46c9a9::upnp:rootdevice

还有两个需要关注的值:NT和NTS,前者是Notify Type(与Search中的ST类似),后者表示NT的子类型,其值只可以是ssdp:alive或ssdp:byebye,目标设备会在生命周期中定期发送alive组播,在正常退出时发送byebye组播,也有实现会在目标设备上线时先发送byebye然后发送alive,便于控制端及时更新设备信息。NT有较多类型,我们只关注upnp:rootdevice类型的Notify即可。

控制点:Search

控制点使用search去发现设备。

Search Protocol Stack
M-SEARCH * HTTP/1.1
ST: upnp:rootdevice
HOST: 239.255.255.250:1900
MX: 3
MAN: "ssdp:discover"

其中ST是Search Type,常见的ST有ssdp:all、upnp:rootdevice、uuid:device-某UUID、urn:schemas-upnp-org:device:device-Type:version等,投屏这里使用的是upnp:rootdevice,HOST为组播地址,MX为最大等待时间,MAN为固定格式。

Search Response

一个响应消息的例子:

<?xml version="1.0" encoding="utf-8"?>

<root xmlns="urn:schemas-upnp-org:device-1-0">  
  <specVersion> 
    <major>1</major>  
    <minor>0</minor> 
  </specVersion>  
  <device> 
    <deviceType>urn:schemas-upnp-org:device:MediaRenderer:1</deviceType>  
    <presentationURL>/</presentationURL>  
    <friendlyName>成精了的电视</friendlyName>  
    <manufacturer>XXXX</manufacturer>  
    <manufacturerURL>http://www.xxx.com</manufacturerURL>  
    <modelDescription>xxx Media Render</modelDescription>  
    <modelName>xxxxx</modelName>  
    <modelURL>http://www.xxx.com</modelURL>  
    <UDN>uuid:F7CA5454-3F48-4390-8009-dce3a07b5e48</UDN>  
    <UID>-1254112285</UID>  
    <serviceList> 
      <service> 
        <serviceType>urn:schemas-upnp-org:service:AVTransport:1</serviceType>
        <serviceId>urn:upnp-org:serviceId:AVTransport</serviceId>  
        <SCPDURL>/dlna/Render/AVTransport_scpd.xml</SCPDURL>  
        <controlURL>_urn:schemas-upnp-org:service:AVTransport_control</controlURL>
        <eventSubURL>_urn:schemas-upnp-org:service:AVTransport_event</eventSubURL>
      </service>  
      <service>
        <serviceType>urn:schemas-upnp-org:service:ConnectionManager:1</serviceType>
        <serviceId>urn:upnp-org:serviceId:ConnectionManager</serviceId>  
        <SCPDURL>/dlna/Render/ConnectionManager_scpd.xml</SCPDURL>
        <controlURL>_urn:schemas-upnp-org:service:ConnectionManager_control</controlURL>
        <eventSubURL>_urn:schemas-upnp-org:service:ConnectionManager_event</eventSubURL>
      </service>  
      <service> 
        <serviceType>urn:schemas-upnp-org:service:RenderingControl:1</serviceType>
        <serviceId>urn:upnp-org:serviceId:RenderingControl</serviceId>  
        <SCPDURL>/dlna/Render/RenderingControl_scpd.xml</SCPDURL>  
        <controlURL>_urn:schemas-upnp-org:service:RenderingControl_control</controlURL>
        <eventSubURL>_urn:schemas-upnp-org:service:RenderingControl_event</eventSubURL>
      </service> 
    </serviceList>  
    <av:X_RController_DeviceInfo xmlns:av="urn:mi-com:av">  
      <av:X_RController_Version>1.0</av:X_RController_Version>  
      <av:X_RController_ServiceList> 
        <av:X_RController_Service> 
          <av:X_RController_ServiceType>controller</av:X_RController_ServiceType>
          <av:X_RController_ActionList_URL>http://192.168.2.3:6095/</av:X_RController_ActionList_URL> 
        </av:X_RController_Service>  
        <av:X_RController_Service> 
          <av:X_RController_ServiceType>data</av:X_RController_ServiceType>
          <av:X_RController_ActionList_URL>http://api.tv.xx.com/bolt/3party/</av:X_RController_ActionList_URL> 
        </av:X_RController_Service> 
      </av:X_RController_ServiceList> 
    </av:X_RController_DeviceInfo> 
  </device>  
  <URLBase>http://192.168.2.3:49152/</URLBase> 
</root>

2 Description

消息都是使用xml文件进行描述。

3 Control

控制信息的传递是基于SOAP协议的,Simple Object Access Protocol.简单对象访问权限。向controlURL发送控制指令,对应一个Action,设备会回应这个消息的结果。同时,这个action在设备执行后可能会产生一个状态变量的变化,这就产生了一个事件event.

如果要传送的数据量非常大的话就不推荐使用SOAP,可以使用带外传输。

控制阶段对传送的SOAP消息的响应,必须是从哪接收的请求,就把响应发回哪去(来和回的IP地址必须相同)

Control Protocol Stack

Action Request

❓SOAP 自动转换成soap消息格式?工具?

head部分

POST /_urn:schemas-upnp-org:service:AVTransport_control HTTP/1.1
Connection: close
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI"
Content-Type: text/xml;charset="utf-8"
Content-Length: 1464
Host: 192.168.2.3:49152
User-Agent: 

Body部分

<?xml version="1.0" encoding="utf-8"?>

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <s:Body>
    <u:SetAVTransportURI xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">  
      <InstanceID>0</InstanceID>  
      <CurrentURI>http://xxx.xxx.com/xxx.m3u8?bizid=xxx&amp;txSecret=fcexxxxxab4cf1b8bbee6efbe6668bd4&amp;txTime=5c3c5de1&amp;uid=0</CurrentURI>  
      <CurrentURIMetaData>&lt;DIDL-Lite xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sec="http://www.sec.co.kr/"&gt;&lt;item id="123" parentID="-1" restricted="1"&gt;&lt;upnp:storageMedium&gt;UNKNOWN&lt;/upnp:storageMedium&gt;&lt;upnp:writeStatus&gt;UNKNOWN&lt;/upnp:writeStatus&gt;&lt;dc:title&gt;Video&lt;/dc:title&gt;&lt;dc:creator&gt;QGame&lt;/dc:creator&gt;&lt;upnp:class&gt;object.item.videoItem&lt;/upnp:class&gt;&lt;res protocolInfo="http-get:*:video/*:DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000"&gt;http://xxx.xxx.com/xxx.m3u8?bizid=xxx&amp;amp;txSecret=fcexxxxxab4cf1b8bbee6efbe6668bd4&amp;amp;txTime=5c3c5de1&amp;amp;uid=0&lt;/res&gt;&lt;/item&gt;&lt;/DIDL-Lite&gt;</CurrentURIMetaData> 
    </u:SetAVTransportURI> 
  </s:Body>
</s:Envelope>

其中Action的列表:

<u:Action xmlns:u="服务类型">
  <参数名1>参数值1</参数名1>
  <参数名2>参数值2</参数名2>
  ...
</u:Action>

举个例子,如果是action是play:

<?xml version="1.0" encoding="utf-8"?>

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">  
  <s:Body> 
    <u:Play xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">  
      <InstanceID>0</InstanceID>  
      <Speed>1</Speed> 
    </u:Play> 
  </s:Body>
</s:Envelope>

如果执行ACTION失败,也会响应一个error

在Upnp的文档中有错误状态码。

4 Eventing

单播架构

Unicast Eventing Protocol Stack

订阅者请求订阅

只有header fields,没有消息体。callback标签里的内容是设备应该往哪推送事件消息?是订阅者要放订阅消息的地方。也可以不止有一个回调地址,但设备至少发送一个。

发布者接受订阅

如果信息足够,发布者就会发布消息。同样没有消息体。

多播架构

对应的还有多播架构。不赘述。但是,多播架构底层的传输协议的UDP。而不是TCP。

5 Presentation独立功能

❓可以理解成一个前端交互页面吗?

Presentation,在控制点发现了设备、并找到了设备的描述后,控制点就准备开始presentation了。Presentation是基于HTML的页面,能够控制或查看设备的状态,Presentation是对控制的补充。presentationURL在device description中,

Presentation Protocol Stack

基于HTTP来完成网页的加载。

猜你喜欢

转载自blog.csdn.net/lily_i/article/details/128529583