低功耗蓝牙(BLE)是为低速率应用设计的,比如控制信号、传感器数据、等,但是偶尔会有在 BLE 下使用更高速率的需要。 理论的 BLE 无线数据传输速率是 1Mb/s,但是这是两个设备间物理层的传输速率,没有考虑到协议开销。 实际上的最高速率接近 10kB/s 并且和设备相关,下面进行解释。

BLE 连接参数

BLE 有多个连接参数(在蓝牙 4.0 中定义,第 3 卷,第 A 部分, 第 4.20 小节)将会决定吞吐量。注意高的吞吐率的结果是更多的电量消耗。

Connection Interval 连接间隔

这个参数定义了中心与外围的通信间隔。每个通信间隔内可以有最多 4 个包被发送,每个包有 20B 载荷,根据 BLE 定义,允许的连接间隔参数范围是 7.5 ms 到 4000 ms。 连接间隔是最有效的改变吞吐量的参数。 假如把连接间隔比作火车调度:举例,火车每半小时离开车站。每列火车包含 1 ~ 4 个车厢,每个车厢可以容纳 20 字节。 所以如果你有 20 ms 连接间隔,则理论的最大吞吐是你在 40 ms 对 80 bytes 数据进行了发送和接收 ACK(1 个 Interval 发送,1个 Interval 接收)。 但是火车无论满的还是空的都会发车,你可能每 80 ms 只发送了 20 bytes,或者更少。

Slave latency

这个参数表示 slave 可以跳过多少个 connection interval。举例,如果 connection interval 是 20 ms 并且 slave latency 是 4,则如果外围愿意 它可以每 80 ms 回复中心一次。 slave latency 在大部分时间等待,偶尔有大量数据传输的场合比较适用。在这种情况下,外围只需要每 80 ms 回复一下中心保持连接活动,但是如果有大量数据时它可以每 20 ms 发送一次数据。slave latency 范围是 0 ~ 499,并且不能超过:((supervisionTimeout / connectionInterval) – 1)

Connection Supervision Timeout

这个参数定义了中心和外围接收一个 link-layer packet 前的最大时间,中心和外围维护者它们各自的 “Supervision 定时器”,每当接收到数据包时置零。一旦定时器超时,则设备认为连接断开,并且退出连接状态(变为 advertising,scanning 或者 standby 状态)。 Connection Supervision Timeout 范围是 100 ms 到 32 s。并且要大于 (1 + slaveLatency) * (connectionInterval).

Packet Per Connection Interval

每个连接间隔可以发送的包数目,根据 BLE 定义,最大值是 6, iOS 下最大为 4。

iOS 的连接参数

上面我们提到最高数据传输速率是和设备相关的,根据 Apple 的 Bluetooth Accessory Design Guidelines for Apple Products https://developer.apple.com/hardwaredrivers/BluetoothDesignGuidelines.pdf 连接参数限制如下:

Interval Max * (Slave Latency + 1) ≤ 2 seconds Interval Min ≥ 20 ms (not 7.5mSec)
Interval Min + 20 ms ≤ Interval Max Slave Latency ≤ 4 connSupervisionTimeout ≤ 6 seconds
Interval Max * (Slave Latency + 1) * 3 < connSupervisionTimeout

如果 BLE HID 是一个 理论上 iOS BLE 的最大吞吐是:80B 每 40ms,即 2kB/s。采用 Nitification / Indications 可能会提高吞吐。

Android 的连接参数

设备相关,有些设备可以支持 7.5ms 的连接间隔,但有些设备表现很差。

参考资料

https://atmosphere.anaren.com/wiki/Data_rates_using_BLE