BluetoothLELibrary 支持1對1鏈接

github地址:https://github.com/qindachang/BluetoothLELibraryjava

該庫只支持1對1鏈接,若是你想1對多設備鏈接,請移步至 BluetoothLE-Multi-Libraryandroid

demo運行環境 Android Studio 2.3git

低功耗藍牙庫。優點:github

  1. 適配到Android5.0和Android6.0、7.0的掃描方式(速度極快)。
  2. 適配小米手機鏈接藍牙操做。
  3. 適配三星手機發現服務、開啓通知等。
  4. 支持直接連發數百條數據,而不用擔憂消息發不出。自帶消息隊列(終於能夠像iOS同樣啦,不用去寫延時啦)。
  5. 支持同時開啓多個通知。
  6. 能夠連續操做發送數據、讀取特徵、開啓通知,即便你在for循環中寫也沒問題,自帶隊列。
  7. 掃描操做支持-> 設置掃描時長、根據設備名稱掃描、根據硬件地址掃描、根據服務UUID掃描、鏈接成功後自動關閉掃描。
  8. 隊列定時設置,知足因公司需求藍牙時間間隔。
  9. 設備信號強度、距離計算回調,可用於防丟器產品。

注意點:

  1. Android 6.0掃描藍牙須要地理位置權限。 Google動態權限開源庫:easypermissions
  2. Android 7.0掃描藍牙須要地理位置權限,而且須要開啓系統位置信息。 LocationUtils ApiLevelHelper
  3. 發送數據、開啓通知、讀取特徵等操做,須要在onServicesDiscovered()發現服務以後才能進行。
  4. 鏈接設備以前最好先中止掃描(小米手機可能會出現不能發現服務的狀況)。

入門指南

引入方式緩存

添加依賴app

做爲第一步,依賴這個庫添加到您的項目。如何使用庫, Gradle是推薦的方式使用這個庫的依賴。ide

添加如下代碼在你的APP級別 app build.gradle:post

compile 'com.qindachang:BluetoothLELibrary:0.7.4'

權限:gradle

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

5.0以上須要ui

<!-- 只有當你的 targets API 等於或大於 Android 5.0 (API level 21) 才須要此權限 -->
<uses-feature android:name="android.hardware.location.gps" />

6.0以上設備須要

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

代碼

前戲

是否支持藍牙

mBluetoothLe.isSupportBluetooth();

判斷藍牙是否打開

mBluetoothLe.isBluetoothOpen();

請求打開藍牙

mBluetoothLe.enableBluetooth(activity.this);

關閉藍牙

mBluetoothLe.disableBluetooth();

1、獲取單例實例

BluetoothLe mBluetoothLe = BluetoothLe.getDefault();

2、初始化

mBluetoothLe.init(this);//必須調用init()初始化

或者使用配置方式進行初始化,這樣你能夠針對本身的藍牙產品,作出個性化的藍牙隊列請求。

such as : 發送隊列間隔時間設置,因某些公司藍牙操做要求時間間隔,例如150ms間隔才能發送下一條數據

