精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

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-07-14 17:58:06

SDP協議

2010-06-23 14:09:50

DHCP協議

2010-07-14 18:14:41

2010-08-23 17:29:27

DHCP協議

2020-11-12 18:53:34

代碼Transformer編程

2024-10-09 17:12:34

2013-01-06 14:11:24

Android編譯代碼結構Android開發

2020-11-10 09:20:06

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

2009-12-04 10:43:53

VS部署

2010-01-26 17:53:30

Android代碼結構

2022-01-10 17:41:31

內存結構PostgreSQL

2010-09-28 11:22:18

Html DOM樹

2010-07-08 14:13:15

UDP協議

2010-06-21 17:33:38

IS-IS路由協議

2010-08-31 10:17:14

2010-03-10 15:19:06

Python源代碼
點贊
收藏

51CTO技術棧公眾號

av成人在线观看| 岳乳丰满一区二区三区| 噜噜噜狠狠夜夜躁精品仙踪林| 亚洲国产一区在线观看| 欧美日韩综合网| 97人妻精品一区二区三区| 激情av一区| 最新国产精品拍自在线播放| 国产乱淫av片| 国产精品传媒麻豆hd| 亚洲成在人线免费| 中文字幕欧美日韩一区二区三区| 香蕉视频黄在线观看| 国内成人精品2018免费看| 欧美一级淫片播放口| 极品盗摄国产盗摄合集| 国产欧美日韩在线观看视频| 国产精品亚洲一区二区在线观看 | 91久色porny| 成人h片在线播放免费网站| 国产成人一区二区三区影院在线| 久久亚洲国产| 亚洲视频自拍偷拍| 久久人妻少妇嫩草av无码专区| 欧美男男gaygay1069| 欧美日韩美女在线观看| 妺妺窝人体色www看人体| 97电影在线看视频| 久久久亚洲综合| 国产伦精品一区二区三区照片91| 国产伦子伦对白视频| 视频一区二区中文字幕| 91精品国产91久久| 久久亚洲国产成人精品性色| 91精品秘密在线观看| 一色桃子一区二区| 国产jk精品白丝av在线观看 | 亚洲精品国产品国语在线| 中文字幕12页| 免费视频成人| 欧美视频一二三区| 激情综合网俺也去| 亚洲高清黄色| 欧美性猛交xxxx免费看| 激情深爱综合网| sm在线播放| 舔着乳尖日韩一区| 黄色www网站| 69av成人| 欧美日韩在线视频一区| 欧美 国产 综合| 美女网站在线看| 黄色91在线观看| 国产中文字幕二区| 国产精品一区二区日韩| 欧美日韩裸体免费视频| 亚洲天天做日日做天天谢日日欢| 久久久久久艹| 欧美亚洲日本| 国产日韩精品久久久| 日韩久久久久久久| av在线女优影院| 亚洲色图视频免费播放| www.18av.com| 成人bbav| 欧美午夜xxx| 欧美精品第三页| 欧美91在线|欧美| 91精品国模一区二区三区| 波多野结衣免费观看| 中文一区二区三区四区| 亚洲国产91精品在线观看| 成人手机在线免费视频| 欧美日韩久久精品| 精品国产一区二区三区在线观看| 午夜精品一区二区三级视频| 黄色日韩在线| 日本一区二区三区四区视频| 在线观看中文字幕网站| 国产在线精品一区二区夜色| 国产高清自拍一区| 免费黄色在线视频网站| 国产精品免费av| 国产成人生活片| 蜜桃麻豆影像在线观看| 欧美亚洲日本国产| 绯色av蜜臀vs少妇| 亚洲人亚洲人色久| 超薄丝袜一区二区| 中日韩精品视频在线观看| 日韩国产成人精品| 97久久天天综合色天天综合色hd| 深夜福利视频在线免费观看| 中文字幕欧美一| 欧美一级在线看| 91成人短视频在线观看| 日韩精品免费在线视频观看| 国产又粗又长又硬| 日韩一级不卡| 欧美精品日韩| 日日骚久久av| 亚洲另类欧美日韩| 激情文学综合插| 久久久一本精品99久久精品| 里番在线观看网站| 日韩欧美成人精品| 亚洲精品久久久久久| 国内精品久久久久久久影视简单 | 欧美精品一区二区蜜臀亚洲| 午夜精产品一区二区在线观看的| 欧美暴力喷水在线| 国产精品亚洲激情| 午夜国产在线观看| 一区二区三区日韩在线观看| 国产理论在线播放| 色吊丝一区二区| 欧美成人中文字幕在线| 亚洲 国产 日韩 欧美| 99久久国产免费看| 男人日女人的bb| 伊人久久大香| 一个人www欧美| 欧美亚洲精品天堂| 国产69精品一区二区亚洲孕妇| 最新欧美日韩亚洲| 欧美暴力调教| 亚洲欧美日韩中文在线制服| 欧美久久久久久久久久久久| 精品一区二区综合| 亚洲欧美99| 性欧美1819sex性高清| 亚洲国产精品va在线| 青青草精品在线视频| 激情六月婷婷综合| 91免费视频黄| 午夜不卡一区| 久久亚洲国产精品| 91极品身材尤物theporn| 中文字幕欧美国产| 一区二区三区 日韩| 欧美日韩第一| 国产精品美女www| 玖玖综合伊人| 国产精品一区免费在线 | 欧美激情综合五月色丁香小说| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 精品精品国产毛片在线看| 久久久久国产精品一区| www.av日韩| 一区二区三区四区在线播放| 亚洲欧美一区在线| 日本美女一区二区| 国产精品狠色婷| а天堂8中文最新版在线官网| 色视频欧美一区二区三区| 无码 人妻 在线 视频| 日韩中文字幕区一区有砖一区| 欧美日韩精品不卡| 国产精品亚洲成在人线| 久久精品视频网站| 国产按摩一区二区三区| 亚洲综合一区在线| 一级欧美一级日韩片| 国产欧美日韩亚洲一区二区三区| 玛丽玛丽电影原版免费观看1977 | 欧美在线不卡区| 成人欧美亚洲| 制服丝袜国产精品| 久久精品国产亚洲av香蕉| 91视视频在线直接观看在线看网页在线看| 日本黄网站免费| 久久视频在线| 福利视频久久| 91精品影视| 久久69精品久久久久久久电影好| 成人爽a毛片一区二区| 欧美日韩国产丝袜另类| 久久久精品成人| 国产精品一区在线观看乱码| 欧美精品久久久久久久久久久| 国产成人调教视频在线观看| 91欧美激情另类亚洲| а√在线中文网新版地址在线| 狠狠色噜噜狠狠狠狠97| 狠狠色香婷婷久久亚洲精品| 亚洲少妇最新在线视频| 欧美日韩免费一区| 91精品欧美久久久久久动漫| 日韩av在线免播放器| 色青青草原桃花久久综合 | 鲁鲁在线中文| 区一区二视频| 中文在线日韩| 国产精品swag| 美女网站视频一区| 欧美激情综合色| av片在线免费观看| 亚洲精品久久久久中文字幕欢迎你 | 欧美老少做受xxxx高潮| 免费在线稳定资源站| 日韩欧美在线不卡| 久久影视中文字幕| 亚洲综合色网站| 亚洲综合第一区| 91原创在线视频| 中文字幕国产高清| 久久久久久一区二区| 天天想你在线观看完整版电影免费| 九九久久婷婷| 国产精品xxx在线观看www| 欧洲午夜精品| 国产成人精品优优av| 91高清视频在线观看| 久久久极品av| 国产天堂在线| 日韩国产一区三区| 免费av网站观看| 欧美一区二区三区视频在线观看| 国模私拍一区二区| 色综合久久久久久久久| 久久久无码一区二区三区| 自拍偷拍亚洲综合| 精品成人无码一区二区三区| 91视频在线看| 中国老熟女重囗味hdxx| 黄网在线免费看| 精品国一区二区三区| 91在线视频国产| 欧美色图在线观看| 国产天堂第一区| 在线免费观看不卡av| 超级碰在线观看| 美女精品久久| 91沈先生作品| 国产美女视频一区二区| 成人国产精品色哟哟| 欧美亚洲人成在线| 国产色视频一区| 欧美亚洲二区| 91久久夜色精品国产网站| 欧美另类激情| 成人黄色av网| 国产欧美视频在线| 2014亚洲精品| 9l亚洲国产成人精品一区二三 | 中文字幕在线不卡一区| jizzjizzjizz国产| 中文字幕色av一区二区三区| 欧美日韩国产一二三区| 亚洲日本一区二区三区| 在线看的片片片免费| 亚洲精品自拍动漫在线| 亚洲国产精品免费在线观看| 亚洲激情校园春色| 日本系列第一页| 色婷婷一区二区三区四区| 青青草视频在线观看免费| 日本道色综合久久| 亚洲图片小说视频| 日韩视频一区二区在线观看| 亚洲AV午夜精品| 亚洲精品色婷婷福利天堂| 精品乱码一区二区三四区视频| 一本色道久久88综合日韩精品| 日本最新在线视频| 久久午夜a级毛片| 国产第一页在线| 亲爱的老师9免费观看全集电视剧| 欧美黑人一区| 91热精品视频| 免费日韩一区二区三区| 日韩国产精品一区二区| 91精品国偷自产在线电影| 免费超爽大片黄| 日韩激情视频网站| 韩国三级丰满少妇高潮| 91最新地址在线播放| www.99re6| 午夜视频在线观看一区二区| 中文字幕xxxx| 日韩精品一区二区三区中文不卡 | 日韩av片免费观看| 97精品久久久久中文字幕 | 国产一区二区色| 国产一级成人av| 日韩中文字幕一区| 国内精品美女在线观看| 男女视频一区二区三区| 国产99久久久精品| 国产馆在线观看| 亚洲超碰精品一区二区| 在线观看中文字幕码| 亚洲国产欧美一区| 黄色免费网站在线| 日本视频久久久| 1204国产成人精品视频| 亚洲三区四区| 一区二区三区精品视频在线观看| 天天影视色综合| 国产亚洲一区二区三区| 国产亚洲精品久久777777| 欧美色欧美亚洲另类二区| 天天干在线观看| 欧美理论片在线观看| 国产91欧美| 看欧美日韩国产| 国产综合色产| 女王人厕视频2ⅴk| 中文一区一区三区高中清不卡| 国产第一页在线播放| 91精品国产色综合久久不卡电影| 欧美新色视频| 午夜精品www| silk一区二区三区精品视频| 亚洲永久激情精品| 日韩av一级片| 国产ts在线播放| 精品久久久久久久中文字幕 | 亚洲乱码一区av黑人高潮| 黄色成人在线网| 99中文字幕| 欧美一区影院| 热久久久久久久久| 中文字幕免费不卡| 精品人妻一区二区三区潮喷在线 | 国产亚洲色婷婷久久99精品91| 亚洲精品老司机| 国产精品主播一区二区| 日韩中文字幕在线| 成人在线视频观看| 天堂社区 天堂综合网 天堂资源最新版| 99亚洲一区二区| 亚洲图片综合网| 精品久久久精品| 天天爱天天干天天操| 性欧美视频videos6一9| 99国产精品久久一区二区三区| 久久人妻无码一区二区| 国产一区二区三区四区五区美女 | 精品国产一区二区三区久久久蜜月| 免费大片在线观看www| 国产欧美精品一区二区| 久久中文字幕av一区二区不卡| 鲁一鲁一鲁一鲁一av| 国产精品久久一卡二卡| 一本色道久久综合精品婷婷| 色一情一乱一区二区| 成人在线日韩| 国产精品igao激情视频| 国产美女久久久久| 麻豆视频在线观看| 亚洲电影av在线| 一区二区三区电影大全| 亚洲a∨一区二区三区| 麻豆精品在线播放| 日韩精品一区二区亚洲av性色| 91精品国产91热久久久做人人| 怡红院在线观看| 精品视频一区二区| 日日夜夜免费精品视频| 香蕉久久久久久久| 日韩欧美在线1卡| 鲁鲁在线中文| 亚洲精品一区国产精品| 精品系列免费在线观看| 久久免费视频播放| 亚洲精品视频中文字幕| 成人在线视频免费| 真实国产乱子伦对白视频| 久久网站热最新地址| 亚洲av综合一区| 欧美情侣性视频| 亚洲人成精品久久久| 国产永久免费网站| 婷婷六月综合亚洲| 拍真实国产伦偷精品| 国产高清自拍一区| 美女一区二区视频| 久久精品www人人爽人人| 亚洲免费电影在线观看| 亚洲精品一区av| 久久国产精品视频在线观看| 国产色综合久久| 精品人妻一区二区三区蜜桃| 2019亚洲日韩新视频| 婷婷综合社区| 中文字幕人妻一区二区| 欧美一区永久视频免费观看| 亚洲美女久久精品| 蜜臀av性久久久久蜜臀av| 91一区二区三区在线观看| 国产片在线播放| 欧美做受高潮1| 四虎永久精品在线| 668精品在线视频| 国产传媒欧美日韩成人精品大片| www激情五月| 色婷婷亚洲一区二区三区| 欧美性video| 亚洲一区二区三区加勒比|