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

Maximizing NRF52 & iOS BLE throughput in both directions

Hello

I'm trying to maximize the throughput between a NRF52832 and iOS devices in both directions.

Currently, I seem to achieve about 400 Kbps from an iPhone 8 to the NRF52 using:

  • CBCharacteristicWriteWithoutResponse
  • maximumWriteValueLengthForType:CBCharacteristicWriteWithoutResponse
  • canSendWriteWithoutResponse on iOS side.

This seem to be what I can expect considering the Apple WWDC 2017 talk about Core Bluetooth.

However, when I send data from the NRF52 to the iPhone, I cannot go beyond 128 Kbps.

I do this using:

  • sd_ble_gatts_hvx()
  • BLE_GATT_HVX_NOTIFICATION
  • multiple calls to sd_ble_gatts_hvx() until the SoftDevice queue is filled up
  • calling again sd_ble_gatts_hvx() as soon as I get a BLE_GATTS_EVT_HVN_TX_COMPLETE

In both cases, the interval is set to 15ms, PHY=2Mbps, ATT MTU set to 185 bytes, Gatt data length set to 251 bytes.

  1. How can I improve the throughput from NRF52 to iOS?
  2. Isn't it supposed to be the same speed in both directions?

Thanks! 

Parents
  • Hello,

    I expected the throughput to be roughly the same in both directions.  To verify this I modified the ble_app_uart example in sdk 15.2.0 to transmit dummy packets and request 2mb phy. With this I was able to achieve  ~400kbps+ with an iphone 7 running ios 12.1 (15ms CI, PHY=2, 185 byte MTU). However, the results seems to have been impacted by the fact that I had been running the ANCS example on the same DK prior to this test. After rebooting the phone (clears device cache) I was not able to get more than 128 kbps. In other words, it looks like the iphone is capping throughput at 128 kbps in some cases. I haven't found any relevant Apple documentation on this so not sure if it there's a proper way to override this.  

    Here are some throughput numbers with Nordic on both sides in case you haven't seen it:

    Bluetooth Low Energy data throughput

Reply
  • Hello,

    I expected the throughput to be roughly the same in both directions.  To verify this I modified the ble_app_uart example in sdk 15.2.0 to transmit dummy packets and request 2mb phy. With this I was able to achieve  ~400kbps+ with an iphone 7 running ios 12.1 (15ms CI, PHY=2, 185 byte MTU). However, the results seems to have been impacted by the fact that I had been running the ANCS example on the same DK prior to this test. After rebooting the phone (clears device cache) I was not able to get more than 128 kbps. In other words, it looks like the iphone is capping throughput at 128 kbps in some cases. I haven't found any relevant Apple documentation on this so not sure if it there's a proper way to override this.  

    Here are some throughput numbers with Nordic on both sides in case you haven't seen it:

    Bluetooth Low Energy data throughput

Children
Related