【发布时间】:2019-03-31 21:41:15
【问题描述】:
我正在编写一个应用程序,当应用程序在前台和后台时扫描蓝牙信标。我已经弄清楚了前台部分,但我不知道如何处理后台部分,尤其是在 android 8.0 及更高版本中,系统不允许应用在后台运行超过 15 分钟。
应用程序需要扫描信标并获取它们的 mac 地址和 UUID。此外,它应该得到扫描响应,因为那里有一些我需要解码和保存的信息。我已经使用指南here 来实现使用BluetoothLeScanner 的前景扫描。至于背景,我尝试将扫描模式更改为 LOW_POWER,但操作系统在大约 15 分钟后终止了该应用程序。请注意,我不想要一个持续通知的前台服务,我可以接受每隔约 15 分钟运行一次的扫描。
许多人建议使用 Android Beacon Library,但我找不到我们使用的 Beacon 类型所需的 beaconLayout,Kontakt Beacon Pro BP16-3,因此 Beacon Library 无法检测到它们。
我需要的信标信息包括唯一 ID 和电池百分比。有关它们在扫描响应中位置的详细信息,请参阅 [此处] (https://support.kontakt.io/hc/en-gb/articles/206294004-How-to-check-the-battery-level-on-your-beacons)。
如果能帮助我编写代码以在后台搜索可在 6.0 及更高版本的任何 Android 版本上运行的信标,或者帮助我将信标库与我上面提到的信标一起使用,我将不胜感激。
编辑:来自扫描响应的唯一 ID 和蓝牙
当我使用 BLEScanner 扫描信标时,我可以使用 ScanResult::getScanRecord() 来获取 scanRecord 对象。然后,我使用 getServiceData() 方法得到一个字节数组,它的前 4 个字节代表 ASCII 中的唯一 ID,接下来的两个字节是 ASCII 中的固件版本,最后一个字节是十六进制的电池百分比。我什至通过官方 Kontakt 应用确认了电池电量,所以我确信它是正确的。
当我使用 Beacon 库时,我找不到一种简单的方法来获取扫描响应的解析版本。相反,我必须使用 NonBeaconLeScanCallback 来获取字节数组。然后,字节数组原来是
[2, 1, 6, 26, -1, 76, 0, 2, 21, -9, -126, 109, -90, 79, -94, 78, -104, -128, 36, -68, 91, 113, -32, -119, 62, -91, 68, 124, 56, -77, 8, 9, 75, 111, 110, 116, 97, 107, 116, 2, 10, -12, 10, 22, 13, -48, 68, 106, 69, 77, 52, 50, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0].
似乎索引 46-49 中的字节表示 ASCII 中的唯一 ID,在本例中为“DjEM”。此外,索引 52 处的字节是电池百分比,十进制;在这种情况下,它是 68。
似乎通过使用 BLE 扫描仪,我可以在解析唯一 ID 和电池方面省去很多麻烦。但是,可靠地实现后台扫描会困难得多。因此,有没有办法将两者中最好的结合起来,并让培根库来解析唯一 ID 和电池百分比?
EDIT2:无法识别我的信标时的信标库消息
即使我同时使用 iBeacon 和 EddyStone 信标布局,信标库仍然无法检测到我的信标。它在 logcat 中打印以下内容:
processing pdu type 16: 0201060d166afe0206010a64f456425a4d08094b6f6e74616b74000000000000000000000000000000000000000000000000000000000000000000000000 with startIndex: 5, endIndex: 16
This is not a matching Beacon advertisement. (Was expecting 02 15. The bytes I see are: 0201060d166afe0206010a64f456425a4d08094b6f6e74616b74000000000000000000000000000000000000000000000000000000000000000000000000
Ignoring pdu type 01
提前致谢。
【问题讨论】:
-
您的时间安排是否灵活?如果是,那么您可以尝试 WorkManager 和 PeriodicWorkRequest 之类的东西。即使应用程序未处于活动状态,它们也可以保证运行,如果您将间隔设置为 15 分钟,那么它将在 15 分钟左右触发。
-
@Ryujin ble 扫描器将能够扫描每个信标或仅扫描与过滤器匹配的信标。换句话说,如果我给一个完整或空的扫描过滤器,它会在后台运行时扫描每个 ble 设备吗?谢谢。
-
我认为将 null 传递给 scanfilter 可以做到这一点。但这已经与您的主要问题不同了。
-
@Ryujin 这是相关的,因为如果 PeriodicWorkRequest 允许我在后台扫描任何信标,那么这就回答了我的问题。另外,我可以在任何 Android 操作系统版本上使用 PeriodicWorkRequest 吗?
-
WorkManager 是一个通用的后台作业 API,它不仅适用于 BLE。它一直被移植回 API 级别 14。请参阅 - developer.android.com/topic/libraries/architecture/workmanager
标签: android bluetooth-lowenergy ibeacon android-bluetooth ibeacon-android