/****************************************************AirPlay2协议整合文档****************************************************/+-------------------------------------------+| 文档目录+-------------------------------------------+|| 1-AirPlay2简介|  | 1.1-服务注册与设备发现|  | 1.2-密钥协商与设备连接|  | 1.3-音频工作原理|  | 1.4-镜像工作原理|  | 1.5-苹果数据包承载分析| 2-AirPlay2工作主流程|  | 2.1-mDNS与DNS_SD|  | 2.2-RTSP请求与响应流程|  | 2.3-ED数字签名ed25519|  | 2.4-DF密钥协商curve25519|  | 2.5-AES分组密码-CTR模式|  | 2.6-镜像线程与h264解密还原|  | 2.7-音频线程与aac_decoder| 3-BUG| 4-可能的新方法| 5-可参考的博客及资料|| more| +-------------------------------------------+1-AirPlay2简介AirPlay2协议为苹果私有协议,其适用于IOS设备与MAC设备,协议中包含的模块有:服务注册、服务发现、HTTP(RTSP)、RTP、数据流解密。下面对各个模块做相应的介绍,如果要了解具体工作,可直接移步至第2章(AirPlay2工作主流程)。1.1-服务注册与设备发现Bonjour协议是苹果公司实现的一种零配置网络协议,在AirPlay2中也包含该协议,Bonjour可以完成在局域网内的设备进行对应服务的发现,在发现所需要的服务以后通过查其PTR,SRV,TXT记录得到服务端的ip和port,用于后续建立通信。1.2-密钥协商与设备连接密钥协商过程完成客户端(如iPhone)与服务端(Android设备)的加解密准备工作,此时的密钥还不是完成的密钥,后续的步骤中,会进行相关的操作来生成真正用于加解密的密钥。这个步骤被嵌入到 RTSP连接的第1个 POST /pair-verify请求中。跟密钥相关的另一个请求是第1个 SETUP。具体见第2章讲解。设备连接(如镜像请求)主要位于RTSP连接的第2个 SETUP请求中。该步骤要求Android端打开数据监听端口、时间同步端口,并把端口response给客户端。1.3-音频工作原理RAOP(远程音频控制协议)。在音频连接请求中,其type代号为96。AirPlay2发送的音频包为经过AES加密的aac数据,对于Java中的AudioTrack而言,需要转成pcm格式使用。详情可见第2章(音频线程与aac_decoder)1.4-镜像工作原理Mirror。在镜像连接请求中,其type代号为110。AirPlay2发送的镜像视频包为经过AES加密(CTR模式)的h264数据。详情可见第2章(镜像线程与h264解密还原)1.5-苹果数据包承载分析以AirPlay2镜像连接为例,Android端设备不断执行select、recv操作。在每次可读循环中,都会先recv一个128字节的数据包,该数据包可参见PPT(音视频数据解析),其含有负载数据大小,负载类型(sps_pps参数集?视频流?心跳包?),NTP时间戳,视频高度与宽度值的地址值。具体的后续操作都要依据负载类型来进行执行。2-AirPlay2工作主流程工作主流程为:(服务端准备工作)->(客户端寻找服务端)->(客户端发起请求)->*(RTSP请求与响应)*->(连接建立,开始投屏)->(客户端发送数据、服务端接收数据)->(退出投屏,连接关闭)2.1-mDNS与DNS_SDAirPlay2采用的组播地址为224.0.0.251,端口为5353。服务端利用mDNSResponder这个第三方库(来自Apple)即可将raop,airplay两个服务注册完成,注册后的这两个服务名字结构可参考PPT(设备广播与发现)。另一个需要准备的任务是建立一个http监听线程,用于监听raop服务所属端口。至此,Android服务端准备工作完成。当iPhone打开服务发现时,会通过组播查询相应的两个服务。并查询PTR,SRV,TXT记录(由Android服务端一次性发送给iPhone)。iPhone可解析得到Android服务端名字,ip,端口。至此,服务发现完成。这一模块的代码比较标准,因为第三方库是苹果自身提供的,因此暂时没有做修改的必要与打算。2.2-RTSP请求与响应流程这一步是工作主流程的重要步骤,也是建立连接及区分服务端后续任务的关键。在Android服务端中,由于在准备工作中有一个监听来自raop服务所属端口的http请求的线程(称其为http监听线程),因此第一个RTSP请求就是先发送到这个端口中,在被http监听线程监听到fd改变后,该线程会进行accept等动作,建立socket连接。连接建立后,RTSP请求正式一个一个地进入。依次到来的请求顺序为:GET /info-> POST /pair-setup*-> POST /pair-verify*-> POST /pair-verify-> POST /fp-setup-> POST /fp-setup-> SETUP-> GET /info-> GET_PARAMETER-> RECORD-> SET_PARAMETER*-> SETUP*-> SET_PARAMETER-> ...注意:这个...代表的后续行为是依据后续iPhone用户的不同操作来产生的。例如后续需要播放声音了,就会产生type值为96的SETUP请求。(但是在iPhone一开始连接上Android服务端时,先是这几个请求动作。)其中各个请求的任务已经在PPT中有所描述,其中较为复杂的是两个加*的请求。具体可见PPT(POST /pair-verify 工作详解)与(SETUP(第二个) 工作详解)。2.3-ED数字签名ed25519ed25519是AirPlay2中所用到的数字签名函数,主要在*POST/pair-verify*被使用。其具体可参考PPT(信息交互与能力协商(数字签名))。2.4-DF密钥协商curve25519curve25519是AirPlay2中所用到的Diffie-Hellman密钥交换(密钥协商)函数,这是一个椭圆曲线函数,可用于客户端与服务端协商产生一个在后续加解密中需要使用的一个密钥雏形。具体的aeskey会在第一个SETUP中到达,而用于解密h264数据的密钥会在第二个SETUP之后完成,具体可参考PPT(RTSP请求到达顺序)。2.5-AES分组密码-CTR模式在镜像传输过程中,h264流被AES分组密码(CTR模式)所加密。该AES分组密码是由多个RTSP请求,逐步求得的。根据对称密码的特点,服务端可以利用这个密码解密数据。具体可见PPT(音视频数据解析(视频流))。2.6-镜像线程与h264解密还原在第二个SETUP中,会有一个搜索type值的过程,若type值为110,则为镜像请求;若为96,则为音频请求。若得到镜像请求,则开启镜像端口,并把端口response给客户端(端口会被构造、添加到一个plist的node)。随后,监听相应端口。在该代码中,会监听一个用于TCP连接的data socket,以及一个用于UDP的time socket。在建立TCP连接后,将持续轮询执行select fd,recv data,用以得到 视频数据包。在每个可读的轮询中,先recv一个128字节的数据包,该包中包含后续要recv的视频数据包的相关信息。详情可见PPT(音视频数据分析)。2.7-音频线程与aac_decoder在第二个SETUP中,会有一个搜索type值的过程,若type值为110,则为镜像请求;若为96,则为音频请求。若得到音频请求,则开始raop端口的监听,后续操作与2.6步骤差不多,此处不再赘述。音频数据后续利用aac_decoder解码,得到pcm数据后,送入AudioTrack进行播放。3-BUG因技术有限,目前仍存在如下BUG:1、延迟显示问题(由于抓到的流能进行正常的重新播放,故基本不存在流数据破损导致画面延时的可能,猜测是MediaCodec解码具有缓存引起的,可能需要进行秒开优化或者丢帧处理)2、音视频同步问题(由于现在并没有集成到播放器那个维度,故收到的音频数据与视频数据是各自独立播放的,在C层代码中有为音视频同步做准备的代码,但目前看来,不起效果。可能是因为没有正确组织代码逻辑引起的,预言:将分离的音频和视频送入IJK播放器可能可以进行同步)3、关闭服务时的异常(在部分机器上,关闭服务时会导致APP闪退,问题是线程及部分socket连接未正确关闭,由于之前主要关心第1个问题,故尚未处理线程与socket连接的关闭问题。)4-可能的新办法见PPT最后,集成IJK播放器,实现秒开。充分利用播放器的能力,实现音视频同步。5-可参考的博客及资料+-----------------------------------------------------------------+- https://nto.github.io/AirPlay.html --   AirPlay非官方的文档,非AirPlay2,有一定参考意义;- https://www.cnblogs.com/seven-sky/p/4729962.html   --   介绍mDNSResponder,用于mDNS;- https://blog.csdn.net/feng19870412/column/info/36310  --   AirPlay协议开发;- https://blog.csdn.net/rambomatrix/article/details/80961060--   AirPlay Android接收端学习一 协议- https://blog.csdn.net/yueqian_scut/article/details/52694411--   局域网设备发现之Bonjour协议- https://blog.csdn.net/wirelessdisplay/article/details/78228872--   ios airplay mirroring镜像- https://blog.csdn.net/bxjie/article/details/39581565--   关于airplay协议实现镜像功能研究+-----------------------------------------------------------------+more-更多关于该工程有关的代码分析,可参考 STRUCT.txt
/****************************************************AirPlay2工程重要结构体介绍+第三方库介绍****************************************************/+---------------------------------------------+| 请同时打开 raop_server.vsdx(图中有字母标识)+---------------------------------------------+||  A.  raop_server_s|  B.  raop_s|  C.  dnssd_s|  D.  httpd_s|  E.  httpd_callbacks_s|  F.  http_connection_s|  G.  raop_conn_s|  H.  raop_rtp_s|  I.  raop_rtp_mirror_s|  J.  pairing_session_s|  K.  raop_buffer_s|  L.  mirror_buffer_s| +---------------------------------------------+---  A.  raop_server_s-    主结构体,内部含 raop_s 和 dnssd_s---  B.  raop_s-    关于Airplay2功能的总结构体(dnssd除外)---  C.  dnssd_s-    关于服务注册与服务发现的结构体-    利用第三方库mDNSResponder(Apple开源)---  D.  httpd_s-    用于监听服务端口,处理到达的请求(RTSP),根据不同的请求执行后续操作-    关键在于其内部的thread(httpd_thread)---  E.  httpd_callbacks_s-    回调函数结构体-    关键在于conn_request(处理不同请求)---  F.  http_connection_s-    已完成的连接(客户端与服务端)-    其中的user_data实际为raop_conn_t的指针---  G.  raop_conn_s-    用于在有连接建立之后使用,可用来处理镜像(视频)或者音频---  H.  raop_rtp_s-    用于处理音频-    包含音量、进度等音频相关变量---  I.  raop_rtp_mirror_s-    用于处理镜像-    关键在于产生的子线程-    分别用于接收数据、解密数据、转发数据至Java层---  J.  pairing_session_s-    这是一个过渡结构体,用于保存各种密钥与签名相关数据,最后将密钥保存至K\L两个结构体中后---  K.  raop_buffer_s-    用于处理音频的结构体,将aac解密后,再转成pcm,送入音频播放器---  L.  mirror_buffer_s-    用于处理镜像的结构体,将h264解密后,送入视频解码器解码+---------------------------------------------+| 第三方库介绍+---------------------------------------------+|| fdk-aac:音频转码| mDNSResponder:服务注册与服务发现| plist:解析请求中的字段| playfair:苹果私有加密的核心| crypto:密码技术相关| curve25519:椭圆曲线函数,用于密钥协商| ed25519:数字签名算法|+---------------------------------------------+

