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

时间:2017-06-13 12:40:16

标签: android bluetooth-lowenergy bluetooth-gatt

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

2 个答案:

答案 0 :(得分:3)

Android的BLE系统如此混乱。我已经看到了你所描述的内容,除了更糟糕的情况 - 你从Android断开连接的地方,但是它与你的外围设备保持着持久的连接。

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

如果你有这种能力,我强烈建议你给外围设备添加一个断开连接特性,这样你就可以通过写断线请求来实际断开连接,并让外围设备强行断开连接 - 然后Android就会把它连接起来。

我看到的好处是它始终有效(因为Android总是选择'硬'断开连接,而'软'断开请求可能会导致某些手机出现问题)。通常情况下,“好”手机不会出现这种行为(特别是棉花糖和棉花糖),但是在那些KitKat时代......就哇....

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

答案 1 :(得分:0)

当您致电"断开()"您只断开客户端对象(BluetoothGatt对象)。您可以将多个BluetoothGatt对象连接到同一物理设备。多个应用程序也可以将自己的BluetoothGatt对象连接到同一设备。

一旦打电话"断开()"请求在系统中的蓝牙堆栈中处理,然后在应用程序完成处理请求后立即调用应用程序中的onConnectionStateChange回调。但是,在所有其他客户端断开连接之前,它不会断开链接。较新版本的Android也会延迟物理断开几秒钟(不确定原因)。此外,一旦断开请求被发送到蓝牙控制器,实际断开可能需要一些时间,因为远程设备需要确认断开(或超时)。默认超时为20秒,直到最近在最新的Android版本中更改为5秒。