【问题标题】:How to search beacons using UUID using altbeacon android library?如何使用 altbeacon android 库使用 UUID 搜索信标?
【发布时间】:2018-07-30 18:33:12
【问题描述】:

alt 信标库提供了许多基于信标布局的示例。没有关于如何使用 uuid 查找信标的文档?

用代码试过了;

try {
    beaconManager.startMonitoringBeaconsInRegion(new Region("myMonitoringUniqueId", null, null, null));

    Identifier identifier = Identifier.parse("XXXXXXXX-XXXX-XXXXX-XXXX-XXXXXXXXXXXX"); //beacon 1
    beaconManager.startMonitoringBeaconsInRegion(new Region("identifier", identifier, null, null));
} catch (RemoteException e) {    }

它不起作用。但是使用本机 API 的等效方法可以正常工作。

List<ScanFilter> scanFilters = new ArrayList<>();
ParcelUuid uid = ParcelUuid.fromString(J_UUID);
ScanFilter filter = new ScanFilter.Builder().setServiceUuid(uid).build();
scanFilters.add(filter);

List<ScanFilter> filters = scanFilters;
BluetoothManager bluetoothManager =
                (BluetoothManager) getApplicationContext().getSystemService(Context.BLUETOOTH_SERVICE);
BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter();
Intent intent = new Intent(getApplicationContext(), MyBroadcastReceiver.class);
intent.putExtra("o-scan", true);
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
bluetoothAdapter.getBluetoothLeScanner().startScan(filters, settings, pendingIntent);

感谢您使用 alt 信标库实现相同的任何帮助,这样我就不必担心重复调度作业。

【问题讨论】:

    标签: android beacon altbeacon


    【解决方案1】:

    不要将 128 位蓝牙 GATT 服务 UUID 与信标的 Proximity UUID 混淆。 当表示为用破折号分隔的十六进制数字时,两者表面上看起来相似,并且具有相同的字节数,但两者在使用各种 API 的目的和方式上有着根本不同:

    Proximity UUID 是一个 BLE 信标概念。它是代表组织对信标的所有权的第一个信标标识符,通常用于过滤属于您的信标。它与 iBeacon 和 AltBeacon 格式一起使用(在 AltBeacon 中通常称为 ID1)。该字段在 BLE 制造商广告

    中编码

    GATT 服务 UUID 是一个较低级别的 BLE 概念,表示 BLE 外围设备执行的特定功能服务(例如心率监视器)。自定义服务通常使用编码在 GATT 服务广告 中的 128 位 GATT 服务 UUID 进行广告,这是与上述制造广告完全不同的 BLE 广告包类型。虽然这些服务广告包用于 Eddystone 信标,但 Eddystone 格式使用更短的 16 位 GATT 服务 UUID 来宣传自己,并且实际的信标标识符位于其数据有效负载内。

    问题中的第二个代码示例显示了如何使用 Android 的内置 BlE API 来查找宣传 128 位 GATT 服务 UUID 的设备。标准信标格式不使用此类结构,这就是为什么 Android 信标库无法轻松搜索这些数据包的原因。它是一个用于处理 BLE 信标的专用库,而不是更通用的 BLE 库。这就是为什么第一个代码示例不起作用的原因。

    标准信标格式不适用于 128 位 GATT 服务 UUID 有几个原因:

    1. 数据包的大小非常有限,128 位 GATT 服务 UUID 占用的空间非常大,剩下的空间非常少。
    2. 信标格式必须有一个前导字节模式,用于标识数据包使用该格式。如果 128 位 GATT 服务 UUID 用作信标标识符,则在此之前没有可用于识别信标格式的可配置前导码。

    一些使用标准格式(如 iBeacon、AltBeacon 或 Eddystone)的信标会交错多个广告,其中之一可能包含 128 位 GATT 服务 UUID,通常用于宣传用于配置信标的专有服务。如果您有执行此操作的硬件信标,请不要将此广告与实际的信标数据包混淆。此广告应仅用于访问专有配置服务。

    【讨论】:

    • 想知道我是否可以用它来扫描一般的BLE设备,这样就不用担心调度等问题了。谢谢你的澄清。
    • 你完全可以这样做,但它有点笨拙。您必须设置自定义信标格式(类似于 Eddystone-UID)以匹配服务 UUID 的开始。匹配表达式限制为 2 个字节,因此您必须使用信标格式来匹配服务 UUID 的前两个字节,然后将剩余字节放入标识符字段并监视与剩余字节匹配的区域服务 UUID
    • 感谢您的建议。代码的第二部分在除 S9 之外的许多 8.0 设备中都能正常工作。您是否遇到过类似的问题?
    • 虽然我在 S9 上毫无问题地测试了 Android 信标库,但我没有进行明确的测试来验证问题后半部分中显示的等效代码是否确实返回了结果。我不知道有问题,但没有去寻找它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 2017-10-05
    相关资源
    最近更新 更多