android设备投屏技术🔥:协议&概念

6,355 阅读9分钟

前言

由于工作上的需求,开始接触投屏技术。

为何要写这篇文章?
我怀疑想学这技术的人群不多,也许文章不会火,毕竟也不是什么热门技术。
但正因为不是热门技术,所以资料很少。我也是自己摸索过来的,我希望写完这篇文章能帮助更多想学习这门技术的人。

“投屏技术”听起来挺高大上的样子,觉得可能比较难。其实实现并不难,因为有了很多成形的底层平台,在一些比较好的平台上 连 demo 也帮你写好了。
虽然实现不难,但作为优秀的程序员 我们知其然也要知其所以然。所以我们要理解它的原理。(看到“原理”,莫慌,我保你能轻松理解)

android投屏技术,我分三个部分来讲:
一、android设备投屏技术🔥:协议&概念
这章主要讲一些基本概念, 那些 DLNA 类库都是基于这些概念来做的,了解这些概念能帮助你理清思路,同时可以提升开发效率,遇到问题也能有个解决问题的清晰思路。

二、android投屏技术🔥🔥:发现设备代码实现 & android投屏技术🔥🔥:发现设备源码分析
这部分是通过Cling DLNA类库来实现发现设备的。
内容包括:

  1. 抽出发现设备所需接口
  2. 发现设备步骤的实现
  3. 原理的分析

三、android投屏技术🔥🔥🔥:控制设备&源码分析(未完结,敬请期待)这部分 因为还未上代码,所以先预留着。(保证一周内上完代码)

第二部分跟第三部分 我是通过使用Cling DLNA类库来实现的,目前已知的搜狐视频就是用的Cling。而且Cling实现起来还算不难,所以公司也使用Cling来实现投屏。

关于投屏 ios 可以使用苹果公司的 airplay,android 设备投屏 可以使用 DLNA 功能来实现投屏 android 设备是具备 DLNA 功能的,而且很多物理设备也是具有 DLNA 功能的。

概念①:什么是DLNA

专业术语:
DLNA的全称是DIGITAL LIVING NETWORK ALLIANCE(数字生活网络联盟)。
DLNA(Digital Living Network Alliance) 由索尼、英特尔、微软等发起成立、旨在解决个人PC,消费电器,移动设备在内的无线网络和有线网络的互联互通。
DLNA 2003年诞生是为了能够把当时相互独立的电视机及其相关设备(功放、音响、DVD/蓝光播放机)、PC及其相关设备(数码相机、音乐播放器)和移动电话在家庭中有机地整合起来,使得多媒体内容能够在各个设备上便捷地播放。

通俗术语:DLNA(数字生活网络联盟) 就是大佬们一起搞事情 商讨“我们要将物联网设备连接起来,怎么搞啊?” 搞着搞着 就搞出了这套设备的工业标准。 然后让其他设备具备 DLNA 这种工业标准,这样这些设备就可以互联互通了。

概念②:UPnP组件

UPnP组件包括如下:


UPnP组件

投屏设备提供 控制服务、事件服务和展示服务,android设备通过控制点控制投屏设备的这些服务。

  • 根设备 与 设备:设备 就是那些物联网设备 如:家用电器、盒子 等。因为一台 UPnP 设备可以是多个服务的载体或多个子设备的嵌套,所以存在一个根设备的概念。

  • 服务:是指 设备所支持 能提供的服务,例如:支持 控制服务、事件服务、展示服务。

  • 控制点:控制点 就是可以发现并控制其他设备的控制设备。听起来有点绕,其实就是控制设备,例如: android 设备需要控制设备来控制投屏设备的视频播放、暂停等操作,就需要控制点对设备进行控制。

下面是我们想象一下投屏的过程:
我在看楚乔传,我觉得手机屏幕太小看得不爽,我想要我的 android 手机投屏到大屏显示器上。
首先需要两个设备(一个是 android 手机,另一个是小米盒子)都连上同一个局域网中(假设连接的是 wifi),我的小米盒子就告诉 wifi 它的描述信息,android 手机开始进行设备发现,就发现了我的小米盒子。然后 我就点击楚乔传 要将它投屏到显示器上,那么首先 小米盒子要支持投屏(这里路由器已经知道了小米盒子支持投屏的), android 手机就通过控制点来控制视频的播放了。(视频的传输的话,可以直接传视频流。但现实情况不是这么干的。因为手机屏幕小,显示器屏幕大,所以显示器需要更清晰的分辨率,因此跟手机上的播放片源是不同的,所以只需要换一个更清晰的片源 url 就好了)

  • 设备发现:android设备投屏,首先android设备就要找到所有支持投屏的设备,找到设备的过程就是设备发现。

  • 设备控制:例如:android设备将视频播放投屏到显示器上,设备需要对显示器上的视频进行 播放、暂停、进度拖拽等操作,这些操作就是设备控制。

  • 设备事件:例如:android 设备需要随时知道 支持投屏设备在局域网中的出现,当出现一个新的设备 android 设备就通知到,要实现这点 android 设备就要订阅这个事件,这也就是设备事件。

