陳媛媛
【摘要】 藍牙作為一種短距無線數據與語音傳輸的開放性全球規范,目前在整個世界范圍內都得到了很廣泛的應用。它可以支持便攜式計算機、移動終端以及其他電子設備之間通過建立無線電空中接口相互通信,可以方便地進行數據和語音傳輸。Android是基于Linux的移動操作系統,目前在終端市場占據了70%的市場份額,應用相當廣泛。本文通過研究Android系統以及藍牙協議棧,在現有架構基礎上平臺實現了in-band ring功能。
【關鍵字】 藍牙 Android in-band ring
一、引言
藍牙(Bluetooth)技術規范由藍牙特別興趣小組(SIG)制訂,在使用通用無線傳輸模塊和數據通信協議的基礎上,開發交互式服務和應用,多用于便攜式通信設備。
整個藍牙協議體系結構自上而下分為高端應用層、中間協議層和底層硬件模塊,結構如圖1所示。
藍牙協議棧最上層為應用層,它對應于各種應用模型的剖面(Profile)。
中間協議層由邏輯鏈路控制與適配協議、服務發現協議、串口仿真協議和電話控制協議等規范組成。它是藍牙協議棧的核心部分,主要實現了邏輯鏈路控制與適配協議實現數據的拆裝、服務質量的控制和協議復用等功能,為上層協議的實現提供相應的基礎。服務發現協議主要為上層應用程序提供一種發現網絡中可用的服務及其特性的特殊機制;串口仿真協議是為運行在不同設備上的兩個應用程序建立一條完整的通信路徑,并保持兩個設備之間有一個通信段;電話控制協議則提供藍牙設備間話音和數據的呼叫控制指令[1]。
藍牙射頻、基帶層和鏈路管理層構成藍牙的底層模塊。藍牙射頻用于實現數據位流的過濾和無線傳輸;基帶層主要控制跳頻和藍牙數據信息幀的傳輸;鏈路管理層則用于建立和拆除鏈路,以及鏈接的安全和控制。它們共同為上層軟件模塊提供相應的訪問接口。兩個模塊之間的數據的傳輸必須通過藍牙主機控制器接口(HCI)的解釋才能進行[2]。
其中免提協議(HFP) 屬于藍牙應用層profile,其中從上到下的協議棧層次如下圖。本文所述的in-band ring功能是基于HFP協議來進行開發的。
二、 Android 藍牙以及開發平臺
2.1 Android 藍牙
目前基于Linux內核的操作系統廣泛采用藍牙協議棧的Bluez,Android也不例外,但是Android4.2版本以后,谷歌開始采用通信機制更加完善的Bluedroid協議棧,目前高通平臺采用的就是該協議棧。
2.2 開發平臺和Android系統
本文調試的硬件是采用高通驍龍8X系列平臺,該平臺內置8核處理器,平臺主芯片內封裝了WCNSS子系統芯片,WCNSS子系統芯片屬于三合一芯片wifi/bt/fm。
WCNSS子系統芯片與AP之間采用高通自定義的總線架構,其中藍牙音頻數據通過PCM接口傳輸。調試系統是基于Android5.1。
三、In-band ring功能
In-band ring功能定義了如何從AG端播放聲音到HF端的協議和信令交互過程。其中AG端是指音頻網關,本文指手機端;HF指免提設備,本文指藍牙耳機或者車載等。聲音是指通過發送的sco(面向同步連接)音頻數據。目前sco音頻廣泛采用的是CVSD編碼,而音頻參數主要有sco和esco兩大類,每個大類參數又包含了若干子類參數。音頻參數主要由鏈路管理協議來進行配置。確保AG與HF音頻能夠能夠正常傳輸。
通過該功能可以在來電時將AG端聲音發送到HF端進行播放,在一些特定的場合可以方便地將來電人信息等轉化為語音通知用戶,可以大大提升用戶體驗。
3.1信令過程
AG與HF端信令交互主要通過AT指令進行。
首先AG與HF端連接后,HF端會發送AT+BRSF獲取AG端支持情況,AG端在收到AT指令后會發送+BRSF攜帶支持的feature參數,其中in-band ring作為參數特征值會發送至HF端[3]。
當AG端有來電時,會發送+ciev指令,并攜帶call的參數發送到HF端。然后需要由AG段發起Audio連接,HF端接受連接請求,建立Audio連接后,由AG端發送音頻數據,HF端收到音頻數據后進行播放。
當HF端發送ATA或者AT+CHUP指令以及AG端CALL進入idle或者active后,AG需要先停止發送該音頻流數據,進行對應指令操作[4]。
3.2Android端實現
藍牙開啟后,Bluedroid會進行初始化操作,其中HFP會初始化AG端的服務,對AG支持的功能進行設置,以便HF端進行獲取。協議占會調用initializeFeaturesNative設置supportfeature,in-band ring屬性設置完成后,協議棧會調用BTA_AgRegister(BTIF_HF_SERVICES, BTIF_HF_ SECURITY,btif_features, p_service_names, bthf_hf_id[i]);來對AG端的支持的feature進行注冊。
當AG與HF配對完成后,耳機端會通過RFCOMM鏈路向手機端發送AT+BRSF指令,手機端檢測到該指令后就會將設置后的feature返回。來告知耳機端手機支持的功能。其中就包含有in-band ring參數。當AG端有來電時,telephoneservice會調用藍牙HFP服務中的phoneStateChangeNative 接口來通知耳機端有來電。協議棧則是通過AT指令的方式將該信息發送至耳機端。
完成上述步驟后,根據in-bandring協議,需要進行AudioConnection。協議中的音頻連接就是指sco連接。音頻連接一般是在AG端在發送完+cie指令后,然后調用conn ectAudioNative(getByteAddress(mCurrentDevice))發起連接請求,HF接收連接請求后,AG協議棧會有連接完成的回調通知上層,上層服務再通過Auidostatechange廣播通知其他模塊,做其他處理。而監聽到音頻連接完成的狀態后,可以添加自定義的聲音播放,聲音就會通過sco連接傳到耳機端。在Android系統中sco鏈路屬于通話鏈路,只支持voice類型的聲音數據,因此在播放時需要先設置音頻流類型或者降低采樣頻率的方式才能通過sco鏈路進行傳輸。本處采用的是TTS語音引擎,引擎初始化時設置音頻參數設置為voice類型后進行播放。
播放過程中,手機端需要監測AG端call的狀態以及耳機端發過來的指令來結束聲音播放或者斷開音頻連接。當AG端的call狀態進入active狀態時需要終止聲音播放,避免與語音聲音重疊,當call進入idle狀態時,則中斷聲音播放,同時斷開音頻連接。
四、結果與性能
為測試該功能的實際使用效果以及兼容性,本文選取了市面上主流的藍牙耳機和車載設備進行測試。耳機品牌包括三星,飛利浦,藍玄,捷布朗等品牌,車載則選取了飛歌,佳藝田,駿歌等車載。并對各種來電場景進行測試。
來電情況下,耳機和車載端能夠清晰發出AG端自定義的音效,并且能夠消除原先廠家的在HF端的提示音效。在進行掛斷和接聽后,AG端自定義音效能夠正常停止,不影響正常通話和掛斷。in-band ring功能正常實現。
兼容性測試方面,83%耳機和車載能夠正常實現inband ring功能。只有個別型號存在兼容性問題。達到了預期效果。
五、總結
本文介紹了藍牙無線通信協議棧以及Android藍牙實現架構, 在研究了藍牙in-band ring協議基礎上,基于現有Android藍牙架構,通過修改開源協議棧以及上層應用邏輯。比較完整地實現了藍牙 in-band ring協議功能,并達到了預期效果。
參 考 文 獻
[1] 金純 林金朝 萬寶紅.藍牙協議及其源代碼分析.國防工業出版社,2006
[2] 米勒.藍牙核心技術:全球無線通信開放規范的權威性指南.機械工業出版社,2001
[3] Bluetooth SIG.Core Specification of the Bluetooth 2.0 +EDR,2004
[4] Bluetooth SIG.HANDS-FREE PROFILE 1.5,2007