蓝牙BLE实现最大吞吐率 您所在的位置:网站首页 ble数据最大传输 蓝牙BLE实现最大吞吐率

蓝牙BLE实现最大吞吐率

2023-10-18 13:30| 来源: 网络整理| 查看: 265

1、  为什么不可能达到BLE的理论速度?

1 Mbps (LE 1M PHY)、2 Mbps (LE 2M PHY)、125 kbps 和 500 kbps(均使用 S=8 和 S=2 的 LE 编码 PHY)的数据速率是无线电的速率 传输数据,但由于以下原因,这对于应用程序吞吐量无法实现:

l   每个连接间隔的数据包数量限制

l   数据包之间的帧间空间 (IFS) 延迟 (150 us)

l   即使没有数据可用于传输,也需要从设备发送空数据包

l   数据包开销--并非数据包中的所有字节都用于有效载荷

1 Mbps (LE 1M PHY)、2 Mbps (LE 2M PHY)、125 kbps 和 500 kbps(均使用 S=8 和 S=2 的 LE 编码 PHY)的数据速率是无线电的速率 传输数据,但由于以下原因,这对于应用程序吞吐量无法实现:

 

每个连接间隔的数据包数量限制

数据包之间的帧间空间 (IFS) 延迟 (150 us)

即使没有数据可用于传输,也需要从设备发送空数据包

数据包开销——并非数据包中的所有字节都用于有效载荷

 

为了更好地了解这些因素并了解影响应用吞吐量的因素,我们必须更深入地研究数据包格式。 下图显示了 LE 1M PHY 和 2M PHY 数据包的样子:

蓝牙数据格式

我们感兴趣的部分(也是真正定义应用程序数据的部分)是 ATT Payload。 从图中可以看出,Bluetooth Low Energy 中的每一层都使用了许多开销字节。

l   在 4.0 和 4.1 中,最大 ATT Payload 为 20 字节。

l   在 4.2 和 5.0 中,一项称为数据长度扩展 (DLE) 的新功能允许 ATT 有效负载最多容纳 244 字节的数据。

 

2、  蓝牙 5 速度:利用新的 2M PHY 提高 2 倍速度

了解在蓝牙 5 中使用新的 LE 2M PHY 的局限性很有用:

l   不能用于传输primary advertisements(在primary频道上)。

l   可用于在与数据包相同的通道(37 个通道:0-36)上发送的辅助“辅助数据包”。

l   LE 1M 是强制性的,而 LE 2M 是可选的。 因此,并非所有声称支持蓝牙 5 的芯片都一定能够处理更高的吞吐量。

l   广告和发现可以发生在 LE 2M PHY 上,然后连接发生在使用 LE 2M PHY 的次要广播通道上

应用程序数据从一个设备到另一个设备的传输通常发生在两个设备之间的连接期间。 连接的设备可以通过 PHY 更新程序协商使用不同的 PHY。 它可以在建立连接后由从设备或主设备启动,但主设备将最终决定每个方向使用哪些 PHY(基于从设备的请求和主设备支持的 PHY)。

3、  影响/决定数据吞吐量的因素

有几个因素会影响 BLE 应用的数据吞吐量。 最常见的是:

l   使用的 PHY(LE 1M 与 LE 2M 与 LE 编码(S=2 或 S=8))

l   连接间隔

l   每个连接间隔的最大数据包数

l   ATT 最大传输单元 (ATT MTU)

l   数据长度扩展 (DLE)

l   操作类型:有响应写入与无响应写入、指示与通知

l   帧间空间 (IFS):后续数据包之间的时间间隔 (150 us)

l   空包传输

l   数据包开销--并非数据包中的所有字节都用于应用程序负载

让我们更详细地讨论每一个。

PHY:

蓝牙 5 中基本上有三个 PHY:原始 1 Mbps PHY、新的 2 Mbps 和编码 PHY(S=2 或 S=8)。 所使用的 PHY 将直接影响您可以实现的最大数据吞吐量,因为它决定了通过空中发送数据包的实际原始数据速率。

连接间隔:

       连接间隔有效地决定了在一个连接事件期间可以发送多少数据包。 该值越高,在一个连接事件中可以发送的数据包越多(对于某些设备,达到一定的限制)。

但是,每个连接事件的数据包数量取决于设备和 BLE 堆栈,因此它是有限的,并且因特定设备上的设备和堆栈版本而异。 该值还取决于设备的操作,因此无线电可能必须处理其他事件,并且每个连接事件发送的数据包数量可能不会达到堆栈允许的最大值。 例如,iOS 和 Android 之间的数字不同,并且还会根据设备上运行的操作系统版本而变化。

       有时根据用例动态更新连接参数很有用。 但是,请记住,接受这些建议或更新参数以适应这些建议取决于主控方。

 

