RN42 Bluetooth отключается на iOS в течение нескольких секунд после потоковой передачи данных

Я пытался читать данные с устройства через Bluetooth 2.1, используя RN-42. Устройство подключается к iPhone или iPad Mini, и данные передаются в течение короткого времени, но модуль iOS & BT отключается (отключается) в течение нескольких секунд (менее 10). Устройство выдает данные 5-10 кБ / с, что вполне соответствует спецификации Bluetooth. Также я заметил, что когда я запускаю функцию NSInputStream, [NSInputStream read: maxLength:], количество возвращаемых байтов всегда равно 158 или меньше. Приложение и аппаратное обеспечение не выходят из строя, но Bluetooth просто отключается.

Устройство все еще отправляет данные на RN42 даже после отключения, что снижает вероятность возникновения проблем со стороны электроники. Эта настройка также отлично работает на устройствах Android. Я могу передавать данные без каких-либо отключений или сбоев.

Вещи, которые я пытался ...

последовал примеру внешнего аксессуара EADemo, предоставленного Apple.просто используя цикл выполнения вместо опроса.поместить поток в фоновую ветку, как это предлагается в этом посте.удаление всех NSLogs, чтобы помочь с производительностью.скомпилирован в режимах отладки и выпуска.

Единственное, что работает, - это замедление передачи данных (т. Е. Менее 5 кБ / с), поскольку это позволяет модулям iOS и BT оставаться на связи и дольше передавать данные перед отключением.

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

Ответы на вопрос(1)

Ваш ответ на вопрос