Android4.4 之Bluetooth整理

來源:互聯網
上載者:User

標籤:android   style   blog   http   java   使用   os   io   

Android 4.4上藍芽協議棧採用的是BRCM和Google共同開發的bluedroid,代替了之前的Bluez.

一、 Bluetooth 源碼分布 (基於Android 4.4 )

1.  packages/apps/Settings/src/com/android/settings/bluetooth

     bluetooth Settings 代碼

2.  packages/apps/Bluetooth

     BT 應用程式層代碼,及BT profile(如:A2dp,gatt,hdp,hfp,hid,map,opp,pan,pbap ...) 上層代碼

     packages/apps/Bluetooth/jni

3.  frameworks/base/core/java/android/bluetooth

     framework 層相關 java 代碼與aidl

4.  external/bluetooth/bluedroid      

     BRCM和Google共同開發的官方藍芽協議棧

5.  linux/kernel/drivers/bluetooth

6.  linux/kernel/net/bluetooth

7. 以下是近期項目intel 平台

hardware/broadcom/libbt

hardware/libhardware

vendor/intel/fw/PRIVATE/bt    廠商bt韌體

 二、Bluetooth 常用類及相關profile

A2dp: Advanced Audio Distribution Profile 藍芽音頻傳輸模型協定

 藍芽立體聲,和藍芽耳機聽歌有關那些,另還有個AVRCP--(Audio/Video Remote Control Profile)音頻/視頻遠端控制設定檔,是用來聽歌時暫停,上下歌曲選擇的

GATT: Generic Attribute Profile   通用屬性設定檔

       GATT是基於ATT Protocol的,ATT針對BLE裝置做了專門的最佳化,具體就是在傳輸過程中使用盡量少的資料。每個屬性都有一個唯一的UUID,屬性將以characteristics and services的形式傳輸

       https://developer.bluetooth.org/TechnologyOverview/Pages/GATT.aspx

HDP:Bluetooth Health Device Profile 藍芽關於醫學方面的應用 

HFP : Hands-free Profile  和電話相關,藍芽接聽、掛斷電話 

HID : Human Interface Device  

         定義了藍芽在人機介面裝置中的協議、特徵和使用規程。典型的應用程式套件括藍芽滑鼠、藍芽鍵盤、藍芽遊戲手柄等。該協議改編自USB HID Protocol

MAP : Message Access Profile

OPP : Object Push Profile

PAN : Personal Area Network Profile

描述了兩個或更多個 Bluetooth 裝置如何構成一個即時網路,和網路有關的還有序列埠功能(SPP),撥號網路功能(DUN)

PBAP: Phonebook Access Profile 電話號碼簿訪問協議

 

三、Enable Bluetooth

1. 服務啟動:

frameworks/base/services/java/com/android/server/SystemServer.java

系統啟動時在SystemServer中註冊藍芽服務管理BluetoothManagerService服務: 

Bt 服務

 其它進程通過binder機制調用該服務,該服務屬於綜合服務管理類,包括AdapterService的啟動、藍芽適配器Adapter的管理等。

 2.  BluetoothAdapter 

Android的藍芽Enable是由BluetoothAdapter提供的。只需要調用BluetoothAdapter.enable()即可啟動藍芽。下面我就分析這一個過程

 frameworks/base/core/java/android/bluetooth/BluetoothAdapter.java

mManagerService.enable()

mManagerService其實就是bluetoothAdapter的一個proxy, 

getDefaultAdapter

BluetoothAdapter

 3. BluetoothManagerService

frameworks/base/services/java/com/android/server/BluetoothManagerService.java

BluetoothManagerService:enable()

sendEnableMsg

sendEnableMsg 交給handleMessage 處理,可以看到case MESSAGE_ENABLE: 裡調用了handleEnable

handleEnable

可以看到是調用了mBluetooth.enable()

 4. AdapterService,AdapterState

packages/app/Bluetooth/src/com/android/bluetooth/btservice/AdapterService.java

AdapterService:enable()

此處用了用了StateMachine,它會在AdapterState 裡processMessage 處理(StateMachine就是狀態機器,在不同的狀態下,收到相同的Event,做不同的事情),直接搜尋UER_TURN_ON 可以看到下面:

USER_TURN_ON

接下來是調用了adapterService.processStart()

processStart

setProfileServiceState(supportedProfileServices,BluetoothAdapter.STATE_ON); 是用來開啟Bluetooth Profile 的,log 中可以看到:        

BT Profile log

然後可以看到:mAdapterStateMachine.sendMessage(mAdapterStateMachine.obtainMessage(AdapterState.STARTED)); 

交給了PendingCommandState下的processMessage處理

case STARTED

由mAdapterService.enableNative(); 可以看到 /*package*/ native boolean enableNative();

 此時就進入了JNI了

 5. JNI 調用

enableNative() 是在 packages/apps/Bluetooth/jni/com_android_bluetooth_btservice_AdapterService.cpp

enableNative

static const bt_interface_t *sBluetoothInterface = NULL;

