1. 程式人生 > >android BLE藍芽詳細講解(一)

android BLE藍芽詳細講解(一)

本文主要講解Android低功耗藍芽的api使用以及藍芽掃描、連線、傳送資料、接收資料等一系列操作,本篇結尾有本人封裝的BleLib藍芽庫,非常適合藍芽初學者使用,只需要一行程式碼注入就OK了,而且用法也極其簡單,我會在第二篇中專門講解一下BleLib庫的使用。

在BLE協議中,有兩個角色,周邊(Periphery)和中央(Central);周邊是資料提供者,中央是資料使用/處理者,一箇中央可以同時連線多個周邊,但是一個周邊某一時刻只能連線一箇中央。
首先使用藍芽就不得不說BluetoothGatt和BluetoothGattCallback這兩個類,該類繼承自BluetoothProfile,BluetoothGatt作為中央來使用和處理資料,通過BluetoothGatt可以連線裝置(connect),發現服務(discoverServices),並把相應地屬性返回到BluetoothGattCallback,BluetoothGattCallback返回中央的狀態和周邊提供的資料。

我們藍芽操作的主要目的就是為了拿到中央BluetoothGatt這個物件,進而進行接下來的所有一系列操作,如下:
1.先拿到BluetoothManager:bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);

2.再拿到BluetoothAdapt:btAdapter = bluetoothManager.getAdapter();

3.開始掃描:btAdapter.startLeScan( BluetoothAdapter.LeScanCallback);

4.從LeScanCallback中得到BluetoothDevice:public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {…..}

5.用BluetoothDevice得到BluetoothGatt:gatt = device.connectGatt(this, true, gattCallback);

這時總算拿到中央BluetoothGatt了,它有很多的方法,呼叫這些方法,你就可以通過BluetoothGattCallback和周邊BluetoothGattServer互動了。

下面講解一下主要類的大致理解:

BluetoothProfile: 一個通用的規範,按照這個規範來收發資料。

BluetoothManager:通過BluetoothManager來獲取BluetoothAdapter
如:BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);

BluetoothAdapter:一個Android系統只有一個BluetoothAdapter ,通過BluetoothManager 獲取
BluetoothAdapter mBluetoothAdapter = bluetoothManager.getAdapter();

BluetoothGattDescriptor:可以看成是描述符,對Characteristic的描述,包括範圍、計量單位等。

BluetoothGattService:服務,Characteristic的集合。

BluetoothGattCallback:已經連線上裝置,對裝置的某些操作後返回的結果。這裡必須提醒下,已經連線上裝置後的才可以返回,沒有返回的認真看看有沒有連線上裝置。
private BluetoothGattCallback GattCallback = new BluetoothGattCallback() {
// 這裡有9個要實現的方法,看情況要實現那些,用到那些就實現那些
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState){};
public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status){};
};
BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
BluetoothGatt gatt = device.connectGatt(this, false, mGattCallback);

藍芽互動的主要對應關係:
1、notification對應onCharacteristicChanged;
gatt.setCharacteristicNotification(characteristic, true);該方法一般是在發現服務後,進行設定的,設定該方法的目的是讓硬體在資料改變的時候,傳送資料給app,app則通過onCharacteristicChanged方法回撥給使用者,從引數中可獲取到回調回來的資料。

2、readCharacteristic對應onCharacteristicRead;
gatt.readCharacteristic(characteristic);

3、writeCharacteristic對應onCharacteristicWrite;
gatt.wirteCharacteristic(mCurrentcharacteristic);

4、連線藍芽或者斷開藍芽 對應 onConnectionStateChange;

5、 readDescriptor對應onDescriptorRead;

6、writeDescriptor對應onDescriptorWrite;

gatt.writeDescriptor(descriptor);

7、readRemoteRssi對應onReadRemoteRssi;
gatt.readRemoteRssi()

8、executeReliableWrite對應onReliableWriteCompleted;

9、discoverServices對應onServicesDiscovered
gatt.discoverServices()

開啟藍芽所具備的許可權:
這裡寫圖片描述
如果 android.hardware.bluetooth_le設定為false,可以安裝在不支援的裝置上使用,判斷是否支援藍芽4.0用以下程式碼就可以了
如:if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
Toast.makeText(this, “裝置不支援藍芽4.0”, Toast.LENGTH_SHORT).show();
finish();
}

對藍芽的啟動關閉操作:
1、利用系統預設開啟藍芽對話方塊
if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}
2、後臺開啟藍芽,不做任何提示,這個也可以用來自定義開啟藍芽對話方塊啦
mBluetoothAdapter.enable();
3、後臺關閉藍芽
mBluetoothAdapter.disable();

本文的api介紹:(blelibrary庫)
1、iQppCallback和QppApi這個兩個類封裝了完整的讀寫資料,設定通知等操作 此demo中並未用到這兩個介面,此列出方便以後呼叫
2、BleDevice類為藍芽物件,其中可以設定藍芽的基本屬性,以及連線狀態等(可以繼承該類進行擴充套件)
3、BleConfig類中主要是放置一些靜態值,如連線超時時長、掃描時長、服務及特徵的uuid,以及驗證硬體傳送的廣播包以便進行過濾掃描到的裝置
4、BleLisenter包含了ble藍芽操作的所有介面 如開始掃描、停止掃描、掃描到裝置、獲取到服務、讀取硬體返回的資料、向硬體寫入資料、設定通知、藍芽連線改變、藍芽連接出錯(在四此處設定同時最多可連線多少裝置)等回撥
5、BluetoothLeService實現所有的上述回撥方法

本文先粗略的講解一下android中api的大致使用及含義。
下篇將重點講解BleLib庫的使用以及各方法的具體使用。

使用:見DEMO
demo下載地址:https://github.com/liulei-0911/BleDemo
androidstudio依賴地址: compile ‘cn.com.superLei:blelibrary:1.0.0’