I’ve been testing the iOS Peripheral throughput using a modified version of Apple’s “Transferring Data Between Bluetooth Low Energy Devices” sample app.
I attempted to send 1 MB (1,048,576 bytes) of data in 512-byte notification packets from a Peripheral iPhone (iPhone SE 3rd gen) to a Central iPhone (iPhone 13 Pro). The transfer took 40.7 seconds, resulting in an effective throughput of approximately 206.11 kbps. I noticed that nearly all the delay occurs while waiting for the peripheralManagerIsReady(toUpdateSubscribers:) callback after the second packet is sent.
I’ve seen reports of throughput around 1300 kbps on 2M PHY (or 700 kbps on 1M PHY). Could anyone advise how to optimize my Peripheral implementation to achieve throughput closer to 1300 kbps?
Thank you!
Performance effecting attributes of a BLE connection, like connection interval, MTU, PHY, etc. can only be requested by a connecting accessory. There is no way for an app to change these. When a BLE connection is between two iPhones, they will decide what the connection parameters will be as appropriate and depending on device state and what else might be going on at that time.
If you are looking into making a final product that needs better throughput for large transfers, you may want to look at implementing L2CAP Channels which will dramatically your throughput by reducing GATT protocol overhead.
Argun Tekant / DTS Engineer / Core Technologies