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

时间:2018-04-24 18:11:52

标签: android bluetooth disconnected unreliable-connection

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

场景是:

  1. 设备已成功配对。
  2. 设备在1-7分钟之间传输到Android(因设备或Android版本而异)。
  3. 虽然设备仍在传输,但Android停止接收字节。
  4. 所以:为什么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
    • 我使用名为Serial Bluetooth Terminal的应用程序进行了测试。此应用遇到同样的问题;只要我测试过,连接就是稳定的。因此,此问题可能是由我的应用程序代码中的某些内容引起的。
    • 我看到各种对Android BT问题的回应,指导用户使用异步流而不是轮询接收到的字节。这似乎是一个红鲱鱼;如果你认为线程模型在这种情况下引起了问题,请清楚地描述为什么切换到异步会解决这个问题。

    我想先发制人地解决可能会关闭此问题的原因:

    • 这不重复。关于BT连接丢失的问题还有其他问题(即Real-time Bluetooth SPP data streaming on Android only works for 5 seconds),但这不是同一个问题。我已经添加了每1秒传输的保持活跃的传出字符,我的问题仍然存在。
    • 我不是在问我的申请特有的问题; SO上至少有一个其他用户遇到过这个问题。
    • 我详细阅读了Android蓝牙文档,我看不出有任何明显的原因发生。
    • 我不是在征求意见;我要求客观回答为什么字节停止接收。

1 个答案:

答案 0 :(得分:1)

好的,我对此有一个部分答案。首先,更多背景:

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

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

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