Android BLE GATT 断开与设备断开

Posted

技术标签:

【中文标题】Android BLE GATT 断开与设备断开【英文标题】:Android BLE GATT Disconnected vs. Device Disconnected 【发布时间】:2017-06-13 12:40:16 【问题描述】:

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

【问题讨论】:

【参考方案1】:

Android 的 BLE 系统太乱了。我已经看到了您所描述的内容,但更糟糕的是 - 您与 Android 断开连接,但在后台它与您的外围设备保持持久连接。

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

如果您有能力,我强烈建议您向外围设备添加断开连接特性,以便您通过编写断开连接请求并让外围设备强制断开连接来真正断开连接 - 然后 Android 将接手。

我看到的好处是它始终有效(因为“硬”断开连接总是被 Android 接收,而“软”断开连接请求可能会导致某些手机出现一些问题)。通常,“好”手机不会表现出这种行为(尤其是 Marshmallow 等),但在 KitKat 时代……哇……

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

感谢您的澄清。你知道当设备实际断开连接时是否可以得到回调事件? 只需注册一个广播接收器即可收听developer.android.com/reference/android/bluetooth/…。

以上是关于Android BLE GATT 断开与设备断开的主要内容,如果未能解决你的问题,请参考以下文章

Android BLE Gatt 连接更改状态

设备与 GATT 服务器断开连接

Android BLE 外围设备与状态码 BLE_HCI_INSTANT_PASSED(0x28) 断开连接

一起Talk Android吧(第二百九十七回:Android中的BLE开发:断开设备连接)

Android ble 设备有时不会断开连接

Android 8.1 连接到调用 connectGatt 的 BLE 外围设备。回调总是说断开连接。从不连接