我正在使用我自己的BLE设备。在收听这些设备后,我想使用ScanFilter
,因此我只能获得我感兴趣的设备。现在我的解决方案是在回调内进行过滤,但如果此过滤可以更早发生并根据规范进行更好应该是可能的。我试图过滤制造商的具体数据,但我无法使其工作。这是我的代码:如何在使用BluetoothLeScanner for android时过滤制造商数据?
BluetoothLeScanner bleScanner = bluetoothAdapter.getBluetoothLeScanner();
ScanFilter filter = getScanFilter();
List<ScanFilter> scanFilters = new ArrayList<>();
scanFilters.add(filter);
ScanSettings scanSettings = getScanSettings();
bleScanner.startScan(scanFilters, scanSettings, scanCallback);
这是创建过滤器和设置功能:
private ScanSetting getScanSettings(){
ScanSettings.Builder builder = new ScanSettings.Builder();
builder.setReportDelay(0);
builder.setScanMode(ScanSettings.SCAN_MODE_LOW_POWER);
return builder.build();
}
private ScanFilter getScanFilter(){
ScanFilter.Builder builder = new ScanFilter.Builder();
ByteBuffer manData = ByteBuffer.allocate(6); //The sensors only sends 6 bytes right now
ByteBuffer manMask = ByteBuffer.allocate(6);
manData.put(0, (byte)0x50);
manData.put(1, (byte)0x41);
manData.put(2, (byte)0x43);
manData.put(3, (byte)0x4b);
manData.put(4, (byte)0x45);
manData.put(5, (byte)0x54);
for(int i = 0; i < 6; i++){
manMask.put((byte)0x01);
}
builder.setManufacturerData(20545, manData.array(), manMask.array()); //Is this id correct?
return builder.build();
}
如果我不使用任何过滤器或设置,只有这个功能:
bluetoothLeScanner.startScan(scanCallback);
我收到我的BLE设备,所以我知道他们正在播放。我还可以打印制造商特定的数据,并可以看到它与我在过滤器中使用的6个字节相同。我不确定如果ID(在.setManufacturerData
函数的第一个参数)是正确的,因为这个我能找到的是从Android开发者页面下面的文本为ScanFilter.Builder:
"Note the first two bytes of the manufacturer Data is the manufacturerId"
的唯一信息。当我用这个代码,并尝试扫描设备后,我什么都没有。我在这里错过了什么?