RN42 Bluetooth rozłącza się na iOS w ciągu kilku sekund od transmisji strumieniowej

Próbowałem odczytać dane z urządzenia przez Bluetooth 2.1 za pomocą RN-42. Urządzenie łączy się z telefonem iPhone lub iPad Mini, a dane są przesyłane strumieniowo przez krótki czas, ale moduł iOS i BT rozłącza się (rozłącza) w ciągu kilku sekund (mniej niż 10). Urządzenie wysyła dane 5-10 kB / s, tak dobrze w specyfikacji Bluetooth. Zauważyłem też, że kiedy uruchomię funkcję NSInputStream, [NSInputStream read: maxLength:], liczba zwracanych bajtów wynosi zawsze 158 lub mniej. Aplikacja i sprzęt nie ulegają awarii, ale Bluetooth tylko paruje.

Urządzenie nadal wysyła dane do RN42 nawet po rozłączeniu, co zmniejsza prawdopodobieństwo wystąpienia problemu po stronie elektroniki. Ta konfiguracja działa również doskonale na urządzeniach z Androidem. Mogę przesyłać strumieniowo dane bez żadnych rozłączeń lub awarii.

Rzeczy, które próbowałem ...

podążał za przykładem zewnętrznego akcesorium, EADemo, dostarczonym przez Apple.czysto wykorzystując pętlę run zamiast odpytywania.umieszczanie strumienia na wątku w tle, jak sugerowano w tym poście.usunięcie wszystkich NSLogów w celu zwiększenia wydajności.skompilowany w trybach debugowania i zwalniania.

Jedną z rzeczy, która działa, jest spowolnienie transferu danych (tj. Mniej niż 5 kB / s), ponieważ pozwala to modułowi iOS i BT na pozostanie w kontakcie i przesyłanie danych przed rozłączeniem.

#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