安卓蓝牙低功耗(BLE)API尚未准备就绪

3
我正在开发一款健身应用程序,支持两个BLE传感器(心率,步幅)。我最终使用了两个有边界的服务(每个传感器一个),并由我的主要活动进行绑定。这运行在Nexus 7 II上,使用KitKat系统。我花了几天时间尝试让应用程序处于稳定状态。Gatt连接和通知在清洁启动后都能正常工作。我面临的问题是在一个或两个设备断开连接并需要重新连接后,将事物恢复到工作状态。由于其他人报告了类似的问题,因此我开发并测试了各种场景,包括在重新启动活动时保持服务和连接,关闭连接和服务器然后重新开始,仅关闭而不断开连接,在重新连接之前等待等。目前,对于一个传感器,大多数时候我可以使应用程序重新连接。对于两个传感器,连接大多数时候无法重新建立。很遗憾,考虑到每周都有许多新的BLE设备,Android BLE API如此脆弱。我想知道是否有其他人在多个BLE传感器方面取得了成功,并且他们是否愿意分享他们的方法以使其工作。

不幸的是,从我(相对较少的)与BLE的经验来看,我只能回应您的沮丧。整个框架似乎非常不稳定。 - Kevin Coppock
3
建议重新表达以减少抱怨的语气(标题、倒数第二句话),更关注代码无法正常工作的问题(源代码、相关的LogCat条目等)。 - CommonsWare
我也处于同样的情况,自从八月以来一直在尝试不同的方法。让系统陷入必须重新启动的状态非常容易。有时候打开和关闭蓝牙会有帮助,但并非总是如此。我曾经遇到打开失败的情况,然后它在10秒钟后又自动开启了...我建议查看各种相关的Android bug报告。 - Ifor
忘了说有时它完美地工作,特别是在重新启动后。我使用心率和自行车速度和踏频,但用户也将自行车功率混合在一起。不确定是否有人同时使用3个设备,但两个设备可以工作,只是不能从随机状态可靠地启动。例如,该框架存在严重的错误。 - Ifor
这正是我的观察结果。我可以在重新启动后使事情正常工作,但只要一个设备断开连接或尝试重新连接,系统就变得不稳定。我从未想过我会在应用程序的这一部分上花费如此多的时间。另一个令人烦恼的事情是API的logcat消息毫无意义,有时在onConnectionStateChanged中我会得到一个未记录的值(0x85)。我计划探索Lo-Tan在此帖子[链接]中的建议。如果我发现任何有用的东西,我会报告的。 - Jason Porter
来自 Lo-Tan 的有趣内容。我个人的所有测试都是使用 Nexus4 进行的,但我已经遇到了很多麻烦。从用户那里得到的印象是,在 S4 和 S3 设备上情况会更好(但并不完美)。 - Ifor
1个回答

3

虽然这不是一个非常问题性的问题,但您的评论表明了解0x85的含义会有所帮助。 Android BLE API 是从三星的第二个BLE API中提取的,但并非所有三星定义的常量都被移植过来。

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

0x8D = 141 GATT_ALREADY_OPEN 这个很容易理解。

另一个需要注意的是确保任何与蓝牙相关的操作都是顺序进行的。多个线程在前一个操作的结果发生之前向BluetoothGatt发送命令通常不是一个好主意。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接