1. 程式人生 > >藍芽通話機制原理

藍芽通話機制原理

[摘要]: 本文主要論述基於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