我目前正在开发一个使用蓝牙低功耗的应用程序(在 Nexus 4 上测试)。在开始使用 Android 4.3 中的官方 BLE API 后,我注意到在我第一次连接设备后,我很少能够再次成功连接/通信该设备或任何其他设备。
按照此处的指南,我可以成功连接到设备、扫描服务和特征以及读/写/接收通知,而不会出现任何问题。但是,断开连接并重新连接后,我经常无法扫描服务/特征或无法完成读/写。我在日志中找不到任何内容来说明为什么会发生这种情况。
一旦发生这种情况,我必须卸载应用程序,禁用蓝牙,然后重新启动手机,然后它才能再次开始工作。
每当设备断开连接时,我都会确保在 BluetoothGatt 对象上调用 close() 并将其设置为 null。有什么见解吗?
编辑: 日志转储:对于这些日志,我将手机植根并提高了 /etc/bluetooth/bt_stack.conf 中相关项目的跟踪级别
成功连接- 重新启动手机并安装应用程序后首次尝试。我能够连接、发现所有服务/特征以及读/写。
失败的尝试 1 - 这是从上述成功连接断开后的下一次尝试。似乎我能够发现特征,但第一次尝试读取返回了一个空值,此后很快就断开了连接。
失败的尝试 2 - 我什至无法发现服务/特征的示例。
编辑 2: 我尝试连接的设备基于 TI 的 CC2541 芯片。我获得了一个TI SensorTag(也是基于 CC2541)来玩,发现 TI昨天发布了一个用于 SensorTag的 android 应用程序。但是,这个应用程序也有 同样的问题。 我在另外两台 Nexus 4 上对此进行了测试,结果相同:第一次或第二次连接到 SensorTag 成功,但(根据日志)此后未能发现服务,导致各种崩溃。我开始怀疑这个特定芯片是否有问题?
(也许由于 Android 操作系统更新,其中一些提示不再需要。)
android.bluetooth.BluetoothGatt#close()
onLeScan(..)
BluetoothDevice#connectGatt(Context context, boolean autoConnect, BluetoothGattCallback callback)
LeScanCallback() {...}.onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord)
android.bluetooth.BluetoothAdapter#startLeScan(UUID[] serviceUuids, LeScanCallback callback)
解决方法:我可以“稳定”我的应用程序这样做......
这项工作是基于以下经验......