0%

DLNA 协议分析及应用

DLNA及相关协议简介

  • DLNA 简介
  • DLNA 架构
  • DLNA 原理
  • UPnP 组件
  • UPnP 工作流程
  • UPnP 消息描述
  • UPnP 设备描述

DLNA 简介

DLNA 的全称是DIGITAL LIVING NETWORK ALLIANCE(数字生活网络联盟), 旨在解决个人 PC,消费电器,移动设备在内的无线网络和有线网络的互联互通,使得数字媒体和内容服务的无限制的共享和增长成为可能,目前成员公司已达 280 多家。

DLNA 架构

DLNA 将其整个应用规定成 5 个功能组件,从下到上依次为:

  1. 网络互连:802.3 以太网,802.11WiFi,802.15 蓝牙
  2. 网络协议:IPV4
  3. 设备的发现控制和管理:UPnP
  4. 媒体传输:HTTP/RTP
  5. 媒体格式

DLNA ARCHITECTURE

DLNA不是一种协议,但包括了实现相关标准所需要的一系列协议栈,UPnP是其中的关键协议

DLNA是基于UPnP协议,DLNA整个发现,控制,事件订阅部分都是由Upnp Device Architecture协议所定义,因此有必要了解下UPnP协议。

img

UPnP协议结构最底层的TCP/IP协议是UPnP协议结构的基础。IP层用于数据的发送与接收。对于需要可靠传送的信息,使用TCP进行传送,反之则使用UDPUPnP对网络物理设备没有要求,可以使用以太网、无线网、IEEE1394、红外进行连接,只要支持IP协议即可。

构建在TCP/IP协议之上的是HTTP协议及其变种,这一部分是UPnP协议的核心部分,所有UPnP消息都被封装在HTTP协议及其变种之中。HTTP协议的变种是HTTPUHTTPMU, 这些协议的格式沿袭了HTTP协议,只不过与HTTP协议不同的是它们通过UDP而不是TCP来发送消息,并且可以用于多播通信。

UPnP包含以下协议:

  • SSDP协议
    简单服务发现协议 (Simple Service Discovery Protocol:SSDP),内建在 HTTPU/HTTPMU 里,定义如何让网络上有的服务被发现的协议。包括控制点如何发现网络上有哪些服务,并取得这些服务的资讯,还有装置本身宣告他提供哪些服务。该协议运用在 UPnP 工作流程的设备发现部分。
  • SOAP协议
    简单对象访问协议 ( Simple Object Access Protocol) 定义了可扩展标记语言 (XML) 和 HTTP 的使用来执行远程调用,包括控制点如何发送命令消息给设备,及设备接收到命令消息后如何发送响应消息给控制点。该协议运用在 UPnP 工作流程的设备控制部分。
  • GENA协议
    一般事件通知架构 (Generic Event Notification Architecture:GENA) 定义在控制点想要监听设备的某个服务状态变量的状况时,控制点如何传送订阅讯息并如何接收通知讯息用的。该协议运用在 UPnP 工作流程的事件订阅部分。

DLNA 原理

参考 《基于 DLNA 的移动端网络视频投屏技术初探》

要实现从移动端将网络视频投放至智能电视或机顶盒,首先要保证这些设备在同一个局域网的相同网段下,即共享同一个网关,这样所有设备都能够拥有独立的 IP,从而具备相互通信的基础

设备发现

当一个新的Control Point加入一个局域网时,为了获取当前网段里都有哪些智能设备,需要遵循SSDP向默认多播 IP 和端口发送获取信息的请求,这是一个 UDP 消息,所以建议在设备搜索过程多做几次发现请求,以免丢包带来的遗漏

控制点可以获得的信息是:有一台设备,它的 IP 和端口号,设备描述文档 (DDD) 在什么位置、UUID 是什么

请求设备描述文档

DDD以及后面要说到的服务描述文档 (SDD, Service Description Document) 都是以 XML 格式返回给请求端的,这一步的通信则是基于 TCP/HTTP 进行可靠传输的。我们请求Location字段的内容即

http://10.2.9.152:49152/TxMediaRenderer_desc.xml

响应

