Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android BLE基礎框架使用詳解

Android BLE基礎框架使用詳解

編輯:關於Android編程

前言

研究了一段時間的藍牙使用,發現網上相關的資料比較貧乏,不像其他Android相關資料那麼齊全,基本上大部分資料都是在藍牙聯盟SIG提供的官網https://www.bluetooth.com/zh-cn/specifications上查找得到,也沒有一個比較穩定好用的基礎操作框架,開發時遇到的各種問題也是非常頭疼。在此種情況下該框架應運而生,框架中包含了藍牙設備的基礎操作功能,調用簡單,已通過實際項目進行驗證,並且配有一個比較好用的demo演示,下文主要講述該框架的使用方式。

項目地址:https://github.com/xiaoyaoyou1212/BLE

項目引入:compile project('com.vise.xiaoyaoyou:baseble:1.0.0')

設備掃描

使用簡介

掃描包含三種方式,第一種方式是直接掃描所有設備,可以設置循環掃描,也可以設置超時時間,掃描到的設備可以添加到BluetoothLeDeviceStore中統一進行處理,使用方式如下:

ViseBluetooth.getInstance(this).setScanTimeout(-1).startScan(new PeriodScanCallback() {
    @Override
    public void scanTimeout() {

    }

    @Override
    public void onDeviceFound(BluetoothLeDevice bluetoothLeDevice) {
        bluetoothLeDeviceStore.addDevice(bluetoothLeDevice);
    }
});

第二種方式是掃描指定Mac地址的設備,一般需設置超時時間,掃描到指定設備後就停止掃描,使用方式如下:

ViseBluetooth.getInstance(this).setScanTimeout(5000).startScan(new PeriodMacScanCallback() {
    @Override
    public void scanTimeout() {

    }

    @Override
    public void onDeviceFound(BluetoothLeDevice bluetoothLeDevice) {

    }
});

第三種方式是掃描指定廣播名的設備,同第二種方式類似,也需設置超時時間,掃描到指定設備後也會停止掃描,使用方式如下:

ViseBluetooth.getInstance(this).setScanTimeout(5000).startScan(new PeriodNameScanCallback() {
    @Override
    public void scanTimeout() {

    }

    @Override
    public void onDeviceFound(BluetoothLeDevice bluetoothLeDevice) {

    }
});

其中掃描到的設備信息都統一放到BluetoothLeDevice中,其中包含了設備的所有信息,以下會詳細講解具體包含哪些信息。

示例圖

設備掃描

設備連接

使用簡介

連接與掃描一樣也有三種方式,第一種方式是在掃描獲取設備信息BluetoothLeDevice後才可使用,可設置連接超時時間,默認超時時間為10秒,使用方式如下:

ViseBluetooth.getInstance(this).connect(bluetoothLeDevice, false, new IConnectCallback() {
    @Override
    public void onConnectSuccess(BluetoothGatt gatt, int status) {

    }

    @Override
    public void onConnectFailure(BleException exception) {

    }
});

第二種方式是連接指定Mac地址的設備,該方式使用前不需要進行掃描,該方式直接將掃描和連接放到一起,在掃描到指定設備後自動進行連接,使用方式如下:

ViseBluetooth.getInstance(this).connectByMac(mac, false, new IConnectCallback() {
    @Override
    public void onConnectSuccess(BluetoothGatt gatt, int status) {

    }

    @Override
    public void onConnectFailure(BleException exception) {

    }
});

第三種方式是連接指定名稱的設備,該方式與第二種方式類似,使用方式如下:

ViseBluetooth.getInstance(this).connectByName(name, false, new IConnectCallback() {
    @Override
    public void onConnectSuccess(BluetoothGatt gatt, int status) {

    }

    @Override
    public void onConnectFailure(BleException exception) {

    }
});

連接成功後就可以進行相關處理,回調已在底層做了線程切換處理,可以直接操作視圖。如果知道該設備服務的UUID,可直接調用ViseBluetooth.getInstance(this).withUUIDString(serviceUUID, characteristicUUID, descriptorUUID);,那麼在下面操作設備時就不需要傳特征(BluetoothGattCharacteristic)和描述(BluetoothGattDescriptor)相關參數,如果在連接成功後一直沒設置UUID,那麼在操作時則需要傳該參數,該內容在下文的設備操作中會詳細講解,此處就不一一講解了。

示例圖

設備連接

設備詳情

使用簡介

DEVICE INFO(設備信息)

獲取設備名稱(Device Name):bluetoothLeDevice.getName(); 獲取設備地址(Device Address):bluetoothLeDevice.getAddress(); 獲取設備類別(Device Class):bluetoothLeDevice.getBluetoothDeviceClassName(); 獲取主要設備類別(Major Class):bluetoothLeDevice.getBluetoothDeviceMajorClassName(); 獲取服務類別(Service Class):bluetoothLeDevice.getBluetoothDeviceKnownSupportedServices(); 獲取配對狀態(Bonding State):bluetoothLeDevice.getBluetoothDeviceBondState();

RSSI INFO(信號信息)

獲取第一次信號時間戳(First Timestamp):bluetoothLeDevice.getFirstTimestamp(); 獲取第一次信號強度(First RSSI):bluetoothLeDevice.getFirstRssi(); 獲取最後一次信號時間戳(Last Timestamp):bluetoothLeDevice.getTimestamp(); 獲取最後一次信號強度(Last RSSI):bluetoothLeDevice.getRssi(); 獲取平均信號強度(Running Average RSSI):bluetoothLeDevice.getRunningAverageRssi();

