Android 蓝牙低功耗 (BLE) API 尚未准备好迎接黄金时段

Posted

技术标签:

【中文标题】Android 蓝牙低功耗 (BLE) API 尚未准备好迎接黄金时段【英文标题】:Android Bluetooth Low Energy (BLE) API Not Ready for Prime Time 【发布时间】:2014-01-21 23:46:58 【问题描述】:

我正在开发一款支持两个 BLE 传感器(心率、步幅)的健身应用。我最终得到了两个有界服务(每个传感器一个),由我的主要活动调用和限制。这是在带有 KitKat 的 Nexus 7 II 上运行的。我花了几天时间试图让应用程序进入稳定状态。 Gatt 连接和通知在干净重启后立即正常工作。我遇到的问题是在一个或两个设备断开连接并需要重新连接后使事情恢复到工作状态。由于其他人报告了类似的问题,我已经开发并测试了各种场景,包括在重新启动活动时保持服务和连接继续,关闭连接和服务器然后重新开始,只关闭而不断开连接,等待之前重新连接等。目前,使用一个传感器,我可以让应用程序在大多数情况下重新连接。使用两个传感器,大部分时间都不会重新建立连接。考虑到每周都有很多新的 BLE 设备,android BLE API 如此脆弱,真是太可惜了。我想知道是否有其他人对多个 BLE 传感器很幸运,他们是否愿意分享他们的方法来让它工作。

【问题讨论】:

不幸的是,从我(相对较小的)BLE 经验来看,我只能回应您的挫败感。整个框架似乎非常不稳定。 我建议重写此代码以淡化咆哮(标题,倒数第二句)并更多地关注不起作用的代码(源代码,相关的 LogCat 条目等)。 我处于同样的境地,自八月以来一直在尝试不同的事情。使系统进入必须重新启动的状态非常容易。有时打开和关闭蓝牙会有所帮助,但并非总是如此。我可以让它进入关闭失败并在 10 秒后恢复的状态......我建议戳各种相关的 Android 错误报告。 忘了说有时它可以完美运行,尤其是在重新启动后。我使用 HR 和自行车速度和踏频,但用户也将其与自行车动力相结合。不确定是否有人同时拥有 3 台设备,但有两个设备无法从随机状态可靠地启动。例如该框架存在严重错误。 这正是我的观察。我可以在重新启动后让事情正常工作,但是一旦设备断开连接或尝试重新连接,系统就会变得不稳定。我从没想过我会在应用程序的这一部分上花这么多钱。另一个烦人的事情是来自 API 的 logcat 消息没有意义,有时 onConnectionStateChanged 我得到一个没有记录的值(0x85)。我计划在这篇帖子link 中探讨 Lo-Tan 的建议。如果我发现任何有用的东西会报告。 【参考方案1】:

这不是一个非常有问题的问题,但您的评论表明知道 0x85 的含义会有所帮助。 Android BLE API 取自三星的第二个 BLE API,但并非三星​​定义的所有常量都能通过。

0x85 = 133(您也可以在日志中看到)是 GATT_ERROR。基本上这意味着出现了问题,可能是外围设备超出了设备的范围,或者蓝牙芯片出了问题。我发现在 onConnectionStateChange 中调用 BluetoothGatt 上的 connect() 是一个不错的解决方案,因为它会等待事情得到整理并尽可能连接。

0x8D = 141 GATT_ALREADY_OPEN 这个非常不言自明。

要注意的另一件事是确保蓝牙发生的任何事情都是按顺序发生的。多个线程在前一个操作的结果发生之前向 BluetoothGatt 发送命令往往不是一件好事。

【讨论】:

以上是关于Android 蓝牙低功耗 (BLE) API 尚未准备好迎接黄金时段的主要内容,如果未能解决你的问题,请参考以下文章

Android-低功耗蓝牙(BLE)-客户端(主机/中心设备)和服务端(从机/外围设备)

Android ble (蓝牙低功耗) 中的坑和技巧

Android 低功耗蓝牙(Ble) 开发总结

Android 低功耗蓝牙 (BLE) 环回

Android 低功耗Ble 蓝牙4.0多连接 开源框架

Android低功耗蓝牙(蓝牙4.0)——BLE开发(上)