<root xmlns="urn:schemas-upnp-org:device-1-0" xmlns:dlna="urn:schemas-dlna-org:device-1-0" configId="499354">
    <specVersion>
        <major>1</major>
        <minor>1</minor>
    </specVersion>
    <device>
        <deviceType>urn:schemas-upnp-org:device:MediaRenderer:1</deviceType>
        <friendlyName>我的设备</friendlyName>
        <manufacturer>Plutinosoft LLC</manufacturer>
        <manufacturerURL>http://www.plutinosoft.com</manufacturerURL>
        <modelDescription>Plutinosoft AV Media Renderer Device</modelDescription>
        <modelName>AV Renderer Device</modelName>
        <modelURL>http://www.plutinosoft.com/platinum</modelURL>
        <UDN>uuid:9c443d47158b-dmr</UDN>
        <dlna:X_DLNADOC xmlns:dlna="urn:schemas-dlna-org:device-1-0">DMR-1.50</dlna:X_DLNADOC>
        <serviceList>
            <service>
                <serviceType>urn:schemas-upnp-org:service:AVTransport:1</serviceType>
                <serviceId>urn:upnp-org:serviceId:AVTransport</serviceId>
                <SCPDURL>/AVTransport/9c443d47158b-dmr/scpd.xml</SCPDURL>
                <controlURL>/AVTransport/9c443d47158b-dmr/control.xml</controlURL>
                <eventSubURL>/AVTransport/9c443d47158b-dmr/event.xml</eventSubURL>
            </service>
            ...
        </serviceList>
    </device>
</root>

返回设备的详细信息:设备名称、设备类型、UUID、服务列表,每个服务都有serviceTypeSCPDURLserviceIdcontrolURLeventSubURL

请求服务描述文档

如何使用这个服务需要参考该服务的SDDSCPDURL这个字段的内容就是请求SDD的路径地址,我们将其与之前在发现设备阶段获取到的响应消息中的 Location 字段内容中设备的 IP 和端口号拿过来,拼接成完整 URL 字符串

http://10.2.9.152:49152/AVTransport/9c443d47158b-dmr/scpd.xml

返回一个动作列表,一个服务会包含一个或多个功能请求动作

<scpd xmlns="urn:schemas-upnp-org:service-1-0">
    <specVersion>
        <major>1</major>
        <minor>0</minor>
    </specVersion>
    <actionList>
        <action>
            <name>SetAVTransportURI</name>
            <argumentList>
                <argument>
                    <name>InstanceID</name>
                    <direction>in</direction>
                    <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
                </argument>
                <argument>
                    <name>CurrentURI</name>
                    <direction>in</direction>
                    <relatedStateVariable>AVTransportURI</relatedStateVariable>
                </argument>
                <argument>
                    <name>CurrentURIMetaData</name>
                    <direction>in</direction>
                    <relatedStateVariable>AVTransportURIMetaData</relatedStateVariable>
                </argument>
            </argumentList>
        </action>
        ...
    </actionList>
    <serviceStateTable>
        <stateVariable sendEvents="no">
            <name>AVTransportURI</name>
            <dataType>string</dataType>
        </stateVariable>
        ...
    </serviceStateTable>
</scpd>

SetAVTransportURI这个请求的功能是将一个音视频资源的 URI 发送给渲染端。一个Action就好比一个 API 请求,你还需要传递一些要求的参数,这时就会用到该 Action 后面参数列表里规定的参数

服务动作请求

有了动作所需要的全部信息,就可以按照 DLNA 规定的方式发给设备请求服务

POST /AVTransport/9c443d47158b-dmr/control.xml HTTP/1.1
HOST: 10.2.9.152
Content-Type: text/xml; charset="utf-8"
SOAPAction: "urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI"
<?xml version="1.0"?>
    <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>yourAVURI</CurrentURI>
        </u:SetAVTransportURI>
    </s:Body>
</s:Envelope>

响应

HTTP/1.1 200 OK
Content-Type: text/xml; charset="utf-8"
Date: Thu, 16 Feb 2017 09:09:45 GMT
Server: OS/version UPnP/1.1 product/version
<?xml version="1.0"?>
<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">
            <u:SetAVTransportURIResponse>
                <_xmlns:u>"urn:schemas-upnp-org:service:AVTransport:1"</_xmlns:u>
            </u:SetAVTransportURIResponse>
        </u:SetAVTransportURI>
    </s:Body>
