2017-05-31 96 views
1

我有這個代碼開始掃描BLE裝置:是否有可能減少掃描BLE設備的時間?

Log.i("timeChar", "Begin"); 
customBluetoothManager.scanLeDevice(true); 

然後scanLeDevice()被調用,管理藍牙適配器開始BLE掃描:

public void scanLeDevice(final boolean enable) { 
     mHandler = new Handler(); 

     if (enable) { 
      // Stops scanning after a pre-defined scan period. 
      mHandler.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        mBluetoothAdapter.stopLeScan(mLeScanCallback); 
       } 
      }, SCAN_PERIOD); 

      mBluetoothAdapter.startLeScan(mLeScanCallback); 
     } else { 
      mBluetoothAdapter.stopLeScan(mLeScanCallback); 
     } 
    } 

而現在,回調爲每個設備是通過掃描發現:

// Device scan callback. 
    private BluetoothAdapter.LeScanCallback mLeScanCallback = 
      new BluetoothAdapter.LeScanCallback() { 
       @Override 
       public void onLeScan(final BluetoothDevice device, int rssi, 
            byte[] scanRecord) { 

        String name = device.getName(); 
        if (name != null && name.compareTo(bluetoothDeviceName) == 0) { 
          Log.i("timeChar", "Device found"); 
        } 
       } 
      }; 

每一次,我要去掃描我的BLE裝置(具有外設角色),它TA kes大約11秒才能檢測到它...

05-31 17:32:39.139 27545-9668/app I/timeChar: Begin 
05-31 17:32:50.149 27545-27545/app I/timeChar: Device found 

有什麼辦法可以減少這個時間嗎?

+1

雖然自我宣傳我發現這篇文章有趣的關於BLE:https://atmosphere.anaren.com/wiki/Android_Issues_With_Bluetooth_Low_Energy –

+0

謝謝那個wiki!我會看一看 :) – adri1992

回答

0

BLE掃描和設備通告是間隔完成的。如果廣告之間的時間間隔很長,讓我們說一秒,那麼android可能會錯過它。爲了從應用程序方面解決這個問題:

//global ScanSettings settings; 
ScanSettings.Builder settingBuilder = new ScanSettings.Builder(); 
settingBuilder.setScanMode(SCAN_MODE_LOW_LATENCY); 
settings = settingBuilder.build(); 

你以後傳遞給掃描方法

mBluetoothAdapter.getBluetoothLeScanner().startScan(null, settings, mLeScanCallback); 
0

爲了做到這一點,你應該考慮到:

  1. 在BLE信標中設置的定義時間間隔。爲了節省電池,您可以定義由BLE Beacon發送的每個數據包之間的時間間隔(從100 ms到幾秒)。因此首先檢查你的信標的時間間隔是多少。

  2. Android OS中設置的時間,表示您已收到新數據包(回調函數)。作爲馬爾辛表示你可以這樣做一樣簡單:

scanSettings = new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).build();