数据长度扩展 (DLE):

此功能允许数据包大小容纳更大量的有效负载(最多 251 个字节,禁用时为 27 个)。 此功能是在蓝牙规范 4.2 版中引入的。

每个连接间隔的最大数据包数:

ATT MTU 确定发送器和接收器可以处理的最大数据量以及它们可以保存在其缓冲区中的数据量。

MTU 值影响开销数据量(特别是 3 字节的 ATT 标头)。 允许的最小 ATT MTU 为 27 字节。 这允许最多 20 个字节的 ATT 有效载荷(3 个字节用于 ATT 标头,4 个字节用于 L2CAP 标头)。

对于 MTU 值可以有多高,每个规范没有限制,但使用的特定堆栈可能有其自身的限制。 例如,如果您启用 DLE,那么您最多可以传输 251 – 4 = 247 个字节(扣除 L2CAP 标头大小后)。 考虑到 ATT 标头(3 个字节)后,我们还剩下 244 个字节用于实际的 ATT 有效载荷数据。 如果 MTU 至少为 247 字节,则 MTU 将适合单个数据包。 如果 MTU 大于 247 字节,则 MTU 将跨越多个数据包,导致吞吐量下降(由于数据包开销和数据包之间的计时)。

有效 MTU 由客户端和服务器支持的 ATT MTU 的最小值决定。 例如,如果客户端支持 100 字节的 ATT MTU 并且服务器响应它支持 150 字节的 ATT MTU,则客户端将决定用于连接的 ATT MTU 为 100 字节

操作类型:有响应写入与无响应写入、指示与通知:

如果需要高吞吐量,那么我们可以使用 Write without response 或 Notifications 将数据从客户端传输到服务器以及从服务器传输到客户端。 这些操作消除了其他设备确认收到数据并在发送下一个数据块之前做出响应的需要。

连续数据包之间的时间延迟(150 us):

蓝牙规范:4.1.1 帧间空间

同一信道索引上的两个连续数据包之间的时间间隔称为帧间空间。 它被定义为从前一个数据包的最后一位结束到后续数据包的第一位开始的时间。

帧间空间被指定为“T_IFS”并且应为 150 μs。

空包传输:

如果接收数据的设备没有数据要发回,它仍然需要按照蓝牙规范发送一个空包。

数据包开销:

正如我们在数据包格式图中看到的,数据包包含一些不计入应用程序数据(ATT 数据)的开销数据。 基本上,这些字节将消耗部分传输数据速率,而不会考虑作为应用程序数据的一部分发送的任何字节。

4、  计算应用程序数据吞吐量

最大的问题是:我们如何计算应用程序吞吐量?

正如我们之前提到的,有几个影响数据吞吐量的变量:

l   使用的蓝牙版本和 PHY

l   DLE:数据长度扩展 – 启用与否

l   ATT MTU 值

l   连接间隔

l   每个连接事件的最大数据包数

l   操作(有响应的写入与无响应的写入,以及通知与指示)

l   帧间空间 (IFS):150 微秒

蓝牙版本和 PHY 决定了原始数据传输速率。 例如,如果我们使用蓝牙 4.2 版和 LE 1M PHY,则传输速率为 1 Mbps。 另一方面,如果我们使用 S=8 的蓝牙 5 LE 编码 PHY,那么数据速率会下降到 125 kbps。

DLE、ATT MTU、连接间隔、每个连接间隔的最大数据包数、操作和 IFS 都决定了用于实际数据传输的无线电时间部分。

数据包格式在传输的数据中有多少是您的实际应用程序数据方面起着重要作用。 LE 1M PHY 和 LE 2M PHY 都具有相似的数据包格式。 LE 编码 PHY 具有明显不同的数据包格式,因此我们将分别查看这两种情况。

 

LE 1M PHY 和 LE 2M PHY 计算:

回顾 LE 未编码 PHY 的数据包格式:

数据包格式

每个 PHY 的开销量略有不同。 前导码在 1M PHY 的情况下是 1 个字节,在 2M PHY 的情况下是 2 个字节。 MIC 字段是一个可选字段,仅用于加密连接。 为简单起见,我们将只考虑未加密的连接——对于加密的情况,它只是增加了 4 个字节的开销。

对于 LE 编码 PHY,数据包格式如下所示(来自蓝牙 5.0 规范第 6 卷,B 部分,第 2.2 节):

计算吞吐量的步骤(以 Mbps 为单位):

为简单起见,我们假设如下:

l   未启用加密(数据包中不包含 MIC 字段)

