Airplay协议研究含shairport交叉编译移植与调试.docx

上传人:b****5 文档编号:7423289 上传时间:2023-01-23 格式:DOCX 页数:12 大小:260.46KB
下载 相关 举报
Airplay协议研究含shairport交叉编译移植与调试.docx_第1页
第1页 / 共12页
Airplay协议研究含shairport交叉编译移植与调试.docx_第2页
第2页 / 共12页
Airplay协议研究含shairport交叉编译移植与调试.docx_第3页
第3页 / 共12页
Airplay协议研究含shairport交叉编译移植与调试.docx_第4页
第4页 / 共12页
Airplay协议研究含shairport交叉编译移植与调试.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

Airplay协议研究含shairport交叉编译移植与调试.docx

《Airplay协议研究含shairport交叉编译移植与调试.docx》由会员分享,可在线阅读,更多相关《Airplay协议研究含shairport交叉编译移植与调试.docx(12页珍藏版)》请在冰豆网上搜索。

Airplay协议研究含shairport交叉编译移植与调试.docx

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为端口号。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1