0%

源代码分析及 DLNA 和 UPnP 协议理解

  • Protocol
    • DLNA Guidelines June 2016 - Part 1-1 Architectures and Protocols.pdf
    • UPnP-arch-DeviceArchitecture-v2.0.pdf
  • Open Source Project
    • minidlna
    • gmediarender

UPnP AV(Audio/Video) Architecture

UPnP 网络中,服务、设备和控制点(Control Point,即 CP)是基本组件。UPnP网络中定义的设备具有很广泛的含义,各种各样的家电、电脑外设、智能设备、无线设备、个人电脑等等都可以成为其中一员。一个 UPnP 设备可以是多个服务的载体和多个子设备的嵌套集。而控制点 CP指的是可以发现并控制其它设备的设备。

UPnP 网络中的设备可提供四种服务(Service):

  1. AVTransport Service (可控制多屏设备上的媒体 play,pause,seek,stop 等)
  2. RenderingControl Service (可调节多屏设备上的音量,声音,静音等)
  3. ContentDirectory Service (可获取多屏设备上可访问的媒体内容)
  4. ConnectionManager Service (可提供所支持的传输协议信息及多屏设备的 MIME 格式信息)

UPnP AV Architecture 定义了UPnP AV设备间媒体传送以及和CP间的交互。UPnP AV也定义了两种UPnP AV设备:UPnP AV MediaServer Device(MSD)UPnP AV MediaRenderer Device(MRD),

DLNA协议中定义如下:

  • MRD使用RCSCDSCMS

1551407003451

  • MSD使用CDSCMS

1551407205375

  • DMP需要实现CDSRendering Endpoints如果支持DMP也需要支持DMR

    Rendering Endpoints that claim to support the DLNA DMP Device Class shall also support the DLNA DMR Device Class.

开源代码

根据上述四种server描述,可以判断出

  • minidlnaMSDDMS项目
  • gmediarenderMRDDMR项目

UPnP 的工作过程

  1. 寻址 ( Addressing )
    IP 寻址是整个 UPnP 网络的基础。设备或控制点必须支持 IPv4(或者是 IPv4 和 IPv6)。当设备或 CP 首次与网络建立连接时,设备或控制点会寻找 DHCP(Dynamic Host Configuration Protocol)服务器,由 DHCP 负责分配向他们分配 IP。如果局域网内没有 DHCP 服务,UPnP 设备将按照 Auto-IP 去获取一个未被使用的 IP 地址。
  2. 发现 ( Discovery )
    发现是 UPnP 网络工作的第一步。 当一个设备加入到网络中,UPnP 的发现协议允许该设备向网络上的 Control Points(CPs) 通知 (advise) 自己拥有的服务。类似地,当一个控制点加入到网络中的时候,它也能够搜索到网络中存在的、感兴趣的设备。设备主动通知或者被动响应时提供的信息仅包含少量的设备信息,比如,类型、uuid 和指向更详细信息的 URL。Discovery architecture如下图所示:

img

UPnP检测协议是基于简单服务发现协议(SSDP,Simple Service Discovery Protocol)的。

按照协议的规定,当一个控制点(CP)接入网络的时候,它可以向一个特定的多播地址的 SSDP 端口 ( 比如 IPv4 环境下,多播地址是 239.255.255.250,端口号是 1900 ) 使用M-SEARCH方法发送ssdp:discover消息。当设备监听到这个保留的多播地址上由控制点发送的消息的时候,设备会分析控制点请求的服务,如果自身提供了控制点请求的服务,设备将通过单播的方式直接响应控制点的请求。类似的,当一个设备接入网络的时候,它应当向一个特定的多播地址的 SSDP 端口使用 NOTIFY 方法发送ssdp:alive消息。控制点根据自己的策略,处理监听到的消息。

SSDP 格式套用 HTTP1.1 的部分消息头字段,但是和 HTTP 不同,SSDP 是采用 UDP 传输的,而且 SSDP 没有 Message Body。

下面说明设备怎样向网络通知或者撤销自己可以提供的服务,CP 是如何搜索设备以及设备是如何回应搜索的。

通知 - 设备可用

当一个设备加入网络时,用 NOTIFY 方法发送一个多播请求,并且 NTS 头为 ssdp:aliveNOTIFY 方法发送的请求没有消息体,但消息与最后一个 HTTP 头之间必须空一行。ssdp:alive 消息格式:

img

NOTIFY 消息必须包含以下四部分:

  1. A notification type (e.g., device type), sent in an NT (Notification Type) header field.
  2. A composite identifier for the advertisement, sent in a USN (Unique Service Name) header field.
  3. A URL for more information about the device (or enclosing device in the case of a service), sent in a LOCATION header field.
  4. A duration for which the advertisement is valid, sent in a CACHE-CONTROL header field. (单位:秒)

撤销 - 设备不可用

在设备及其服务将要从网络中退出时,设备以多播方式用 NOTIFY 方法发送 ssdp:byebye 消息 ( 对于每个未超期的ssdp:alive消息 )。但如果设备突然从网络退出,它可能来不及发出这个通知消息。因此,discovery message 必须在CACHE-CONTROL 中包含超时值(如上所述);如果不重新发出通告,discovery message 最后也会因超时而过期的。ssdp:byebye消息格式如下:

img

搜索

当一个控制点加入到网络中时,它应该采用以下格式的 M-SEARCH 方法发送多播请求来搜索自己感兴趣的设备(服务)。如果 CP 已知道设备的 IP,也可以类似的格式发送单播去了解详细信息。

img

响应

当设备自身能够提供与 CP 发出的多播消息所匹配的服务时,就会以单播形式予以响应,消息格式如下:

img

需要注意的是:设备通过主动多播方式或者是被动地响应 CP 的搜索消息,使得 CP 能够了解到它是否是自己感兴趣的设备。但是如果 CP 对某设备感兴趣,想获取更多信息的话,则需要通过已获得的LOCATION- 指向更详细信息的 URL来发送description query message,从而得到设备详细的描述信息。

描述 ( Description )

在控制点发现了一个设备之后,控制点仍然对设备知之甚少。可能仅仅知道发现消息中的相关信息,如设备(或服务)的 UPnP 类型、设备的全球唯一标识符和设备 UPnP 描述的 URL 地址。为了让控制点更多的了解设备及其功能、或者与设备交互,控制点必须从发现消息中得到设备描述的 URL,并通过 URL 取得详细的设备描述。这些信息是以 XML 的形式返回的。设备的 UPnP 描述一般分成两个逻辑部分:设备描述以及服务描述(描述设备对外暴露的能力)。

  • 设备描述
    UPnP 设备描述包括特定厂商、制造商信息,如模块名称和编号、序列号、制造商名称、特定厂商网站 URL 等。对于设备中的每种服务,描述包含服务类型、名称、服务描述 URL、控制 URL 以及事件 URL。设备描述还包括所有嵌入式设备描述及 presentationURL.
  • 服务描述
    关于服务的 UPnP 描述定义了 Action 及其参数,还有状态变量及其数据类型、取值范围和事件特征。
    每个服务必须包含 0 或多个 Action,每个 Action 必须包含 0 或多个参数,每个参数要么是输入参数要么是输出参数,每个参数对应一个状态变量,每个服务有 1 或多个状态变量。

XML 格式如下:

img

获取设备描述很简单,CP 向 discovery message 里的 URL 发一个 HTTP GET 请求,设备在 HTTP 响应的消息体中返回其描述。

控制 ( Control )

拿到 Device description 和 Service descriptions 以后,那 CP 怎么去控制这些设备呢?
为了控制一个设备,控制点向设备上的服务发出一个 Action 。这一般由控制点向服务的 controLURL(在设备描述的服务元素 controlURL 子元素部分提供)发送一个适当的控制消息。而服务则会对此 Action 做出响应,返回相关结果或错误。

UPnP 的设备控制是基于 SOAP 协议的,SOAP(Simple Object Access Protocol)即简单对象访问协议,是交换数据的一种协议规范,是一种轻量的、简单的、基于 XML(标准通用标记语言下的一个子集)的协议,它被设计成在 WEB 上交换结构化的和固化的信息。在 UPnP 中控制点会向设备的服务发出 Action,并接收结果或错误返回,该动作、结果和错误封装在 SOAP 中,通过 HTTP 请求发送,并通过 HTTP 响应接收。

事件 ( Eventing )

