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

时间:2019-03-07 15:08:21

标签: android bluetooth-lowenergy beacon altbeacon

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

  • iBeacon类型(0x4c000215)
  • 信标类型代码为0x4106的自定义信标

我知道有一个问题修复了三星断断续续的扫描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"  

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

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());
}

如果我删除此代码,一切都会按预期进行。

我需要做些什么,所以我不需要编辑库吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

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

这里有两个问题:

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

  2. 对于将与这些过滤器匹配的任何信标布局,必须设置硬件辅助制造商标识符。默认情况下,该库包括所有其他制造商信标类型的0x0118(用于AltBeacon的Radus Networks)和0x0215(用于iBeacon的Apple)。对于使用另一个制造商代码的任何自定义信标(请参见此处的列表: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更加直观,我持开放态度,这样其他人就不会遇到与您相同的问题。