Bluetooth Low Energy

What throughput does BLE get in practice?

Less than the radio's bit rate, by an amount that depends on the devices. The Bluetooth SIG lists LE bit rates of 2 Mb/s on LE 2M, 1 Mb/s on LE 1M, and 500 or 125 kb/s on LE Coded, but an application sees less after packet framing, turn-taking, acknowledgements, retransmissions and the limits each phone's stack puts on connection interval, data length and MTU. There is no dependable general figure, so measure the link you will ship.

Learning objectives

After reading this article you will be able to:

  • Explain why BLE applications see less than the PHY bit rate
  • Identify how data length, MTU, connection interval and PHY affect throughput
  • Describe how to measure BLE throughput on the phones you will ship

Bit rate is not throughput

The Bluetooth SIG’s technology overview lists the raw bit rates of the Bluetooth Low Energy PHYs: 2 Mb/s for LE 2M, 1 Mb/s for LE 1M, and 500 kb/s or 125 kb/s for the LE Coded PHY. Those are the speeds of bits on air while a packet is being sent. They are not what an application gets, for several reasons.

  • Framing. Every link-layer packet carries more than data. Apple’s accessory guidelines draw it as a 1-byte preamble, 4-byte access address, 2-byte header, the data, a 4-byte message integrity check and a 3-byte CRC.
  • Turn-taking. On a connection, data moves in connection events. The Core Specification describes the Central and Peripheral alternating packets within each event, so the radio is not sending one direction’s data all the time.
  • Acknowledgement and retransmission. A packet that fails its CRC check is not acknowledged and gets sent again, according to the SIG’s Bluetooth 5 explainer. At longer range or with interference, more airtime goes to repeats.
  • Upper layers. L2CAP and ATT add their own headers. Android’s guidance on MTU tells developers to subtract 5 bytes for headers when sizing writes.

The settings that decide throughput

A handful of parameters do most of the work. Most are negotiated, so an app requests them and the stacks on both sides decide.

Data length. Data Packet Length Extension raises the maximum data per link-layer packet from 27 to 251 bytes. Apple’s guidelines say larger per-packet data lengths improve radio efficiency and greatly increase application data rates, because the fixed framing is spread over more payload.

ATT MTU. The MTU caps how much one ATT operation, such as a write or a notification, can carry. From Android 14, the stack requests an MTU of 517 bytes when the first GATT client calls requestMtu, and the result is the smaller of that and what the peer offers. Apple devices request an MTU based on factors such as connection event length, maximum data length and protocol.

Connection interval. This is how often the two devices meet. A shorter interval gives the link more chances to move data. On Android, requestConnectionPriority(CONNECTION_PRIORITY_HIGH) asks for a low-latency connection and is meant for transferring large amounts of data quickly. Apple’s guidelines say accessories should request a minimum interval of at least 15 ms, in multiples of 15 ms, and that requests outside the guidelines may be rejected. The Core Specification lets the Central end each connection event at any time, so how much data fits into one event varies between devices.

PHY. Moving from LE 1M to LE 2M shortens each packet’s time on air. On Android, setPreferredPhy expresses a preference, which the controller can override.

Write type. In Core Bluetooth, a write with response waits for the peripheral to report success or failure, while a write without response skips that reply, so the app gets no notice if it fails. Which one to use, and whether to send data as characteristic writes or notifications, is a trade between speed and confirmation.

Why phones get less than benchmarks

A throughput figure measured between two development boards tuned for one job tells you little about phones, which differ in ways an app cannot fully control:

  • The operating system chooses or negotiates connection parameters, data length, MTU and PHY. An app can only request them: Android’s requestConnectionPriority sends a connection parameter update request to the remote device, and Apple devices negotiate data length and MTU themselves.
  • Distance, walls and interference cause more failed CRC checks, and so more retransmissions.
  • Running in the background brings its own platform rules. See Can a BLE app run in the background on iOS?

A figure from one phone model also says little about another.

Large payloads move as many small packets

Anything larger than one ATT operation has to be split. An application-level chunk is usually far larger than a BLE packet: the Offline Protocol mesh SDK, for example, moves files in 32 KiB chunks, and a payload that size crosses the radio as many link-layer packets of at most 251 data bytes each. Everything in the list above applies to each of them. How do large files move across a mesh? covers the chunking, resuming and integrity checks on top.

How to measure it

  1. Time real payloads end to end, at the application layer, in both directions.
  2. Use the phones you will ship, at realistic distances, with the app in the foreground and in the background.
  3. Log the negotiated values: Android reports them through callbacks such as onMtuChanged and onPhyUpdate.
  4. Change one setting at a time and record it with the result.

A throughput number is only meaningful with its PHY, MTU, data length, connection interval and devices attached.

Frequently asked questions

Does LE 2M PHY double throughput?

It doubles the bit rate while a packet is on air, but not everything shrinks with it. The SIG notes that the LE 2M preamble takes the same time to arrive as the LE 1M one, and the connection interval, turn-taking and OS limits stay the same, so application throughput rises by less than the bit rate. Both devices must also support LE 2M.

Why is my BLE transfer slower on one phone than another?

Each phone's Bluetooth stack chooses or negotiates the connection interval, data length, MTU and PHY, and those choices differ between operating systems, versions and chipsets. Log the negotiated values on each phone to see where they diverge.

Sources

Build it with Offline Protocol

The mesh SDK's limits page lists v0.27.0 payload ceilings and chunk sizes, and states that they are bounds rather than throughput guarantees, to be qualified on the hardware you deploy.

Read the limits and capacity docs