控制点可以监听设备的状态,设备的状态或信息发生了变化,只要产生一个事件广播出去,控制点就能接收到并进行响应,类似一般的订阅者模式,发布者是指事件源即设备的服务,订阅者是控制点。有两种类型的事件:单播事件和多播事件。

  • 单播事件

img

  • 多播事件

img

表示 / 展示 ( Presentation )

控制点发现设备并且获取到设备的描述信息后,如果设备有返回 “presentationURL” ,那么,控制点就可以请求(HTTP GET)该 URL,在浏览器中展示出来,用户通过该网页就能控制远端的设备,或查看设备状态等。

img

DLNA 协议

数字生活网络联盟 Digital Living Network Alliance (DLNA)

DLNA 采用 upnp 协议格式。主要分为两大块,一个是发现控制器 SSDP, 它通过 udp 来实现

二是控制协议 SOAP , 即开始投屏后发投屏设备发送 前进,后退,暂停,调节音量等操作。

DLNA 各种设备术语:

  1. Digital Media Controller(DMC)数位媒体控制器:作为遥控装置使用,可寻找 DMS 上的多媒体档案,并指定可播放该多媒体档案的 DMR 进行播放或是控制多媒体档案上下传到 DMS 的装置,一般是手机。
  2. Digital Media Server(DMS)数位媒体服务器:提供了媒体档案的获取、录制、储存以及作为源头的装置。一般是公网上流媒体服务器
  3. Digital Media Renderer(DMR)数位媒体控制器:可接收并播放从 DMC push 过来的媒体档案。即接收投屏数据,一般是智能电视,OTT 盒子等。

这三者的关系是,DMC 通过获取 DMS 上的歌曲或者视频(也可以不是 DMS 上的,而仅仅只是一个链接),把它们传送到 DMR 上,由 DMR 进行播放。

DLNA 发现控制协议

即 DMC 通过 upnp 广播 发现局域网中 DMR 设备。

这里我们抓 iOS 咪咕视频的发现为分析例子。

img

步骤是,DMC 首先向固定的 多播地址(239.255.255.250:1900)发送 UDP 广播包。DMR 收到数据后,会用 UDP 响应数据

M-SEARCH 包格式

实际包格式

img

http 包头格式:

  • M-SEARCH * HTTP/1.1 起始行,表明是一个 SSDP 搜索消息
  • HOST 多播地址和端口
  • MAN 协议查询类型,必须是 ssdp:discover
  • MX 设备响应最长等待时间;设备在 0 和这个值之间随机选择一个时间最为延迟,避免多个设备同时响应造成网络拥堵
    +ST 搜索的目标,通常为 upnp:rootdevice (值域为 ssdp:all、upnp:rootdevice、uuid:device-UUID、urn:schemas-upnp-org:devices:device-Type:version、urn:schemas-upnp-org:service:service-Type )
  • User-Agent DMC 设备名称
M-SEARCH * HTTP/1.1
MX: 5
ST: upnp:rootdevice
MAN: "ssdp:discover"
User-Agent: UPnP/1.0 DLNADOC/1.50 Platinum/1.0.5.13
Connection: close
Host: 239.255.255.250:1900

响应包格式

img

  • HTTP/1.1 200 OK 起始行,表明是一个 HTTP 响应消息
  • CACHE_CONTROL 消息存活时间
  • DATE 响应生成的时间
  • EXT N/A
  • LOCATION 设备描述的 URL
  • SERVER 包含设备上的操作系统名、版本、产品名称和产品版本信息
  • ST 与搜索消息相同
    USN 唯一服务名称,SSDP 使用通用唯一标识符 UUID 作为某个设备 / 服务的全球唯一标识
HTTP/1.1 200 OK
LOCATION: http://169.254.100.156:37215/upnpdev.xml
SERVER: Linux UPnP/1.0 Huawei-ATP-IGD
CACHE-CONTROL: max-age=86500
EXT:
ST: upnp:rootdevice
USN: uuid:00e0fc37-2525-2828-2500-0034fe66fdc6::upnp:rootdevice
DATE: Fri, 20 Jul 2018 07:11:30 GMT

LOCATION: http://192.168.0.108:49152/description.xml
还有一种格式采用 NOTIFY, 主动向广播发送自己信息,这是小米电视主动发送通知

img

