【问题标题】:Using AltBeacon as a Wrapper For BLE Scanning/Connections使用 AltBeacon 作为 BLE 扫描/连接的包装器
【发布时间】:2016-03-29 08:54:29
【问题描述】:
我的应用程序不使用信标(至少不是通常意义上的)。用例是持续在后台扫描匹配特定格式的 BLE 外设,然后连接到这些外设并发送/接收数据并断开连接(可能不止一次这样做)。
蓝牙 LE 在 Android 上的稳定性和可靠性还有待改进,尤其是在支持更早的 API 版本(18+)时,就像我一样。 AltBeacon 似乎是一个经验丰富的库,可以处理 Android 蓝牙 LE 管理中的许多奇怪的边缘情况和复杂性(至少在扫描方面)。我想利用这个库来扫描和识别我的外围设备,然后自己连接到它们。有谁知道我如何能够做到这一点?
【问题讨论】:
标签:
android
bluetooth-lowenergy
ibeacon-android
altbeacon
【解决方案1】:
虽然 Android Beacon 库确实不是为扫描蓝牙服务而设计的,但在某些情况下它可以方便地用于此目的。但是请注意,这样做违背了它的设计原则,并迫使你做一些非常丑陋的黑客行为。如果这样的黑客让你的眼睛流血,那就不要再读了!对于那些可以忍受的人,这是您需要做的:
-
设置将查找 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 的广告时,该库都会对您的类的 didRangeBeaconsInRegion 方法进行回调。所以你知道它就在附近,你可以获得图书馆的所有省电、后台启动和其他好处。现在的问题是该库没有公开对调用connectGatt(...) 所需的原始BluetoothDevice 对象的任何引用。
因此,除非您修改库源代码,否则一旦您知道信标就在附近,您仍然必须使用原始扫描 API 来获取此参考。您必须决定使用库是否值得所有这些麻烦,因为无论如何您都必须使用原始扫描 API 来获取 BluetoothDevice 进行连接。