Android检测蓝牙立即断开最多2秒

Ham*_*mad 16 android bluetooth broadcastreceiver rfcomm

我正在寻找一种方法来检测蓝牙设备发生后立即断开(最多2秒),通常在"设备太远"的情况下或设备电池耗尽.目前我可以BroadcastReceiver通过获取a 来检测它BluetoothDevice.ACTION_ACL_DISCONNECTED,但需要大约16到20秒才能触发.

  1. 有没有办法在2秒内收到通知.
  2. 我使用的是BroadcatReceiver,但速度不足以在2秒内获得警报Max,所以还有其他任何一种方法可以快速获得蓝牙断开连接的通知.
  3. 我用这个createRfcommSocketToServiceRecord(UUID); 连接配对设备,我必须使用UUID使用它.

我已经访问了很多关于这个问题的链接,但是没有人符合我的需求.这就是为什么任何帮助都会受到赞赏的原因.

谢谢.

Tre*_*vor 5

我认为您可以可靠地快速(两秒内)感知连接丢失的唯一方法是通过您自己的通过蓝牙连接使用的应用程序协议。例如,您的应用程序协议可能实现每 500 毫秒发生一次的心跳。如果您在两秒内没有看到心跳,那么您可以触发自己的事件。

蓝牙是一种基于套接字的流协议,设计用于在不可靠的介质(即无线电)上工作,因此必须容忍数据包中的错误(或丢失)。因此,正如您所发现的,在您的蓝牙堆栈声明它已放弃并断开设备连接之前,需要花费超过 2 秒的时间。

我在 Play 上有一个应用程序,旨在通过蓝牙与汽车 ECU 通信,我的检测断开连接的策略与我在第一段中建议的完全一样。

14年6月20日更新

我在您的赏金评论和下面的评论中看到您要求提供代码示例,但在不了解您在套接字连接上运行的应用程序协议的情况下,我很难提供代码示例。或者换句话说,我的第一段(即心跳建议)到底是什么让您不理解或无法为自己创建代码?使用心跳的概念确实非常简单。您可以在应用程序协议中定义代表心跳消息的特定消息类型。连接的一端定期(例如每秒)发送此心跳消息。连接的另一端检查是否每秒收到此心跳消息,并在两秒超时后断开连接。不可能比这更具体了,因为我看不到您现有的代码,也不知道您当前正在通过套接字交换哪种消息。