在Application的onCreate()方法中參照如下方式配置:

    public class BaseApplication extends Application { @Override public void onCreate() { super.onCreate(); BluetoothConfig config = new BluetoothConfig.Builder() .enableQueueInterval(true)//開啓隊列定時 .setQueueIntervalTime(150)//設置定時150ms時長(纔會發下一條),單位ms .build(); BluetoothLe.getDefault().init(this, config); } }

固然,你也可使用自動的方式來配置藍牙隊列請求。這個時間間隔是經過讀取遠程藍牙設備的最小間隔和最大間隔計算得出,保證了隊列的最大可用性。

    BluetoothConfig config = new BluetoothConfig.Builder() .enableQueueInterval(true) .setQueueIntervalTime(BluetoothConfig.AUTO)//發送時間間隔將根據藍牙硬件自動得出 .build(); BluetoothLe.getDefault().init(this, config);

上述的讀取遠程藍牙設備的最小間隔和最大間隔,你能夠在連上藍牙發現服務後讀取:

        @Override
        public void onServicesDiscovered(BluetoothGatt gatt) { mStringBuilder.append("發現服務啦\n"); mTvText.setText(mStringBuilder.toString()); mHandler.postDelayed(new Runnable() { @Override public void run() { //查看遠程藍牙設備的鏈接參數,如藍牙的最小時間間隔和最大時間間隔等.. Log.d("debug", mBluetoothLe.readConnectionParameters().toString()); } }, 1000); }

在使用途中修改以上配置:

修改配置:

    BluetoothConfig config = new BluetoothConfig.Builder() .enableQueueInterval(false) .build(); mBluetoothLe.changeConfig(config);

3、掃描

掃描過程已攜帶6.0動態權限申請:地理位置權限

    mBluetoothLe.setScanPeriod(15000)//設置掃描時長,單位毫秒,默認10秒 .setScanWithDeviceAddress("00:20:ff:34:aa:b3")//根據硬件地址過濾掃描 .setScanWithServiceUUID("6E400001-B5A3-F393-E0A9-E50E24DCCA9E")//設置根據服務uuid過濾掃描 .setScanWithDeviceName("ZG1616")//設置根據設備名稱過濾掃描 .setReportDelay(0)//若是爲0,則回調onScanResult()方法,若是大於0, 則每隔你設置的時長回調onBatchScanResults()方法,不能小於0 .startScan(Activity activity);

根據多個硬件地址、服務uuid、設備名稱過濾掃描,你能夠這樣:

    .setScanWithDeviceAddress(new String[]{"00:20:ff:34:aa:b3","f3:84:55:b4:ab:7f"}) .setScanWithServiceUUID(new String[]{"0000180d-0000-1000-8000-00805f9b34fb","6E400001-B5A3-F393-E0A9-E50E24DCCA9E"}) .setScanWithDeviceName(new String[]{"ZG1616","HaHa"})

獲取藍牙掃描狀態:

mBluetoothLe.getScanning();

中止掃描

mBluetoothLe.stopScan();

4、鏈接藍牙、藍牙鏈接狀態

	//發送數據、開啓通知等操做,必須等待onServicesDiscovered()發現服務回調後,才能去操做 //參數:false爲關閉藍牙自動重連,若是爲true則自動重連 mBluetoothLe.startConnect(false, mBluetoothDevice);

獲取藍牙鏈接狀態:

mBluetoothLe.getConnected();

獲取發現服務狀態:

mBluetoothLe.getServicesDiscovered();

斷開鏈接

mBluetoothLe.disconnect();

5、發送數據(到藍牙特徵)

	//如下兩個參數爲硬件工程師提供,請你與你司的硬件工程師溝通 private static final String SERVICE_UUID = "0000180d-0000-1000-8000-00805f9b34fb"; private static final String WRITE_UUID = "0000fff5-0000-1000-8000-00805f9b34fb"; mBluetoothLe.writeDataToCharacteristic(bytes, SERVICE_UUID, WRITE_UUID);

6、Notification類型通知

	private static final String SERVICE_UUID = "0000180d-0000-1000-8000-00805f9b34fb"; private static final String HEART_NOTIFICATION_UUID = "00002a37-0000-1000-8000-00805f9b34fb"; private static final String STEP_NOTIFICATION_UUID = "0000fff3-0000-1000-8000-00805f9b34fb";

開啓一個通知

mBluetoothLe.enableNotification(true, SERVICE_UUID, STEP_NOTIFICATION_UUID);

開啓多個通知

    mBluetoothLe.enableNotification(true, SERVICE_UUID, new String[]{HEART_NOTIFICATION_UUID, STEP_NOTIFICATION_UUID});

7、Indication類型通知

開啓一個通知

	mBluetoothLe.enableIndication(true, SERVICE_UUID, STEP_NOTIFICATION_UUID);

開啓多個通知

    mBluetoothLe.enableIndication(true, SERVICE_UUID, new String[]{HEART_NOTIFICATION_UUID, STEP_NOTIFICATION_UUID});

8、讀取數據

    private static final String SERVICE_UUID = "0000180d-0000-1000-8000-00805f9b34fb"; private static final String READ_UUID = "0000fff5-0000-1000-8000-00805f9b34fb"; mBluetoothLe.readCharacteristic(SERVICE_UUID, READ_UUID);

9、藍牙信號強度、距離

    mBluetoothLe.setReadRssiInterval(2000)//設置讀取信號強度間隔時間,單位毫秒 .setOnReadRssiListener(TAG, new OnLeReadRssiListener() { @Override public void onSuccess(int rssi, int cm) { } });

中止監聽藍牙信號強度

mBluetoothLe.stopReadRssi();

監聽

//監聽掃描 //Every Bluetooth-LE commands status will be callback in here. Flowing listener: mBleManager.setOnScanListener(TAG, new OnLeScanListener() { @Override public void onScanResult(BluetoothDevice bluetoothDevice, int rssi, ScanRecord scanRecord) { } @Override public void onBatchScanResults(List<ScanResult> results) { } @Override public void onScanCompleted() { } @Override public void onScanFailed(ScanBleException e) { } });

更多的相似於

mBleManager.setOnConnectListener(...)//監聽鏈接 mBleManager.setOnNotificationListener(...)//監聽通知 mBleManager.setOnIndicateListener(...)//監聽通知 mBleManager.setOnWriteCharacteristicListener(...)//監聽寫 mBleManager.setOnReadCharacteristicListener(...)//監聽讀 mBleManager.setOnReadRssiListener(...)//監聽信號強度

擁有TAG的監聽將能夠在多個界面中產生回調,這能夠幫助你實現多個Activity或Fragment監聽藍牙狀態的需求。如不使用TAG的監聽,將只有一個回調。

使用TAG監聽,須要在生命週期onDestroy()中調用mBluetoothLe.destroy(TAG); 如不使用TAG監聽,須要在生命週期onDestroy()中調用mBluetoothLe.destroy();

其它

清理藍牙緩存

請你在鏈接上藍牙後,再執行這步操做

mBluetoothLe.clearDeviceCache();

關閉GATT

在你退出應用的時候使用

mBluetoothLe.close();

取消隊列

假設當你在for循環中發送100條數據,想要在中途取消餘下的發送

mBluetoothLe.clearQueue();

避免內存泄露

在Activity生命週期onDestroy() 中使用:

mBluetoothLe.destroy();

若是你使用了tag標籤的監聽,使用: (它的好處是你能夠在多個界面產生多個相同的回調)

mBluetoothLe.destroy(TAG);

取消對應tag:

mBluetoothLe.cancelTag(TAG);

取消所有tag:

mBluetoothLe.cancelAllTag();

仍在補充

  1. 一連多臺藍牙設備

瞭解更多

  1. 強烈建議閱讀Demo : MainActivity.java / activity_main.xml

  2. 如何在多個Activity和Fragment中使用:https://github.com/qindachang/BluetoothLELibrary/tree/master/app/src/main/java/com/qindachang/bluetoothlelibrary/ui/demo

相關文章
相關標籤/搜索