成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Bluedroid的結構和代碼分布

移動開發 Android
在android4.2中,Google更換了android的藍牙協議棧,從Bluez換成Bluedroid,我也是初涉這個方面,順便記錄一下。

android development對于4.3藍牙的介紹:

android提供BlueDroid作為默認的協議棧,BlueDroid分為兩個部分:

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

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

BT 系統服務通過JNI與BT stack交互,并且通過Binder IPC通信與應用交互。這個系統服務同時也提供給RD獲取不同的BT profiles;下面的圖標展示BT stack的一個大體的結構:

一、application Framework

這個層的代碼主要是利用android.bluetooth APIS 和 bluetooth hardware進行交互。 也就是通過Binder IPC機制調用bluetooth 進程;

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

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

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

通過Binder IPC 通信機制,調用到packages/apps/Bluetooth/src/com.android.bluetooth.a2dp/A2dpService.java下一個內部私有類

A2dpService是一個繼承于ProfileService,而ProfileService是繼承于Service的。

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

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

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

  1. public boolean connect(BluetoothDevice device) { 
  2.     enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, 
  3.                                    "Need BLUETOOTH ADMIN permission"); 
  4.  
  5.     if (getPriority(device) == BluetoothProfile.PRIORITY_OFF) { 
  6.         return false
  7.     } 
  8.  
  9.     int connectionState = mStateMachine.getConnectionState(device); 
  10.     if (connectionState == BluetoothProfile.STATE_CONNECTED || 
  11.         connectionState == BluetoothProfile.STATE_CONNECTING) { 
  12.         return false
  13.     } 
  14.  
  15.     mStateMachine.sendMessage(A2dpStateMachine.CONNECT, device); 
  16.     return true

這個過程就是Bluetooth Application Framework與Bluetooth Process的調用過程。

二、Bluetooth System service

Bluetooth System service位于packages/apps/Bluetooth下,它打包成一個android app包,并且在android framework 層實現BT service
和各種profile。BT app會通過JNI調用到HAL層。

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

  1. case CONNECT: 
  2.                 BluetoothDevice device = (BluetoothDevice) message.obj; 
  3.                 broadcastConnectionState(device, BluetoothProfile.STATE_CONNECTING, 
  4.                                BluetoothProfile.STATE_DISCONNECTED); 
  5.  
  6.                 if (!connectA2dpNative(getByteAddress(device)) ) { 
  7.                     broadcastConnectionState(device, BluetoothProfile.STATE_DISCONNECTED, 
  8.                                    BluetoothProfile.STATE_CONNECTING); 
  9.                     break
  10.                 } 
  11.  
  12.                 synchronized (A2dpStateMachine.this) { 
  13.                     mTargetDevice = device; 
  14.                     transitionTo(mPending); 
  15.                 } 
  16.                 // TODO(BT) remove CONNECT_TIMEOUT when the stack 
  17.                 //          sends back events consistently 
  18.                 sendMessageDelayed(CONNECT_TIMEOUT, 30000); 
  19.                 break

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

即會通過JNI調用到Native;

private native boolean connectA2dpNative(byte[] address);

三、JNI

與android.bluetooth有關的JNI代碼位于packages/apps/bluetooth/jni下,JNI 的代碼會調用到HAL層,并且在確信一些BT操作被觸發時,會從HAL
獲取一些回調。比如當BT設備被發現時。

