蓝牙低能量 – 降低了BLE startScan在Android 5.0 Lollipop上检测到的设备

简短版本:

在我的测试与Android 5.0 Lollipop我注意到android.bluetooth.le.BluetoothLeScanner检测BLE设备比Android 4.4 KitKat不太频繁。为什么会有这样的选择?

长版本:

我正在开发Android应用,专门针对Nexus 7平板电脑,专注于检测蓝牙低功耗(BLE)设备。该应用程序主要关注信标的RSSI值,以确定其与平板电脑的接近程度。这意味着我不需要连接到BLE设备,因为当检测到设备时,RSSI值被传递到扫描回调。

在Android 4.4 KitKat中,当我调用BluetoothAdapter.startLeScan(LeScanCallback)时,对于每个检测到的BLE设备,我的回调仅对ONCE进行调用。 (我已经看到some discussions声称这种行为可能因设备而异)但是,我对不断变化的RSSI值感兴趣,因此目前推荐的方法是以设定的间隔(在我的情况下为250ms)持续执行startLeScan和stopLeScan:

public class TheOldWay {

    private static final int SCAN_INTERVAL_MS = 250;

    private Handler scanHandler = new Handler();
    private boolean isScanning = false;

    public void beginScanning() {
        scanHandler.post(scanRunnable);
    }

    private Runnable scanRunnable = new Runnable() {
        @Override
        public void run() {
            BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();

            if (isScanning) {
                adapter.stopLeScan(leScanCallback);
            } else if (!adapter.startLeScan(leScanCallback)) {
                // an error occurred during startLeScan
            }

            isScanning = !isScanning;

            scanHandler.postDelayed(this, SCAN_INTERVAL_MS);
        }
    };

    private BluetoothAdapter.LeScanCallback leScanCallback = new BluetoothAdapter.LeScanCallback() {
        @Override
        public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {
            // use the RSSI value
        }
    };

}

本质上这给了我所需的结果,但是这个过程非常耗资源,最终导致无响应的蓝牙适配器。

由于这些原因,我将Nexus 7升级到Android 5.0 Lollipop,以查看我的BLE问题是否被修复。在Lollipop中,BluetoothAdapter.startLeScan(LeScanCallback)已被弃用,并替换为a new API,允许对扫描过程进行更多的控制。在我的第一个测试中,当RSSI值发生变化时,startScan不会持续调用回调(在我的Nexus 7上),所以我仍然需要使用startScan / stopScan实现:

@TargetApi(21)
public class TheNewWay {

    private static final int SCAN_INTERVAL_MS = 250;

    private Handler scanHandler = new Handler();
    private List<ScanFilter> scanFilters = new ArrayList<ScanFilter>();
    private ScanSettings scanSettings;
    private boolean isScanning = false;

    public void beginScanning() {
        ScanSettings.Builder scanSettingsBuilder = new ScanSettings.Builder();
        scanSettingsBuilder.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY);
        scanSettings = scanSettingsBuilder.build();

        scanHandler.post(scanRunnable);
    }

    private Runnable scanRunnable = new Runnable() {
        @Override
        public void run() {
            BluetoothLeScanner scanner = BluetoothAdapter.getDefaultAdapter().getBluetoothLeScanner();

            if (isScanning) {
                scanner.stopScan(scanCallback);
            } else {
                scanner.startScan(scanFilters, scanSettings, scanCallback);
            }

            isScanning = !isScanning;

            scanHandler.postDelayed(this, SCAN_INTERVAL_MS);
        }
    };

    private ScanCallback scanCallback = new ScanCallback() {
        @Override
        public void onScanResult(int callbackType, ScanResult result) {
            super.onScanResult(callbackType, result);

            int rssi = result.getRssi();

            // do something with RSSI value
        }

        @Override
        public void onScanFailed(int errorCode) {
            super.onScanFailed(errorCode);

            // a scan error occurred
        }
    };

}

如您所见,我已经使用ScanSettings类配置了扫描仪,它允许您设置scanMode。我使用ScanSettings.SCAN_MODE_LOW_LATENCY,它具有以下文档:“扫描使用最高占空比”,建议只有在应用程序在前台运行时才使用此模式。听起来就像我想要的,但不幸的是,我每15 – 30秒钟只能得到一个信标检测,在这个扫描间隔上,KitKat版本会每隔1-2秒显示相同的信标。

你有什么想法可能是这个差异的原因吗?我错过了什么,也许一些新的设置?是否有替代方法做上述?

非常感谢!

阿贝尔

PS:我想包括更多的链接到我使用的资源,但我还没有得到重点。

Nexus 5运行新的Android 5.0扫描API,我的结果已经非常不同了。使用SCAN_MODE_LOW_LATENCY时,BLE数据包的检测接近实时,每隔100ms,以10Hz发送的BLE信标。

您可以在这里阅读完整的结果:

http://developer.radiusnetworks.com/2014/10/28/android-5.0-scanning.html

这些测试是基于运行开源的Android Beacon Library 2.0的实验性android-l-apis分支here

测试结果有什么区别并不明显,但扫描开始和停止可能会改变结果。

编辑:有可能硬件是有区别的。查看Nexus 4:https://github.com/AltBeacon/android-beacon-library/issues/59#issuecomment-64281446上类似时间的报告

翻译自:https://stackoverflow.com/questions/27111309/decreased-ble-startscan-detected-devices-on-android-5-0-lollipop

转载注明原文:蓝牙低能量 – 降低了BLE startScan在Android 5.0 Lollipop上检测到的设备