Bluedroid的結(jié)構(gòu)和代碼分布是怎樣的

本篇文章給大家分享的是有關(guān)Bluedroid的結(jié)構(gòu)和代碼分布是怎樣的,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

創(chuàng)新互聯(lián)建站專注于老河口網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供老河口營(yíng)銷型網(wǎng)站建設(shè),老河口網(wǎng)站制作、老河口網(wǎng)頁(yè)設(shè)計(jì)、老河口網(wǎng)站官網(wǎng)定制、成都小程序開發(fā)服務(wù),打造老河口網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供老河口網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。

android development對(duì)于4.3藍(lán)牙的介紹:

android提供BlueDroid作為默認(rèn)的協(xié)議棧,BlueDroid分為兩個(gè)部分:

1、Bluetooth Embedded System(BTE),它實(shí)現(xiàn)了BT的核心功能。

2、Bluetooth Application Layer (BTA),用于和android framework層交互。

BT 系統(tǒng)服務(wù)通過JNI與BT stack交互,并且通過Binder IPC通信與應(yīng)用交互。這個(gè)系統(tǒng)服務(wù)同時(shí)也提供給RD獲取不同的BT profiles;下面的圖標(biāo)展示BT stack的一個(gè)大體的結(jié)構(gòu):

一、application Framework

這個(gè)層的代碼主要是利用android.bluetooth APIS 和 bluetooth hardware進(jìn)行交互。 也就是通過Binder IPC機(jī)制調(diào)用bluetooth 進(jìn)程;

代碼位于framework/base/core/java/android.bluetooth/下。

比如A2DP的連接:framework/base/core/java/android.bluetooth/BluetoothA2dp.java中的connect(Bluetoothevice)方法。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
public boolean connect(BluetoothDevice device) {
    if (DBG) log("connect(" + device + ")");
    if (mService != null && isEnabled() &&
        isValidDevice(device)) {
        try {
            return mService.connect(device);
        } catch (RemoteException e) {
            Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
            return false;
        }
    }
    if (mService == null) Log.w(TAG, "Proxy not attached to service");
    return false;
}

通過Binder IPC 通信機(jī)制,調(diào)用到packages/apps/Bluetooth/src/com.android.bluetooth.a2dp/A2dpService.java下一個(gè)內(nèi)部私有類

A2dpService是一個(gè)繼承于ProfileService,而ProfileService是繼承于Service的。

private static class BluetoothA2dpBinder extends IBluetoothA2dp.Stub{}的connect(BluetoothDevice)方法。

1
2
3
4
5
public boolean connect(BluetoothDevice device) {
        A2dpService service = getService();
        if (service == null) return false;
        return service.connect(device);
    }

然后調(diào)用到A2dpService的connect(BluetoothDevice)方法。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
public boolean connect(BluetoothDevice device) {
    enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM,
                                   "Need BLUETOOTH ADMIN permission");

    if (getPriority(device) == BluetoothProfile.PRIORITY_OFF) {
        return false;
    }

    int connectionState = mStateMachine.getConnectionState(device);
    if (connectionState == BluetoothProfile.STATE_CONNECTED ||
        connectionState == BluetoothProfile.STATE_CONNECTING) {
        return false;
    }

    mStateMachine.sendMessage(A2dpStateMachine.CONNECT, device);
    return true;
}

這個(gè)過程就是Bluetooth Application Framework與Bluetooth Process的調(diào)用過程。

二、Bluetooth System service

Bluetooth System service位于packages/apps/Bluetooth下,它打包成一個(gè)android app包,并且在android framework 層實(shí)現(xiàn)BT service

和各種profile。BT app會(huì)通過JNI調(diào)用到HAL層。

A2dpService的connect方法會(huì)發(fā)送一個(gè)StateMachine.sendMessage(A2dpStateMachine.CONNECT, device)的message,這個(gè)message會(huì)被A2dpStateMachine對(duì)象的processMessage(Message)方法接收到:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
case CONNECT:
                BluetoothDevice device = (BluetoothDevice) message.obj;
                broadcastConnectionState(device, BluetoothProfile.STATE_CONNECTING,
                               BluetoothProfile.STATE_DISCONNECTED);

                if (!connectA2dpNative(getByteAddress(device)) ) {
                    broadcastConnectionState(device, BluetoothProfile.STATE_DISCONNECTED,
                                   BluetoothProfile.STATE_CONNECTING);
                    break;
                }

                synchronized (A2dpStateMachine.this) {
                    mTargetDevice = device;
                    transitionTo(mPending);
                }
                // TODO(BT) remove CONNECT_TIMEOUT when the stack
                //          sends back events consistently
                sendMessageDelayed(CONNECT_TIMEOUT, 30000);
                break;

