github地址:https://github.com/qindachang/BluetoothLELibraryjava
該庫只支持1對1鏈接,若是你想1對多設備鏈接,請移步至 BluetoothLE-Multi-Libraryandroid
demo運行環境 Android Studio 2.3git
低功耗藍牙庫。優點:github
引入方式緩存
添加依賴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();
強烈建議閱讀Demo : MainActivity.java / activity_main.xml
如何在多個Activity和Fragment中使用:https://github.com/qindachang/BluetoothLELibrary/tree/master/app/src/main/java/com/qindachang/bluetoothlelibrary/ui/demo