首页 > 解决方案 > android蓝牙RFCOMM数据传输速率太慢

问题描述

我正在开发一个从其他硬件设备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. 上面的代码运行在不同的安卓手机上(from android 6.0to android 8.0),可以400K ~ 500K在发送方发送数据时接收4M数据。显然,90% 的数据在传输过程中会丢失。
  2. 如果发送方设备发送一个小文件,不超过2K相同的速率,android 能够完全接收。它在第一个数据包之后开始丢失数据2K
  3. 如果发送方保持不变,但每次传输后都baudrate(1382400)休眠,android 也能够完整接收整个文件。50ms1K4M
  4. 4M使用安卓原生蓝牙共享功能将文件从一部安卓手机传输到另一部安卓,大约30s不会丢失数据。

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

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

谁能给我一些关于如何获得高传输率的建议android?非常感谢。

标签: androidbluetooth

解决方案


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

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


推荐阅读