使用BluetoothLeScanner扫描多次为同一设备调用onScanResult

时间:2016-03-29 23:11:27

标签: android bluetooth bluetooth-lowenergy

我在Android上使用BLE实现了一个简单的广告+扫描功能,由于某种原因,我通过同一设备获得了大量调用onScanResult回调。

广告:

//Advertise settings build
AdvertiseSettings.Builder builder = new AdvertiseSettings.Builder();
builder.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY);
builder.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH);
builder.setConnectable(true);

AdvertiseSettings advSettings = builder.build();

//Advertise data build
AdvertiseData.Builder advDataBuilder = new AdvertiseData.Builder();
advDataBuilder.addServiceUuid(ParcelUuid.fromString(SFGattAttributes.SERVICE));

AdvertiseData advertiseData = advDataBuilder.build();

//Start Advertising
bluetoothLeAdvertiser.startAdvertising(advSettings, advertiseData, advertiseData, new BLEAdvertiserCallback());

扫描:

BluetoothManager bluetoothManager = (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE);
bluetoothAdapter = bluetoothManager.getAdapter();
bluetoothLeScanner = bluetoothAdapter.getBluetoothLeScanner();
bluetoothLeScanner.startScan(getScanFilters(), getScanSettings(), new BLEScanCallback());

每次唯一的区别似乎是rssi值的差异。

有没有办法避免这种多次通话?

1 个答案:

答案 0 :(得分:4)

这实际上是一项功能,可以用于(广告)BLE设备。还有(较旧的)设备在扫描周期期间不能获得特定设备的多个扫描结果。这会导致包括BLE信标在内的其他设备出现问题。多个呼叫还会让您(随着时间的推移)知道设备仍可访问/可访问。

因此,如果您不想要多个呼叫,请忽略对已知设备(MAC地址)的呼叫。它无法停用。

请记住,许多设备(尤其是手机)都会更改其mac地址。有的甚至每2分钟一次。将新的mac地址映射到旧设备(旧的mac地址)并不容易。你必须相应地处理这种行为。