l   我们对一个方向的吞吐量感兴趣(例如 Master 到 Slave),所以我们假设另一个方向只传输空包

l   无响应写入(这将有助于在传输大量数据时最大化吞吐量)

 

步骤:

1.确定正在使用的 PHY 并记下原始数据传输的速率

例如。 对于 1M PHY -> 1 Mbps,对于编码 PHY 和 S=8 -> 125 kbps

2.确定从接收方发送一个数据包和空包所需的时间。

发送一个数据包的时间将包括以下内容:

Data_Packet_Time = 传输空包的时间 + IFS + 传输实际数据包的时间 + IFS。

空包传输时间可以计算如下:

传输空包的时间 = 空包大小 / 原始数据速率

 

一个空包将包含以下字段:

前导码 + 访问地址 + LL 标头 + CRC。

对于 1M PHY,Preamble 将是 1 个字节,因此空包的总大小 = 1 + 4 + 2 + 3 个字节 = 10 个字节 = 80 位。

(对于 2M PHY,空包的大小将为 88 位,因为 Premable 是 2 个字节而不是 1 个字节)。

 

基于此,传输一个空的 1M PHY 数据包的时间将为:

传输空包的时间 = 空包大小 / 原始数据速率 = 80 位 / 1 兆位每秒 = 80 微秒

 

数据包将包含数据包格式图中列出的所有字段,但 MIC 字段(禁用加密)除外。

传输数据包的时间 = 数据包大小 / 原始数据速率

 

如果我们启用了 DLE 并且 ATT MTU 等于一个数据包中允许的最大字节数:247 字节,那么我们可以计算数据包大小为:

数据包大小=1+4+2+4+247+3字节=265字节=265*8位=2088位

传输数据包的时间 = 2088 位 / 1 Mbps = 2,088 微秒

Data_Packet_Time = 传输空包的时间 + IFS + 传输实际数据包的时间 + IFS = 80 + 2*150 + 2088 = 2,468 微秒

 

为了比较,在 2M PHY 的情况下,它将是:

Data_Packet_Time = 传输空包的时间 + IFS + 传输实际数据包的时间 + IFS = 80/2 + 2*150 + (2 + 4 + 2 + 4 + 247 + 3)*8/2 = 1,388 微秒

 

当启用 DLE 并且 ATT MTU 设置为小于 247 时,我们最终会产生更多的开销(因为现在大于 ATT MTU 的数据被分成更多的数据包)。 例如,假设我们将 ATT MTU 设置为 158,那么为了传输 244 字节的应用程序数据,我们将需要两个数据包而不是一个数据包,由于增加的字节开销以及增加的字节开销导致吞吐量下降 数据包之间的 IFS。 在另一种情况下,我们可以禁用 DLE(有效负载大小高达 27 字节)和大于 27 字节的 ATT MTU。 在这里,这也会导致相同数量的数据需要发送更多的数据包,从而导致吞吐量下降。

 

3. 计算在一个连接间隔内可以传输多少个数据包,这种计算并不总是纯粹的数学计算--需要考虑所使用的堆栈和设备的限制。 iOS 和 Android 的最大值会随操作系统版本而变化,因此并不总是很容易弄清楚。 话虽如此,在 MCU 上,供应商的 SDK 通常会在其文档中列出最大值。 进行反复试验并找出您的特定设备支持的内容也很有帮助。

       计算出最大值后,可以计算适合所选连接间隔的最大理论数据包数。 例如,如果我们的连接间隔为 7.5 毫秒(规范允许的最低值),那么对于上面的示例(使用 1M PHY,启用 DLE):

每个连接间隔的最大数据包数 = [连接间隔 / Data_Packet_Time],其中 [ ] 舍入到最大整数(整数)每个连接间隔的最大数据包数 = [7.5*1000 微秒 / 2468 微秒] = 3 个数据包

通常,这个数字是不现实的,因为在连续连接事件上发送的数据包之间存在时间延迟。 因此,对于我们的示例,我们将使用 2 个数据包而不是 3 个。

 

4. 一旦我们计算出每个连接间隔可以传输的最大数据包数量,我们可以计算数据吞吐量:数据吞吐量 = 每个连接间隔的数据/连接间隔 = 每个连接间隔的数据包数量 * 每个数据大小 数据包/连接间隔

= 2 * 244 * 8 位 / 7.5 毫秒 = 520,533 位/秒 ~= 508 kbps

 

5.BLE5.0理论吞吐率计算公式:(未考虑连接间隔)

备注:此文看着有点晦涩,多看几次仔细分析就会有一个大概对蓝牙速率的理解,可以简单的帮助开发者理解蓝牙的通信速率的问题和如果优化达到最好的通信效果



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有