基於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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM