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

person Rami Alhamad    schedule 31.10.2013    source источник


Ответы (1)


Я разговаривал с ребятами из Microchip (компания, которая купила Roving Networks, которые были первоначальными производителями RN42) об этом типе проблемы, и кажется, что есть неприятная маленькая «особенность», которая нигде не задокументирована. инструкции РН42.

Когда RN42 используется для связи с устройством iOS, скорость передачи данных не может превышать 2,5–3 КБ/с... Если он используется для связи с Android, компьютером или чем-либо еще, он может передавать данные со скоростью 35 КБ/с (через SPP). .

Причиной этого является недостаточная мощность чипа в RN42, который не может обрабатывать как стек BT, так и байты переупаковки в формате, необходимом для устройства iOS (протокол iAP).

Они рекомендуют следующие варианты:

  1. Переключитесь на использование WiFi-модуля.
  2. Реализуйте протокол iAP на своем микроконтроллере и используйте обычный RN42 для передачи данных (теоретически скорость должна быть 35 КБ/с).
  3. Буферизируйте данные на своем устройстве и отправляйте их обратно с меньшей скоростью.
  4. Используйте ванильный RN42 и одно из их устройств PIC, которое реализует стек iAP.

У меня есть вежливое пятое предложение... Найдите новый Bluetooth-модуль, поддерживаемый Apple.

Кроме того, использование 4-проводной связи UART должно помочь при сбоях.

person SJoshi    schedule 17.11.2013
comment
Вы нашли другой модуль Bluetooth, поддерживаемый Apple? мне это тоже нужно - person 4ntoine; 25.02.2015
comment
@4ntoine Попробуйте варианты AmpedRF. У них есть хорошая коллекция модулей BLE и BT. - person SJoshi; 25.02.2015
comment
Кажется, это то, что мне нужно. Но вроде и обычным пользователям их не продают? - person 4ntoine; 26.02.2015
comment
Если это хобби-проект, для которого вы покупаете несколько? Возможно нет. Если это 1k ‹ x ‹ 10k единиц, они будут. ST Micro white маркирует свой BT33 как SPBT2632, но с более дрянной прошивкой - работает достаточно хорошо. В качестве альтернативы, я думаю, что Arrow является дистрибьютором AmpedRF, так что это может быть вариантом. - person SJoshi; 26.02.2015
comment
Это хобби-проект (проект приложения для iOS), но он требует некоторых аппаратных решений, которые пользователи приложения должны иметь возможность сделать самостоятельно или купить в магазине. Поэтому я рассчитываю найти или разработать самостоятельно (и пользователи должны иметь возможность загружать его в модуль BT без дополнительной оплаты) прошивку модуля BT или просто найти подходящий модуль BT. Я не собираюсь разрабатывать новое оборудование, а только программное обеспечение. - person 4ntoine; 26.02.2015
comment
Хорошо, просто к вашему сведению, если вы не знали, но для использования классического Bluetooth с iOS вам нужен модуль MFI — и Apple действительно не так легко их отдает. - person SJoshi; 26.02.2015
comment
да, я был бы рад найти сертифицированный MFi модуль BT 2.1 менее чем за 10 долларов, который я могу купить в магазине - person 4ntoine; 26.02.2015
comment
Какие-нибудь новости о другом модуле Bluetooth, сертифицированном MFi? - person Arnlen; 25.08.2017
comment
@Arnlen Я давно не использовал Bluetooth Classic - придерживайтесь BLE 5.0 - и у вас будет лучшая поддержка по всем направлениям (без MFI) - person SJoshi; 15.10.2017