【问题标题】:Why do I only get one beacon even when using multiple BLE filters?为什么即使使用多个 BLE 过滤器也只能获得一个信标?
【发布时间】:2022-05-13 09:25:12
【问题描述】:

我想从 2 个 BLE 设备接收信标。我知道他们的蓝牙地址。我创建了一个过滤器列表,如下所示:

private List<ScanFilter> filters = new ArrayList<ScanFilter>(); // Global in actual code

ScanFilter filter1 = new ScanFilter.Builder()
    .setDeviceAddress(bluetoothAddress1).build();

ScanFilter filter2 = new ScanFilter.Builder()
    .setDeviceAddress(bluetoothAddress2).build();

filters.add(filter1);
            
filters.add(filter2);

并调用它

mLEScanner.startScan(filters, settings, mScanCallback);

(设置和回调已在别处定义并正常工作)。

如果我打印过滤器列表,我可以看到我的两个过滤器,因此我知道它们在那里。如果我注释掉其中一个过滤器,我将仅正确接收来自另一个信标的数据包(无论我注释掉哪个过滤器都是如此)。但是,如果我不注释两个过滤器,那么我只会收到来自第二个设备的数据包。

为什么使用过滤器扫描只会给我来自一台设备的数据包,而不是来自多个设备的数据包?

【问题讨论】:

    标签: android filter bluetooth bluetooth-lowenergy beacon


    【解决方案1】:

    当您添加多个扫描过滤器时,它们将作为 AND 条件而不是 OR 条件应用。这意味着必须同时满足 ALL 扫描过滤器才能产生匹配。由于每个蓝牙设备都有一个唯一的 MAC 地址,因此一次只能匹配一个过滤器。

    如果两者都应用,您将永远不会得到任何结果。虽然我没有看到任何文档来确认这一点,但我怀疑设备地址过滤器是一个特殊情况,因此一次只能激活一个,而最近应用的过滤器处于活动状态。

    【讨论】:

      【解决方案2】:

      我认为你应该把它放在一个方法中。 下面的代码对我有用:

      private List<ScanFilter> scanFilters() {
      
          List<ScanFilter> list = new ArrayList<ScanFilter>();
      
          ScanFilter scanFilterMAC00 = new ScanFilter.Builder().setDeviceAddress("The MAC Address of the device").build();
          ScanFilter scanFilterMAC01 = new ScanFilter.Builder().setDeviceAddress("The MAC Address of the device").build();
          ScanFilter scanFilterMAC02 = new ScanFilter.Builder().setDeviceAddress("The MAC Address of the device").build();
          ScanFilter scanFilterMAC03 = new ScanFilter.Builder().setDeviceAddress("The MAC Address of the device").build();
          ScanFilter scanFilterMAC04 = new ScanFilter.Builder().setDeviceAddress("The MAC Address of the device").build();
          ScanFilter scanFilterMAC05 = new ScanFilter.Builder().setDeviceAddress("The MAC Address of the device").build();
          // and so on....
      
      
          list.add(scanFilterMAC00);
          list.add(scanFilterMAC01);
          list.add(scanFilterMAC02);
          list.add(scanFilterMAC03);
          list.add(scanFilterMAC04);
          list.add(scanFilterMAC05);
          // and so on.... When you finish, just return the list.
      
          return list;
      }
      

      然后,startScanning() 方法:

      public void startScanning() {
              ScanSettings settings = new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_POWER).build();
              btScanner = btAdapter.getBluetoothLeScanner();
      
              btScanner.startScan(scanFilters(), settings, scanCallback);
          }
      }
      

      btScanner是类BluetoothLeScanner的一个实例。

      就是这样。正如我所说,它对我来说很好,返回我添加到方法列表中的每个 MAC 地址。

      【讨论】:

        猜你喜欢
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多