This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

BLE4 transfer speed slower on iPhone8/X than 5/6/7.

Hello-

Recently, we optimized our BLE4 transfer settings. With the same device, firmware, and payload, we get better transfer rates on iPhone5,6,7 than iPhone 8/X. On all systems the parameter settings requested by peripheral are accepted by iPhone.

Has anyone seen this problem? I am aware that BLE5 supports "data length extension" and is capable of potentially much higher transfer rates, but this would require (for us) an SDK upgrade and some re-architecting, so I wanted to exhaust the BLE4 options first.

On iPhone5S,6, and 7 we get 6-7KB/s.

On iPhone8/X and variants we max out at ~2.7KB/s.

The relevant current transfer speed settings are as follows:

nr52

SDK is 14.2.0, SD132

gap_conn_params.min_conn_interval = MSEC_TO_UNITS(15, UNIT_1_25_MS); /**< Minimum acceptable connection interval - how fast peripheral/central exchange data.*/;
gap_conn_params.max_conn_interval = MSEC_TO_UNITS(15, UNIT_1_25_MS); /**< Maximum acceptable connection interval (1 second). */
NRF_SDH_BLE_GAP_EVENT_LENGTH 24 //this is 30ms

I believe the GAP param change request is acknowledged on both sets of phones because in all cases my BLE handler hits this event:

case BLE_GAP_EVT_CONN_PARAM_UPDATE:

//and in this message I check (and report over UART) this result:

p_ble_evt->evt.gap_evt.params.conn_param_update.conn_params.max_conn_interval * 125 / 100);

This reports as 15ms for both iPhone5/6/7 where I see the speedboost and on 8/X, where I do not.

Parents
  • Replying to my own post, even though it's very old.

    Short version: Nothing to see here, expected behavior as I understand it. Anecdotally, earlier iphones seem to allow you to squeeze the throughput harder, while newer phones will ACK the param change request though you dont actually see as much of a boost. With newer phones, just use DLE (data length extension).

    Longer version:

    I found this very helpful: https://punchthrough.com/maximizing-ble-throughput-on-ios-and-android/

    It turns out we DID NOT need to bump the SDK to get DLE working, and with some minor tweaks we were able to get iphone5s/6/7 up to 10-12KB/s and able to get iPhone8 and above all the way to 50KB/s.

    's recommendation to actually use the sniffer is a good one, though I did not need to go that far to fix my own problem. Only so much you can infer from aggregate measurements. When all else fails, try measuring ;)

Reply
  • Replying to my own post, even though it's very old.

    Short version: Nothing to see here, expected behavior as I understand it. Anecdotally, earlier iphones seem to allow you to squeeze the throughput harder, while newer phones will ACK the param change request though you dont actually see as much of a boost. With newer phones, just use DLE (data length extension).

    Longer version:

    I found this very helpful: https://punchthrough.com/maximizing-ble-throughput-on-ios-and-android/

    It turns out we DID NOT need to bump the SDK to get DLE working, and with some minor tweaks we were able to get iphone5s/6/7 up to 10-12KB/s and able to get iPhone8 and above all the way to 50KB/s.

    's recommendation to actually use the sniffer is a good one, though I did not need to go that far to fix my own problem. Only so much you can infer from aggregate measurements. When all else fails, try measuring ;)

Children
No Data
Related