bt_interface_t 定義

 bt_interface_t 定義 在hardware/libhardware/include/hardware/bluetooth.h

sBluetoothInterface的初始化在classInitNative(),這個函數大概做了以下的事情:

1)、註冊java的回呼函數(就是當下層已經開啟藍芽了,然後要通知上層,藍芽已經開啟了,java層就可以發送藍芽開啟的Broadcast了。)

2)、初始化藍芽模組的HAL介面。

3)、得到sBluetoothInterface

 

6. Bluedroid ->bluetooth.c

external/bluetooth/bluedroid/btif/src/bluetooth.c

sBluetoothInterface->enable(); 會調到下方

bluetooth:enable()

 

接下來調用:external/bluetooth/bluedroid/btif/src/Btif_core.c

btif_enable_bluetooth

 

 external/bluetooth/bluedroid/main/Bte_main.c

bte_main_enable

 

bte_hci_enable

我們先看下bt_hc_if->set_power,前面有做一些初始化Bluedroid的動作

由 bt_hc_if->set_power(BT_HC_CHIP_PWR_ON);可以看出:

static bt_hc_interface_t *bt_hc_if=NULL;

下面是bt_hc_if 的初始化

bte_main_in_hw_init

 

 external/bluetooth/bluedroid/hci/src/Bt_hci_bdroid.c

bt_hc_get_interface

 

bluetoothHCLibInterface

 

由以上可以看到set_power

set_power

 

可以看到,bt_vnd_if->op(BT_VND_OP_POWER_CTRL, &pwr_state);

 external/bluetooth/bluedroid/hci/src/Bt_hw.c

bt_vendor_interface_t *bt_vnd_if=NULL;

 bt_vnd_if 初始化:

init_vnd_if

在init_vnd_if()函數可以看到其實是一個libbt-vendor.so的interface。這個是Vendor(晶片廠商)的library

Vendor就是晶片供應商的意思,在他們做好一塊藍芽晶片後,需要提供一些硬體相關的動作,比如上下電,設定傳輸速率之類的。但是這些 操作一般不會對沒有許可的開放。Bluedroid提供了一個統一的介面bt_vendor_interface_t,供應商只需要實現這個介面定義的藍 牙相關的操作就可以交給bluedroid去做剩下的事情了

 

下面主要是broadcom 為例,我們進入/hardware/裡面:

$ find . -name Android.mk |xargs grep libbt
./broadcom/libbt/Android.mk:LOCAL_MODULE := libbt-vendor
./broadcom/libbt/Android.mk:LOCAL_MODULE := libbt-vendor
./broadcom/libbt/Android.mk:    LOCAL_SRC_FILES := $(TI_BT_VENDOR_PATH)/libbt-vendor-ti.c
./qcom/bt/Android.mk:include $(call all-named-subdir-makefiles,libbt-vendor)
./qcom/bt/libbt-vendor/Android.mk:LOCAL_MODULE := libbt-vendor

 

或者

$ grep -nr BT_VND_OP_POWER_CTRL
broadcom/libbt/src/bt_vendor_brcm.c:147:        case BT_VND_OP_POWER_CTRL:
broadcom/libbt/src/bt_vendor_brcm.c:149:                BTVNDDBG("op: BT_VND_OP_POWER_CTRL");
qcom/bt/libbt-vendor/src/bt_vendor_qcom.c:105:        case BT_VND_OP_POWER_CTRL:

在broadcom/libbt/src/bt_vendor_brcm.c

op

upio_set_bluetooth_power

static char *rfkill_state_path = NULL;

 rfkill_state_path 是在下面初始化的。

init_rfkill

原來就是在rfkill_state_path(/sys/class/rfkill/rfkill[x]/state)虛擬設備裡寫入了1

shell@android :/sys/class/rfkill/rfkill0 $ cat state
0  // 表示藍芽是關閉狀態

shell@android :/sys/class/rfkill/rfkill0 $ cat state 

1   // 開啟藍芽後可以看到

rfkill是Linux下的一個標準的無線控制的虛擬設備,Linux也提供了rfkill的命令去查看以及控制所有的註冊的無線裝置。它們會在/dev/(PC的Linux)或者/sys/class(一般是Android)下產生相應的虛擬設備。

 

結合set_power 下面的log 和 bluetoothHCLibInterface  定義,可以看到接下來是調用的 bluetoothHCLibInterface 裡的 proload->bthc_signal_event(HC_EVENT_PRELOAD)->bt_hc_worker_thread -》 userial_open(USERIAL_PORT_1)->bt_vnd_if->op(BT_VND_OP_USERIAL_OPEN, &fd_array);->userial_vendor_open((tUSERIAL_CFG *) &userial_init_cfg);

接下來是Hardware.c裡

hw_config_start-》hw_config_cback

部分log 如下:

log

 

 

下面為minicom 裡開啟藍芽的logcat 的log

logcat

 

 

 

Ref:

http://blog.csdn.net/baimy1985/article/details/8892410

http://my.oschina.net/u/1436933/blog/192060

http://blog.csdn.net/yutao52shi/article/details/12690353


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.