NOTIFY * HTTP/1.1
HOST: 239.255.255.250:1900
CACHE-CONTROL: max-age=62
LOCATION: http://192.168.0.108:49152/description.xml
NT: urn:schemas-upnp-org:service:AVTransport:1
NTS: ssdp:alive
SERVER: Linux/3.14.29, UPnP/1.0, Portable SDK for UPnP devices/1.6.13
USN: uuid:F7CA5454-3F48-4390-8009-4c3848e24612::urn:schemas-upnp-org:service:AVTransport:1

其中 LOCATION 是一个指向 xml 下载网址,里面描述设备真正的信息

以下是一个小米音箱的响应

<?xml version="1.0" encoding="utf-8"?>
<root
    xmlns="urn:schemas-upnp-org:device-1-0">
    <specVersion>
        <major>1</major>
        <minor>1</minor>
    </specVersion>
    <device>
        <deviceType>urn:schemas-upnp-org:device:MediaRenderer:1</deviceType>
        <friendlyName>灏忕背 AI 闊崇-8003</friendlyName>
        <manufacturer>Mi, Inc.</manufacturer>
        <modelDescription>The Mi AI SoundBox</modelDescription>
        <modelName>S12</modelName>
        <modelNumber>S12</modelNumber>
        <qq:X_QPlay_SoftwareCapability
            xmlns:qq="http://www.tencent.com">QPlay:2
        </qq:X_QPlay_SoftwareCapability>
        <dlna:X_DLNADOC
            xmlns:dlna="urn:schemas-dlna-org:device-1-0">DMR-1.50
        </dlna:X_DLNADOC>
        <dlna:X_DLNACAP
            xmlns:dlna="urn:schemas-dlna-org:device-1-0">,
        </dlna:X_DLNACAP>
        <UDN>uuid:d3b1a06a-8fb6-4f5b-b042-a15d1b956fb8</UDN>
        <serviceList>
            <service>
                <serviceType>urn:schemas-upnp-org:service:AVTransport:1</serviceType>
                <serviceId>urn:upnp-org:serviceId:AVTransport</serviceId>
                <SCPDURL>AVTransport1.xml</SCPDURL>
                <controlURL>/AVTransport/control</controlURL>
                <eventSubURL>/AVTransport/event</eventSubURL>
            </service>
            <service>
                <serviceType>urn:schemas-upnp-org:service:ConnectionManager:1</serviceType>
                <serviceId>urn:upnp-org:serviceId:ConnectionManager</serviceId>
                <SCPDURL>ConnectionManager1.xml</SCPDURL>
                <controlURL>/ConnectionManager/control</controlURL>
                <eventSubURL>/ConnectionManager/event</eventSubURL>
            </service>
            <service>
                <serviceType>urn:schemas-upnp-org:service:RenderingControl:1</serviceType>
                <serviceId>urn:upnp-org:serviceId:RenderingControl</serviceId>
                <SCPDURL>RenderingControl1.xml</SCPDURL>
                <controlURL>/RenderingControl/control</controlURL>
                <eventSubURL>/RenderingControl/event</eventSubURL>
            </service>
            <service>
                <serviceType>urn:xiaomi-com:service:Queue:1</serviceType>
                <serviceId>urn:xiaomi-com:serviceId:Queue</serviceId>
                <SCPDURL>Queue1.xml</SCPDURL>
                <controlURL>Queue1/control</controlURL>
                <eventSubURL>Queue1/event</eventSubURL>
            </service>
            <service>
                <serviceType>urn:xiaomi-com:service:Playlist:1</serviceType>
                <serviceId>urn:xiaomi-com:serviceId:Playlist</serviceId>
                <SCPDURL>Playlist1.xml</SCPDURL>
                <controlURL>Playlist1/control</controlURL>
                <eventSubURL>Playlist1/event</eventSubURL>
            </service>
            <service>
                <serviceType>urn:schemas-tencent-com:service:QPlay:1</serviceType>
                <serviceId>urn:tencent-com:serviceId:QPlay</serviceId>
                <SCPDURL>QPlay1.xml</SCPDURL>
                <controlURL>QPlay1/control</controlURL>
                <eventSubURL>QPlay1/event</eventSubURL>
            </service>
            <service>
                <serviceType>urn:xiaomi-com:service:Favorites:1</serviceType>
                <serviceId>urn:xiaomi-com:serviceId:Favorites</serviceId>
                <SCPDURL>Favorites1.xml</SCPDURL>
                <controlURL>Favorites1/control</controlURL>
                <eventSubURL>Favorites1/event</eventSubURL>
            </service>
        </serviceList>
    </device>