</s:Envelope>

UPnP 组件

图为组件之间的关系:

img

  • 服务 (Service)
    UPnP网络中,最新的控制控制单元就是服务,服务描述的设备在不同的情况下的活动和设备的状态。例如,时钟服务可以表述为时间变化(状态变化),当前的时间(时间状态)以及设置时间和读取时间两个活动,通过这两个活动,你就可以控制服务。
  • 设备 (Device)
    UPnP网络中定义的设备具有很广泛的含义,各种各样的家电、电脑外设、智能设备、无线设备、个人电脑等等都可以成为其中一员。一个UPnP设备可以是多个服务的载体和多个子设备的嵌套集。例如一台印表机有提供列印这样的服务;一台电视有提供收讯的服务,这些都属于设备。
  • 控制点 (ControlPoint)
    UPnP网络中,控制点指的是可以发现并控制其它设备的控制设备。在UPnP网络中,设备可以和控制点合并。也就是说,同一个设备,可以同时具有设备的功能和控制点的功能,即可以作为设备提供服务,也可以作为控制点发现和控制其它设备。

UPnP 工作流程

寻址

UPnP 网络互连的基础是 IP 协议,因此必须先获取一个有效的 IP 地址。当设备首次与网络建立连接后,利用 DHCP 服务,使设备得到一个 IP 地址。这个 IP 地址可以是 DHCP 系统指定的,也可以是由设备选择的。设备还可以使用 Friendly Name,这就需要 DNS 来转换得到 IP

发现

当一个设备被添加到网络后,UPnP 的发现协议允许该设备向网络上的控制点 (Control Point, CP) 通知自己拥有的服务。同样,当一个 CP 被添加到网络后,UPnP 发现协议允许该 CP 搜索网络上可用的设备。这两种情况下的组播消息一般是设备和服务的基本信息,如设备类型,唯一标识符,状态参数和指向更详细信息的一个指针等等。要注意设备信息和服务信息都是要组播出去的

发现过程使用的协议是 SSDP(Simple Service Discovery Protocol,简单服务发现协议),采用 UDP 传输

描述

描述分为两部分:

  • 一个是设备描述
  • 另一个是服务描述

控制点在发现一个设备之后仍然对其知之甚少。为了使控制点了解到更多关于设备及其能力的信息或与设备进行交互,则控制点必须取得来自该设备在发现消息中所提供之 URL 的设备描述。设备可能包含其它逻辑设备,以及功能单元或服务 。对于设备的 UPnP 描述通过 XML 来表达,并包括诸如模型名称和号码、序列号、制造商名称和厂商专门网站 URL 等专门针对厂商的制造商信息。该描述还包括一列任意的嵌入式设备或服务,以及用于控制、事件触发和展示的 URL。对于每项服务,此描述均包括一列命令或动作,而服务(参数或变量)对于每个动作做出响应;针对服务的描述还包括一系列变量;这些变量模型化服务在运行时的状态,并通过数据类型、范围和事件特征进行描述。以下关于描述的部分说明了设备如何被描述,以及这些描述如何被 控制点取得。

控制

在设备描述部分,还有关于如何控制设备的描述,会给出一个 Control URL,CP 可以向这个 URL 发送不同的控制信息就可以控制了,然后设备也可以返回一个信息反馈。

这种 CP 和设备之间沟通信息按照SOAP(Simple Object Access Protocol) 的格式来写。消息体里面就可以写想调用的动作了,叫做 Action Invocation,可能还要传参数,比如想播放一个视频,要把视频的 URL 传过去,设备收到后会响应,表示能不能执行调用,出错的话会返回一个错误代码

事件

在服务进行的整个时间内,只要变量值发生了变化或者模式的状态发生了改变,就产生了一个事件,该事件服务提供者(某设备的某个服务)会把该事件向整个网络进行多播。而且,CP 也可以事先向事件服务器订阅事件信息,保证将该 CP 感兴趣的事件及时准确地单播传送过来

