Altbeacon 2.16.1 无法扫描具有特定信标类型代码的信标

Altbeacon 2.16.1 can't scan beacons with specific beacon type code

我正在构建一个 Android 应用程序,它使用 android-beacon-library 扫描两种类型的信标:

我知道有一个问题修复了损坏的三星屏幕关闭扫描 https://github.com/AltBeacon/android-beacon-library/pull/798
该修复已在 2.15.3 版本中实施。
从那时起,在每次使用 >= Android 8.0 的三星设备进行扫描时,我都没有看到任何自定义信标,但我确实收到了 iBeacon 等其他信标类型。所以我还在使用 2.15.2 版本。

这是我的自定义信标布局:

"m:0-1=4106,i:2-3,i:4-4,i:5-6,i:7-8,i:9-10,i:11-11,i:12-12,i:13-13,i:14-14,i:15-15,i:16-16,i:17-17,i:18-23,p:24-24"  

我检查了库中的代码,我可以看到一个仅适用于三星设备的过滤器:

if (Build.MANUFACTURER.equalsIgnoreCase("samsung")) {
  // On the Samsung Galaxy Note 8.1, scans are blocked with screen off when the
  // scan filter is empty (wildcard).  We do a more detailed filter on Samsung only
  // because it might block detections of AltBeacon packets with non-standard
  // manufacturer codes.  See #769 for details.
  filters = new ScanFilterUtils().createScanFiltersForBeaconParsers( 
  mBeaconManager.getBeaconParsers());
}

如果我删除这段代码,一切都会如我所料。

有什么我必须做的,这样我就不需要编辑库了吗?

谢谢。

当应用程序处于后台时,该库使用 BLE 制造商 ID 和信标类型代码来匹配 BLE 过滤器。为此,您必须完全正确地设置它们,否则过滤器将不匹配。

这里有两个问题:

  1. 您的信标类型代码不应包含 BLE 制造商 ID。使用 0x0215 而不是 0x4c000215(注意:0x4c00 是 Apple BLE 制造商 ID,将单独应用。)如果使用信标布局字符串,您必须调整字节偏移量以解决这个问题,因此您的布局以 m:2-3=0215

  2. 对于将与这些过滤器匹配的任何信标布局,您必须设置硬件辅助制造商标识符。默认情况下,该库包含所有其他制造商信标类型的 0x0118(AltBeacon 的 Radius Networks)和 0x0215(Apple 的 iBeacon)。对于使用另一个制造商代码的任何自定义信标(请参阅此处的列表:https://www.bluetooth.com/specifications/assigned-numbers/company-identifiers),您必须像这样添加它(硬件制造商 ID 0x1234 显示的示例):

    beaconParser.setHardwareAssistManufacturerCodes(new int[]{0x1234});

重要提示:移动设备的蓝牙硬件过滤器插槽数量有限。您可以通过以下方式帮助确保您 运行 不在其中:

  1. 只注册所需数量的信标布局。如果不使用默认的 AltBeacon 布局,请调用 beaconManager.getBeaconParsers().clear(); 将其删除。

  2. 仅在每个 BeaconParser 中注册您需要的确切硬件制造商代码。如果您注册了多个,您将使用多个过滤器插槽。

以上 API 是在三星限制实施之前设计的,这使得这个问题更加严重。我对如何使这个 API 更直观的其他想法持开放态度,这样其他人就不会 运行 遇到与您一样的问题。