likes
comments
collection
share

DLNA投屏协议从理论到实践优化

作者站长头像
站长
· 阅读数 18

DLNA投屏协议从理论到实践优化

一、5W2H分析DLNA

1.1 什么是DLNA协议

DLNA 的全称是DIGITAL LIVING NETWORK ALLIANCE(数字生活网络联盟), 旨在解决个人PC、消费电器、移动设备在内的无线网络和有线网络的互联互通,使得数字媒体和内容服务(音频,视频,图片)的无限制的共享和增长成为可能。

1.2 为什么使用dlna

1.2.1 几种无线投屏协议比较:

Airplay、Miracast、DLNA比较:

首先DLNA、Airplay、Miracast区别:

Airplay

AirPlay是苹果开发的一种无线技术,可以通过WiFi将iPhone、iPad、iPodtouch等iOS设备上的包括图片、音频、视频通过无线的方式传输到支持AirPlay设备。

AirPlay具备与DLNA所没有的镜像功能,这一功能叫AirPlay镜像,可将iPhone或iPad上的画面实时传输到电视上。

DLNA与苹果的AirPlay功能比较类似,都可以让手机中的媒体内容投放到电视屏幕里。不同的是手机上的DLNA并没有AirPlay的镜像功能。

Miracast

Miracast是由Wi-Fi联盟于2012年所制定,以Wi-Fi直连为基础的无线显示标准。支持此标准的设备可通过无线方式分享视频画面,例如手机可通过Miracast将影片或照片直接在电视或其他装置播放而无需受到连接线缆长度的影响。

协议优点缺点
Airplay支持同一局域网多媒体传输、共享;支持屏幕镜像AirPlay只能在Apple设备之间使用;对网络质量和稳定性有一定要求
Miracast支持同一局域网多媒体传输、共享;支持屏幕镜像对网络质量和稳定性有一定要求;兼容性差异:不同设备和平台对Miracast的实现可能存在差异
DLNA支持同一局域网多媒体传输、共享;投在线资源时网络没过高要求无法投镜像

1.2.2 Android手机主流多媒体连接方式比较

DLNA无线传输,Micro HDMI接口输出,USB接口通过MHL转换HDMI输出

DLNA投屏协议从理论到实践优化

