[英]How can I customize Android BLE (Bluetooth Low Energy) gatt transfer speed?
我正在构建一个使用 BLE 技术传输图像的应用程序。 图像不需要立即传输,因此在阅读了一些文档后,我得出结论,1-3 Mbit/s 是一个合理的选择。
(From Wikipedia)
Distance/Range <100 m (<330 ft)
Over the air data rate 125 kbit/s – 1 Mbit/s – 2 Mbit/s
Application throughput 0.27-1.37 Mbit/s [38]
然而,使用 BLE 进行的实际测试显示传输速率非常慢。 (几乎 100 字节/秒)我正在测试,
为了提高传输速率,我使用以下代码将缓冲区大小从默认值更改为 500 字节。
gatt.requestMtu(CommonConstants.FILE_BUFFER_SIZE);
@Override
public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {
Log.e("ERROR", "stats=>" + String.valueOf(status));
Log.e("INFO", "CONNECTED");
Log.i("ERROR", "Connected to GATT server.");
Log.i("ERROR", "Attempting to start service discovery:" + gatt.discoverServices());
}
但是,更改最大传输单位并没有改变数据传输的速率。
当我将有效负载长度硬编码为20 个字节并且传输 1MB 的文件花费了太长时间时,我遇到了同样的问题。 所以,我读到了MTU
MTU(最大传输单元) :MTU 指定在单个写操作中可以发送的最大字节数。
仅仅请求MTU不会加快传输时间。 requestMtu()将简单地返回在设备上写入时可以发送到其他设备的最大字节数。
要加快进程,您需要更新要发送到连接设备上的有效负载。
假设您当前的字节以100 字节/秒的速度发送:
总字节数:5000 字节
有效载荷长度:100 字节
1次写操作:100字节/秒
总写入操作为:5000/100 = 50 秒
现在假设从设备请求MTU值后,它是250字节,所以再次:
总字节数:5000 字节
有效载荷长度:250 字节
1次写操作:250字节/秒
总写入操作将是:5000/250 = 20 秒// 看到时间现在减少了。
那么,如何实现这一目标:
1:连接设备
2:请求MTU值(最大512,它会返回设备支持的MTU值。大多数情况下是251,但只是为了信息3字节用于内部目的,所以最大大小为MTU-3 )
3:使用此MTU值创建有效负载
4:做写操作
具有短连接间隔的大 MTU 通常会提供最佳性能。 如果两个设备都支持 LE 数据长度扩展和 2 Mbit/s PHY,那么您将把性能提高到最大值。
请参阅https://www.novelbits.io/bluetooth-5-speed-maximum-throughput/ 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.