我目前正在开发一款将使用蓝牙低功耗的应用程序(在Nexus 4上进行测试)。在开始使用Android 4.3中的官方BLE API之后,我注意到在我第一次连接设备后,我很少能够成功连接到该设备或与该设备或任何其他设备进行通信。
按照指南here,我可以成功连接到设备,扫描服务和特征,以及读取/写入/接收通知而不会出现任何问题。但是,在断开连接并重新连接后,我经常无法扫描服务/特性或无法完成读/写操作。我在日志中找不到任何内容来说明发生这种情况的原因。
一旦发生这种情况,我必须卸载应用程序,禁用蓝牙,然后重新启动手机才能重新开始工作。
每当设备断开连接时,我都要确保在BluetoothGatt对象上调用close()并将其设置为null。任何见解?
编辑:
日志转储:对于这些日志,我根据我的手机并在/etc/bluetooth/bt_stack.conf中提升了相关项目的跟踪级别
Successful connection - 重启手机并安装应用后首次尝试。我能够连接,发现所有服务/特性,以及读/写。
Failed Attempt 1 - 这是断开上述成功连接后的下一次尝试。我似乎能够发现特征,但是第一次尝试读取时返回了一个空值,并在此后很快断开连接。
Failed Attempt 2 - 我甚至无法发现服务/特征的例子。
编辑2:
我尝试连接的设备基于TI的CC2541芯片。我获得了TI SensorTag(也基于CC2541),并发现TI昨天为SensorTag发布了an android app。但是,这个应用程序有相同的问题。我在其他两个Nexus 4上测试了这个结果相同:连接到SensorTag第一次或第二次成功,但是(根据日志)无法之后发现服务,导致各种崩溃。我开始怀疑这个特定芯片是否存在问题?
答案 0 :(得分:175)
(由于Android操作系统更新,可能不再需要其中一些提示。)
android.bluetooth.BluetoothGatt#close()
onLeScan(..)
内开始一个新主题然后连接。原因:BluetoothDevice#connectGatt(Context context, boolean autoConnect, BluetoothGattCallback callback)
总是失败,如果在使用Android 4.3的三星Galaxy S3上的同一个线程中调用LeScanCallback() {...}.onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord)
(至少对于构建JSS15J.I9300XXUGMK6)android.bluetooth.BluetoothAdapter#startLeScan(UUID[] serviceUuids, LeScanCallback callback)
并使用参数来过滤某些服务UUID ,因为这在使用Android 4.3和{{3的三星Galaxy S3中完全被破坏了一般来说。新手的一个非常好的切入点可能是这个视频教程:为Android开发蓝牙智能应用程序due to the synchronous nature of the gatt implementation.
解决方法:我可以“稳定”我的应用程序......
这项工作基于以下经验......
答案 1 :(得分:15)
我也可以确认,关闭WIFI会使蓝牙4.0更稳定,特别是在谷歌Nexus上(我有一台Nexus 7)。
我正在开发的应用程序需要 WIFI 和连续蓝牙LE扫描。所以关闭WIFI对我来说是不可取的。
此外我已经意识到持续蓝牙LE扫描实际上可以<强烈>杀死WIFI连接并使 WIFI适配器无法重新连接任何WIFI网络,直到BLE扫描开启。 (我不确定移动网络和移动互联网) 这肯定发生在以下设备上:
然而,使用WIFI进行BLE扫描似乎非常稳定:
我扫描BLE 短时间 3-4秒然后我关闭扫描3-4秒。然后再次开启。
services
或characteristics
失败时也重置了BLE。答案 2 :(得分:6)
确保您的Nexus已与设备配对。我无法验证通信是否正常工作,但您可以在不重启的情况下连接多次。似乎第一个连接不需要配对,但所有后续尝试都需要。
我会在几天内测试服务发现和gatt读写请求而不重新启动时更新此答案。
编辑: 事实证明我正在测试一个开发固件版本(我们的传感器),如果没有配对就会导致问题。我们最新的生产固件版本在2540s和2541s上运行良好。
编辑: 我注意到在Nexus 7 2013上,当WiFi关闭时,连接更加稳定。我想知道这是否有助于其他任何人。
编辑: 我好像已经配对了它。没有配对时一切正常。配对后,我遇到与OP完全相同的症状。目前还不知道这是否与我们的固件或Android BLE API有关。测试时要小心,因为一旦配对,由于此post的3b中解释的错误,您可能无法取消配对。
答案 3 :(得分:4)
在某些型号中存在缺陷: https://code.google.com/p/android/issues/detail?id=180440
另一方面,在我的情况下问题是,我的连接没有在onDestroy方法中正确关闭。正确关闭后,对我来说问题不存在,无论wifi打开还是关闭。
btGatt.disconnect();
btGatt.close();
答案 4 :(得分:0)
我面临着类似的问题。我的解决方法是
Product
&断开连接后通话关闭。