Android的蓝牙RFCOMM数据传输速率太慢

时间:2019-01-30 10:45:38

标签: android bluetooth

我正在开发android app以便从其他硬件设备接收big file(约4M)。设备以1382400 bps发送数据,但我的Android程序仅接收400K。数据读取代码在一个独立的线程中,除了从InputStream中读取数据外,不执行任何操作,并对读取的字节计数。这是我的代码段:

try {
    socket = device.createRfcommSocketToServiceRecord(MY_UUID_SECURE);
    socket.connect();
    InputStream is = socket.getInputStream();
    byte[] buf = new byte[1024];
    int byteRead ;
    while ((byteRead = is.read(buf)) > 0) {
        totalBytes += byteRead;
        Log.v(LOG_TAG, "read byte:" + totalBytes);
    }
} catch (IOExcepiton e) {
    Log.e(LOG_TAG, "Connect to bluetooth device failed.", e);
    return null;
}

我已经做了很多实验来找出问题所在:

  1. 以上代码在不同的Android手机(从android 6.0android 8.0)上运行,当发送方发送400K ~ 500K数据时,它们可以接收4M数据。显然,传输过程中会丢失90%的数据。
  2. 如果发送方设备以相同的速率发送一个小文件(不超过2K),则android能够完全接收。在第一个2K数据包之后,它开始丢失数据。
  3. 如果发件人保留相同的baudrate(1382400),但在每次50ms传输后休眠1K,则android也能够完全接收整个4M文件。
  4. 我使用android原生蓝牙共享功能将4M文件从一台Android手机传输到另一台android,大约需要30s,而不会丢失数据。

第4位表示android原生支持高速率传输(> 1Mbps),但我无法在自己的代码中实现。 远程设备使用HC-06串行到bluetooth适配器,可以在here中找到该文档。该文档显示了适配器支持1.3M bps串行速率和空中bluetooth速率。

我在stackoverflow和google中搜索了很多文章,没有关于android bluetooth传输速率和较低级别buffer大小的更多信息。

有人可以给我一些有关如何在android中获得高传输率的建议吗?非常感谢。

1 个答案:

答案 0 :(得分:0)

请考虑使用缓冲流。逐字节读取并将其打印到日志消息的速度太慢了。这样,您可以将字节读取的速度绑定到调试输出的速度。

这个问题可能也重复到 Android Bluetooth Serial RFCOMM low baud rate / slow transmission