SCAN RECORD INFO(廣播信息)

根據掃描到的廣播包AdRecordStore獲取某個廣播數據單元AdRecord的類型編號record.getType(),再根據編號獲取廣播數據單元的類型描述record.getHumanReadableType()以及該廣播數據單元的長度及數據內容,最後通過AdRecordUtil.getRecordDataAsString(record)將數據內容轉換成具體字符串。

示例圖

設備詳情 設備詳情

設備操作

使用簡介

在操作設備前首先要保證設備已連接成功,那麼在設備連接成功獲取到BluetoothGatt後直接對服務的特征值UUID進行相關處理,其中特征值UUID有可讀、可寫、可通知、指示器四種,獲取過程如下所示:

final String unknownServiceString = getResources().getString(R.string.unknown_service);
final String unknownCharaString = getResources().getString(R.string.unknown_characteristic);
final List> gattServiceData = new ArrayList<>();
final List>> gattCharacteristicData = new ArrayList<>();
mGattCharacteristics = new ArrayList<>();

// Loops through available GATT Services.
for (final BluetoothGattService gattService : gattServices) {
    final Map currentServiceData = new HashMap<>();
    uuid = gattService.getUuid().toString();
    currentServiceData.put(LIST_NAME, GattAttributeResolver.getAttributeName(uuid, unknownServiceString));
    currentServiceData.put(LIST_UUID, uuid);
    gattServiceData.add(currentServiceData);

    final List> gattCharacteristicGroupData = new ArrayList<>();
    final List gattCharacteristics = gattService.getCharacteristics();
    final List charas = new ArrayList<>();

    // Loops through available Characteristics.
    for (final BluetoothGattCharacteristic gattCharacteristic : gattCharacteristics) {
        charas.add(gattCharacteristic);
        final Map currentCharaData = new HashMap<>();
        uuid = gattCharacteristic.getUuid().toString();
        currentCharaData.put(LIST_NAME, GattAttributeResolver.getAttributeName(uuid, unknownCharaString));
        currentCharaData.put(LIST_UUID, uuid);
        gattCharacteristicGroupData.add(currentCharaData);
    }

    mGattCharacteristics.add(charas);
    gattCharacteristicData.add(gattCharacteristicGroupData);
}

在獲取到BluetoothGattCharacteristic後可進行如下操作:
- 設置通知服務

ViseBluetooth.getInstance(this).enableCharacteristicNotification(characteristic, new IBleCallback() {
    @Override
    public void onSuccess(BluetoothGattCharacteristic bluetoothGattCharacteristic, int type) {

    }

    @Override
    public void onFailure(BleException exception) {

    }
}, false);

其中最後一個參數是設置該通知是否是指示器方式,指示器方式為有應答的通知方式,在傳輸時更為靠譜。如果在連接成功時已經知道該設備可通知的UUID並且已經設置成功,那麼此處還可以如下設置:

ViseBluetooth.getInstance(this).enableCharacteristicNotification(new IBleCallback() {
    @Override
    public void onSuccess(BluetoothGattCharacteristic bluetoothGattCharacteristic, int type) {

    }

    @Override
    public void onFailure(BleException exception) {

    }
}, false);
讀取信息
ViseBluetooth.getInstance(this).readCharacteristic(characteristic, new IBleCallback() {
    @Override
    public void onSuccess(BluetoothGattCharacteristic bluetoothGattCharacteristic, int type) {

    }

    @Override
    public void onFailure(BleException exception) {

    }
});

同上,如果已設置過可讀的UUID,那麼此處也可以通過如下方式讀取信息:

ViseBluetooth.getInstance(this).readCharacteristic(new IBleCallback() {
    @Override
    public void onSuccess(BluetoothGattCharacteristic bluetoothGattCharacteristic, int type) {

    }

    @Override
    public void onFailure(BleException exception) {

    }
});
寫入數據
ViseBluetooth.getInstance(this).writeCharacteristic(characteristic, new byte[]{0x00,0x01,0x02}, new IBleCallback() {
    @Override
    public void onSuccess(BluetoothGattCharacteristic bluetoothGattCharacteristic, int type) {

    }

    @Override
    public void onFailure(BleException exception) {

    }
});

同樣,如果在連接成功時設置過可寫UUID,那麼此處也可以通過如下方式寫入數據:

ViseBluetooth.getInstance(this).writeCharacteristic(new byte[]{0x00,0x01,0x02}, new IBleCallback() {
    @Override
    public void onSuccess(BluetoothGattCharacteristic bluetoothGattCharacteristic, int type) {

    }

    @Override
    public void onFailure(BleException exception) {

    }
});

此處的數據new byte[]{0x00,0x01,0x02}為模擬數據,在使用時替換為真實數據即可,切記每次發送的數據必須在20個字節內,如果大於20字節可采用分包機制進行處理。

示例圖

設備服務

總結

從以上的描述中可以知道,設備相關的所有操作都統一交給ViseBluetooth進行處理,並且該類是單例模式,全局只有一個,管理很方便,連接設備成功時會自動獲得一個BluetoothGatt,在斷開連接時會將該BluetoothGatt關閉,上層不用關心連接數最大為6的限制問題,只需要在需要釋放資源時調用ViseBluetooth.getInstance(this).clear();就行,簡單易用,這也正是該項目的宗旨。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved