android - Android 4.3蓝牙低功耗不稳定

我目前正在开发一个将使用蓝牙低能量的应用程序(在Nexus4上测试)。在开始使用Android 4.3中的官方BLE API之后,我注意到,在第一次连接设备之后,我很少能再次成功地连接到该设备或任何其他设备/与之通信。
按照指南,我可以成功地连接到设备、扫描服务和特征以及读/写/接收通知,而不会出现任何问题。但是,在断开连接并重新连接之后,我通常无法扫描服务/特性或无法完成读/写。我在日志中找不到任何东西来说明这是为什么发生的。
一旦发生这种情况,我必须卸载应用程序,禁用蓝牙,并重新启动手机,然后它才能重新开始工作。
每当一个设备断开连接时,我一定要调用bluetouthgatt对象的close()并将其设置为空。有什么见解吗?
编辑:
日志转储:对于这些日志,我在/etc/bluetooth/bt_stack.conf中建立了手机的根目录,并提高了相关项目的跟踪级别。
here-重新启动手机并安装应用程序后首次尝试。我能够连接、发现所有服务/特性以及读/写。
Successful connection-这是从上述成功连接断开后的下一次尝试。似乎我能够发现特征,但第一次尝试读取时返回了一个空值,很快就断开了连接。
Failed Attempt 1—一个我甚至无法发现服务/特性的示例。
编辑2:
我尝试连接的设备是基于TI的CC2541芯片。我获得了一个Failed Attempt 2(也基于cc2541)来玩,发现Ti昨天发布了传感器标签的TI SensorTag。但是,这个应用程序也有同样的问题。我在另外两个Nexus 4S上测试了这一点,结果相同:第一次或第二次连接到sensortag是成功的,但是(根据日志)之后没有发现服务,导致了各种各样的崩溃。我开始怀疑这是否是这个特定芯片的问题?


最佳答案:

重要的实施提示
(由于Android操作系统的更新,可能不再需要这些提示。)
一些设备,如Nexus4和Android 4.3take 45+ seconds to connect using an existing gatt instance。解决方法:总是在断开连接时关闭GATT实例,并在每个连接上创建一个新的GATT实例。
别忘了打电话给android.bluetooth.BluetoothGatt#close()
onLeScan(..)内启动一个新线程,然后连接。原因:BluetoothDevice#connectGatt(Context context, boolean autoConnect, BluetoothGattCallback callback)Always fails,if called insideLeScanCallback() {...}.onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord)in the same thread on Samsung Galaxy S3 with Android 4.3(至少对于build JSS15J.I9300XXUGMK6)
Most devices filter advertising
最好不要使用带参数的android.bluetooth.BluetoothAdapter#startLeScan(UUID[] serviceUuids, LeScanCallback callback)来过滤某些服务UUID,因为这在使用Android 4.3和doesn't work for 128bit UUIDs的三星Galaxy S3中是完全破坏的。
GATT总是可以一次处理一个命令。如果多个命令被一个接一个的短调用,则第一个命令将被取消due to the synchronous nature of the gatt implementation.
我经常看到,即使在安卓5的现代设备上,WiFi也会干扰蓝牙,反之亦然。最后,关闭WiFi以稳定蓝牙。
初学者教程
对于新来者来说,一个不错的入门点可以是这个视频教程:为Android开发蓝牙智能应用程序http://youtu.be/x1y4tEHDwk0
下面描述的问题和解决方法现在可能由操作系统更新解决。
解决方法:我可以“稳定”我的应用程序…
我为用户提供了一个设置“重启蓝牙”。如果启用了这个设置,我会在一些点上重新启动蓝牙,这些点指示BLE堆栈的开始变得不稳定。例如,如果startscan返回false。如果ServiceDiscovery失败,也可能是一个好问题。我只是把蓝牙关掉再打开。
我提供了另一个设置“关闭WiFi”。如果启用了该设置,则当应用程序运行时,我的应用程序将关闭WiFi(然后再将其打开)。
这项工作基于以下经验…
重新启动蓝牙有助于在大多数情况下解决BLE的问题
如果关闭WiFi,BLE堆栈会变得更加稳定。但是,它在大多数打开WiFi的设备上也可以正常工作。
如果关闭WiFi,重新启动蓝牙将完全恢复BLE堆栈,在大多数情况下无需重新启动设备。