java - Java 中的 Raspberry pi 3 蓝牙 : my BufferedReader hangs when receiving lots of data

标签 java android bluetooth arm

我在我的 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。

我尝试更改 BufferedReadersBufferedWriters 以直接操作 OutputStreamInputStream,但问题仍然存在。

在发送部分添加 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/

相关文章:

android - 即使使用 android :inputType ="textPassword",EditTextPreference 也不会屏蔽密码

android - 如何将android设备连接到具有特定SSID的wifi

java - 将行插入数据库后 JTable 不更新

java - 两个单独的错误

java - 有没有办法根据包中的所有 java 源文件生成哈希值,然后在运行时在日志消息中使用该值?

android - 当互联网连接从关闭切换到打开时,Firebase 推送通知不起作用

android - 如何在蓝牙设备列表中显示图像而不是蓝牙设备名称。?

iphone - 如何使用蓝牙将设备与 nfc 芯片(twinlinx mymax nfc 芯片)连接

javascript - Web 应用程序有没有办法从支持蓝牙的硬件读取实时数据?如果没有,有哪些替代方案?

java - 查找二维数组中数字的位置