bluetooth-lowenergy - 为什么 BLE 4.2 比 BLE 4.1 快

标签 bluetooth-lowenergy

我已阅读技术规范并试图了解为什么 BLE 4.2 比 BLE 4.1 更快?

我们能否发送大于 20 字节的数据包或者连接间隔是否更快?

我想了解是什么让 BLE 4.2 更快。

最佳答案

与早期相比,蓝牙 4.2 中唯一提供更高吞吐量的是链路层的长度扩展。它使得发送长度为 251 字节的数据 pdus 成为可能,而不是之前的限制 27 字节。以前,如果由于 header 大小以及 rx 和 tx 数据包之间以及从 tx 到 rx 之间所需的时间而发送多个数据包,这意味着很大的开销。 数据本身以 1 MBit/s 的速度通过无线方式发送。

请注意,双方都需要支持此新功能,并且新的最大长度必须在设备之间协商才能使用。

这里我将解释一个典型的连接事件,同时中央写入多个 GATT Write 命令数据包,每个数据包 20 个字节。由于无线传输速率为 1 MBit/s,因此传输每位需要 1 μs。链路层头部和底部总共 80 位,包括以下内容:1 个字节的前导码 + 4 个访问地址(用于将数据包识别到正确目的地的内容)。 1 个字节包含流/确认和数据类型。 1 个字节包含数据包的长度。然后是数据,后跟一个 3 字节的 CRC 校验和。用户数据包本身封装在 ATT 数据包(带有操作码和 ATT 句柄的 3 字节 header )中,后者又封装在 L2CAP 数据包(2 字节 channel ID 和 2 字节长度)中。所以 20 字节的大数据包现在变成了 37 字节,通过空中发送。在空中,主机和从机在发送和接收之间交替。所以如果master发送了很多数据包而slave没有什么可发送的,slave仍然必须用一个80位头的空包来响应。此外,在所有数据包之间,必须有 150 μs 的 radio 静默,以便让 radio 有时间在 RX 和 TX 之间切换。因此,一个包含 4 个数据包的连接事件,每个数据包填充了 20 个字节的用户数据,如下所示: 1. Master -> Slave:296 μs 第一个数据包 2.静默150μs 3. Slave -> Master: 80 μs 空包 4.静默150μs 5. Master -> Slave:296 μs 第二个数据包 6.静默150微秒 7. Slave -> Master: 80 μs 空包 8. 静默 150 μs 9. Master -> Slave:296 μs 第 3 个数据包 10.静默150微秒 11. 从站 -> 主站:80 μs 空包 12. 静默 150 μs 13. Master -> Slave:296 μs 第 4 个数据包 14.静默150微秒 15. 从站 -> 主站:80 μs 空包 所有这些加起来为 2554 μs

使用新的数据包长度扩展,我们可以在一个数据包中发送相同的 80 字节(仍然是 17 字节 header + CRC 的开销)= 97 字节 = 776 位。

1. Master -> Slave:776 μs 数据包 2.静默150μs 3. Slave -> Master: 80 μs 空包

这加起来只有 1006 微秒,比以前快两倍多! radio 现在可用于为来自另一个连接的连接事件提供服务。

如您所见,吞吐量增加了。但是要使这个新功能有用,您需要确保用数据包填充连接事件。您当然可以在一个连接事件期间更快地发送相同数量的数据,但如果您只是在下一个连接事件之前将剩余时间闲置,您并不能真正更快地发送数据。

关于bluetooth-lowenergy - 为什么 BLE 4.2 比 BLE 4.1 快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39371797/

相关文章:

c# - 在 xamarin 表单中使用 yyy 编写特征时如何修复异常设备 xxx 已断开连接?

ios - 用 macOS 模拟 iBeacon

swift - 从本地通知将 iPhone 变成 iBeacon

ios - 核心蓝牙 : Range Detection in Background mode

android - 使用 BLE 的室内导航和跟踪人员

c# - 事件处理器乱序处理事件

ios - 如何使用 CoreBluetooth 从 1822 PulseOximeter 的蓝牙 LE 数据中提取 SFLOAT 值

javascript - TI Sensortag 将固件更改为更高的传感器读数更新率

android - Android 设备能否同时在外设和中央模式下运行低功耗蓝牙?

android - 获取蓝牙适配器时出现 Lint 错误