再回到A2dp連接的例子中來,BT System Service通過JNI會調用到com_android_bluetooth_a2dp.cpp中:

  1. static jboolean connectA2dpNative(JNIEnv *env, jobject object, jbyteArray address) { 
  2. jbyte *addr; 
  3. bt_bdaddr_t * btAddr; 
  4. bt_status_t status; 
  5.  
  6. ALOGI("%s: sBluetoothA2dpInterface: %p", __FUNCTION__, sBluetoothA2dpInterface); 
  7. if (!sBluetoothA2dpInterface) return JNI_FALSE; 
  8.  
  9. addr = env->GetByteArrayElements(address, NULL); 
  10. btAddr = (bt_bdaddr_t *) addr; 
  11. if (!addr) { 
  12.     jniThrowIOException(env, EINVAL); 
  13.     return JNI_FALSE; 
  14.  
  15. if ((status = sBluetoothA2dpInterface->connect((bt_bdaddr_t *)addr)) != BT_STATUS_SUCCESS) { 
  16.     ALOGE("Failed HF connection, status: %d", status); 
  17.     env->ReleaseByteArrayElements(address, addr, 0); 
  18.     return (status == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE; 

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

這個sBluetoothA2dpInterface結構體對象是在initNative(JNIEnv *env, jobject object)方法時得到的。

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

四、HAL

硬件抽象層定義android.bluetooth APIs和BT process調用的標準接口,并且你必須實現這些接口來讓你的BT hardware功能運行正常。BT HAL的
的頭文件位于hardware/libhardware/include/hardware/bluetooth.h和hardware/libhardware/include/hardware/bt_*.h 文件中。

JNI中sBluetoothA2dpInterface是一個btav_interface_t結構體,位于hardware/libhardware/include/hardware/bt_av.h中,定義為:

  1. typedef struct { 
  2.  
  3.      
  4.     size_t          size; 
  5.      
  6.     bt_status_t (*init)( btav_callbacks_t* callbacks ); 
  7.  
  8.      
  9.     bt_status_t (*connect)( bt_bdaddr_t *bd_addr ); 
  10.  
  11.      
  12.     bt_status_t (*disconnect)( bt_bdaddr_t *bd_addr ); 
  13.  
  14.      
  15.     void  (*cleanup)( void ); 
  16.  
  17. } btav_interface_t; 

五、BT stack

作為默認的BT stack,(4.2之前是bluez作為協議棧的)

代碼位于external/bluetooth/bluedroid下,這個stack實現了通用的BT HAL并且也可以通過擴展和改變配置來自定義。

A2dp的連接會調用到external/bluetooth/bluedroid/btif/src/btif_av.c的connect方法。

  1. static bt_status_t connect(bt_bdaddr_t *bd_addr) 
  2.     BTIF_TRACE_EVENT1("%s", __FUNCTION__); 
  3.     CHECK_BTAV_INIT(); 
  4.  
  5.     return btif_queue_connect(UUID_SERVCLASS_AUDIO_SOURCE, bd_addr, connect_int); 

六、Vendor extension

為了追蹤添加自定義拓展和一個HCI層,你可以創建一個libbt-vendor模塊并且指定這些組件。
  本文鏈接:http://my.oschina.net/u/994235/blog/300404

責任編輯:chenqingxiang 來源: oschina
相關推薦

2010-09-03 09:38:53

divspanCSS

2009-04-03 08:28:39

2020-09-17 11:12:03

分布式系統代碼檢代碼檢視

2019-05-21 14:28:35

代碼算法編程

2010-06-23 14:09:50

DHCP協議

2010-07-14 17:58:06

SDP協議

2010-08-23 17:29:27

DHCP協議

2010-07-14 18:14:41

2020-11-12 18:53:34

代碼Transformer編程

2013-01-06 14:11:24

Android編譯代碼結構Android開發

2024-10-09 17:12:34

2010-01-26 17:53:30

Android代碼結構

2020-11-10 09:20:06

垃圾代碼優質代碼編輯語言

2009-12-04 10:43:53

VS部署

2022-01-10 17:41:31

內存結構PostgreSQL

2010-06-21 17:33:38

IS-IS路由協議

2010-07-08 14:13:15

UDP協議

2010-09-28 11:22:18

Html DOM樹

2010-08-31 10:17:14

2024-05-16 12:23:45

C語言指針代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 真人女人一级毛片免费播放 | 亚洲午夜精品久久久久久app | 中国一级特黄毛片大片 | 99热这里都是精品 | 欧美操操操 | 亚洲国产成人精品女人久久久 | 欧美久久综合 | 亚洲一一在线 | 亚洲国产aⅴ成人精品无吗 综合国产在线 | av在线免费观看网站 | 亚洲成人动漫在线观看 | 国产视频中文字幕 | 国产999精品久久久久久绿帽 | 天天摸天天干 | 黄网站在线观看 | 超碰成人免费 | 蜜臀av日日欢夜夜爽一区 | 成人亚洲在线 | 91精品国产91久久久久久密臀 | 久久久久久久久久久蜜桃 | 在线视频一区二区三区 | 日韩在线免费看 | 亚洲成人免费av | 亚洲精品久久视频 | 欧美情趣视频 | 日韩欧美综合在线视频 | 亚洲综合日韩精品欧美综合区 | 在线中文字幕第一页 | 亚洲人va欧美va人人爽 | 欧美日韩在线一区二区 | 午夜视频免费 | 国产成人99久久亚洲综合精品 | 精品国产不卡一区二区三区 | 国产色播av在线 | 国产精品99999999 | 欧美一区二区三区电影 | 在线免费观看视频你懂的 | 欧美一级免费片 | 九九热热九九 | 欧美一区二区免费在线 | 天天操天天射综合网 |