Я пытался считать данные с устройства через 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;
[...]