【问题标题】:Android detect Bluetooth disconnect immediately Max 2 secondsAndroid 立即检测到蓝牙断开连接最长 2 秒
【发布时间】:2014-03-05 14:19:24
【问题描述】:

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

  1. 有什么方法可以在 2 秒内获得通知。
  2. 我使用了 BroadcatReceiver,但它的速度不够快,无法在 2 秒内获得警报(Max),所以有没有其他方法可以快速获得蓝牙断开连接的通知。
  3. 我使用这个 createRfcommSocketToServiceRecord(UUID);连接配对设备,我一定会使用 UUID 使用它。

我已经访问了很多关于这个问题的链接,但没有一个符合我的需求。这就是为什么任何帮助都将不胜感激的原因。

谢谢。

【问题讨论】:

  • 有这方面的消息吗?你能找到解决办法吗?
  • 还没有,但如果我找到什么肯定会发布答案!
  • 我认为唯一的方法就是以某种方式发送 ping 和获取 pong 消息。只有在设备有电池的情况下才会出现问题,而不是连续发送/接收会很快耗尽电池。

标签: android bluetooth broadcastreceiver rfcomm


【解决方案1】:

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

蓝牙是一种基于套接字的流协议,旨在通过不可靠的介质(即无线电)工作,因此必须容忍数据包中的错误(或丢失)。出于这个原因,您的蓝牙堆栈需要 2 秒多的时间才能宣布它已放弃并断开设备,正如您所发现的那样。

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

14 年 6 月 20 日更新

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

【讨论】:

  • 嗯!但如何?与此相关的代码示例或教程链接会很有帮助@Trevor
  • 感谢@trevor 的回复,但问题是!连接的另一端,无法回复或提供确认!这就是我有问题的原因!
  • @Hamad 这就是实施心跳机制的建议。如果您的应用没有收到来自硬件蓝牙设备的心跳响应(这意味着它超出范围或已关闭),那么您将继续设备断开连接并在应用端显示断开连接警报。
  • @Trevor 在我对检查应用程序和设备之间连接性的心跳机制的看法中,应用程序(手机)和蓝牙硬件设备上的电池消耗似乎也很大。你这么认为吗?
【解决方案2】:

什么都没有解决! 我有两件事要完成我的工作。

  1. 我需要检查我的蓝牙套接字是否未使用(发送接收)直到 2 到 5 秒我断开连接,当用户想要向接收设备发送数据时我再次连接。

  2. 或者我会在 2 到 5 秒后尝试连接套接字,如果它没有准备好连接意味着它已经连接,否则它将被连接并刷新之前的套接字引用。

但第一个选项更有价值,可以完美解决我的问题。

【讨论】:

    【解决方案3】:

    这是旧蓝牙和硬件多于软件的问题。

    如果您想注意到连接已断开,您需要进行轮询(心跳),例如“你还活着吗?你还活着吗?”......这对电池不利,所以......用户会最后卸载你的应用。

    我建议您更改为 BTLE(低功耗蓝牙),Nexus 5 等设备具有此功能。 使用 BTLE,您有一个接近配置文件,可以告诉您信号的质量,因此,您可以猜测距离(近、远、超出范围),因此您还可以判断设备是否断开连接。

    另一个不错的点是,如果设备超出范围但有一个设备再次在范围内,您也可能会被注意到,因此这对于应用程序通过接近打开门等非常有用。

    检查这个: https://developer.bluetooth.org/TechnologyOverview/Pages/PXP.aspx

    另一方面,Apple 发明了 iBeacons 的概念,即具有距离感知能力的设备,好在还有一个适用于 Android 的 iBeacons 实现: http://developer.radiusnetworks.com/ibeacon/android/

    【讨论】:

    • Verdas 的问题不在于距离!问题是连接意外丢失!就像硬件没电或没电了!那么我想快速通知连接丢失!
    • 你好,距离是用RSSI计算的,它实际上告诉了信号的质量。让我说 RSSI=0 是信号丢失,然后我们可以判断设备超出范围(由于距离或丢失电池)。所有充当 Gatt 服务器的 BTLE 设备都提供了 RSSI 值,因此该解决方案是所有 BTLE 设备的标准配置。
    • 我不是只为支持 BTLE 的设备开发应用程序,而是为所有最便宜到最高收入的设备构建应用程序。
    • 就是我说的,这是硬件问题。这是导致普通蓝牙失败的原因之一(电池消耗过多)。以前人们只通过 SMS 发送消息,而现在每个人都使用 Whatsapp、gtalk 等。对我来说这是同样的情况。无论如何,如果这不符合您的需求,请忽略它,但我已经解决了同样的问题,最后决定只为 BTLE 开发。无论如何,我希望这对您有所帮助。
    • 感谢您的帮助!但问题是硬件比应用更重要。
    猜你喜欢
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    相关资源
    最近更新 更多