When connecting to our peripheral (I will use peripheral for the physical device we are connecting to and it's firmware, sorry for the previously confusing language), during negotiations the only parameters that the firmware will accept are MTU=244 and ConnectionInterval=15ms. Only thing that is negotiable is PHY, either 1 or 2, but 2 is requested by default.
On the peripheral, due to vast differences in bluetooth APIs on various platforms, we have added characteristic that notifies us whenever connection parameters change. As of now, iOS hasn't succeeded (or tried) to change them. We had a similar issue on Android, where OS would change the PHY from 2 to 1, thus drastically reducing our throughput. Whenever this had happened, we were immediately notified by our peripheral. As I've said, we have not (yet) observed this on iOS.
When our peripheral send data to the phone, it is always writing without response, and we rely on notifications to get and parse the bytes. When sending data from the phone to the peripheral, we are also writing without response, though these are usually a couple of bytes to configure the device and get it to start the data stream.
Is it possible that the iOS changes connection parameters in a way that is one sided? From my understanding, for all changes to the connection parameters, devices need to handshake and we would be notified like we are on the other platforms?
Best throughput we've observed is around 400-600 kbps, but it's quite unstable and a bit opinionated. Is it possible that the iOS is throttling the throughput without affecting the connection parameters?
Also one important piece of information is that we are sending larger amounts of data than it's common for BLE devices. Is it possible that we are throttled by a number of packages it is possible to send to the iOS device during one connection interval? When sampling every 4ms, everything works great, as there are only 3-4 packages sent every connection interval. When sampling every 2 or 1ms, that's when we start to observe the problems, as it can be required to send up to 15 packages during one connection interval? I read somewhere (though on a quite old forum post) that the iOS limits the number of packages it will accept during one connection interval, and I don't know if this is still a case.
Thanks a lot for the fast response, and sorry for the information-bomb!