BLE 文件传输:读取单个 GATT 特性作为瓶颈

问题描述 投票:0回答:1

我需要从支持仅蓝牙低功耗 (BLE) 的嵌入式设备读取文件(大小最多 100 KB)。阅读器是一个Android设备(minSDK 33)。

在 GATT 特性中,单个文件以数据块的形式“提供”。另一个特征包含文件大小(文件大小 > 0 表示有文件要读取)。为了请求下一个块,应用程序会写入另一个特征。

现在我遇到了一个瓶颈:单次读取(使用android BluetoothGatt.readCharacteristic)和读取回调(onCharacteristicRead)之间的时间始终> 80毫秒。

这限制了最大带宽,因为我每秒最多可以执行 12.5 次读取。即使我每次读取 509 字节,我也会卡在 6.300 字节/秒。这没有考虑块计数器特性的写入所带来的开销时间。

实际上,我可能必须使用 128 字节的块大小。这将带宽限制为 1.600 字节/秒。

还有其他方法可以让这首单曲读得更快吗?还是这就是它的速度?

我在 Stack Overflow 上搜索并阅读了类似的问题,但我没有找到任何有关像我这样的场景的实际最大速度的信息。

谢谢!

android bluetooth-lowenergy
1个回答
0
投票

您基本上有两种解决方案来提高吞吐量:

  1. 使用关贸总协定通知。确保您有较大的 MTU(例如 517)。发送 495 字节的通知,假设链路层支持 251 字节大 PDU。
  2. 使用L2CAP面向连接的通道。

理论上(即根据规范),第二种方法更稳定,因为它正确地处理流量控制并与其他通信数据交织,而如果接收器跟不上流量,则允许接收器丢弃通知.

在实践中,GATT 通知也效果很好,而且通常使用起来更简单。据我所知,Android 永远不会丢弃传入的通知。

使用读取事务速度慢得多的原因是,一次只能有一个待处理的读取,并且通常不可能在一个连接事件中处理多个读取请求;通常两个连接间隔只能处理一个读事务。使用单向通信方法,不涉及或类似的应用程序级确认,因此可以填充 LE 数据包队列,从而允许链路层在每个连接事件中发送许多数据包。

© www.soinside.com 2019 - 2024. All rights reserved.