低功耗藍牙開發之設備掃描

1、前言:

瞭解點藍牙開發的童鞋都知道,在進行藍牙設備的掃描以前須要開啓藍牙。不瞭解的童鞋能夠閱讀上一篇文章:藍牙開發之開啓藍牙。成功開啓設備藍牙功能以後,咱們須要拿到周圍藍牙設備信息,這就須要使用到掃描功能。android

2、開啓藍牙掃描:

1.獲取BluetoothAdapter(藍牙適配器)

bluetoothAdapter = BluetoothAdapter.getDefaultAdapter()
複製代碼

2.獲取BluetoothLeScanner(藍牙掃描器)

熟悉藍牙的童鞋應該知道,在Android 4.3(API 18)時,增長了使用BluetoothAdapter掃描低功耗藍牙的掃描方法bluetoothAdapter.startLeScan()可是在Android 5.0(API 21)以後就廢棄了,並提倡咱們使用BluetoothLeScanner#startScan(List, ScanSettings, ScanCallback)替代,在廢棄的方法裏能夠指定藍牙低功耗藍牙的UUID去指定要去掃描的設備,同時在回調方法裏獲取藍牙設備信息。總之使用藍牙掃描器掃描低功耗藍牙設備的優勢是不言而喻的,因此這裏你們應該有個取捨,或者兼容到Android 4.3,不過我認爲沒有必要的,而且該版本設備佔有率也不高。數組

言歸正傳,咱們首先獲取藍牙掃描器對象:bash

if (bluetoothAdapter != null) {

bluetoothLeScanner = bluetoothAdapter.getBluetoothLeScanner();

}複製代碼

3.添加權限:

上一步驟中咱們已經說過,咱們推薦使用BLuetoothLeScanner進行低功耗藍牙的掃描,可是使用該方法進行掃描須要模糊定位權限,因此須要在註冊清單中添加:ui

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />複製代碼

4.開始掃描:

使用藍牙掃描器對象調用開始掃描方法進行掃描:spa

bluetoothLeScanner.startScan(filters, settings, callback)複製代碼
說一下三個參數的含義:
  • List<ScanFilter> filters:藍牙掃描的過濾條件,是一個ScanFilter集合,若是沒有過濾條件的話能夠填null;
  • ScanSettings settings:掃描配置,能夠不進行任何設置,也就是new ScanSettings.Builder().build()傳遞一個空對象;
  • ScanCallback callback:掃描回調,用於接收掃描回調的結果和掃描失敗的回調;

注意:使用該方法掃描低功耗藍牙設備須要知足Android系統版本在Build.VERSION_CODES.LOLLIPOP以上.net

5.掃描參數解析:

(1)ScanFilter:掃描過濾條件。3d

官方API提供了多種方法添加過濾條件:code

​​

關於過濾條件這兒,我也嘗試過屢次,有些過濾條件不太好使,你們有其餘想法,但願可以指正。
cdn

  1. 使用ScanFilter在掃描前將掃描規則加入,獲得即爲符合規則的設備信息;
  • 使用設備名進行過濾,區分大小寫;
  • 使用設備Mac地址進行過濾,需嚴格按照原則進行;
  • 使用ServiceUuid進行過濾無效(初步緣由判斷爲:掃描獲得的uuid集合爲空);
  • 使用ServiceData進行過濾須要ServiceUuid配合ServiceData進行使用,同時配置的ServiceData爲完整數據中的不可變部分;
  • 藍牙的ServiceUuid只有四位能夠修改:"0000****-0000-1000-8000-00805F9B34FB";
  • 數據均爲16進制字符串轉化的Byte數組;

注意:使用該方法進行過濾有些方式不太好使;對象

2.不添加過濾規則,掃描完成後代碼過濾;

(2)ScanSettings :參數掃描配置類

官方API提供了多個方法:

​​

通常咱們只使用setScanMode()方法就能夠,其餘參數使用默認值。

該方法有三種取值:

  • SCAN_MODE_LOW_POWER:低功耗模式,默認的掃描模式,當應用不在前臺時默認執行。
  • SCAN_MODE_BALANCED:平衡模式
  • SCAN_MODE_LOW_LATENCY:高頻模式,前臺時建議使用此模式。

6.掃描結果

咱們在開始掃描的時候使用了ScanCallback,在onScanResult(int callbackType, ScanResult result)方法裏處理回調掃描到的設備信息;若是掃描失敗會回調該方法onScanFailed(int errorCode)。

相關文章
相關標籤/搜索