</root>

其中 friendlyName 是比较友好的显示名字,一般显示在设备上。
modelName 是英文名字

天猫盒子的设备描述

<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>
<UDN>uuid:595d5f67-dc56-3ac7-118b-2fab9893c7b7</UDN>
<friendlyName/>
<manufacturer>www.yunos.com</manufacturer>
<manufacturerURL>www.yunos.com</manufacturerURL>
<modelDescription>YunOS UPnP/DNLA DMR</modelDescription>
<modelName>MagicBox_M17</modelName>
<modelNumber>3.0.4-gp3.0.4</modelNumber>
<modelURL>www.yunos.com</modelURL>
<yingshiVersion>2120513812</yingshiVersion>
<rcsPort>13510</rcsPort>
<serviceList>
<service>
<serviceType>urn:schemas-upnp-org:service:AVTransport:1</serviceType>
<serviceId>urn:upnp-org:serviceId:AVTransport</serviceId>
<controlURL>
/dev/595d5f67-dc56-3ac7-118b-2fab9893c7b7/svc/upnp-org/AVTransport/action
</controlURL>
<eventSubURL>
/dev/595d5f67-dc56-3ac7-118b-2fab9893c7b7/svc/upnp-org/AVTransport/event
</eventSubURL>
<SCPDURL>
/dev/595d5f67-dc56-3ac7-118b-2fab9893c7b7/svc/upnp-org/AVTransport/desc.xml
</SCPDURL>
</service>
<service>
<serviceType>urn:schemas-upnp-org:service:RenderingControl:1</serviceType>
<serviceId>urn:upnp-org:serviceId:RenderingControl</serviceId>
<controlURL>
/dev/595d5f67-dc56-3ac7-118b-2fab9893c7b7/svc/upnp-org/RenderingControl/action
</controlURL>
<eventSubURL>
/dev/595d5f67-dc56-3ac7-118b-2fab9893c7b7/svc/upnp-org/RenderingControl/event
</eventSubURL>
<SCPDURL>
/dev/595d5f67-dc56-3ac7-118b-2fab9893c7b7/svc/upnp-org/RenderingControl/desc.xml
</SCPDURL>
</service>
<service>
<serviceType>urn:schemas-upnp-org:service:ConnectionManager:1</serviceType>
<serviceId>urn:upnp-org:serviceId:ConnectionManager</serviceId>
<controlURL>
/dev/595d5f67-dc56-3ac7-118b-2fab9893c7b7/svc/upnp-org/ConnectionManager/action
</controlURL>
<eventSubURL>
/dev/595d5f67-dc56-3ac7-118b-2fab9893c7b7/svc/upnp-org/ConnectionManager/event
</eventSubURL>
<SCPDURL>
/dev/595d5f67-dc56-3ac7-118b-2fab9893c7b7/svc/upnp-org/ConnectionManager/desc.xml
</SCPDURL>
</service>
</serviceList>
</device>
</root>

小米电视的通知

<specVersion>
<major>1</major>
<minor>0</minor>
</specVersion>
<device>
<deviceType>urn:schemas-upnp-org:device:MediaRenderer:1</deviceType>
<presentationURL>/</presentationURL>
<friendlyName>客厅的小米电视</friendlyName>
<manufacturer>Xiaomi</manufacturer>
<manufacturerURL>http://www.xiaomi.com/</manufacturerURL>
<modelDescription>Xiaomi MediaRenderer</modelDescription>
<modelName>Xiaomi MediaRenderer</modelName>
<modelURL>http://www.xiaomi.com/hezi</modelURL>
<UPC>000000000017</UPC>
<UDN>uuid:F7CA5454-3F48-4390-8009-4c3848e24612</UDN>
<UID>-982164636</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>
<service>
<serviceType>urn:mi-com:service:RController:1</serviceType>
<serviceId>urn:upnp-org:serviceId:RController</serviceId>
<SCPDURL>/dlna/Render/RControl_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.0.108: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.duokanbox.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.0.108:49152/</URLBase>
</root>