事件的订阅和推送这块用的通信协议是General Event Notification Architecture(GENA),通过 HTTP/TCP/IP 传送。订阅过程如下:

  1. 订阅。Subscriber 发送订阅消息主要包含事件 URL,服务 ID 号,这两个可以在设备服务描述信息中找到,以及寄送 URL,还会包含一个订阅期限 Duration
  2. 成功订阅。Publisher 收到订阅信息,如果同意订阅的话就会为每个新 Subscriber 生成一个唯一的 ID 并记录 Subscriber 的 Duration 和 Delivery URL。还会记录一个顺序增长 EventKey 用来保证事件确实推送到 Subscriber 那里
  3. 首次推送。订阅同意订阅之后还会向 Subscriber 发送一组初始变量或状态值,进行首次同步
  4. 续订。Subscriber 必须在订阅到期前发送 Renewal 续订
  5. 订阅到期。订阅到期后 Publisher 会把 Subscriber 的信息删除,Subscriber 又回到订阅前的状态。
  6. 退订。Subscriber 发送 Cancel 信息将会取消订阅。Subscriber 因非正常退出网络的话,则不会退订直到订阅到期
  7. 订阅操作失败信息。当订阅、续订和退订不能被 Publisher 接收或者出现错误时,Publisher 会发送一个错误代码

表达

只要得到了设备的 URL,就可以取得该设备表达的 URL,取得该设备表达的 HTML,然后可以将此 HTML 纳入 CP 的本地浏览器上。这部分还包括与用户对话的界面,以及与用户进行会话的处理。因此设备表达可以理解成“遥控器”。这部分定义描述界面,规范界面以及传输界面内容。远程界面是供 CP 用户使用的,CP 用户通过远程界面完成设备描述的获取,控制设备,订阅收取设备事件等等

UPnP 消息描述

UPnP 搜索

M-SEARCH * HTTP/1.1
Man: "ssdp:discover" // 固定
Mx: 10 // 等待时长
Host: 239.255.255.250:1900 // 多播地址
St: ssdp:all // 搜索所有 也可以指定特殊类型设备

UPnP 响应

HTTP/1.1 200 OK
CACHE-CONTROL: max-age=100 // 生命周期
DATE: Tue, 06 Sep 2016 08:59:17 GMT // 响应时间
EXT: // 想控制点确认 MAN 头域已经被设备理解
LOCATION: http://192.168.31.242:49153/description.xml // 描述文件地址
OPT: "http://schemas.upnp.org/upnp/1/0/"; ns=01
01-NLS: 36b309d6-1dd2-11b2-a747-e67ed51c3f33
SERVER: Linux/2.6.32.11.as, UPnP/1.0, Portable SDK for UPnP devices/1.6.18 // 版本信息
X-User-Agent: redsonic
ST: upnp:rootdevice
USN: uuid:a22d1223-d889-b76b-0cc3-4c484a00002e::upnp:rootdevice

UPnP 通知

NOTIFY * HTTP/1.1
HOST: 239.255.255.250:1900 // 多播地址
CACHE-CONTROL: max-age=100 // 缓存时间
LOCATION: http://192.168.31.242:49153/description.xml // 描述文件地址
OPT: "http://schemas.upnp.org/upnp/1/0/"; ns=01
01-NLS: 36b309d6-1dd2-11b2-a747-e67ed51c3f33
NT: urn:schemas-upnp-org:service:ConnectionManager:1
NTS: ssdp:alive
SERVER: Linux/2.6.32.11.as, UPnP/1.0, Portable SDK for UPnP devices/1.6.18
X-User-Agent: redsonic
USN: uuid:a22d1223-d889-b76b-0cc3-4c484a00002e::urn:schemas-upnp-org:service:ConnectionManager:1

NT GENA 规定使用的标头。通知类型。必须采用以下一种形式。单一 URI。

  • UPnP:rootdevice 向根设备发送一次。
  • uuid:device-UUID 向每种设备 (根设备或嵌入式设备) 发送一次。 设备 UUID 由 UPnP 厂商指定。
  • urn:schemas-UPnP-org:device:deviceType:v 向每种设备(根设备或嵌入式设备)发送一次。设备类型与版本 由 UPnP 论坛工作委员会定义。
  • urn:schemas-UPnP-org:service:serviceType:v 向每种服务发送一次。服务类型与版本由 UPnP 论坛工作委员会 定义。

