2016-10-06 26 views
1

私は自分のBLEデバイスで作業しています。これらのデバイスをリッスンするときはScanFilterを使用したいので、興味のあるデバイスのみを取得します。私の解決策はコールバック内でフィルタリングすることですが、このフィルタリングが先に起こり、仕様に従って可能でなければならない。私はメーカー固有のデータをフィルタリングしようとしていますが、動作させることができません。これは私のコードです:私はこれだけの機能を有する任意のフィルタや設定を使用しない場合はアンドロイド用BluetoothLeScannerを使用している場合、メーカーデータをフィルタリングする方法は?

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 bleScanner = bluetoothAdapter.getBluetoothLeScanner(); 
ScanFilter filter = getScanFilter(); 
List<ScanFilter> scanFilters = new ArrayList<>(); 
scanFilters.add(filter); 
ScanSettings scanSettings = getScanSettings(); 
bleScanner.startScan(scanFilters, scanSettings, scanCallback); 

これは、フィルタや設定を作成する機能である

bluetoothLeScanner.startScan(scanCallback); 

BLEデバイスを取得しているので、正しく配信されていることがわかります。私もメーカーの特定のデータを印刷することができ、それは私のフィルタで使用する6つの同じバイトであることがわかります。 ID(.setManufacturerData関数の最初のパラメータ)が正しければ、私はこれを使用すると、私は見つけることができる、これについてのみ情報がScanFilter.Builder:

"Note the first two bytes of the manufacturer Data is the manufacturerId" 

のためのAndroid開発者のページから次のテキストからだったので、私はわかりませんよ私は何も得られないデバイスの後にスキャンしようとします。私はここで何が欠けていますか?

答えて

1

私はそれを動作させることができます。それは正しい製造元ではありませんでした。私が最初の2バイトから得たのは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); 
} 

こうすることによって、私はその後、bleScanner.startScan機能に置くことができ、正しいmanufacturerIdを得ました。

関連する問題