我在我的 Raspberry Pi 3 上用 Java 编写了一个简单的程序。它的作用基本上是在电视上播放动画和声音,并且它收到的用于知道要播放什么的输入是由 Android 平板电脑使用蓝牙发送的。
在平板电脑方面,我有一些 slider (例如:音量),每当它们发生变化时,它们都会通过蓝牙发送数据。平板电脑充当服务器,代码如下所示:
final BluetoothSocket clientSocket = bluetoothServerSocket.accept();
InputStream is = clientSocket.getInputStream();
OutputStream os = clientSocket.getOutputStream();
bufIn = new BufferedReader( new InputStreamReader( is ) );
bufOut = new BufferedWriter( new OutputStreamWriter( os ) );
每当我想发送数据时,我都会在另一个线程中执行以下操作:
bufOut.write("<message>blabla</message>");
bufOut.flush();
但是,如果我快速移动 slider ,程序会在 bufOut.flush();
处停止。我对此的想法是,RPi 上套接字的另一端已满,导致平板电脑无法发送更多数据。
因此,在 RPi 上,我使用 bluecove 库,我的代码如下所示:
connection = (StreamConnection) Connector.open(serviceInDevice);
is = connection.openInputStream();
os = connection.openOutputStream();
bufIn = new BufferedReader(new InputStreamReader(is));
bufOut = new BufferedWriter(new OutputStreamWriter(os));
为了接收数据,我在另一个线程上执行以下操作:
while(true) {
String readLine = bufIn.readLine();
//Process data...
}
这里,在 slider 疯狂之后,当平板电脑卡在其 flush()
函数上时,程序卡在 readLine()
上。
我试图测试 bufIn 的状态,一旦它似乎卡住了,使用另一个线程并执行 System.out.println(bufIn.ready()) ,但线程也卡在这条线上。
我还尝试通过调用 is.available()
异步测试 inputStream is
的状态,但返回值始终为 0。
我尝试更改 BufferedReaders
和 BufferedWriters
以直接操作 OutputStream
和 InputStream
,但问题仍然存在。
在发送部分添加 sleep 以避免过度发送不是一个选择,因为我还必须将音频数据发送到 RPi 以及基本上很多东西。
RPi 上的蓝牙是否存在已知问题,或者我遗漏了什么?
谢谢
最佳答案
好的,我已经找到树莓派蓝牙死机的原因了。答案可能对其他人没有太大帮助,但我正在使用 VNC 在我的计算机上查看树莓派的输出,一旦我停止使用 VNC,问题就消失了。因此,如果有人想知道,不建议在 RPi 上同时使用 VNC 和蓝牙 :p
关于java - Java 中的 Raspberry pi 3 蓝牙 : my BufferedReader hangs when receiving lots of data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43756470/