RN42 Bluetooth se desconecta en iOS en segundos después de la transmisión de datos

He estado intentando leer datos de un dispositivo a través de Bluetooth 2.1 con un RN-42. El dispositivo se empareja con un iPhone o iPad Mini, y los datos se transmiten brevemente, pero el módulo de iOS y BT se desconecta (desvincula) en cuestión de segundos (menos de 10). El dispositivo está emitiendo datos a 5-10kB / s, por lo que está bien dentro de las especificaciones de Bluetooth. Algo que también he notado es que cuando ejecuto la función NSInputStream, [NSInputStream read: maxLength:], el número de bytes devueltos siempre es 158 o menos. La aplicación y el hardware no se bloquean, pero el Bluetooth simplemente se descompone.

El dispositivo sigue enviando datos al RN42 incluso después de la desconexión, lo que reduce la probabilidad de un problema en el lado de la electrónica. Esta configuración también funciona perfectamente bien en dispositivos Android. Puedo transmitir datos sin ninguna desconexión o bloqueo.

Cosas que he intentado ...

Siguió el ejemplo de accesorio externo, EADemo, proporcionado por Apple.puramente utilizando el ciclo de ejecución en lugar de sondeo.poniendo la secuencia en un hilo de fondo como se sugiere en esta publicación.eliminando todos los NSLogs para ayudar con el rendimiento.Compilado en los modos de depuración y liberación.

Una cosa que funciona es ralentizar la transferencia de datos (es decir, menos de 5kB / s), ya que permite que los módulos de iOS y BT se mantengan conectados y transfieran datos durante más tiempo antes de desconectarse.

#define EAD_INPUT_BUFFER_SIZE 1024

/**
 * Stream delegate
 */
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
{
    switch (eventCode) {
[... other cases ...]

        case NSStreamEventHasBytesAvailable:
        {            
            uint8_t buf[EAD_INPUT_BUFFER_SIZE];
            unsigned int len = 0;
            len = [(NSInputStream *)aStream read:buf maxLength:EAD_INPUT_BUFFER_SIZE];

            if(len) {
                // Read successful, process data
            } else {
                // Fail
            }     
            break;
        }
        default:
            break;
    }
}

/**
 * Stream delegate with polling (for better or worse)
 */
    [...]
        case NSStreamEventHasBytesAvailable:
        {            
            while ([[_session inputStream] hasBytesAvailable])
            {
                // Read the data
                NSInteger bytesRead = [[_session inputStream] read:_buf maxLength:EAD_INPUT_BUFFER_SIZE];

                if (bytesRead > 0) {
                    // Read successful, process data

                } else if (bytesRead == 0) {
                    // End of buffer reached
                    return;

                } else if (bytesRead == -1) {
                    // Failed to read
                    return;
                }
            }
            break;
    [...]

Respuestas a la pregunta(1)

Su respuesta a la pregunta