Hello,
I have a CSR 1000-based Bluetooth Low Energy development kit and installed
a GATT server with a 20 byte characteristic. I now want to send notifications
for this characteristic to an iPhone 4S. Notifications are sent at the minimum
possible interval. Ideally, I want to achieve peak rates of 200+ kbit/s. Since this
rate is not used continuously, low energy should still provide a good solution.
WLAN is disabled on the iPhone, no other Bluetooth or BLE devices are connected
to the device. Therefore, nothing should interfere with the connection.
GATT database discovery works well, the notification mechanism is also up and
running. However, I am experiencing a strange issue, that leads to packet loss.
I monitor the times that it takes for a packet to be acknowledged. As soon as
a Link Layer acknowledgement occurs, the time that was spent is written to a Log and
a new notification with a new value for the characteristic is immediately sent.
The minimum connection interval that is accepted by the iPhone 4S is used: 18.75 ms.
(connection event #1) (# 1) 16.692ms (# 2) 600µs (# 3) 626µs (# 4) 623µs
(connection event #2) (# 5) 16.698ms (# 6) 601µs (# 7) 626µs (# 8) 624µs
(connection event #3) (# 9) 16.695ms (#10) 601µs (#11) 627µs (#12) 625µs
(connection event #4) (#13) 16.695ms (#14) 601µs (#15) 626µs (#16) 624µs
...
After every fourth notification of the characteristic value, I experience a long delay.
This results in a low throughput of around 32 kbit/s, that is really low compared to the
case where all acknowledgements would happen at around 650µs. In this ideal case,
the achieved throughput would be 1'000'000 / 650 * 160 / 1000 = nearly 250 kbit/s.
I tested the development kit with a separate Bluetooth USB dongle and a PC software.
In this environment, the strange delays after every fourth notification did NOT occur.
Different values for Connection_Interval did not change the numbers of notifications that
could be sent per connection event. I plotted the achieved throughput against 42
different values of Connection_Interval. For the majority of the connection events,
only four notifications went through, regardless of the chosen Connection_Interval.
- Where does this artificial cap of four notifications per connection event come from?
- What can I do to increase / remove the cap?
- Is this cap a bug?
- What other issues could be the source of this problem?
Thanks,
Etan