【发布时间】: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;
}
我做了很多实验试图找出问题所在:
- 以上代码运行在不同的Android手机上(从
android 6.0到android 8.0),当发送方发送4M数据时,可以收到400K ~ 500K的数据。显然,90% 的数据在传输过程中会丢失。 - 如果发送方设备发送一个小文件,不超过
2K,同样的速率,android可以完全接收。它在第一个2K数据包之后开始丢失数据。 - 如果发送者保持相同的
baudrate(1382400),但在每次1K传输后休眠50ms,android也能完整接收整个4M文件。 - 我使用安卓原生蓝牙共享功能将
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 数据包是完整且正确的,如果发送方休眠而不更改波特率,则所有数据都会正确接收。