藍芽通話機制原理
[摘要]: 本文主要論述基於android 6.0的藍芽上層(Java層)通話機制;總結了藍芽通話框架,並且給出了接聽電話的詳細的流程圖;最後說明了apk的實現以及總結了藍芽/android 相關的知識點。
1, 藍芽框架
主要程式碼路徑:
路徑1: frameworks\base\core\java\android\bluetooth\
藍芽相關介面,藍芽各種功能的發起點。
路徑2:packages\apps\Bluetooth\src\com\android\bluetooth\
獨立的Bluetooth.apk,裡面包含藍芽相關的各種服務,是java層和C/C++層的橋樑。
路徑3: packages\apps\Bluetooth\jni\
呼叫底層C/C++實現各種藍芽功能,並且反饋給java層。
在路徑2裡面還有各種相互獨立的java程式碼包,每一個包都包含一個協議,實現一個具體的功能:
btservice: 統一管理,控制其他服務。
a2dp: 和藍芽耳機,音訊有關,比如聽歌等。
avrcp: 音訊/視訊通過連線的藍芽控制,比如放歌時控制暫停等。
gatt:低功耗BLE有關,比如藍芽按鍵。
hdp: 藍芽醫療有關
hfp和hfpclient : 藍芽通話有關,比如藍芽通話的相關操作
hid: 藍芽鍵盤鍵盤/滑鼠
map: 同步藍芽簡訊相關
opp: 藍芽傳輸,比如傳輸檔案等
pan: 個人區域網
pbap: 同步電話本,比如聯絡人/通話記錄等
sap : 藍芽通話,主要和SIM卡相關
sdp: 藍芽服務發現/獲取相關
這12個包分別實現了12中藍芽功能,大多數以服務的形式存在,執行在Bluetooth.apk中。不僅如此,還具有以下特點:
1,每一個服務相互獨立,互相毫無任何影響, 繼承自 ProfileService,由
AdapterService服務統一管理。
2,每一個服務在路徑1中都存在對應的客戶端類,通過Binder進行跨程序通訊。
3,每一個服務在路徑3中都存在對應的C/C++類,通過JNI機制互相呼叫。
4,每一個服務的啟動,對應的Binder以及JNI機制的呼叫原理,方法,流程幾乎都是一樣的。
下面以藍芽通話功能為例來解析相關介面以及程式碼實現框架圖。
2 藍芽通話框架
2.1 相關類的說明
藍芽通話上層程式碼主要分為3個部分:
1,藍芽api相關程式碼, 路徑4: frameworks\base\core\java\android\bluetooth\
主要有2個類
BluetoothHeadsetClient.java主要負責藍芽通話的相關動作,比如接聽等等
BluetoothHeadsetClientCall.java主要負責藍芽通話的狀態,比如是來電還是去電等等。
2,藍芽服務端的相關程式碼,路徑5:
packages\apps\Bluetooth\src\com\android\bluetooth\hfpclient\
有3個類
HeadsetClientHalConstants.java類裡面只是定義了一些int/boolean 型別的值。
HeadsetClientService.java從名字就知道它是一個服務,它的設計很有意思,裡面還有一個BluetoothHeadsetClientBinder內部類,該內部類主要負責和
BluetoothHeadsetClient進行跨程序通訊。另外,HeadsetClientService也是
BluetoothHeadsetClientBinder和HeadsetClientStateMachine之間的橋樑。
HeadsetClientStateMachine是一個狀態機,即管理連線的狀態也是通話時java和C/C++之間的橋樑,通過JNI機制和com_android_bluetooth_hfpclient 裡面的方法互相呼叫。
3,JNI相關程式碼,路徑6: packages\apps\Bluetooth\jni\
有1個檔案:
com_android_bluetooth_hfpclient 藍芽通話動作,撥號/接聽/結束通話/拒接 實際的執行者。
DialerBTHfpService服務是開機之後啟動的。
2.2類圖
圖一 類圖BluetoothHeadsetClient是一個api,由第三方apk直接呼叫,可以進行撥號/接聽/拒接/結束通話操作,對應的方法依次為dial()/acceptCall()/rejectCall()/terminateCall().
HeadsetClientService是一個服務, BluetoothHeadsetClientBinder是它的內部類, BluetoothHeadsetClientBinder是BluetoothHeadsetClient在HeadsetClientService中的代理,通過aidl進行方法的呼叫。
Connected(已連線狀態)是HeadsetClientStateMachine 的其中一種狀態,通話的相關操作都建立在已連線狀態之上,其它三種狀態為Disconnected, Connecting,
AudioOn狀態。HeadsetClientService 根據不同的方法給狀態機發送不同的訊息,最後通過HeadsetClientStateMachine根據JNI機制呼叫
com_android_bluetooth_hfpclient.cpp對應的方法,最後呼叫底層C/C++ 來真正的實現撥號/接聽/拒接/結束通話操作。
撥號/接聽/拒接/結束通話方法呼叫的流程完全是一模一樣的,下小節給出接聽方法具體呼叫的完整流程圖。
2.3流程圖
圖二 接聽電話流程圖除了dial 方法最後呼叫從C/C++ dialNative之外,其它的3個方法最後都是呼叫handleCallActionNative,只是引數不同而已。
撥號/接聽/拒接/結束通話都是主動完成的,那麼如果有來電,對方接通電話或者對方結束通話電話,我們怎麼知道呢?這些都是com_android_bluetooth_hfpclient.cpp通過JNI機制呼叫通話狀態機的方法sendCallChangedIntent,將電話的狀態(包含在
BluetoothHeadsetClientCall.java中)通過廣播發送出來,第三方apk監聽狀態就可以進行相應的操作了。具體的來電流程圖如下:
圖三 來電流程圖
3 藍芽通話apk說明
在自己的apk中,只需要做2件事情就可以完成藍芽通話的幾乎所有動作,
1,根據上一小節的論述,註冊BluetoothHeadsetClientCall相關廣播,監聽來電/接通/對方結束通話的狀態,獲取藍芽電話的相關資訊,比如號碼,裝置資訊等等。
比如,如果收到來電廣播,就可以根據BluetoothHeadsetClientCall獲取來電的號碼等資訊,然後顯示來電介面。
2,通過BluetoothAdapter 獲取並且初始化BluetoothHeadsetClient物件,然後就可以直接呼叫dial()/acceptCall()/rejectCall()/terminateCall() 方法進行撥號/接聽/拒接/結束通話的操作了。
4, 小節
利用api實現藍芽通話不是很難,但是如果弄清楚具體的藍芽通話機制以及細節甚至藍芽相關功能,這就得下功夫了,關於藍芽,還可以進一步研究的android知識點以及藍芽涉及的上層java要點如下:
1,基本藍芽功能:開啟/關閉/掃描/配對/連線
2,藍芽功能:通過藍芽傳輸檔案/藍芽鍵盤/藍芽醫療服務/藍芽同步聯絡人等等
3,android知識:跨程序通訊機制/JNI機制/反射機制/狀態機機制等等。
相關推薦
藍芽通話機制原理
[摘要]: 本文主要論述基於android 6.0的藍芽上層(Java層)通話機制;總結了藍芽通話框架,並且給出了接聽電話的詳細的流程圖;最後說明了apk的實現以及總結了藍芽/android 相關的知識點。 1, 藍芽框架 主要程式碼路徑: 路徑1: frameworks\
藍芽通話功能原始碼解析
3 藍芽耳機服務 在開啟藍芽過程中,會開啟一些對應的服務,在此只將和通話相關的一個服務, HeadsetClientService。手機上只有開啟了這個服務,才可以將該手機當作一個藍芽耳機,通話時聲音才可以傳輸過來。 3.1 準備 首先在啟動apk時,會首先啟動該apk的A
車載BlueTooth通話機制原理及開發
[摘要]: 本文主要論述基於android 6.0的藍芽上層(Java層)通話機制;總結了藍芽通話框架,並且給出了接聽電話的詳細的流程圖;最後說明了apk的實現以及總結了藍芽/android 相關的知識點。 1, 藍芽框架 主要程式碼路徑: 路徑1: framewo
藍芽通話鏈路和手機通話鏈路有區別麼?
近日友人推了一個部落格:https://blog.csdn.net/david_tym/article/details/80963732 作者對手機中通話鏈路進行了詳細的分析。其中包括了經典的CP Call(運營商提供的電話業務)和流行的AP Call(VoIP等OTT業務)的鏈路,值得一看。 不過在藍芽耳機
女朋友問:你知道藍芽耳機的原理嗎?
![](https://james-1258744956.cos.ap-shanghai.myqcloud.com/bluetooth/cycling.jpeg?imageMogr2/thumbnail/!50p) 又到了春暖花開的季節,每天最幸福的時光就是戴著我的藍芽耳機,聽著自己喜歡的歌,騎著我心愛的小
藍芽協議分析(11)_BLE安全機制之SM
1. 前言 注1:此SM是Security Manager的縮寫,非彼SM,大家不要理解歪了! 書接上文,我們在中介紹了BLE安全機制中的終極武器----資料加密。不過使用這把武器有個前提,那就是雙方要共同擁有一個加密key(LTK,Long Term Key)。這個
藍芽 寬頻通話 (wide band speech)WBS 剖析(一) -- profile層
一.概述WBS(wide band speech)通俗來講就是藍芽寬頻通話,通話資料frequency 16K,採用msbc編解碼(chip中實現)和NBS(narrow band speech)相對,NBS通俗來講是窄帶通話,通話資料frequency 8K,採用CSVD編解
關於藍芽耳機通話,切換聲音路徑
今天遇到一個問題,不大不小:1.聲音從本機切換到藍芽耳機 (1)如果此時靜音功能關閉,切換到BT耳機後,靜音功能仍關閉,[靜音]選單顯示正常,之後開啟、關閉操作也正常; (2)如果此時靜音功能開啟,切換到BT耳機後,靜音功能被關閉,但是[靜音]選單的顯示仍然是開啟,即:切換聲音路徑到BT耳機時,自動關閉了靜音
藍芽協議分析(8)_BLE安全機制之白名單
前言 在萬物聯網的時代,安全問題將會受到非常嚴峻的挑戰(相應地,也會獲得最大的關注度),因為我們身邊的每一個IOT裝置,都是一個處於封印狀態的天眼,隨時都有被開啟的危險。想想下面的場景吧: 凌晨2點,x米手環的鬧鐘意外啟動,將你從睡夢中驚醒,然後床頭的燈光忽明忽暗……
藍芽協議分析(9)_BLE安全機制之LL Privacy
前言 在上一篇文章[1]中,我們介紹了BLE的白名單機制,這是一種通過地址進行簡單的訪問控制的安全機制。同時我們也提到了,這種安全機制只防君子,不防小人,試想這樣一種場景: A裝置表示只信任B、C、D裝置,因此就把它們的地址加入到了自己的白名單中,表示只願意和它們溝通。與此
Android6.0 藍芽搜尋不到裝置原因,MIUI許可權申請機制
為提供更高的資料保護 Android6.0版本上增加了關於Wifi和藍芽的許可權。 藍芽搜尋到裝置需要用到定位服務,所以在開發中 targetSdkVersion 大於等於23(6.0) 需要在程式碼中進行許可權獲取 需要在配置檔案中申請兩個許可權: <uses
Android 藍芽開發(八)hfp接聽、結束通話電話
本文已授權微信公眾號 fanfan程式媛 獨家釋出 掃一掃文章底部的二維碼或在微信搜尋 fanfan程式媛 即可關注 繼續研究hfp相關功能。藍芽耳機可以控制手機接聽、拒接、結束通話電話,撥打電話等功能。本文主要分析下起這些操作的大致流程。 在
無線通訊原理及協議棧(ZigBee、藍芽等)解析
1、天線 說起無線電通訊,不可不提起天線。 在無線電裝置中,用來輻射和接收無線電波的裝置稱為天線。 在發射端,發射機產生的已調製的高頻振盪電流(能量)經饋電(指被控制裝置向控制點的送電,即對一個使用者
藍芽協議中LQ和RSSI的原理及應用場景
本文轉自http://www.wowotech.net 在藍芽協議棧的物理層,有這樣兩個比較有用的引數:LQI和RSSI。它們都是通過接收端,判斷當前無線環境的質量(鏈路質量),以指導後續的動作。但這兩個數值的計算原理和使用場景又有很大的差別。 LQI (Link Qua
Delphi 的 Blooth LE(藍芽4.0) 程式設計原理簡介
首先,Delphi 官方的例子程式裡面,有BLE的例子,可以先參考。 藍芽的不同版本:2.0 3.0 4.0 其通訊協議有很大的不同。4.0 就是 BLE,低功耗藍芽。 以下是我經過自己寫例子程式碼操作藍芽裝置的測試摸索後對BLE藍芽程式設計原理的理解。安卓手機上測試通過。
Unity3D學習(一):簡單梳理下Unity跨平臺的機制原理
12px get 一個 bsp 嵌入 ram 屬於 開源 runtime 前言 首先需要了解的是,Unity3D的C#基礎腳本模塊是通過Mono來實現的。 什麽是Mono? 參考下百度百科:Mono是一個由Novell公司(由Xamarin發起)主持的項目,並由Migu
java的反射機制原理
動態調用 clas java語言 動態 方法 gpo mod odi log 一 反射機制的概念: 指在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法,對於任意一個對象,都能調用它的任意一個方法.這種動態獲取信息,以及動態調用對象方法的功能叫java語言的反
Android Handler 消息機制原理解析
當前 its leak 示例 異步消息 了解 modifier supported 異步 前言 做過 Android 開發的同學都知道,不能在非主線程修改 UI 控件,因為 Android 規定只能在主線程中訪問 UI ,如果在子線程中訪問 UI ,那麽程序就會拋出異常 a
Android Handler 機制原理(轉)
oop 滿足 src ssa .net adl 主線程 實例 分享圖片 andriod提供了Handler 和 Looper 來滿足線程間的通信。Handler先進先出原則。Looper類用來管理特定線程內對象之間的消息交換(MessageExchange)。1)Loope
DNS 緩存機制原理
soft 機制 ont col display 服務器 域名 一段 play DNS 緩存機制原理 簡單來說,一條域名的DNS記錄會在本地有兩種緩存:瀏覽器緩存和操作系統(OS)緩存。在瀏覽器中訪問的時候,會優先訪問瀏覽器緩存, 如果未命中則訪問OS緩存,最後再訪問D