Android BLE GATT断开连接与设备断开连接

问题描述:

我正在研究与自定义蓝牙设备通信的Android应用程序。在调用BluetoothGatt.Disconnect()后,我看到OnConnectionStateChange回调被调用,并且新状态为Disconnected,但是,在发生这种情况和设备本身实际上断开连接之间似乎存在延迟。例如,如果我使用已连接的设备调用BluetoothManager.GetConnectionState(...),它仍会返回已连接。有时在GetConnectionState返回Disconnected之前需要几秒。这是正常的吗?是否有可能在我的应用程序中做错了可能导致此问题的错误?例如脱离非UI界面或类似的东西?或者,物理蓝牙设备本身是否可能无法正确处理断开连接,并可能无法及时完成断开连接事件?Android BLE GATT断开连接与设备断开连接

当你调用“disconnect()”时,你只能断开你的客户端对象(BluetoothGatt对象)。您可以将多个BluetoothGatt对象连接到同一个物理设备。多个应用程序也可以拥有连接到同一设备的自己的BluetoothGatt对象。

一旦你调用“disconnect()”,系统中的蓝牙堆栈会处理该请求,并且它立即在应用程序完成处理请求时调用onConnectionStateChange回调函数。但是,直到所有其他客户端断开连接之后,它才会断开连接。较新版本的Android也会延迟物理断开几秒钟(不知道为什么)。而且,一旦断开请求已经发送到蓝牙控制器,由于远程设备需要确认断开连接(或超时),实际断开可能需要一些时间。默认超时时间为20秒,直到最近Android版本中最近更改为5秒。

+0

感谢您的澄清。你知道当设备实际断开连接时是否可以得到回调事件吗? – PICyourBrain

+0

只需使用注册广播接收器来收听https://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#ACTION_ACL_DISCONNECTED。 – Emil

Android的BLE系统非常混乱。我已经看到您所描述的内容,除了更糟 - 您从Android断开连接的位置,但仍然保持与外设的持续连接。

通常需要30秒钟才能断开,有时需要几分钟!全部取决于您当时使用的手机。

如果您有能力,我强烈建议为外设添加断开连接特性,以便通过写入断开连接请求实际断开连接,并让外设强制断开连接 - 然后Android会将其取出。我看到的好处是它总是有效(因为'硬'断开总是被Android拿走,而'软'断开连接请求会在某些手机上引起一些问题)。典型的“好”的手机不出现此行为(尤其是棉花糖和),但早在那些日子奇巧....哇....

另一个好处...如果你使用的是iOS,您可以更快地扫描或重新连接断开的外围设备。