【发布时间】:2020-03-10 03:13:13
【问题描述】:
我正在使用自己的 BLE 设备。在收听这些设备时,我想使用ScanFilter,所以我只得到我感兴趣的设备。我现在的解决方案是在回调内部进行过滤,但如果这种过滤可以更早发生并根据规范应该是可能的。我正在尝试过滤制造商的特定数据,但我无法让它工作。这是我的代码:
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 函数中的第一个参数)是否正确,因为我能找到的唯一信息来自ScanFilter.Builder: 的android 开发者页面中的以下文本
"Note the first two bytes of the manufacturer Data is the manufacturerId"
当我使用此代码并尝试在设备之后进行扫描时,我什么也得不到。我在这里错过了什么?
【问题讨论】:
-
只是检查-为了最有效地过滤制造商数据,掩码不应该将所有字节设置为
0xFF而不是0x01吗?还是我错过了什么?
标签: android bluetooth-lowenergy