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