【AirPlay2开发】协议整合相关推荐

  1. 《实战突击:PHP项目开发案例整合(第2版)(含DVD光盘1张)》

    <实战突击:PHP项目开发案例整合(第2版)(含DVD光盘1张)> 基本信息 作者: 徐康明    辛洪郁 出版社:电子工业出版社 ISBN:9787121221378 上架时间:2014 ...

  2. java的model层实例_Struts 2.1.6 精简实例系列教程(3):新闻管理Model层的开发(整合iBatis)...

    本期开始讲Model层的开发,整合iBatis框架,iBatis是Apache旗下Java数据持久层的框架,跟Hibernate是同一类型的框架.大家可到它的官方网站去下载http://ibatis. ...

  3. 《实战突击.php项目开发案例整合》.(明日科技).[PDF]ckook

    图书作者: 明日科技 图书编号: 9787121141140 图书格式: PDF 出 版 社: 电子工业出版社 出版年份: 2011 图书页数: 800-900 [内容简介] <实战突击:php ...

  4. 实战突击:PHP项目开发案例整合(第2版)

    为什么80%的码农都做不了架构师?>>>    实战突击:PHP项目开发案例整合(第2版) 案例涉及行业广泛,实用性非常强.通过对<实战突击:PHP项目开发案例整合(第2版)& ...

  5. 《SpringBoot框架开发技术整合》笔记(一)

    文章目录 前言 第一章 构建简单WEB项目 第二章 SpringBoot接口返回Json 第三章 SpringBoot热部署 第四章 SpringBoot资源文件属性 前言     笔者近期在慕课网上 ...

  6. 《SpringBoot框架开发技术整合》笔记(二)

    文章目录 前言 第五章 SpringBoot配置全局的异常捕获 一. 页面跳转形式 二. ajax形式 三. 统一返回异常的形式 参考 前言     笔者近期在慕课网上学习了<Springboo ...

  7. 微信php功能整合,微信公众平台开发功能整合

    一.简介 在前面的几篇微信功能开发文档中,各个微信的功能都是独立的,单一微信只能提供一种功能,这样不符合大众开发者和客户的需求.所以在这一篇文章中,我们将对前面开发出来的微信功能进行简单整合,以供读者 ...

  8. 个人微信开发协议sdk接口API分享

    个人微信开发协议sdk接口API分享 1.基础消息类型 1.客户端发送的心跳包 HeartBeatReq = 1001; 2.消息接收确认回复(接收或拒绝接收) MsgReceivedAck = 10 ...

  9. JAVAWEB开发之Spring详解之——Spring的入门以及IOC容器装配Bean(xml和注解的方式)、Spring整合web开发、整合Junit4测试

    Spring框架学习路线 Spring的IOC Spring的AOP,AspectJ Spring的事务管理,三大框架的整合 Spring框架概述 什么是Spring?  Spring是分层的Java ...

