基于Android 的蓝牙A2DP 功能的实现

摘 要:蓝牙(Bluetooth)技术是一种低成本的无线数据与数字通信的开放性全球规范。
  Android 是Google 于2007 年11 月5 日宣布的基于Linux平台开源手机操作系统名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。本文通过研究蓝牙无线通信协议栈,在Android 手机平台上设计并实现了蓝牙立体声耳机收听高保真音乐的功能(即A2DP 应用框架的实现)。
  
  关键词:蓝牙;A2DP ;Android
  
  1.引言
  蓝牙(Bluetooth)技术规范由蓝牙特别兴趣小组(SIG)制订,在使用通用无线传输模块和数据通信协议的基础上,开发交互式服务和应用,多用于便携式通信设备。
  蓝牙规范包括核心协议与应用框架(profiles)两个文件。协议规范部分定义了蓝牙的各层通信协议,应用框架只出了如何采用这些协议实现具体的应用产品[1]。
  蓝牙协议规范遵循开放系统互联参考模型(Open System Interconnection/ReferencedModel, OSI/RM),从低到高地定义了蓝牙协议栈的各个层次。
  逻辑链路控制与适配协议以下的协议都是蓝牙无线通信的核心协议,为蓝牙通信提供无连接与面向连接的数据通道。串口仿真协议将很容易地实现有具有电缆的串行通信应用模型向无线串行通信领域的转移。服务发现协议服务发现协议(SDP)是蓝牙技术框架中非常重要的一个部分,它是所有应用模型的基础。任一蓝牙应用模型的实现都是利用某些服务的结果。
  在设备之间组网的基本动机就是使这些设备相互通信,并且获得彼此的服务。其他协议都是蓝牙应用协议,本文就是在AVDTP(音视频发布传输协议)基础上实现A2DP的功能[2]。
  
  2.开发平台及Android系统
  文本的硬件平台是以Mavell公司的Tavor平台为基础,Tavor平台包换两各部分:应用程序子系统和通信子系统。其中XscaleCPU(624 MHz)用于应用程序子系统,ARMCPU(34.67MHz to 208MHz)与MSA core(52 MHzto 312MHz)一同专门处理通信模块子系统,当手机处于待机状态时,XScaleCPU会处于休眠状态以节省电量,两个CPU使用自己的DDR内存,通信通过MSL串行总线。蓝牙芯片通过串口与XScale相连。
  
  2.1 音频系统
  蓝牙芯片(WLAN/Bluetooth88W8688,串口连接最大3.6Mbps,64-byteFIFOs)作为外设有两条数据通路,一条是SSP3串行接口用于语音通信PCM数据的收发,用于创建SCO链路。另一条是和串口控制器的连接用于ACL数据分组的收发以及以数据分组为基础的其他应用。I2C总线用与控制音频解码芯片进行选路的操作(声音从哪里出来,喇叭,有线耳机或蓝牙设备)。SSP2接口是音频数据传送的通道。
  
  2.2 Android 系统
  Android是一个为移动设备设计的软件平台,包括操作系统、中间件和一些关键应用。
  目前发布的Android SDK提供了必须的工具和进行应用开发所必须的API,在Android上的开发使用Java语言。
  开发者开发自己的应用时可以调用核心应用所使用的相同的API接口。这个应用程序架构被设计用来简化组件的重用;任何应用都可以宣布它的功能,其他的任何应用都可以使用这些功能。相同的机制允许组件被用户替换。
  Android包括了一套C/C++库,这些功能是通过Android应用框架提供给开发者的。
  每个Android应用程序在它自己的进程中运行,有它自己的Dalvik虚拟机的实例。Dalvik已经被改写过,使得一个设备可以有效得运行多个 VM。Dalvik虚拟机运行自己独特的可执行文件格式--.dex,该格式经过优化,使用尽量少的内存。Dalvik虚拟机依赖LinuxKernel 提供底层功能支持,如线程、底层内存管理。
  Android依赖Linux内核2.6提供核心系统服务,比如安全、内存管理、进程管理、网络、硬件驱动。蓝牙的驱动也包含其中。在这里,Linux内核扮演的是硬件层和系统其他层次之间的一个抽象层的概念。
  
  3. A2DP的实现
  A2DPProfile定义了高质量音频数据传输的协议和过程,包括立体声和单声道数据的传输。这里的高质量音频指的是单声道(Mono)和立体声(Sterco)的音频,主要区别于蓝牙SCO链路上传输的普通语音。A2DP的典型应用是将音乐播放器的音频数据发送到耳机或音箱。
  由于蓝牙提供的带宽较窄,音频数据可能需要进行有效的压缩才能保证接收端的实时播放。
  目前A2DP只定义了点对点的音频传输,没有定义广播式的音频传输,可能是由于速率的原因。
  A2DP建立在AVDTP传输协议的基础之上,AVDTP规定了链接是如何建立的,连接建立好之后,音频数据经过压缩之后,便可以收发了。音频数据是双向的[4]。
  此应用框架定义了两个音频设备角色:音频源和汇点。
  源(SRC)–当设备充当被传输至微微网 SNK 的数字音频流时,则设备称为数据流源。
  汇点(SNK)–当设备充当从在同一微微网上的数据流源传输的数字音频流时,则设备称为数据流汇。
  
  3.1 信令过程
  首先使用Stream_End_Point_Discover命令发现ACP中的流端点,主要工作是要去查询远端的蓝牙设备(需要远端蓝牙设备的地址,这个地址是唯一的)可以提供的SEP,每个SEP可以提供一些服务。远端的蓝牙设备会返回一个respond,respond包含一些信息,最重到是有多少个SEID,媒体服务类型等信息并不十分重要,服务类型可以通过Get_Capablities来获得。
  然后从中选择将要建立的流端点。发送Stream_End_Point_Discover命令之后,会获得很多个SEID,然后就要发送 Get_Capabilites命令来获得每个SEP所能提供的服务。(一个SEID代表一个SEP)具体的服务类型,以及字段detail参见 AVDTP的手册。我们感兴趣的是,蓝牙设备(例如蓝牙头戴式设备)是否拥有SBC解码的能力,A2DP规定,蓝牙立体声耳机必须支持SBC解码,其他的解码方式是可选的,有关SBC的内容要参见A2DP协议。
  再使用Set_Configuration命令对流端点进行配置,通过Get_Capabilites,可以知道 SEP可以支持的服务,然后根据服务类型再进行一下具体的配置。需要配置音频的声道,采样率等信息。当然配置的时候,要给出SEID参数,指明对哪个SEP进行配置。
  最后就是启动流Stream_Start,如果某个SEP具有AudioMedia的服务,那么打开一个stream,给出SEID参数,stream 是对应某个SEP。开启stream之后,就可以利用write系统调用向socket里写音频数据了,写的时候不需要再指明具体的SEID。
  链路建立好之后,就可以进行数据传输,建链的过程,属于AVDTP 协议的内容, 而传输的内容要符合A2DP的规定,当然 A2DP 与AVDTP是密不可分的。
  
  3.2 音频编码
  PCM码流,需要很大的带宽,即低效又费电,不适合无线传输。因此需要编码压缩之后,再进行传输。
  A2DP要求SRC和SNK至少要支持低于复杂度自带编解码(Low ComplexitySubbandCodec,SBC)标准。MPEG-1 Audio,Mpeg-2Audio,MPEG-2,4高级音频编码(AdvancedAudio Coding,ACC)和自适应变换音频编码(AdaptiveTransform AcousticCoding,ATRAC)这几种音频编码标准是可选的。除此之外的其他编码标准称为“非A2DP编码(Non-A2DPCodec)[5]。
  低复杂度自带编解码(SBC)是专门为蓝牙音视频设计的,它可以在中等传码率下获得较高的音频质量,并且具有较低的计算复杂度。
  在信令交互的过程中,需要发现蓝牙设备的SEP并获得其服务能力,如果SEP具有SBC解码能力,那么需要对SBC有关参数进行配置,相关参数如下:
  采样频率(48K,44.1K,32K,16K)声道模式(Mono,DualChannel,Stereo)块长度(4,8,12,16)子带 (4,8)分配方法(SNR、LOUDNES)BitPool(2~250)决定传码率的编解码信息包含于SBC数据帧头部,并且和音频数据流一起被不断的发送到SNK。
  
  3.3 Android下的实现
  Android系统中,应用程序只能看到AudioSystem这个接口,AudioFlinger是一个实现类,主要用于音频选路和PCM包的混音与重采样,并把PCM数据包传送给底层。AudioFlinger在所有进程中只有一个实体,其他进程如需要访问通过Binder进程间通信的方式进行访问。
  AudioHardware是一层硬件抽象层,主要负责音频数据的收发与控制。AudioFlinger把他看成实际的硬件。当音频路径设置成A2DP时,通过Bluetooth模块收发数据,通过立体声蓝牙耳机即可听到高保真音乐。
  AudioAccessory主要用于事件的监听,并把这些事件发送给AudioFlinger模块进行音频路径的重新设定。当蓝牙立体声耳机匹配之后,AudioAccessory会从kernel中获得相应的信息(监听HCI层的事件),然后把音频路径配置成A2DP模式,这样音频数据就只会发送到蓝牙耳机当中,如有必要,也可以设置扬声器的音频解码芯片转入休眠状态。
  当有音频数据播放时,由于SBC音频压 缩的开源代码只能压缩512bytes大小的数据因此,AudioHardware每次发送下来4096Bytes,然后把这4096个字节分割成N个 512Bytes的小块,放入一个队列当中。经过SBC压缩之后变成113bytes。另外一个线程会每次对SBC压缩好的包进行再封装,封装成一个标准 的A2DP packet,然后再把这样的A2DP packet移动到发送队列当中。
  最后设定好软件定时器,每隔一段时间回发送一个A2DP包。这个时间间隔是SBC编码期间返回的推荐值。
  
  4.结果与性能评估
  测试用的耳机是Motorola的S9型蓝牙耳机,耳机配对之后,选择一首MP3音乐进行播放,最开始的程序是A2DP开源的测试程序,在Linuxshell下播放PCM数据流的音频文件可以正常播放,但整合到Android系统中便产生了较大的延迟。后来引入缓存队列和定时器后,效果有了明显改善。
  
  5.总结
  本文通过研究蓝牙无线通信协议栈,并分析了蓝牙音频视频分布传输协议,简要介绍了Android系统的特点,并在开源测试程序的基础上做了相应的改进并改善了音频文件播放的效果。较完整地在Android手机平台上设计并实现了蓝牙立体声耳机收听高保真音乐的功能(即A2DP 应用框架的实现)。
  

十年论文机构京都名师论文中心,正规全面的论文刊物为您提供职称论文,毕业论文,硕士论文,医学论文,教育论文等各类论文发表服务。
  参考文献
  [1] 金纯 林金朝 万宝红.蓝牙协议及其源代码分析.国防工业出版社,2006
  [2] 米勒.蓝牙核心技术:全球无线通信开放规范的权威性指南.机械工业出版社,2001
  [3] Bluetooth SIG.Generic Audio/Video Distribution Profile,2007
  [4] Bluetooth SIG.Core Specification of the Bluetooth 2.0 +EDR,2004
  [5] Bluetooth SIG.Advanced Audio Distribution Profile Specification,2007

转载自:http://www.360doc.com/content/13/1230/11/9484405_341198153.shtml

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。