Android无法处理断开连接超时

Android无法处理断开连接超时,android,bluetooth-lowenergy,Android,Bluetooth Lowenergy,引用博客帖子之类的,等等问题之类的。我将假设这是一种一般行为(而不是我这边的bug)。常见的答案似乎是:“更改BLE固件,使其主动断开连接。” 没有得到很好解决的问题是Android应用程序如何处理一个非常常见的事件?由于“范围”,即无线电信号强度,连接意外中断 有没有一种方法可以让应用程序在失去连接时“立即”得到通知 所有的应用程序都在那里等待20秒,这被称为核心操作系统超时值,这似乎是不现实的。即使我在iOS上的应用程序在不到1秒的时间内就知道连接丢失,我们都应该这么做吗 例1 BLE设备的

引用博客帖子之类的,等等问题之类的。我将假设这是一种一般行为(而不是我这边的bug)。常见的答案似乎是:“更改BLE固件,使其主动断开连接。”

没有得到很好解决的问题是Android应用程序如何处理一个非常常见的事件?由于“范围”,即无线电信号强度,连接意外中断

有没有一种方法可以让应用程序在失去连接时“立即”得到通知

所有的应用程序都在那里等待20秒,这被称为核心操作系统超时值,这似乎是不现实的。即使我在iOS上的应用程序在不到1秒的时间内就知道连接丢失,我们都应该这么做吗

例1 BLE设备的一种常见类型是“查找我的密钥”类型。它们中的许多都有一个功能,当您无意中离开“钥匙”时,可以提醒用户。我假设这使用连接下降作为你走得太远的指标。对吧?

例2 您的应用程序应该会收到设备特性值变化的通知。这将是任何类型的传感器数据,例如,您有一些阈值正在被跨越。我可以想出很多例子,你会想立即知道你的“传感器”超出了范围

已知的变通办法 我见过一种解决办法,就是不断监控BLE设备的RSSI,但这似乎会消耗大量电池。类似地,任何写入特征的失败(通常成功)也可以被使用,同样电池寿命也要付出代价


对于这个问题,一些接近最终答案的东西似乎是一个很好的资源。

在最新版本的Android中,他们将默认超时时间降低到了5秒,这当然要好得多

我想大多数外设都会发送自己的连接更新请求,在那里他们可以设置不同的超时值,这就解决了这个问题(除了连接设置和连接更新之间的很短时间)

在我看来,所谓的“超出范围”的探测器应用程序毫无用处,而且很难修复,因为BLE设备有时可能会暂时断开连接,即使它们在范围内


对于您的实际问题,如果有可能“立即”收到连接丢失的通知,基本答案是否定的,因为蓝牙控制器不会向主cpu发送任何数据包丢失的信息(这就是超时的全部目的,因此允许您丢失数据包)。但是你当然可以尝试轮询rssi或设置一个流,在该流中,外围设备每隔一个固定的间隔发送一个通知,然后你可以在应用程序中检测一段时间后是否没有收到通知。但是在这种情况下,使用连接参数更新过程设置自己的超时(从外围设备)更为明智。

我可以理解为什么通常会有“长”超时。而钥匙发现者可能是一个坏例子。我的应用程序已设置为接收来自BLE设备的值更改通知。如果我超出范围,我需要告诉用户这一点,以便他们知道他们将无法接收这些值更改。