Airplay协议研究含shairport交叉编译移植与调试.docx
- 文档编号:7423289
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:12
- 大小:260.46KB
Airplay协议研究含shairport交叉编译移植与调试.docx
《Airplay协议研究含shairport交叉编译移植与调试.docx》由会员分享,可在线阅读,更多相关《Airplay协议研究含shairport交叉编译移植与调试.docx(12页珍藏版)》请在冰豆网上搜索。
Airplay协议研究含shairport交叉编译移植与调试
AIRPLAY协议
一、介绍
AIRPLAY是由苹果公司实现的一套协议族,用来实现在AppleTV上浏览iPhone、iPodtouch、iPad(硬件设备)或者iTunes(软件)中的各种媒体内容。
AirPlay支持如下几种使用场景:
∙从iOS设备上传输并显示照片、幻灯片;
∙从iOS设备或者Itunes软件中传输并播放音频;
∙从iOS设备或者Itunes软件中传输并播放视频;
∙对iOS设备或者OSXMountainLion进行屏幕镜像。
由于此功能需要硬件的硬解码支持,所以只能在iPad2、iPhone4S、带SandyBridgeCPU的Mac电脑(或更新的设备)上支持。
最初这套协议名字叫AirTunes,只支持音频流播放。
后来苹果开发AppleTV时,对此协议进行了扩充和改进,加入了视频支持,并改名叫做AIRPLAY。
AIRPLAY协议基于一些知名的网络标准协议,如MulticastDNS、HTTP、RTSP、RTP或NTP以及其他的一些自定义扩展。
由于我们只关注音频部分,所以下面研究的重点是AirTunes服务。
二、实现机制
实现AIRPLAY协议的软件不需要再做任何配置就能发现同一网络中的相关设备,这主要得益于Bonjour(基于M-DNS协议实现)
Bonjour:
苹果为基于组播域名服务(multicastDNS)的开放性Zeroconf标准所起的名字。
Zeroconf(零设置网络标准):
全称为Zeroconfigurationnetworking,中文名则为零配置网络服务标准,是一种用于自动生成可用IP地址的网络技术,不需要额外的手动配置和专属的配置服务器。
“零配置网络”的目标,是让非专业用户也能便捷的连接各种网络设备,例如计算机,打印机等。
整个搭建网络的过程都是通过程式自动化实现。
如果没有zeroconf,用户必须手动配置一些服务,例如DHCP、DNS,计算机网络的其他设置等。
这些对非技术用户和新用户们来说是很难的事情。
具体例子为:
用户拥有一台appletv和一台iPhone4s,那之只要都连入到同一个无线局域网内,iphone4s就会自动找出appletv,那么在播放音乐或者视频时候,用户只要点击推送,就可以讲音乐和视频推送到appletv上播放。
除了Bonjour以外,实现Zeroconf协议的还有Avahi和howl。
下面以AirTunes服务为例来具体看是如果实现服务发现的。
首先发布RAOP(RemoteAudioAccessProtocol )服务,其格式如下:
name字段由设备的MAC地址和远程设备的名称组成(通常就在客户端上显示此设备名称)
TXT参数中包含以下字段:
Audiocodecs(音频编码)
EncryptionTypes
MetadataTypes
RAOP从本质上来说是实时流协议(RTSP,其内容为实时流传输协议和控制协议),只不过增加了基于身份验证请求-应答的一步。
实时流协议是应用层协议,用来实现和控制实时数据的传送。
RAOP服务用两个信道实现流媒体音乐:
一个是用实时流协议的控制信道;另一个是数据信道用来发送原始数据。
以iTunes客户端(v6.0.4)和AirportExpress路由器(简称ApEx)之间的数据交换为例分析RAOP服务过程如下所示:
从iTunes到ApEx传输
从ApEx到iTunes传输
从上面可以看出iTunes客户端提供自己的版本号和一个随机生成的22byte的加密的苹果请求参数给ApEx。
然后ApEx回复一个响应,这个响应是由储存在ApEx的私钥加密后的请求参数。
然后iTunes用非对称密钥对的公钥对该值进行验证(这种私钥加密公钥验证的方法具体实现细节如果感兴趣可以参考http:
//zh.wikipedia.org/wiki/RSA%E5%8A%A0%E5%AF%86%E6%BC%94%E7%AE%97%E6%B3%95)。
这一步目的是iTunes用来验证是否正在与一个ApEx对话。
在这一步交流过后上述连接断开。
接下来,iTunes在同一个端口建立另外一个与ApEx相连的RTSP连接,同时提供一个随机产生的AES密钥给ApEx。
这个AES密钥是经过RSA加密过的,其密钥由iTunes提供(即非对称密钥对的公钥)。
然后通过ApEx的私钥解密来验证是否正在跟一个iTunes对话。
值得欣喜的是目前通过逆向工程已经破解了非对称密钥对。
上述过程如下所示:
从iTunes到ApEx传输
从ApEx到iTunes传输
然后,ApEx告诉iTunes哪一个端口用于数据连接(server_port,6000)。
从iTunes到ApEx传输
从ApEx到iTunes传输
在控制包里的RTSP序列和时间戳的交换如下所示:
从iTunes到ApEx传输
从ApEx到iTunes传输
下面展示如果调整音量参数:
从iTunes到ApEx传输
从ApEx到iTunes传输
最后展示是如何关闭会话的:
从iTunes到ApEx传输
从ApEx到iTunes传输
重新来看下图:
知ApEx支持的方法有:
ANNOUNCE, SETUP, RECORD, PAUSE, FLUSH, TEARDOWN, OPTIONS, GET_PARAMETER和SET_PARAMETER。
ANNOUNCE:
ANNOUNCE会告诉RTSP服务器音频流使用的是会话描述协议。
并且也会告知相关的编码信息和加密密钥信息。
协议交互如下:
ANNOUNCE for AppleLossless audiofromiTunes
SETUP:
SETUP会初始化一个记录会话,发送必要的传输信息建立三个UDP信道:
协议交互如下:
setuparecordsession
RECORD:
RECORD启动音频流,RTP-Info头文件里包含了下面的参数:
启动音频流的协议交互如下:
FLUSH:
FLUSH关闭音频流。
其协议交互如下:
TEARDOWN:
TEARDOWN结束RTSP会话,其协议交互上面已经有图介绍过。
如果想有更深入的了解可以参考http:
//nto.github.io/AirPlay.html#audio-rtsprequests中关于音频的部分。
三、AIRPLAY协议的实现、移植与调试:
在linux下实现AIRPLAY协议的开源软件有shairport、xmbc(其音频部分实现机制也是基于shairport的)。
shairport是一个模拟ApEx路由器的软件,用以达到传输来自iTunes和其他兼容设备的音乐的目的。
它是作为支持RAOP的一个服务端。
其0.X版本是perl脚本写的,但目前shairport已经更新至1.0-dev,该版本已经去除perl脚本部分,改为完全由C写成,这更方便了我们进行移植工作。
但是目前其还在开发中,还没正式发布,潜在着bug。
1.0-dev版本后必需的依赖库是OpenSSL,可选的依赖库有libao、PulseAudio、avahi(或者howl)。
通过分析知,如果libao和PulseAudio安装后shairport将有5个输出后端(即alsa、ao、pusle、dummy、pipe)可以选择,而即便不安装libao和PulseAudio,shairport将仍有3个输出后端(即alsa、dummy、pipe),不影响shairport的功能(播放时会产生延迟),如果追求高质量的音质最好还是要安装PulseAudio。
通过不断的尝试,可以选择交叉编译OpenSSL和howl,以避免复杂的交叉编译。
总共需要进行交叉编译的有alsa-lib、OpenSSL、howl、zlib和shairport1.0-dev
交叉编译前依然是先新建安装目录shairport,并约定目录(在shairport目录下进行):
WORK_DIR=$PWD
TARGET_INC="$WORK_DIR"/include
TARGET_LIBS="$WORK_DIR"/lib
TARGET_BIN="$WORK_DIR"/bin
TARGET_SBIN="$WORK_DIR"/sbin
交叉编译alsa-lib:
1../configure--prefix="$WORK_DIR"--bindir="$TARGET_BIN"--sbindir="$TARGET_BIN"--libexecdir="$TARGET_BIN"--libdir="$TARGET_LIBS"--includedir="$TARGET_INC"--enable-shared--disable-static--host=mips-linux--build=i686-linux--disable-alisp--disable-python--disable-old-symbols--disable-seq--disable-rawmidi
2.make时出现以下错误:
parser.c:
Infunction'uc_mgr_scan_master_configs':
parser.c:
1138:
error:
'versionsort'undeclared(firstuseinthisfunction)
parser.c:
1138:
error:
(Eachundeclaredidentifierisreportedonlyonce
parser.c:
1138:
error:
foreachfunctionitappearsin.)
make[2]:
***[parser.lo]Error1
解决方法:
patch-p1 3.下面又出现问题: aserver.o: Infunction`pcm_shm_cmd': aserver.c: (.text+0x25f0): warning: Warning: snd_pcm_hwsync()isdeprecated,considertousesnd_pcm_avail() ../src/.libs/libasound.so: undefinedreferenceto`atomic_sub' ../src/.libs/libasound.so: undefinedreferenceto`atomic_add' collect2: ldreturned1exitstatus make[1]: ***[aserver]Error1 make[1]: Leavingdirectory`/home/wcy/shairport/alsa-lib-1.0.24.1/aserver' make: ***[all-recursive]Error1 解决方法: 在alsa-lib-1.0.24\include中的iatomic.h中定义的有关mips架构的atomic_add和atomic_sub函数的实现时,将extern改为static。 交叉编译openssl 1../config shared no-asm --prefix=/home/wcy/shairport/--openssldir=/home/wcy/shairport/openssl-1.0.1e 2.修改Makefile: CC=mips-linux-gcc RANLIB=/home/wcy/Lsdk/build/gcc-4.3.3/build_mips/staging_dir/usr/bin NM=mips-linux-nmAR=mips-linux-ar 交叉编译howl 1../configure--prefix="$WORK_DIR"--bindir="$TARGET_BIN"--sbindir="$TARGET_BIN"--libexecdir="$TARGET_BIN"--libdir="$TARGET_LIBS"--includedir="$TARGET_INC"--host=mips-linux--build=i686-linux 2.make时出现错误 解决方法如下: 即: 进入src/autoipd执行命令makelinux_autoip.loposix_main.lo 交叉编译zlib ./configure–prefix=../../Lsdk/build/gcc-4.3.3/build_mips/staging_dir/usr 修改Makefile: CC=../../Lsdk/build/gcc-4.3.3/build_mips/staging_dir/usr/bin/mips-linux-gcc CPP=mips-linux-gcc AR=mips-linux-ar RANLIB=mips-linux-ranlib prefix=../../Lsdk/build/gcc-4.3.3/build_mips/staging_dir/usr 交叉编译shairport ./configure之后修改Makefile: 添加CC=../../Lsdk/build/gcc-4.3.3/build_mips/staging_dir/usr/bin/mips-linux-gcc 修改config.mk: 删去CONFIG_PULSE=yes 修改CFLAGS和LDFLAGS: CFLAGS+=-D_REENTRANT-I/../../Lsdk/build/gcc-4.3.3/build_mips/staging_dir/usr/include/alsa LDFLAGS+=-L/../../Lsdk/build/gcc-4.3.3/build_mips/staging_dir/usr/lib-lm-lpthread-lssl-ldl-L/../lib-lz-lasound-lcrypto 修改config.h: 删去#defineCONFIG_PULSE 移植到板子上需要三个可执行文件,分别是mDNSResponder、mDNSPublish和shairport(三者的大小加起来175kb),且总共需要移植的动态库有10个(大小总共加起来有6.59mb)如下图所示: 动态库放在/lib,可执行程序放在/bin中即可。 调试过程中如果出现“cannotload****.so.*,可通过创建SymbolicLink来解决。 调试的结果是程序正常运行,协议交互正常,音频播放功能暂时还没办法测试有待完善(需求带音频部分的板子和外接音箱) 测试环境为win7iTunes和芯片9341tplink的路由器。 测试原理: 由于路由器和win7在同一个网络中,所以win7下当iTunes软件开启时将能发现路由器中的扬声器设备(虚拟)即图中的蓝色矩形框中会显示相应的小喇叭,其名字对应于开启服务时的输入,这里为“gdpisen” 图中78DC5128A107为路由器的MAC地址,_raop._tcp为协议类型,5002为端口号。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Airplay 协议 研究 shairport 交叉 编译 移植 调试
![提示](https://static.bdocx.com/images/bang_tan.gif)