最新文章

  1. 使用Visual Studio重构与分析Python
  2. 物流行业如何选择手持终端
  3. JAVA入门级教学之(编写第一个HelloWorld程序)
  4. sata接口 图解 定义_硬盘有几个接口 硬盘不同接口介绍【详解】
  5. 【转】彻底删除打印机
  6. 【转】ubuntu 12.04 /sbin/ldconfig.real: /usr/local/lib/*.so.8 不是符号连接 解决办法
  7. 计算机上的符号在哪找,像w的那个符号在哪里可以找到?word文档
  8. java获取登录内网ip地址
  9. python保存超大数据excel表格——大于65532
  10. 【linux】vi常用快捷键
  11. 分享一款超棒的jQuery Google地图插件:Gmaps
  12. HTML5网页编辑基础(简介+基础标签使用)
  13. 光伏电站清扫机器人_光伏电站清扫机器人
  14. 数据结构之顺序表(Java实现)
  15. log4j WARN 和 SLF4J WARN 解决办法
  16. Unity的ScrollRect如何裁切粒子特效,以及如何使粒子特效显示在UI上
  17. 阿里年薪50WJAVA工程师转大数据学习路线!
  18. 遇到同事求助时需要帮助的3件事情,别说你不知道
  19. Android学习——UI高级组件三
  20. 【工具分享】优雅地下载B站高清视频的【神级】解决方案

热门文章

  1. 猿创征文|Hexo+Github搭建完全免费个人博客详细教程
  2. EUI-64生成IPv6地址
  3. 报表相关的同比和环比
  4. git-cz git commit 定制提交规范
  5. 表格头固定而列可滚动的效果
  6. PS设计网页下载使用960栅格系统设计简洁网页
  7. ReferenceQueue、Reference详解
  8. JVM探秘:垃圾收集器
  9. 《一本书读懂财报》:系统的输入与输出的体现
  10. 腾讯、阿里、百度高工都点头称赞的“Redis 实战超全笔记”,不看你就亏大发了