iOS Bluetooth LE: forma adecuada de escribir sin respuesta

Con iOS CoreBluetooth, cuando envía una cantidad de datos relativamente grande, es importante dividirlo en trozos de 20 bytes y luego escribirlos uno a la vez en el object periférico. Esto es bastante fácil de hacer cuando se usa una característica WriteWithResponse: escriba 20 bytes, espere la callback, escriba los próximos 20 bytes, y así sucesivamente.

Pero ¿qué pasa con una característica WriteWithoutResponse? Necesito enviar de 1-2 KB de datos lo más rápido que pueda sobre BLE. WriteWithResponse es muy ineficiente al hacer esto, ya que requiere cada package de 20 bytes. La corrección de errores y la confiabilidad son atendidos en mi capa de aplicación, por lo que no necesito que BLE acepte los datos.

El problema es que WriteWithoutResponse no le da una callback, porque CoreBluetooth no tiene la posibilidad de saber cuándo se escribió realmente la información. Entonces la pregunta es: ¿cómo espaciamos correctamente el envío de una gran cantidad de datos usando WriteWithoutResponse?

La única solución en la que he pensado es hacer lo siguiente:

  1. Obtenga el intervalo de connection y la cantidad de packages que el enlace es capaz de realizar por intervalo de connection.
  2. Inmediatamente escriba packages X de 20 bytes cada uno, espere time Y, y repita hasta que no quede ningún dato. (X = Número de packages por intervalo de connection, Y = El intervalo de connection)

Hay dos problemas evidentes con este enfoque:

  1. CoreBluetooth no nos muestra el intervalo de connection (¿por qué?). Entonces hay dos opciones. El primero es: adivinar. Probablemente sea un peor caso o un caso promedio dependiendo de sus parameters de connection preferidos, creo que a iOS le gusta elegir 30 ms. Pero esta es una mala idea porque una central tiene el derecho de ignorar por completo los parameters sugeridos. La segunda es que puede tener la tienda periférica y transmitir el CI acordado al dispositivo iOS. El problema con esto es que no puede enviar el CI hasta que el dispositivo iOS haya terminado de descubrir los services y las características y se haya suscrito a la notificación correspondiente. Por lo tanto, tendría que poner un retardo fijo algo arbitrario después de la connection antes de enviar el CI, o enviar una pequeña cantidad de datos desde el dispositivo iOS notificando al periférico que está listo. Ambos crean latencias y son soluciones bastante pobres.
  2. No sabemos cuántos packages por intervalo de connection se pueden admitir. Hay un máximo teórico de 6. Pero el caso promedio es probablemente 4 o less. También depende del periférico.

Por supuesto, una gran opción para enviar grandes cantidades de datos es boost el tamaño de la MTU a más de 20 bytes para acomodar nuestra gran cantidad de datos. Pero parece que pocos periféricos apoyan esto; el nuestro no lo hace

Alguien tiene alguna idea sobre cómo resolver esto?