使用 AltBeacon 作为 BLE 的包装器 Scanning/Connections

Using AltBeacon as a Wrapper For BLE Scanning/Connections

我的应用程序不使用信标(至少不是通常意义上的)。用例是持续后台扫描匹配特定格式的 BLE 外围设备,然后连接到这些外围设备和 transmit/receive 数据并断开连接(可能不止一次这样做)。

Bluetooth LE 在 Android 上的稳定性和可靠性还有待改进,尤其是在支持早期 API 版本(18+)的情况下,就像我一样。 AltBeacon 似乎是一个经验丰富的库,可以处理 Android 蓝牙 LE 管理中的许多奇怪的边缘情况和复杂问题(至少在扫描方面)。我想利用这个库来扫描和识别我的外围设备,然后自己连接到它们。有谁知道我怎样才能做到这一点?

虽然 Android 信标库确实不是为扫描蓝牙服务而设计的,但在某些情况下它可以方便地用于此目的。但是请注意,这样做违背了它的设计初衷,并迫使您进行一些非常丑陋的修改。如果这样的黑客让你的眼睛流血,那就不要再读下去了!对于那些能忍受它的人,这是你需要做的:

  • 设置将查找 GATT 服务 UUID 的信标解析器。您必须匹配服务 UUID 中的几个字节,而库的匹配器设计为一次只匹配几个字节。因此,如果您的 GATT 服务 UUID 为 00010203-0405-0607-0809-0a0b0c0d0e0f,则应取前三个字节:00,01,02 并将它们用作匹配表达式。因为匹配表达式具有不同的字节顺序,所以必须将字节的顺序颠倒为 02,01,00。所以你最终得到这样的代码:

    BeaconManager beaconManager = org.altbeacon.beacon.BeaconManager.getInstanceForApplication(this);
    beaconManager.getBeaconParsers().add(new BeaconParser().
            setBeaconLayout("m:0-2=020100,i:0-15l,p:15-15"));
    
  • 根据与您的完整 GATT 服务 UUID 匹配的区域开始测距。 (同样,您必须将 UUID 替换为您的服务的 UUID。):

    Region gattServiceRegion = new Region("gattServiceRegion",
            Identifier.parse("00010203-0405-0607-0809-0a0b0c0d0e0f"), null, null);
    beaconManager.setRangeNotifier(this);
    beaconManager.startRangingBeaconsInRegion(region);
    

现在,每次看到该 GATT 服务 UUID 的广告时,库都会回调您的 class' didRangeBeaconsInRegion 方法。所以您知道它就在附近,您可以获得图书馆的所有节能、后台启动和其他好处。现在的问题是库没有公开任何对调用 connectGatt(...) 所需的原始 BluetoothDevice 对象的引用。

因此,除非您修改库源代码,否则一旦您知道信标就在附近,您仍然必须使用原始扫描 API 来获取此引用。您必须决定使用库是否值得所有这些麻烦,因为无论如何您都必须使用原始扫描 API 来获取 BluetoothDevice 来建立连接。