android -- 藍牙 bluetooth (一) 入門

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

        前段時間在 網上看了一些關於android藍牙的文章,發現大部分是基於老版本(4.1以前含4.1)的源碼,雖然無礙瞭解藍牙的基本原理和工作流程,但對着4.2.2的代碼看起來總是有些遺憾。所以針對4.2.2版本代碼整理下相關知識,當然藍牙工作的主幹流程是沒有變的,上電、加載驅動這些動作少不了的,只是這些功能的實現代碼位置變了不少。希望本文可以讓大家對android4.2的藍牙部分代碼有一個初步的瞭解。


        正文開始前,先明確代碼版本:android  jellyBean 4.2.2,後續的藍牙相關文章同樣如此。

        另推薦個源碼在線閱讀網址 http://androidxref.com/,已經知道的童鞋無視這行吧。


        入手一個新的模塊或應用,當然首先要知道它都有什麼了,與它相關的代碼在那裏,所以先一起看下藍牙代碼分佈吧。


1. 代碼分佈:

    packages/apps/Bluetooth/     

         看這路徑肯定是藍牙應用方面的代碼了,主要是關於藍牙應用協議的表現代碼,包括opp、hfp、hdp、a2dp、pan等等,這些名詞後面再解釋。

    frameworks/base/core/java/android/server/  

          4.2以後這個目錄雖然還有了,但裏面代碼已經轉移到應用層了,就是前面那個目錄,所以4.2.2上的藍牙這裏可以忽略。

    framework/base/core/java/android/bluetooth  

           這個目錄裏的代碼更像一個橋樑,裏面有供java層使用一些類,也有對應的aidl文件聯繫C、C++部分的代碼,還是挺重要的。

    kernel\drivers\bluetoothBluetooth    

           具體協議實現。包括hci,hid,rfcomm,sco,SDP等協議

    kernel\net\bluetooth Linux kernel

           對各種接口的Bluetoothdevice的驅動。例如:USB接口,串口等,上面kernel這兩個目錄有可能看不到的,但一定會有的。

    external\bluetooth\bluedroid      BlueZ (應用空間協議),官方藍牙協議棧。

    system\bluetoothBluetooth        適配層代碼,和framework那個作用類似,是串聯framework與blueZ的工具。

        大致代碼分佈就是這些,初步查看後讓我們再來看下藍牙的整體結構。


2.整體結構:

        這部分直接上圖了,看着直觀些。圖中把JNI部分雖然在目前4.2的代碼中在packages層,這裏還是畫在Framework層了,說明下希望

不要引起理解的誤會。從圖上可以感覺到整體流程和以前變化不大,所以流程方面的文章看4.1或更早的應該問題也不大。



 PS:上圖關於藍牙協議棧的說明有誤,4.2裏已經不再是bluez了,在些更正一下,當然協議棧這一部分還是要有的,新的協議棧看下面英文:


Android 4.2 introduces a new Bluetooth stack optimized for use with Android devices. The new Bluetooth stack developed in 

collaboration between Google and Broadcom replaces the stack based on BlueZ and provides improved compatibility and reliability.

google和broadcom合作開發了一個新藍牙協議棧,老版本的兼容性問題在所難免了。在此感謝網友andger032的提醒。


3.常用類和名詞解釋:  

   \packages\apps\Settings\src\com\android\settings\bluetooth 目錄下

     BluetoothEnabler.java   界面上藍牙開啓、關閉的開關就是它了, 

     BluetoothSettings.java  主界面,用於管理配對和連接設備

     LocalBluetoothManager.java  提供了藍牙API上的簡單調用接口,這裏只是開始。

    CachedBluetoothDevice.java   描述藍牙設備的類,對BluetoothDevice的再封裝

    BluetoothPairingDialog.java  那個配對提示的對話框


  /packages/apps/Phone/src/com/android/phone/

    BluetoothPhoneService.java  在phone的目錄肯定和電話相關了,藍牙接聽掛斷電話會用到這個


 /packages/apps/Bluetooth/src/com/android/bluetooth/btservice/

        AdapterService.java    4.2後纔有的代碼,藍牙打開、關閉、掃描、配對都會走到這裏,其實更準確的說它替代了4.1之前的BluetoothService.java,原來的工作就由這個類來完成了。說到這裏不能不說4.2藍牙的目錄變了,在4.1及以前的代碼中packages層的代碼只有opp協議相關應用的代碼,也就是文件傳輸那部分,而4.2的代碼應用層的代碼則豐富了許多,按具體的藍牙應用協議來區別,分爲以下文件夾(這裏一併對藍牙一些名詞作個簡單解釋):

       a2dp    藍牙立體聲,和藍牙耳機聽歌有關那些,另還有個avrcp--音頻/視頻遠程控制配置文件,是用來聽歌時暫停,上下歌曲選擇的。
       btservice  這個前面AdapterService.java的描述大家應該能猜到一些,關於藍牙基本操作的目錄,一切由此開始。
       hdp      藍牙關於醫療方面的應用 Bluetooth Health Device Profile
       hfp       和電話相關,藍牙接聽、掛斷電話  Hands-free Profile
       hid      人機交互接口,藍牙鼠標鍵盤什麼的就是這個了
      opp     不多解釋,以前就有。
      pan      描述了兩個或更多個 Bluetooth 設備如何構成一個即時網絡,和網絡有關的還有串行端口功能(SPP),撥號網絡功能(DUN)

      pbap    電話號碼簿訪問協議(Phonebook Access Profile)

       android 4.2的藍牙應用層部分代碼更豐富了,雖然有些目錄還沒具體代碼,不過說不準哪個版本更新就有了,就像4.0添加了hdp醫療那部分一樣。

另外原本在framework的JNI代碼也被移到packages/apps/bluetooth當中。     

   /frameworks/base/core/java/android/bluetooth/目錄下


      BluetoothA2dp.java A2DP的功能實現
     BluetoothAdapter.java 藍牙action的定義,虛擬設備屬性以及操作方法
     BluetoothAudioGateway.java 藍牙語音網關
     BluetoothClass.java 藍牙設備類型的定義
     BluetoothDevice.java 藍牙設備屬性
     BluetoothDevicePicker.java 定義遠程藍牙設備的特性,比如需要認證,設備類型
     BluetoothHeadset.java 定義藍牙headset功能的屬性以及接口
     BluetoothInputStream.java 藍牙流接口的實現(輸入流)
    BluetoothOutputStream.java 藍牙流接口的實現(輸出流)
    BluetoothServerSocket.java 藍牙socket服務端具備的方法
    BluetoothSocket.java 藍牙socket的封裝
    BluetoothUuid.java 藍牙uuid的定義以及uuid的解析

    以上java文件在使用具體功能會用到,現在只是簡單描述下,至於具體使用在後續文章用到時再給出。同時代碼說明部分也就寫這些了

對於C、C++部分的代碼一方面沒看那麼多,另一方面根據android JNI的命名習慣,大家找起來也很容易。


4.後續分析:

       前面從整體上描述藍牙的基本知識,落實在具體的代碼分析上,我們按幾個主線功能來走,藍牙的開關、搜索配對、藍牙耳機與電話和文件傳輸,

這幾個也算是藍牙的常用必備功能了,所以在後續文章中將按着這個順序來跟一下它們代碼調用流程。希望可以讓你快速的瞭解藍牙,當然如果有失誤

寫錯的地方,歡迎反饋,謝謝。



------------------------修改記錄------------------

2013.5.28 23:16  修改藍牙協議棧說明


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章