我正在寻找一种方法来检测蓝牙设备在断开连接后立即断开连接(最长2秒),通常是在"设备太远"或设备电池耗尽的情况下。目前,我可以通过获得BluetoothDevice.ACTION_ACL_DISCONNECTED
来用BroadcastReceiver
检测它,但发射大约需要16到20秒。
- 有没有办法在2秒内得到通知
- 我使用了BroadcastReceiver,但它的速度不够快,无法在2秒内获得警报,所以有没有其他方法可以快速获得蓝牙断开的通知
- 我使用这个createRfcommSocketToServiceRecord(UUID);连接一个配对的设备,我将使用UUID使用它
我已经访问了很多关于这个问题的链接,但没有人符合我的需求。这就是为什么任何帮助都将不胜感激。
谢谢。
我认为,您能够快速(在两秒内)可靠地检测到连接丢失的唯一方法是通过您在蓝牙连接上使用的自己的应用程序协议。例如,您的应用程序协议可能实现每500毫秒发生一次的心跳。如果你在两秒内没有看到心跳,那么你可以触发自己的事件。
蓝牙是一种基于套接字的流协议,设计用于在不可靠的介质(即无线电)上工作,因此必须容忍数据包中的错误(或丢失)。因此,正如您所发现的,在蓝牙堆栈宣布放弃并断开设备之前,需要2秒钟以上的时间。
我在Play上有一个应用程序,旨在通过蓝牙与汽车ECU进行通信,我的断开感测策略正是我在第一段中建议的。
2014年6月20日更新
我在你的慷慨评论和下面的评论中看到,你要求提供一个代码示例,但我很难在不了解你在套接字连接上运行的应用程序协议的情况下提供一个。或者换一种说法,我的第一段(即心跳建议)到底是什么,你不理解或无法为自己创建代码?使用心跳的概念其实很简单。您可以在应用程序协议中定义表示心跳消息的特定消息类型。连接的一端周期性地发送这个心跳消息,比如每隔一秒。连接的另一端每隔一秒左右检查是否收到此心跳消息,并在两秒超时后断开连接。再具体不过了,因为我看不到您现有的代码,也不知道您当前通过套接字交换的是什么类型的消息。
什么都不解决!我有两件事要做。
-
我需要检查我的蓝牙插座是否未使用(发送-接收),直到2到5秒我断开连接,当用户想向接收器设备发送数据时,我会再次连接。
-
或者,我会在2到5秒后尝试连接套接字,这样,如果它还没有准备好连接,就意味着它已经连接,否则它将被连接,我会刷新以前的套接字引用。
但第一个选项对于完美解决我的问题更有价值。
这是旧蓝牙的问题,硬件多于软件。
如果你想注意到连接断开,你需要进行轮询(心跳),比如"你还活着吗?你还活着?"。。。这对电池不好,所以…用户最终会卸载你的应用程序。
我建议你改为BTLE(蓝牙低能耗),像Nexus 5这样的设备有这个功能。使用BTLE,您有一个接近度配置文件,可以告诉您信号的质量,因此,您可以猜测距离(近、远、超范围),因此您还可以判断设备是否断开连接。
另一个好的方面是,如果设备超出了范围,但其中一个又在范围内,你也可能会被注意到,所以这对应用程序来说真的很好,例如通过附近的方式打开门。
检查此项:https://developer.bluetooth.org/TechnologyOverview/Pages/PXP.aspx
另一方面,苹果发明了iBeacons的概念,即具有距离感知功能的设备,好的是,安卓系统也实现了iBeacon:http://developer.radiusnetworks.com/ibeacon/android/