您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 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(音频编码)EncryptionTypesMetadataTypesRAOP从本质上来说是实时流协议(RTSP,其内容为实时流传输协议和控制协议),只不过增加了基于身份验证请求-应答的一步。实时流协议是应用层协议,用来实现和控制实时数据的传送。RAOP服务用两个信道实现流媒体音乐:一个是用实时流协议的控制信道;另一个是数据信道用来发送原始数据。以iTunes客户端(v6.0.4)和AirportExpress路由器(简称ApEx)之间的数据交换为例分析RAOP服务过程如下所示:从iTunes到ApEx传输从ApEx到iTunes传输从上面可以看出iTunes客户端提供自己的版本号和一个随机生成的22byte的加密的苹果请求参数给ApEx。然后ApEx回复一个响应,这个响应是由储存在ApEx的私钥加密后的请求参数。然后iTunes用非对称密钥对的公钥对该值进行验证(这种私钥加密公钥验证的方法具体实现细节如果感兴趣可以参考)。这一步目的是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服务器音频流使用的是会话描述协议。并且也会告知相关的编码信息和加密密钥信息。协议交互如下:ANNOUNCEforAppleLosslessaudiofromiTunesSETUP:SETUP会初始化一个记录会话,发送必要的传输信息建立三个UDP信道:协议交互如下:setuparecordsessionRECORD:RECORD启动音频流,RTP-Info头文件里包含了下面的参数:启动音频流的协议交互如下:FLUSH:FLUSH关闭音频流。其协议交互如下:TEARDOWN:TEARDOWN结束RTSP会话,其协议交互上面已经有图介绍过。如果想有更深入的了解可以参考中关于音频的部分。三、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=$PWDTARGET_INC=$WORK_DIR/includeTARGET_LIBS=$WORK_DIR/libTARGET_BIN=$WORK_DIR/binTARGET_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-rawmidi2.make时出现以下错误:parser.c:Infunction'uc_mgr_scan_master_configs':parser.c:1138:error:'versionsort'undeclared(firstuseinthisfunction)parser.c:1138:error:(Eachundeclaredidentifierisreportedonlyonceparser.c:1138:error:foreachfunctionitappearsin.)make[2]:***[parser.lo]Error1解决方法:patch-p1alsa-lib-1.0.24.1-uclibc-missing-versionsort.patch3.下面又出现问题: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:ldreturned1exitstatusmake[1]:***[aserver]Error1make[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。交叉编译openssl1../configsharedno-asm--prefix=/home/wcy/shairport/--openssldir=/home/wcy/shairport/openssl-1.0.1e2.修改Makefile:CC=mips-linux-gccRANLIB=/home/wcy/Lsdk/build/gcc-4.3.3/build_mips/staging_dir/usr/binNM=mips-linux-nmAR=mips-linux-ar交叉编译howl1../configure--prefix=$WORK_DIR--bindir=$TARGET_BIN--sbindir=$TARGET_BIN--libexecdir=$TARGET_BIN--libdir=$TARGET_LIBS--includedir=$TARGET_INC--host=mips-linux--build=i686-linux2.make时出现错误解决方法如下:即:进入src/autoipd执行命令makelinux_autoip.loposix_main.lo交叉编译zlib./configure–prefix=../../Lsdk/build/gcc-4.3.3/build
本文标题:Airplay协议研究(含shairport交叉编译移植与调试)
链接地址:https://www.777doc.com/doc-2901062 .html