使用AltBeacon作为BLE扫描/连接的包装器

时间:2016-03-28 23:06:02

标签: android bluetooth-lowenergy ibeacon-android altbeacon

我的应用程序不使用信标(至少不是通用意义)。用例是对符合特定格式的BLE外设进行连续后台扫描,然后连接到这些外设并发送/接收数据并断开连接(可能多次执行此操作)。

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

1 个答案:

答案 0 :(得分:2)

虽然Android Beacon Library确实不是为扫描蓝牙服务而设计的,但在某些情况下可以方便地实现此目的。然而,要预先警告,这样做违背了它的设计,并强迫你做一些非常丑陋的黑客攻击。如果这样的黑客让你的眼睛流血,那就不要再读了!对于那些能够忍受它的人来说,这就是你需要做的事情:

  • 设置一个寻找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替换为您的服务。):

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

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

因此,除非您修改库源代码,否则一旦您知道信标只是为了获得此引用,您仍然必须使用原始扫描API。你必须决定使用图书馆是否值得所有这些麻烦,因为你必须使用原始扫描API让BluetoothDevice建立连接。