RN42 Bluetooth unter iOS wird innerhalb von Sekunden nach dem Streamen von Daten getrennt

Ich habe versucht, mit einem RN-42 Daten von einem Gerät über Bluetooth 2.1 zu lesen. Das Gerät wird mit einem iPhone oder iPad Mini gekoppelt, und die Daten werden kurz übertragen. Das iOS- und BT-Modul wird jedoch innerhalb von Sekunden (weniger als 10) getrennt (getrennt). Das Gerät gibt Daten mit einer Geschwindigkeit von 5 bis 10 kB / s aus, was den Bluetooth-Spezifikationen entspricht. Mir ist auch aufgefallen, dass beim Ausführen der Funktion "NSInputStream" ([NSInputStream read: maxLength:]) die Anzahl der zurückgegebenen Bytes immer 158 oder weniger beträgt. Die App und die Hardware stürzen nicht ab, aber das Bluetooth funktioniert nicht.

Das Gerät sendet auch nach dem Trennen der Verbindung noch Daten an das RN42, wodurch die Wahrscheinlichkeit eines Problems auf der Elektronikseite verringert wird. Dieses Setup funktioniert auch auf Android-Geräten einwandfrei. Ich kann Daten ohne Unterbrechungen oder Abstürze streamen.

Dinge, die ich versucht habe ...

Folgen Sie dem Beispiel für externes Zubehör (EADemo) von Apple.rein mit der run-loop statt polling.Platzieren des Streams in einem Hintergrund-Thread, wie in diesem Beitrag vorgeschlagen.Entfernen aller NSLogs, um die Leistung zu verbessern.im Debug- und Release-Modus kompiliert.

Eine Sache, die funktioniert, verlangsamt die Datenübertragung (d. H. Weniger als 5 kB / s), da das iOS- und BT-Modul länger verbunden bleiben und Daten übertragen kann, bevor die Verbindung getrennt wird.

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

Antworten auf die Frage(1)

Ihre Antwort auf die Frage