2016-10-06 34 views
1

我正在使用我自己的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" 

的唯一信息。当我用这个代码,并尝试扫描设备后,我什么都没有。我在这里错过了什么?

回答

1

我设法让它工作。这是制造商ID是不正确的。这不是我从前两个字节得到的20545。相反,我发现,我能得到从ScanResult这个ID(当我使用过滤器)通过执行以下操作:

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功能放置。