O RN42 Bluetooth é desconectado no iOS em segundos após a transmissão de dados

Eu tenho tentado ler dados de um dispositivo via Bluetooth 2.1 usando um RN-42. O dispositivo é emparelhado com um iPhone ou iPad Mini e os dados são transmitidos brevemente, mas o módulo iOS e BT é desconectado (desemparelhar) em segundos (menos de 10). O dispositivo está emitindo dados de 5-10kB / s, de modo que estão dentro das especificações do Bluetooth. Algo que também notei é que quando executo a função NSInputStream, [NSInputStream lê: maxLength:], o número de bytes retornados é sempre 158 ou menos. O aplicativo e o hardware não travam, mas o Bluetooth é desativado.

O dispositivo ainda está enviando dados para o RN42 mesmo após a desconexão, o que reduz a probabilidade de um problema no lado eletrônico. Esta configuração também funciona perfeitamente em dispositivos Android. Eu posso transmitir dados sem qualquer desconexão ou falha.

Coisas que eu tentei ...

seguiu o exemplo External Accessory, EADemo, fornecido pela Apple.puramente usando o loop de execução em vez de pesquisa.colocando o fluxo em um thread de fundo, como sugerido neste post.removendo todos os NSLogs para ajudar com o desempenho.compilado nos modos de depuração e liberação.

Uma coisa que funciona é diminuir a transferência de dados (ou seja, menos de 5kB / s), pois isso permite que o módulo iOS e BT permaneça conectado e transfira os dados por mais tempo antes de desconectar.

#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;
    [...]

questionAnswers(1)

yourAnswerToTheQuestion