2016-10-06 1 views
1

Я работаю с собственными устройствами 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" 

Когда я использую это кода и попробуйте сканировать после устройств, которые я ничего не получаю. Что мне здесь не хватает?

ответ

1

Мне удается заставить его работать. Это был неправильный производитель. Это было не 20545, которые я получил из первых двух байтов. Вместо этого я узнал, что я мог бы получить этот идентификатор из ScanResult (когда я не использовал фильтр), выполнив следующие действия:

ScanRecord scanRecord = scanResult.getScanRecord(); 
SparseArray<byte[]> manufacturerData = scanRecord.getManufacturerSpecificData(); 
for(int i = 0; i < manufacturerData .size(); i++){ 
    int manufacturerId = manufacturerData.keyAt(i); 
} 

Делая это, я получил правильный manufacturerId, что я тогда мог поместить в функции bleScanner.startScan.

Смежные вопросы