投屏及控制功能

投屏指令10.1.4.30 MM control point rules for DLNA PlayContainer URI

A UPnP AV MediaRenderer control point may invoke AVT:SetAVTransportURI with the CurrentURI input argument set to a DLNA PlayContainer URI.
这里的SOAPAction: urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI 就是播放指定 URL,在 SOAP 消息体中 CurrentURI 内容就是播放地址

POST /_urn:schemas-upnp-org:service:AVTransport_control HTTP/1.1
SOAPAction: "urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI"
User-Agent: UPnP/1.0 DLNADOC/1.50 Platinum/1.0.5.13
Host: 192.168.0.108:49152
Content-Length: 1535
Content-Type: text/xml; charset="utf-8"


<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><u:SetAVTransportURI xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"><InstanceID>0</InstanceID><CurrentURI>http://gslbmgsplive.miguvideo.com/wd_r1/fifa/cctv5hd/720264/encrypt/index.m3u8?msisdn=&amp;mdspid=&amp;spid=800033&amp;netType=4&amp;sid=5500511372&amp;pid=2028597139&amp;timestamp=20180726185704&amp;Channel_ID=0116_23050003-99000-200300020100003&amp;promotionId=&amp;mvid=&amp;mcid=&amp;mpid=&amp;ProgramID=641252154&amp;ParentNodeID=-99&amp;playbackbegin=20180715223000&amp;playbackend=20180716020059&amp;client_ip=223.74.148.1&amp;assertID=5500511372&amp;imei=3d90e97657c1de3de151910495bc22fa6c0bd18914e3b5f7f7e638a25c1bcbbf&amp;chargePhone=&amp;SecurityKey=20180726185704&amp;encrypt=d9814b446d6b3bb25ec6d42a25e59bb0</CurrentURI><CurrentURIMetaData>&lt;DIDL-Lite xmlns="urn:schemas - upnp - org : metadata - 1 - 0 / DIDL - Lite / " xmlns:dc="http ://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/"&gt;&lt;item id="unknown" parentID="-1" restricted="1"&gt;&lt;upnp:genre&gt;Unknown&lt;/upnp:genre&gt;&lt;upnp:storageMedium&gt;UNKNOWN&lt;/upnp:storageMedium&gt;&lt;upnp:writeStatus&gt;UNKNOWN&lt;/upnp:writeStatus&gt;&lt;upnp:class&gt;object.item.videoItem.movie&lt;/upnp:class&gt;&lt;dc:title&gt;unknown&lt;/dc:title&gt;&lt;/item&gt;&lt;/DIDL-Lite&gt;</CurrentURIMetaData></u:SetAVTransportURI></s:Body></s:Envelope>

img

查询播放状态指令

UPnP MediaRenderers that respond to an AVT:GetTransportInfo request shall reflect the play/transport state in the following manner.
投屏指令是向设备描述的处理 IP 和端口发送 TCP http POST 指令来完成 <URLBase>http://192.168.0.108:49152/</URLBase>

img

POST /_urn:schemas-upnp-org:service:AVTransport_control HTTP/1.1
SOAPAction: "urn:schemas-upnp-org:service:AVTransport:1#GetTransportInfo"
User-Agent: UPnP/1.0 DLNADOC/1.50 Platinum/1.0.5.13
Host: 192.168.0.108:49152
Content-Length: 314
Content-Type: text/xml; charset="utf-8"

<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><u:GetTransportInfo xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"><InstanceID>0</InstanceID></u:GetTransportInfo></s:Body></s:Envelope>

这是小米电视响应包

img

表示已经开始播放了

HTTP/1.1 200 OK
CONTENT-LENGTH: 411
CONTENT-TYPE: text/xml; charset="utf-8"
DATE: Thu, 26 Jul 2018 10:57:14 GMT
EXT:
SERVER: Linux/3.14.29, UPnP/1.0, Portable SDK for UPnP devices/1.6.13
X-User-Agent: redsonic

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body>
<u:GetTransportInfoResponse xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
<CurrentTransportState>PLAYING</CurrentTransportState>
<CurrentTransportStatus>OK</CurrentTransportStatus>
<CurrentSpeed>1</CurrentSpeed>
</u:GetTransportInfoResponse>
</s:Body> </s:Envelope>