Android蓝牙LE扫描仪如何检查设备是否超出范围?

时间:2019-02-06 20:54:52

标签: android bluetooth bluetooth-lowenergy

我使用startScan的{​​{1}}方法遇到了一个问题,但是发现BLE设备,但是当我关闭BLE设备时,我的手机仍然显示该设备为打开状态!

我尝试使用:

BluetoothLeScanner

伙计们,我还没有找到解决方案来检测BLE设备是否在其他资源中丢失,例如(Android SDK参考,论坛,stackoverflow等)(:

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

这个one看起来不错(JAVA):

据我了解,您需要实现startLeScan()。

查找BLE设备

要查找BLE设备,请使用startLeScan()方法。此方法将BluetoothAdapter.LeScanCallback作为参数。您必须实现此回调,因为这是返回扫描结果的方式。由于扫描会消耗大量电池,因此您应遵守以下准则:

找到所需设备后,立即停止扫描。 切勿循环扫描,并设置扫描时间限制。先前可用的设备可能已超出范围,并且继续扫描会耗尽电池电量。 以下代码片段显示了如何启动和停止扫描:

公共类DeviceScanActivity扩展了ListActivity {

private BluetoothAdapter mBluetoothAdapter;
private boolean mScanning;
private Handler mHandler;

// Stops scanning after 10 seconds.
private static final long SCAN_PERIOD = 10000;
...
private void scanLeDevice(final boolean enable) {
    if (enable) {
        // Stops scanning after a pre-defined scan period.
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                mScanning = false;
                mBluetoothAdapter.stopLeScan(mLeScanCallback);
            }
        }, SCAN_PERIOD);

        mScanning = true;
        mBluetoothAdapter.startLeScan(mLeScanCallback);
    } else {
        mScanning = false;
        mBluetoothAdapter.stopLeScan(mLeScanCallback);
    }
    ...
}

... }

也请考虑检查this教程。 还有this个。

答案 1 :(得分:0)

在谷歌搜索和浏览Android文档期间,我弄清楚了如何检测设备是否超出范围。我想分享我的解决方案:

...
public void scanBLEDevices(final boolean enable) {
    if(mLeScanner == null) {
        Log.d(TAG, "Could not get LEScanner object");
        throw new InternalError("Could not get LEScanner object");
    }

    if (enable) {
        startLeScan();
    } else {
        stopLeScan(false);
    }
}

private void startLeScan() {
    Log.i(TAG, "startLeScan(BluetoothLeScanner mLeScanner)");
    mScanning = true;
    mInRangeBtDevices.clear();
    if (mStartScanCallback != null) {
        mHandler.removeCallbacks(mStartScanCallback);
    }
    if (Build.VERSION.SDK_INT < 21) {
        mBluetoothAdapter.startLeScan(mLeScanCallback);
    } else {
        mLeScanner.startScan(mScanFilters, mScanSettings, mScanCallback);
    }
    mStopScanCallback = new Runnable() {
        @Override
        public void run() {
            stopLeScan(true);
        }
    };
    mHandler.postDelayed(mStopScanCallback, SCAN_PERIOD);
}

private void stopLeScan(final boolean isContinueAfterPause) {
    Log.i(TAG, "stopLeScan(BluetoothLeScanner mLeScanner)");
    mScanning = false;
    if (mStopScanCallback != null) {
        mHandler.removeCallbacks(mStopScanCallback);
    }
    removeOutOfRangeDevices();
    if (Build.VERSION.SDK_INT < 21) {
        mBluetoothAdapter.stopLeScan(mLeScanCallback);
    } else {
        mLeScanner.stopScan(mScanCallback);
    }
    if (isContinueAfterPause) {
        mStartScanCallback = new Runnable() {
            @Override
            public void run() {
                startLeScan();
            }
        };
        mHandler.postDelayed(mStartScanCallback, SCAN_PAUSE);
    }
}

private void removeOutOfRangeDevices() {
    final Set<String> outOfRangeDevices = new HashSet<>();
    for (String btAddress : mBtDevices.keySet()) {
        if (!mInRangeBtDevices.contains(btAddress)) {
            outOfRangeDevices.add(btAddress);
        }
    }
    for (String btAddress : outOfRangeDevices) {
        final BluetoothDevice outOfRangeDevice = mBtDevices.get(btAddress);
        mBtDevicesRSSI.remove(btAddress);
        mBtDevices.remove(btAddress);
    }
}
...

说明:

  1. 如您所见,我在每个扫描期mInRangeBtDevices上添加了一个集合,该集合将保留当前扫描期间找到的所有设备。
  2. 当我停止扫描时,我还将使用一个额外的帮助程序集合outOfRangeDevices从先前的列表中删除不再可用的设备

我认为该示例将非常有用,您将能够将其集成到自己的代码中