最重要的一句:connectA2dpNative(getByteAddress(device);

即會(huì)通過JNI調(diào)用到Native;

private native boolean connectA2dpNative(byte[] address);

三、JNI

與android.bluetooth有關(guān)的JNI代碼位于packages/apps/bluetooth/jni下,JNI 的代碼會(huì)調(diào)用到HAL層,并且在確信一些BT操作被觸發(fā)時(shí),會(huì)從HAL

獲取一些回調(diào)。比如當(dāng)BT設(shè)備被發(fā)現(xiàn)時(shí)。

再回到A2dp連接的例子中來,BT System Service通過JNI會(huì)調(diào)用到com_android_bluetooth_a2dp.cpp中:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
static jboolean connectA2dpNative(JNIEnv *env, jobject object, jbyteArray address) {
jbyte *addr;
bt_bdaddr_t * btAddr;
bt_status_t status;

ALOGI("%s: sBluetoothA2dpInterface: %p", __FUNCTION__, sBluetoothA2dpInterface);
if (!sBluetoothA2dpInterface) return JNI_FALSE;

addr = env->GetByteArrayElements(address, NULL);
btAddr = (bt_bdaddr_t *) addr;
if (!addr) {
    jniThrowIOException(env, EINVAL);
    return JNI_FALSE;
}

if ((status = sBluetoothA2dpInterface->connect((bt_bdaddr_t *)addr)) != BT_STATUS_SUCCESS) {
    ALOGE("Failed HF connection, status: %d", status);
}
    env->ReleaseByteArrayElements(address, addr, 0);
    return (status == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE;
}

重點(diǎn)代碼是:status = sBluetoothA2dpInterface->connect((bt_bdaddr_t *)addr);

這個(gè)sBluetoothA2dpInterface結(jié)構(gòu)體對(duì)象是在initNative(JNIEnv *env, jobject object)方法時(shí)得到的。

1
2
3
4
5
if ( (sBluetoothA2dpInterface = (btav_interface_t *)
      btInf->get_profile_interface(BT_PROFILE_ADVANCED_AUDIO_ID)) == NULL) {
    ALOGE("Failed to get Bluetooth A2DP Interface");
    return;
}

四、HAL

硬件抽象層定義android.bluetooth APIs和BT process調(diào)用的標(biāo)準(zhǔn)接口,并且你必須實(shí)現(xiàn)這些接口來讓你的BT hardware功能運(yùn)行正常。BT HAL的

的頭文件位于hardware/libhardware/include/hardware/bluetooth.h和hardware/libhardware/include/hardware/bt_*.h 文件中。

JNI中sBluetoothA2dpInterface是一個(gè)btav_interface_t結(jié)構(gòu)體,位于hardware/libhardware/include/hardware/bt_av.h中,定義為:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
typedef struct {

    
    size_t          size;
    
    bt_status_t (*init)( btav_callbacks_t* callbacks );

    
    bt_status_t (*connect)( bt_bdaddr_t *bd_addr );

    
    bt_status_t (*disconnect)( bt_bdaddr_t *bd_addr );

    
    void  (*cleanup)( void );

} btav_interface_t;

五、BT stack

作為默認(rèn)的BT stack,(4.2之前是bluez作為協(xié)議棧的)

代碼位于external/bluetooth/bluedroid下,這個(gè)stack實(shí)現(xiàn)了通用的BT HAL并且也可以通過擴(kuò)展和改變配置來自定義。

A2dp的連接會(huì)調(diào)用到external/bluetooth/bluedroid/btif/src/btif_av.c的connect方法。

1
2
3
4
5
6
7
static bt_status_t connect(bt_bdaddr_t *bd_addr)
{
    BTIF_TRACE_EVENT1("%s", __FUNCTION__);
    CHECK_BTAV_INIT();

    return btif_queue_connect(UUID_SERVCLASS_AUDIO_SOURCE, bd_addr, connect_int);
}

六、Vendor extension

為了追蹤添加自定義拓展和一個(gè)HCI層,你可以創(chuàng)建一個(gè)libbt-vendor模塊并且指定這些組件。

以上就是Bluedroid的結(jié)構(gòu)和代碼分布是怎樣的,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

分享題目:Bluedroid的結(jié)構(gòu)和代碼分布是怎樣的
瀏覽地址:http://bm7419.com/article4/jcgooe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、服務(wù)器托管、自適應(yīng)網(wǎng)站、企業(yè)網(wǎng)站制作、網(wǎng)站收錄品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)