【问题标题】:android bluetooth RFCOMM data transfer rate is too slowandroid蓝牙RFCOMM数据传输速度太慢
【发布时间】:2019-02-05 04:18:05
【问题描述】:

我正在开发一个android app 来接收来自其他硬件设备的big file(大约4M)。设备以1382400 bps 发送数据,但我的android 程序只接收400K。数据读取代码在一个独立的线程中,除了从InputStream 读取数据并计算读取的字节数之外什么都不做。这是我的代码 sn-p:

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

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

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

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

【问题讨论】:

  • HC-06 的当前波特率是多少?请参阅第 9 章中的注释。sgbotic.com/products/datasheets/wireless/hc06_datasheet.pdf 中的 AT 命令集。通常在蓝牙、UART、USB和RS232等串行通信中,source和sink必须以相同的速度工作。
  • 我确定 HC-06 已设置为正确的波特率。如果波特率不正确,所有数据都将不正确,但在我的情况下,第一个 2K 数据包是完整且正确的,如果发送方休眠而不更改波特率,则所有数据都会正确接收。

标签: android bluetooth


【解决方案1】:

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

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

【讨论】:

  • 如果我评论日志没有区别。我计算传输结束后的总字节数。
猜你喜欢
  • 2022-11-02
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
相关资源
最近更新 更多