新聞中心
android development對于4.3藍牙的介紹:

10年積累的網(wǎng)站制作、做網(wǎng)站經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計制作后付款的網(wǎng)站建設(shè)流程,更有龍口免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
android提供Bluedroid作為默認(rèn)的協(xié)議棧,BlueDroid分為兩個部分:
1、Bluetooth Embedded System(BTE),它實現(xiàn)了BT的核心功能。
2、Bluetooth Application Layer (BTA),用于和android framework層交互。
BT 系統(tǒng)服務(wù)通過JNI與BT stack交互,并且通過Binder IPC通信與應(yīng)用交互。這個系統(tǒng)服務(wù)同時也提供給RD獲取不同的BT profiles;下面的圖標(biāo)展示BT stack的一個大體的結(jié)構(gòu):
一、application Framework
這個層的代碼主要是利用android.bluetooth APIS 和 bluetooth hardware進行交互。 也就是通過Binder IPC機制調(diào)用bluetooth 進程;
代碼位于framework/base/core/java/android.bluetooth/下。
比如A2DP的連接:framework/base/core/java/android.bluetooth/BluetoothA2dp.java中的connect(Bluetoothevice)方法。
- 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 通信機制,調(diào)用到packages/apps/Bluetooth/src/com.android.bluetooth.a2dp/A2dpService.java下一個內(nèi)部私有類
A2dpService是一個繼承于ProfileService,而ProfileService是繼承于Service的。
private static class BluetoothA2dpBinder extends IBluetoothA2dp.Stub{}的connect(BluetoothDevice)方法。
- public boolean connect(BluetoothDevice device) {
- A2dpService service = getService();
- if (service == null) return false;
- return service.connect(device);
- }
然后調(diào)用到A2dpService的connect(BluetoothDevice)方法。
- 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;
- }
這個過程就是Bluetooth Application Framework與Bluetooth Process的調(diào)用過程。
二、Bluetooth System service
Bluetooth System service位于packages/apps/Bluetooth下,它打包成一個android app包,并且在android framework 層實現(xiàn)BT service
和各種profile。BT app會通過JNI調(diào)用到HAL層。
A2dpService的connect方法會發(fā)送一個StateMachine.sendMessage(A2dpStateMachine.CONNECT, device)的message,這個message會被A2dpStateMachine對象的processMessage(Message)方法接收到:
- 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);
即會通過JNI調(diào)用到Native;
private native boolean connectA2dpNative(byte[] address);
三、JNI
與android.bluetooth有關(guān)的JNI代碼位于packages/apps/bluetooth/jni下,JNI 的代碼會調(diào)用到HAL層,并且在確信一些BT操作被觸發(fā)時,會從HAL
獲取一些回調(diào)。比如當(dāng)BT設(shè)備被發(fā)現(xiàn)時。
再回到A2dp連接的例子中來,BT System Service通過JNI會調(diào)用到com_android_bluetooth_a2dp.cpp中:
- 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;
- }
重點代碼是:status = sBluetoothA2dpInterface->connect((bt_bdaddr_t *)addr);
這個sBluetoothA2dpInterface結(jié)構(gòu)體對象是在initNative(JNIEnv *env, jobject object)方法時得到的。
- 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)接口,并且你必須實現(xiàn)這些接口來讓你的BT hardware功能運行正常。BT HAL的
的頭文件位于hardware/libhardware/include/hardware/bluetooth.h和hardware/libhardware/include/hardware/bt_*.h 文件中。
JNI中sBluetoothA2dpInterface是一個btav_interface_t結(jié)構(gòu)體,位于hardware/libhardware/include/hardware/bt_av.h中,定義為:
- 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下,這個stack實現(xiàn)了通用的BT HAL并且也可以通過擴展和改變配置來自定義。
A2dp的連接會調(diào)用到external/bluetooth/bluedroid/btif/src/btif_av.c的connect方法。
- 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
為了追蹤添加自定義拓展和一個HCI層,你可以創(chuàng)建一個libbt-vendor模塊并且指定這些組件。
本文鏈接:http://my.oschina.net/u/994235/blog/300404
標(biāo)題名稱:Bluedroid的結(jié)構(gòu)和代碼分布
網(wǎng)頁URL:http://www.dlmjj.cn/article/djegiij.html


咨詢
建站咨詢