NTS GENA 规定使用的标头。通知子类型。必须是 ssdp:alive。单一 URI。

USN SSDP 要求使用的标头。 唯一服务名称。 必须是以下一种。 前缀(位于双冒号前)必须与设备描述中的 UDN 元素值相匹配。单一 URI。

  • uuid:device-UUID::UPnP:rootdevice 向根设备发送一次。设备 UUID 由 UPnP 厂商指定。
  • uuid:device-UUID 向每种设备 (根设备或嵌入式设备) 发送一次。 设备 UUID 由 UPnP 厂商指定。
  • uuid:device-UUID::urn:schemas-UPnP-org:device:deviceType:v 向每种设备 (根设备或嵌入式设备) 发送一次。 设备 UUID 由 UPnP 厂商指定。设备类型与版本由 UPnP 论坛工作委员会定义。
  • uuid:device-UUID::urn:schemas-UPnP-org:service:serviceType:v 向每种服务发送一次。设备 UUID 由 UPnP 厂商指定。服务类型 与版本由 UPnP 论坛工作委员会定义。

UPnP 离线

NOTIFY * HTTP/1.1
HOST: 239.255.255.250:1900 // 多播地址
NT: urn:schemas-upnp-org:service:ConnectionManager:1
NTS: ssdp:byebye
SERVER: Linux/2.6.32.11.as, UPnP/1.0, Portable SDK for UPnP devices/1.6.18
X-User-Agent: redsonic
USN: uuid:a22d1223-d889-b76b-0cc3-4c484a00002e::urn:schemas-upnp-org:service:ConnectionManager:1

UPnP 设备描述

一个设备的 UPnP 描述包含多个特定厂商信息、所有嵌入式设备定义、设 备展示 URL、以及所有服务列表,包括控制 URL 和事件触发 URL。除了定义非 标准设备之外,UPnP 厂商可以为标准设备添加新的嵌入式设备和服务。

<?xml version="1.0"?>
<root xmlns="urn:schemas-upnp-org:device-1-0">
    <specVersion>
        <major>1</major>
        <minor>0</minor>
    </specVersion>
    <URLBase>base URL for all relative URLs</URLBase>
    <device>
        <deviceType>urn:schemas-upnp-org:device:deviceType:v</deviceType>
        <friendlyName>short user-friendly title</friendlyName>
        <manufacturer>manufacturer name</manufacturer>
        <manufacturerURL>URL to manufacturer site</manufacturerURL>
        <modelDescription>long user-friendly title</modelDescription>
        <modelName>model name</modelName>
        <modelNumber>model number</modelNumber>
        <modelURL>URL to model site</modelURL>
        <serialNumber>manufacturer's serial number</serialNumber>
        <UDN>uuid:UUID</UDN>
        <UPC>Universal Product Code</UPC>
        <iconList>
            <icon>
            <mimetype>image/format</mimetype>
            <width>horizontal pixels</width>
            <height>vertical pixels</height>
            <depth>color depth</depth>
            <url>URL to icon</url>
            </icon>
            XML to declare other icons, if any, go here
        </iconList>
        <serviceList>
            <service>
            <serviceType>urn:schemas-upnp-org:service:serviceType:v</serviceType>
            <serviceId>urn:upnp-org:serviceId:serviceID</serviceId>
            <SCPDURL>URL to service description</SCPDURL>
            <controlURL>URL for control</controlURL>
            <eventSubURL>URL for eventing</eventSubURL>
            </service>
            Declarations for other services defined by a UPnP Forum working committee (if any)
            go here
            Declarations for other services added by UPnP vendor (if any) go here
        </serviceList>
        <deviceList>
            Description of embedded devices defined by a UPnP Forum working committee (if any)
            go here
            Description of embedded devices added by UPnP vendor (if any) go here
        </deviceList>
        <presentationURL>URL for presentation</presentationURL>
    </device>
</root>

Ref

  1. DLNA 协议分析及应用
  2. DLNA 开源库——Cling
  3. DLNA 与 UPnP 初探
  4. UPnP™ Device Architecture 1.1