【问题标题】:Why does Android Bluetooth stop receiving bytes after a few minutes?为什么 Android 蓝牙在几分钟后停止接收字节?
【发布时间】:2018-04-24 18:11:52
【问题描述】:

我在保持蓝牙连接(从 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),但这不是同一个问题。我已经添加了一个每 1 秒传输一次的保持活动传出字符,我的问题仍然存在。
  • 我不是在询问特定于我的应用程序的问题; SO 上的至少一个其他用户遇到了这个问题。
  • 我已详细查看了 Android 蓝牙文档,但看不出有什么明显的原因会发生这种情况。
  • 我不是在征求意见;我要求客观回答为什么停止接收字节。

【问题讨论】:

    标签: android bluetooth disconnected unreliable-connection


    【解决方案1】:

    好的,我对此有部分答案。首先,多一点背景知识:

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

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

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

    【讨论】:

    • 你应该一次改变一件事情来找出哪支枪在冒烟,否则你永远不会知道哪个改变让事情变得更好。感谢您自己找到解决方案,但我理解关闭的需要
    猜你喜欢
    • 2012-10-12
    • 2019-02-21
    • 2014-08-13
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 2010-09-13
    • 2019-04-09
    相关资源
    最近更新 更多