一、工程結構&概述
整個應用包含兩個按鈕,一個是搜索所有藍牙設備,另一個是連接所有藍牙設備~
下面是整個工程的文件結構:

二、代碼業務流程跟蹤
2.1、兩個按鈕
下面講講該工程里的主要跳轉流程及各部分功能:
ActivityMain:
onCreate函數中主要初始化兩個按鈕並對其綁定監聽事件:

2.1.1、第一個按鈕——藍牙搜索流程
點擊第一個按鈕執行scanLeDevice(true)函數:
這里99行的mHandler是產生一個異步的延時SCAN_PERIOD時間然后執行run中的部分的效果~
整體意思是:若傳入參數為true則啟動藍牙搜索,經過SCAN_PERIOD時間停止搜索;在搜索過程中可以調用該函數傳入false來強行終止搜索。

當調用startLeScan函數后進入藍牙搜索階段,該階段產生的一些藍牙信息都會被mLeScanCallback函數監聽到:
第126行把搜索到的藍牙設備放到mLeDeviceList中~

2.1.2、第二個按鈕——藍牙連接流程
2.1.2.1、藍牙連接流程——通過intent啟動DeviceControlActivity,轉到藍牙設備控制部分
點擊第二個按鈕執行btn2_click()函數:
該函數把mLeDeviceList中的藍牙信息通過intent傳給DeviceControlActivity,並啟動DeviceControlActivity~

在DeviceControlActivity的oncreate函數中:
第71行將ActivityMain中傳來的設備信息存儲到mDeviceName和mDeviceAddress數組中;
第77、78行啟動一個BluetoothLeService服務,並用bindService建立一個和藍牙服務之間的連接;
其中mServiceConnection函數類似於回調函數:監聽藍牙服務連接或斷開的信息

2.1.2.2、藍牙連接流程——在藍牙服務回調函數的onServiceCOnnected監聽中初始化藍牙服務,並建立遠程連接
在類似於回調函數的mServiceConnection中的第40行:當已經建立藍牙服務時,首先41行獲取藍牙服務對象、接着42行對藍牙服務初始化、最后47行調用connect函數將之前搜索到的設備地址和數量傳入函數,進行藍牙連接(連多個)

第42行初始化函數主要獲得藍牙適配器:

第47行connect函數用於連接遠程設備:
第214行對每一個遠程藍牙設備連接Gatt服務,其中mGattCallback是Gatt服務的回調函數(這里多個設備共用一個!)

2.1.2.3、藍牙連接流程——在Gatt服務的回調函數中解析藍牙消息,並通過廣播發送這些消息
在該回調函數中,對各種事件都是通過調用broadcastUpdate函數,將消息廣播出去(這樣在主activity中寫廣播監聽函數即可以實現與藍牙服務的數據溝通)
在該回調函數中重寫了連接狀態轉變監聽函數、服務搜索監聽函數、讀特征數據監聽、特征變化監聽函數。

broadcast有兩種:其中一種就是簡單的將action消息廣播出去

另一種是包含特征信息解析的廣播:
其中第123行是和傳感器數據測量的UUID進行比對,解析該特征是否是有關傳感器測量的。如果是,則對信息進行解讀~
第137行則是對其他非傳感器測量的特征進行處理

鏈接
ps:最初的是eclipse版本的,后來草草地做了個android studio版本,源代碼用處不大,本文在於梳理流程
link:http://pan.baidu.com/s/1i4nVe3z

@beautifulzzzz 2016-02-014 continue~
e-mail:beautifulzzzz@qq.com