DLNA 标准包括多项协议及标准,其中最重要的部分是 UPnP 协议

概念③:那些协议

协议部分,可能比较无聊(可能是我写得比较无聊吧 😭 ),还是稍微了解一下吧。

UPnP协议栈:UPnP是由“通用即插即用论坛”(UPnP™ Forum)推广的一套网络协议,它的目标是实现设备间网络互联。

  • UPnP协议定义了设备之间,设备和控制点,控制点之间通信的协议
  • 完整的UPnP协议栈由设备寻址、设备发现、设备描述、设备控制、事件通知以及基于Html的描述等几部分构成

UPnP协议内容

别被吓跑了,我们目前还不用了解很透彻,心里有个底就好了,这对我们之后理解有帮助。
该图每一层都以相邻的下层为基础,同时又是相邻上层的基础。直至达到应用层为止。
看到这个图有没有想到 ISO 七层模型

我从下至上来介绍一下:


ip网络协议 大哥哥

IP:就是ip网络协议
为什么需要它?
因为用到网络层数据的传输,IP层用于数据的发送与接收。
想象一下两个设备互联,其实就是在网络互联,所以需要网络层协议。


TCP-UDP


这里包含了UDP和TCP两块协议。
这里图应该这样表示:


一堆看不懂的?


UDP协议跟IP协议组合成:UDP/IP协议
而 HHTPMU 和 HTPU 这两个协议是基于 UDP/IP 协议之上的。
TCP协议跟IP协议组合成:TCP/IP 协议
HTTP 则是基于 TCP/IP 协议上。

TCP/IP 协议大家应该都了解,但为何出现一个 UDP/IP 呢?使用UDP,可以通过多点传送(Multicast)向 LAN 上所有支持UPnP的设备发送新设备接入的通知。这里流媒体 也会使用 UDP 来传输,因为速度快。

HHTPMU 和 HHTPU 是什么?
它是构建在 TCP/IP 协议之上的是 HTTP 协议及其变种,所有 UPnP 消息都被封装在 HTTP 协议及其变种中。HTTP 协议的变种是 HTTPU 和 HTTPMU,这些协议的格式沿袭了 HTTP 协议,只不过与 HTTP 不同的是他们通过 UDP 而非 TCP 来承载的,并且可用于组播进行通信。
可见 它之所以存在就是替换 TCP 为 UDP。

接下来就是 设备发现 | 设备控制 | 设备事件 协议了:
(打起精神 😄 )
1、设备发现 SSDP 协议
简单服务发现协议(Simple Service Discovery Protocol:SSDP)
具体包括控制点如何发现网络上有哪些服务,以及这些服务的资讯,还有控制点本身宣告他提供哪些服务。

2、控制设备 SOAP 协议
简单对象访问协议(Simple Object Access Protocol:SOAP)
它定义如何使用 XML 与 HTTP 来执行远程过程调用。包括控制点如何发送命令消息给设备,设备收到命令消息后如何发送响应消息给控制点。

3、设备事件 GENA 协议
通用事件通知架构(Generic Event Notification Architecture:GENA)
定义在控制点想要监听设备的某个服务状态变量的状况时,控制点如何传送订阅信息并如何接收这些信息。


体系定义

这一层仅仅是一个抽象的、公用的设备模型。就是一个规范 定义,所有的 UPnP 设备都必须使用这层。


UPnP论坛

UPnP 论坛的各个专业委员会的设备定义层,在这个论坛中,不同电器设备由不同的专业委员会定义,例如:电视委员会只负责定义网络电视设备部分,空调器委员会只负责定义网络空调设备部分,依此类推。


UPnP设备制造厂商定义

也就是应用层,由 UPnP 设备制造厂商定义的部分。

总结:
内容都是一些概念,所以比较枯燥,下面章节我会通过代码一步一步实现投屏,还深入进行原理的分析噢。一周内更新,不要错过!
下章预告:
手机通过WIFI发现设备
这部分是通过Cling DLNA类库来实现发现设备的。
内容包括:
1、抽出发现设备所需接口
2、发现设备步骤的实现
3、原理的分析

android实现投屏代码(未完结)