O RN42 Bluetooth é desconectado no iOS em segundos após a transmissão de dados
Eu tenho tentado ler dados de um dispositivo via Bluetooth 2.1 usando um RN-42. O dispositivo é emparelhado com um iPhone ou iPad Mini e os dados são transmitidos brevemente, mas o módulo iOS e BT é desconectado (desemparelhar) em segundos (menos de 10). O dispositivo está emitindo dados de 5-10kB / s, de modo que estão dentro das especificações do Bluetooth. Algo que também notei é que quando executo a função NSInputStream, [NSInputStream lê: maxLength:], o número de bytes retornados é sempre 158 ou menos. O aplicativo e o hardware não travam, mas o Bluetooth é desativado.
O dispositivo ainda está enviando dados para o RN42 mesmo após a desconexão, o que reduz a probabilidade de um problema no lado eletrônico. Esta configuração também funciona perfeitamente em dispositivos Android. Eu posso transmitir dados sem qualquer desconexão ou falha.
Coisas que eu tentei ...
seguiu o exemplo External Accessory, EADemo, fornecido pela Apple.puramente usando o loop de execução em vez de pesquisa.colocando o fluxo em um thread de fundo, como sugerido neste post.removendo todos os NSLogs para ajudar com o desempenho.compilado nos modos de depuração e liberação.Uma coisa que funciona é diminuir a transferência de dados (ou seja, menos de 5kB / s), pois isso permite que o módulo iOS e BT permaneça conectado e transfira os dados por mais tempo antes de desconectar.
#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;
[...]