我正在构建一个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"
我检查了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());
}
如果我删除此代码,一切都会按预期进行。
我需要做些什么,所以我不需要编辑库吗?
谢谢。
答案 0 :(得分:0)
当应用程序在后台运行时,该库使用BLE制造商ID和信标类型代码来匹配BLE过滤器。为此,您必须将它们设置正确,否则过滤器将不匹配。
这里有两个问题:
您的信标类型代码不应包含BLE制造商ID。而不是0x4c000215,请使用0x0215(注意:0x4c00是Apple BLE制造商ID,将单独应用。)如果与此配合使用信标布局字符串,则必须调整字节偏移以解决此问题,因此布局以m开头: 2-3 = 0215
对于将与这些过滤器匹配的任何信标布局,必须设置硬件辅助制造商标识符。默认情况下,该库包括所有其他制造商信标类型的0x0118(用于AltBeacon的Radus Networks)和0x0215(用于iBeacon的Apple)。对于使用另一个制造商代码的任何自定义信标(请参见此处的列表:https://www.bluetooth.com/specifications/assigned-numbers/company-identifiers),您必须像这样添加它(示例显示为硬件制造商ID 0x1234):
beaconParser.setHardwareAssistManufacturerCodes(new int[]{0x1234});
重要提示:移动设备的蓝牙硬件过滤器插槽数量有限。您可以通过以下方法帮助确保您不会用完它们:
仅注册所需数量的信标布局。如果未使用默认的AltBeacon布局,请调用beaconManager.getBeaconParsers().clear();
将其删除。
仅向每个BeaconParser注册所需的确切硬件制造商代码。如果您注册多个,则将使用多个过滤器插槽。
上述API是在三星限制生效之前设计的,这使问题更加严重。对于如何使该API更加直观,我持开放态度,这样其他人就不会遇到与您相同的问题。