Я работаю с собственными устройствами BLE. При прослушивании после этих устройств я хотел бы использовать ScanFilter
, поэтому я получаю только интересующие меня устройства. Мое решение прямо сейчас заключается в фильтрации внутри обратного вызова, но было бы лучше, если бы эта фильтрация могла произойти раньше и в соответствии со спецификацией должно быть возможным. Я пытаюсь фильтровать данные производителя, но я не могу заставить его работать. Это мой код:Как фильтровать данные производителя при использовании BluetoothLeScanner для 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, поэтому я знаю, что они правильно транслируются. Я также могу распечатать конкретные данные производителя и увидеть, что это шесть одинаковых байтов, которые я использую в своем фильтре. Я не уверен, если идентификатор (первый параметр в функции .setManufacturerData
) является правильным, потому что единственной информацией об этом я смог найти из следующего текста из андроида страницы разработчика для ScanFilter.Builder:
"Note the first two bytes of the manufacturer Data is the manufacturerId"
Когда я использую это кода и попробуйте сканировать после устройств, которые я ничего не получаю. Что мне здесь не хватает?