Tamaño máximo de datos al enviar datos a través de BTLE en iOS

Actualmente estoy implementando una aplicación de iOS que utiliza CoreBluetooth para transferir datos entre 2 dispositivos. Por ejemplo, para enviar datos de la central a la periférica, utilizo este código:

NSData *data = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:nil]; NSLog(@"Writing data of length %d", [data length]); [peripheral writeValue:data forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse]; 

Esto funciona absolutamente bien, pero es que he leído varias veces ahora que las características pueden transferir un máximo de 20 bytes a la vez. Además, cuando miro el código de ejemplo BTLE de Apple, implementan un mecanismo que divide los datos en trozos de 20 bytes. Pero el código anterior imprime algo así como Writing data of length 124 , sin embargo, los datos llegan bien en el otro dispositivo.

Entonces: ¿ Por qué funciona esto en absoluto? Y más aún, me temo que esto podría romperse en algún momento, especialmente cuando entran en juego dispositivos no iOS.

    El estándar BLE requiere 23 bytes como el mínimo ATT_MTU (unidad de transmisión máxima del protocolo de attributes) que todos los dispositivos BLE deben admitir. Sin embargo, el ATT_MTU máximo es de 255 bytes y se ha duplicado nuevamente para BLE 4.2.

    ESPECIFICACIÓN BLUETOOTH Versión 4.2 [Vol 3, Parte A]:

    Todas las implementaciones de L2CAP admitirán un MTU mínimo de […] 23 octetos sobre el enlace lógico LE-U; sin embargo, algunos protocolos y perfiles requieren explícitamente soporte para una MTU más grande.

    Al establecer una connection, ambos dispositivos intercambiarán su tamaño ATT_MTU y se usará el menor de ambos valores. Cuando Apple comenzó con BLE, solo admitían el mínimo, pero desde entonces han ampliado el tamaño posible. Es por eso que funcionan sus 124 bytes, pero la documentation más antigua y el código de muestra utilizan un ATT_MTU mucho más pequeño.

    En iOS 9+ puede usar este método en cada CBCentral suscrito para determinar cuántos datos enviar por chunk:

     [central maximumUpdateValueLength]; 

    Estoy usando iOS 7.1.1 y también he encontrado que puedo enviar hasta 132 bytes confiablemente desde un iPhone a un iPad usando BLE. También escuché que 20 bytes era el máximo, pero seguro que no parece ser

    Como punto de partida, el llamado tamaño ATT_MTU determina la cantidad de bytes que se pueden escribir. Este valor se intercambia / negocia entre los dos dispositivos. Desafortunadamente, este valor no parece estar expuesto en la interfaz CoreBluetooth de Apple 🙁

    Pero acabo de usar un sniffer BLE y en mi caso fue 158 bytes. Pero, nuevamente, este valor puede cambiar con el time …

    Si escribe más datos que ATT_MTU, entonces la stack BlueTooth puede usar un procedimiento llamado Prepare-Write, pero no todas las stacks lo admiten. No han probado si Apple admite esto …

    🙂