android - 为什么 Android 蓝牙会在几分钟后停止接收字节?

标签 android bluetooth disconnected unreliable-connection

我无法维持蓝牙连接(从 Android 到我正在开发的设备)超过几分钟。

场景是:

  1. 设备已成功配对。
  2. 设备向 Android 传输大约 1-7 分钟(因设备或 Android 版本而异)。
  3. Android 停止接收字节,尽管设备仍在传输。

那么:Android BT为什么会停止接收?

这与 bboydflo 对这个问题的回答中描述的问题/观察结果非常相似: Application using bluetooth SPP profile not working after update from Android 4.2 to Android 4.3

更多背景:

  • 我正在使用的 BT 设备每秒一次不断地发出包含约 200 个字符的测量数据包。我确定问题发生时设备端仍在传输。
  • 此症状出现在我的两台 Android 设备上的应用程序中:一台 Android 5.0.1 Acer 平板电脑和一台 Android 7.1.1 Moto Play X
  • 我已经使用名为串行蓝牙终端的应用程序进行了测试。此应用不会遇到同样的问题;只要我测试过,连接就是稳定的。因此,这个问题可能是由我的应用程序代码中的某些内容引起的。
  • 我看到过各种针对 Android BT 问题的回复,这些回复指导用户使用异步流而不是轮询接收到的字节。这似乎是一条红鲱鱼;如果您认为线程模型在这种情况下引起了问题,请清楚地说明为什么切换到异步会解决此问题。

我想预先说明这个问题可能被关闭的原因:

  • 这不是重复的。关于 BT 连接下降(即 Real-time Bluetooth SPP data streaming on Android only works for 5 seconds)还有其他问题,但这不是同一个问题。我已经添加了一个每 1s 传输一次的 keep-alive 传出字符,但我的问题仍然存在。
  • 我问的不是针对我的申请的特定问题; SO 上至少有一个其他用户遇到了这个问题。
  • 我已经详细查看了 Android 蓝牙文档,但我看不出有任何明显的原因会导致这种情况发生。
  • 我不是征求意见;我要求客观回答为什么停止接收字节。

最佳答案

好的,我对这个有部分答案。首先,更多背景知识:

  • 我在一个每 2 秒执行一次可运行的线程上运行 BT 流轮询
  • 用于读取流的缓冲区长度为 1024 个元素

我怀疑这可能是某个后台缓冲区空间不足。因此,我将 2s 更改为 500ms,将 1024-length 更改为 10024。现在,我已经有大约 20 分钟的连接,没有任何问题(并且还在继续)。

如果能为此找到确凿的证据,那就太好了。我最初认为 stream.Available() 足以判断缓冲区是否已满,但在这种情况下,stream.Available() 实际上在 Android 设备停止接收时返回 0。所以我不太确定要检查哪个队列来证明此问题与缓冲区已满有关。

关于android - 为什么 Android 蓝牙会在几分钟后停止接收字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50008313/

相关文章:

asp.net-mvc - 在修改现有子 Entity Framework 的同时添加新子对象

c - 在线程中使用select()不会对操作系统主机断开连接使用react

android - 如何将 Activity 从下拉菜单中的通知放在前面?

android - 在 Android 上监听多个传感器并使用传感器值更新多个 TextView

ios - 如何订阅全局委托(delegate)事件?

Android Beacon Library 在一台 Android 4.4 设备上运行良好,但在另一台设备上运行不佳

android - 如何使用 android 从蓝牙耳机捕获关键事件

android - jar 不匹配!修复使用 appcompat_v7 和 Facebook sdk 时的依赖关系。

android - 小部件 setOnClickPendingIntent