可以看到DLNA连接方式是最方便的,而且支持绝大多数的手机(tech.sina.cn/mobile/pc/2…

1.3 什么时候

家庭娱乐场景,如将手机、ipad、pc的多媒体资源(在线或本地)投在DMP设备播放(投影仪、大板、盒子等)

1.4 哪些应用集成了dlna

乐播、爱奇艺、腾讯视频、哔哩哔哩、芒果TV等各大主流视频媒体

1.5 如何使用

1.将手机或其他需要投屏的设备连接到和需要被投屏的设备(投影仪、盒子等)同一个局域网;

2.打开视频终端(如腾讯视频等),打开自己想要看的视频;

3.点击视频界面中TV按钮

DLNA投屏协议从理论到实践优化

二、技术细节探究

2.1 dlna架构、协议组成、流程分析

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

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

DLNA投屏协议从理论到实践优化

2.12 DLNA协议组成 DLNA协议是一个由多个具体协议组成的标准,用于在不同设备之间共享和传输媒体内容。以下是DLNA协议中的一些具体协议:

  1. UPnP(Universal Plug and Play):UPnP是DLNA协议的基础,它提供了设备之间的自动发现、连接和通信功能。

  2. HTTP(Hypertext Transfer Protocol):HTTP用于在设备之间传输媒体内容和控制命令。

  3. SSDP(Simple Service Discovery Protocol):SSDP用于设备的自动发现和网络服务的广播通知。

  4. SOAP(Simple Object Access Protocol):SOAP用于设备之间的控制和通信,通过XML格式传递命令和参数。

  5. GENA(Generic Event Notification Architecture:GENA) 一般事件通知架构 定义在控制点想要监听设备的某个服务状态变量的状况时,控制点如何传送订阅讯息并如何接收通知讯息用的。该协议运用在 UPnP 工作流程的事件订阅部分。

  6. XML(eXtensible Markup Language):XML用于描述和传输媒体内容的元数据信息。

  7. RTSP(Real-Time Streaming Protocol):RTSP用于实时流媒体的传输和控制。

  8. MPEG(Moving Picture Experts Group):DLNA支持MPEG格式的音频和视频编码,如MPEG-2、MPEG-4等。

  9. JPEG(Joint Photographic Experts Group):DLNA支持JPEG格式的图像编码,用于传输和显示图片。

这些具体协议共同构成了DLNA标准,使得不同设备可以通过DLNA协议进行互联和媒体内容的共享和传输。通过这些协议,用户可以在DLNA兼容的设备上无缝地访问和播放来自其他设备的媒体内容,如在智能电视上观看手机中的视频、在音频设备上播放音乐等。

2.13 upnp协议概览

DLNA投屏协议从理论到实践优化

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

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

UPnP的工作过程

UPnP的工作过程分为6步:

(1)寻址(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。这个过程用到的东西都是现存的,而且是很普及的,市面上买的路由器都会有。

(2)发现(Discovery)。

       发现是 UPnP工作第一步。 当一个设备被添加到网络后,UPnP的发现协议允许该设备向网络上的Control Points(CPs)通知(advise)自己拥有的服务。同样,当一个CP被添加到网络后,UPnP发现协议允许该CP搜索网络上可用的设备。这两种情况下的组播消息一般是设备和服务的基本信息,如它的类型,唯一标识符,当前状态参数等等。要注意设备信息和服务信息都是要组播出去的。发现的过程可以用下面Figure 1-1来描述。

 

 DLNA投屏协议从理论到实践优化

 

         下面详细叙述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单播。

1.notify主动通知同一网络中的CP. ssdp:alive 一般需要包含以下类型的包: 对于根设备,存在三种发现消息:

NTUSN
根设备的UUID根设备的UUID
设备类型:设备版本根设备的UUID,设备类型:设备版本
upnp:rootdevice根设备的UUID,设备类型和upnp:rootdevice

  对于每个服务:

NTUSN
服务类型:服务版本相关设备的UUID,服务类型和服务版本

作为DMP主要包含的服务有三种:RenderingControl、AVTransport、ConnectionManager。

以下是对三个不同的URN值的解释和区别:

  1. urn:schemas-upnp-org:service:RenderingControl:1 这个URN值表示设备提供了一个名为RenderingControl的服务,版本号为1。RenderingControl服务通常用于控制设备的音频或视频渲染参数,例如音量、亮度等。

  2. urn:schemas-upnp-org:service:AVTransport:1 这个URN值表示设备提供了一个名为AVTransport的服务,版本号为1。AVTransport服务通常用于控制设备的媒体传输功能,例如播放、暂停、跳转等。

  3. urn:schemas-upnp-org:service:ConnectionManager:1 这个URN值表示设备提供了一个名为ConnectionManager的服务,版本号为1。ConnectionManager服务通常用于管理设备之间的连接和数据传输。

    2.发现请求(Discovery request 或查询请求)

SSDP客户端向此地址发送HTTP UDP 发现请求,查询某种类型的服务。SSDP服务在此地址上监听服务发现请求。当服务监听到的HTTP UDP 发现请求和它自己提供的服务匹配时,它以单播方式发送HTTP UDP 响应。

DLNA投屏协议从理论到实践优化

HOST:设置为协议保留多播地址和端口,必须是:239.255.255.250:1900(IPv4)或FF0x::C(IPv6)

MAN:设置协议查询的类型,必须是:ssdp:discover

MX:设置设备响应最长等待时间,设备响应在0和这个值之间随机选择响应延迟的值。这样可以为控制点响应平衡网络负载。

ST:设置服务查询的目标,它必须是下面的类型:

ssdp:all 搜索所有设备和服务 upnp:rootdevice 仅搜索网络中的根设备 uuid:device-UUID 查询UUID标识的设备 urn:schemas-upnp-org:device:device-Type:version 查询device-Type字段指定的设备类型,设备类型和版本由UPNP组织定义。 urn:schemas-upnp-org:service:service-Type:version 查询service-Type字段指定的服务类型,服务类型和版本由UPNP组织定义。

 

在设备接收到查询请求并且查询类型(ST字段值)与此设备匹配时,设备必须向多播地址239.255.255.250:1900回应响应消息。典型:

DLNA投屏协议从理论到实践优化

(3)描述(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,需要哪些参数,怎么调用等等。

DLNA投屏协议从理论到实践优化  

(4)控制(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,表示能不能执行调用,出错的话会返回一个错误代码。

请求播放控制:

DLNA投屏协议从理论到实践优化   是一个xml的字符串,包含控制指令以及对应的参数,其他控制命令如控制播放进度、暂停等指令类似。

(5)事件(Eventing)

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

 

下面是一个Unicast eventing 的architecture图,CP是subscriber,服务器是publisher。

 

 DLNA投屏协议从理论到实践优化

      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。下面列出订阅过程供参考:

1.订阅。subscriber发送订阅消息主要包含事件URL(evenURL),服务ID号(service identifier),这两个可以在设备服务描述信息中找到,以及寄送地址(delivery URL)。还会包含一个订阅期限(duration)。

2.成功订阅。publisher收到订阅信息,如果同意订阅的话就会为每个新subscriber 生成一个唯一的subscriber identifier并记录subscriber 的duration和delivery URL。还会记录一个顺序增长event key用来保证事件确实推送到subscriber那里。比如说有个新事件,key是6,然后把这个事件推送给某个subscriber那里,subscriber那里记录的event key是4,现在收到的事件key是6,他就知道他没收到key为5的事件,这样他就向publisher索要漏收的事件,从而保证双方变量值或状态的一致。

3.首次推送。订阅同意订阅之后还会向subscriber发送一组初始变量或状态值,进行首次同步。

4.续订。subscriber必须在订阅到期前发送renewal续订。

5.订阅到期。订阅到期后publisher会把subscriber的信息删除,subscriber又回到订阅前的状态。

6.退订。subscriber发送cancel信息将会取消订阅。subscriber因非正常退出网络的话,则不会退订直到订阅到期。

7.订阅操作失败信息。当订阅、续订和退订不能被publisher接收或者出现错误时,publisher会发送一个错误代码。

 

        再简单说下多播(multicast,或者叫组播,本文中两者等同)和单播。even的组播采用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地址。

 

 DLNA投屏协议从理论到实践优化

 

(6)表达(Presentation)

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

 

好了, 到此,UPnP的工作过程的讲解就结束了。总结一下:

 

DLNA投屏协议从理论到实践优化 

 

UPnP分为6个步骤:

先是Addressing,设备加入网络,通过DHCP或者Auto-IP获得IP;这部分在闪联IGRS中是没有定义的。

然后是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嘛,哪样写得好哪样来!

2.2 为什么使用udp、tcp组合方式

UPnP(Universal Plug and Play)协议使用UDP(User Datagram Protocol)和TCP(Transmission Control Protocol)是因为它们分别具有不同的特点和适用场景。

  1. UDP:UDP是一种无连接的传输协议,它提供了一种简单的、无状态的数据传输方式。UPnP使用UDP主要是为了实现设备的自动发现和广播通知功能。UDP的特点是传输速度快、延迟低,适用于实时性要求较高的通信场景。通过UDP广播,设备可以在网络中发送自己的服务信息,其他设备可以通过监听UDP广播来自动发现和识别这些设备。

  2. TCP:TCP是一种面向连接的传输协议,它提供了可靠的数据传输和流控制机制。UPnP使用TCP主要是为了设备之间的控制和通信。TCP的特点是提供可靠的数据传输,确保数据的完整性和有序性。通过TCP连接,设备之间可以建立稳定的通信通道,进行命令和数据的传输。

综合使用UDP和TCP的原因是为了在UPnP协议中兼顾实时性和可靠性。UDP广播可以快速地进行设备的自动发现和通知,适用于实时性要求较高的场景,而TCP连接则提供了可靠的数据传输和控制通信,确保命令和数据的准确传输。

总之,UPnP使用UDP和TCP的组合,既满足了设备自动发现和广播通知的实时性要求,又保证了设备之间的控制和通信的可靠性。

三、存在问题及注意事项

1.当DMC无法搜索到DMR时如何进行排查? 解决办法: 1.ios确定IOS版本,12之前只要DMC发出SEARCH包,并且DMR正确回复即可搜索到设备;IOS高版本,Android应用(哔哩哔哩、腾讯等)最新版本需要DMR定时发送notify包; 2.确保notify alive包包含设备类型、设备uuid、设备描述文件正确,DMR的服务包正确并且被接收,DMC的SEARCH包被正确回复。

2.CPU过高时如何进行分析及如何处理的?

a.cpu过高90%的情况都是由于socket阻塞导致的。项目中使用jetty.jar作为网络服务器,当socket io异常时通过字节码插桩作为plugin插入三方库进行异常监听并释放:

DLNA投屏协议从理论到实践优化

DLNA投屏协议从理论到实践优化

b.排查使用的服务器网卡地址是否是可用的,目前仅支持Eth、Wlan网卡,查看是否是用的p2p、usb或其他网卡。

3.如何知道DMC设备播放中断线?

播放中DMC会定期获取DMR的播放进度TransportInfo,通过对该事件作为心跳包进行周期性检测来判断是否断线。

4.如何防止设备间相互控制? DMC A设备投屏后,其他DMC设备也可以控制音量、暂停的操作。原因在于没有建立设备管控机制,通过UDN在DMR端建立设备管理,在DMC发送操作指令时比较IP和UDN来决定是否响应指令。

2.cpu问题 cpu过高场景及通用解决办法:

  1. 设备数量过多:如果网络中的设备数量过多,每个设备都会发送和接收UPnP消息,这可能导致CPU的负载增加。可以通过减少设备数量或者优化网络结构、对设备选择性应答来缓解这个问题。
  2. UPnP消息处理复杂:如果设备需要处理复杂的UPnP消息,例如解析和处理大量的XML数据,会消耗大量的CPU资源。可以对通用性的资源描述进行复用,如DMR本身的描述文档。
  3. DLNA会根据每张网卡创建组播,根据网卡信息组装发送notify报文,并用网卡发送notify报文,假设网卡数量为M,notify类型为N,重复发送次数为R,可能的发送次数为:M * N * N * R,注意此时有些报文是无用的,需要根据notify报文中的ip和multicast 组的ip进行匹配,匹配后发送次数为M * N * R