Android BLE GATT 断开连接与设备断开连接
Android BLE GATT Disconnected vs. Device Disconnected
我正在开发一个与自定义蓝牙设备通信的 Android 应用程序。调用 BluetoothGatt.Disconnect()
后,我看到调用了 OnConnectionStateChange
回调,并且新状态为 Disconnected
,但是,发生这种情况的时间与设备本身的时间之间似乎存在延迟实际上断开连接。例如,如果我用已连接的设备调用 BluetoothManager.GetConnectionState(...),它仍然 returns 已连接。有时在 GetConnectionState
returns Disconnected
之前需要几个 秒 。这是正常的吗?有没有可能是我在我的应用程序中做错了什么导致了这种情况?例如从非 UI 踏板断开连接,或类似的东西?或者,是否有可能是物理蓝牙设备本身没有正确处理断开连接,可能没有及时完成断开连接事件?
当您调用 "disconnect()" 时,您只会断开您的客户端对象(BluetoothGatt 对象)。您可以将多个 BluetoothGatt 对象连接到同一物理设备。多个应用程序也可以将自己的 BluetoothGatt 对象连接到同一设备。
只要您调用 "disconnect()",请求就会在系统的蓝牙堆栈中得到处理,并且在完成请求处理后立即在您的应用程序中调用 onConnectionStateChange 回调。但是,在所有其他客户端断开连接之前,它不会断开 link。 Android 的较新版本也会延迟几秒钟的物理断开连接(不确定为什么)。此外,一旦断开连接请求已发送到蓝牙控制器,实际断开连接可能需要一些时间,因为远程设备需要确认断开连接(或超时)。默认超时为 20 秒,最近在最新 Android 版本中更改为 5 秒。
Android的BLE系统太乱了。我已经看到了你所描述的内容,除了更糟糕的是 - 你与 Android 断开连接的地方,但在引擎盖下它与你的外围设备保持持久连接。
通常需要 30 秒才能最终断开连接,有时需要几分钟!一切都取决于您当时使用的 phone。
如果你有能力,我强烈建议给外设添加一个断开连接的特性,这样你就可以通过写一个断开请求来真正断开连接,让外设强制断开连接——然后Android会选择顶起来。
我看到的好处是它总是有效(因为 'hard' 断开连接总是由 Android 接收,而 'soft' 断开连接请求可能会导致一些问题某些 phones)。通常 'good' phone 不会表现出这种行为(尤其是 Marshmallow 等),但在那些 KitKat 时代....哇....
另一个好处...如果您正在使用 iOS,您可以更快地扫描或重新连接到断开连接的外围设备。
我正在开发一个与自定义蓝牙设备通信的 Android 应用程序。调用 BluetoothGatt.Disconnect()
后,我看到调用了 OnConnectionStateChange
回调,并且新状态为 Disconnected
,但是,发生这种情况的时间与设备本身的时间之间似乎存在延迟实际上断开连接。例如,如果我用已连接的设备调用 BluetoothManager.GetConnectionState(...),它仍然 returns 已连接。有时在 GetConnectionState
returns Disconnected
之前需要几个 秒 。这是正常的吗?有没有可能是我在我的应用程序中做错了什么导致了这种情况?例如从非 UI 踏板断开连接,或类似的东西?或者,是否有可能是物理蓝牙设备本身没有正确处理断开连接,可能没有及时完成断开连接事件?
当您调用 "disconnect()" 时,您只会断开您的客户端对象(BluetoothGatt 对象)。您可以将多个 BluetoothGatt 对象连接到同一物理设备。多个应用程序也可以将自己的 BluetoothGatt 对象连接到同一设备。
只要您调用 "disconnect()",请求就会在系统的蓝牙堆栈中得到处理,并且在完成请求处理后立即在您的应用程序中调用 onConnectionStateChange 回调。但是,在所有其他客户端断开连接之前,它不会断开 link。 Android 的较新版本也会延迟几秒钟的物理断开连接(不确定为什么)。此外,一旦断开连接请求已发送到蓝牙控制器,实际断开连接可能需要一些时间,因为远程设备需要确认断开连接(或超时)。默认超时为 20 秒,最近在最新 Android 版本中更改为 5 秒。
Android的BLE系统太乱了。我已经看到了你所描述的内容,除了更糟糕的是 - 你与 Android 断开连接的地方,但在引擎盖下它与你的外围设备保持持久连接。
通常需要 30 秒才能最终断开连接,有时需要几分钟!一切都取决于您当时使用的 phone。
如果你有能力,我强烈建议给外设添加一个断开连接的特性,这样你就可以通过写一个断开请求来真正断开连接,让外设强制断开连接——然后Android会选择顶起来。
我看到的好处是它总是有效(因为 'hard' 断开连接总是由 Android 接收,而 'soft' 断开连接请求可能会导致一些问题某些 phones)。通常 'good' phone 不会表现出这种行为(尤其是 Marshmallow 等),但在那些 KitKat 时代....哇....
另一个好处...如果您正在使用 iOS,您可以更快地扫描或重新连接到断开连接的外围设备。