为什么 Android 蓝牙会在几分钟后停止接收字节?
Why does Android Bluetooth stop receiving bytes after a few minutes?
我无法维持蓝牙连接(从 Android 到我正在开发的设备)超过几分钟。
场景是:
- 设备配对成功。
- 设备向 Android 传输 1-7 分钟(因设备或可能 Android 版本而异)。
- Android 尽管设备仍在传输,但已停止接收字节。
所以:为什么AndroidBT停止接收?
这非常类似于bboydflo对这个问题的回答中描述的issue/observation:
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 蓝牙文档,但我看不出任何明显的原因。
- 我不是征求意见;我要求 objective 回答为什么停止接收字节。
好的,我对这个有部分答案。首先,更多背景知识:
- 我是 运行 BT 流轮询线程,该线程每 2 秒执行一次可运行
- 用于读取流的缓冲区长度为 1024 个元素
我怀疑这可能是 space 中的某个后台缓冲区 运行。因此,我将 2s 更改为 500ms,将 1024 长度更改为 10024。现在,我已经进行了大约 20 分钟的连接,没有任何问题(而且还在继续)。
如果能找到确凿的证据就好了。我最初认为 stream.Available() 足以判断缓冲区是否已满,但在这种情况下,当 Android 设备停止接收时,stream.Available() 实际上返回 0 .所以我不太确定要检查哪个队列来证明这个问题与缓冲区已满有关。
我无法维持蓝牙连接(从 Android 到我正在开发的设备)超过几分钟。
场景是:
- 设备配对成功。
- 设备向 Android 传输 1-7 分钟(因设备或可能 Android 版本而异)。
- Android 尽管设备仍在传输,但已停止接收字节。
所以:为什么AndroidBT停止接收?
这非常类似于bboydflo对这个问题的回答中描述的issue/observation: 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 蓝牙文档,但我看不出任何明显的原因。
- 我不是征求意见;我要求 objective 回答为什么停止接收字节。
好的,我对这个有部分答案。首先,更多背景知识:
- 我是 运行 BT 流轮询线程,该线程每 2 秒执行一次可运行
- 用于读取流的缓冲区长度为 1024 个元素
我怀疑这可能是 space 中的某个后台缓冲区 运行。因此,我将 2s 更改为 500ms,将 1024 长度更改为 10024。现在,我已经进行了大约 20 分钟的连接,没有任何问题(而且还在继续)。
如果能找到确凿的证据就好了。我最初认为 stream.Available() 足以判断缓冲区是否已满,但在这种情况下,当 Android 设备停止接收时,stream.Available() 实际上返回 0 .所以我不太确定要检查哪个队列来证明这个问题与缓冲区已满有关。