Core Bluetooth diminuir a velocidade ao enviar pacotes

Estou com um problema em que o tempo entre a gravação de um valor para uma característica usando o

[peripheral writeValue:dataPacket forCharacteristic:writeChar type:CBCharacteristicWithResponse]

e o dispositivo iOS enviando fisicamente o pacote bluetooth está progressivamente demorando mais e mais.

Isso pode ser ilustrado na saída a seguir do depurador:

2013-10-23 14:12:17.510 Test App iOS[1561:60b] Packet sent
2013-10-23 14:12:17.595 Test App iOS[1561:60b] Packet sent confirmation, error = (null)
2013-10-23 14:12:17.598 Test App iOS[1561:60b] Packet response received

2013-10-23 14:12:17.611 Test App iOS[1561:60b] Packet sent
2013-10-23 14:12:17.656 Test App iOS[1561:60b] Packet sent confirmation, error = (null)
2013-10-23 14:12:17.657 Test App iOS[1561:60b] Packet response received

2013-10-23 14:12:22.601 Test App iOS[1561:60b] Packet sent
2013-10-23 14:12:23.123 Test App iOS[1561:60b] Packet sent confirmation, error = (null)
2013-10-23 14:12:23.125 Test App iOS[1561:60b] Packet response received

2013-10-23 14:12:27.601 Test App iOS[1561:60b] Packet sent
2013-10-23 14:12:28.111 Test App iOS[1561:60b] Packet sent confirmation, error = (null)
2013-10-23 14:12:28.113 Test App iOS[1561:60b] Packet response received

2013-10-23 14:12:32.611 Test App iOS[1561:60b] Packet sent
2013-10-23 14:12:34.595 Test App iOS[1561:60b] Packet sent confirmation, error = (null)
2013-10-23 14:12:34.597 Test App iOS[1561:60b] Packet response received


2013-10-23 14:12:37.611 Test App iOS[1561:60b] Packet sent
2013-10-23 14:12:39.582 Test App iOS[1561:60b] Packet sent confirmation, error = (null)
2013-10-23 14:12:39.585 Test App iOS[1561:60b] Packet response received

2013-10-23 14:12:42.611 Test App iOS[1561:60b] Packet sent
2013-10-23 14:12:44.570 Test App iOS[1561:60b] Packet sent confirmation, error = (null)
2013-10-23 14:12:44.573 Test App iOS[1561:60b] Packet response received

2013-10-23 14:12:47.611 Test App iOS[1561:60b] Packet sent
2013-10-23 14:12:49.558 Test App iOS[1561:60b] Packet sent confirmation, error = (null)
2013-10-23 14:12:49.560 Test App iOS[1561:60b] Packet response received

// Several packets omitted...

2013-10-23 14:13:07.610 Test App iOS[1561:60b] Packet sent
2013-10-23 14:13:09.508 Test App iOS[1561:60b] Packet sent confirmation, error = (null)
2013-10-23 14:13:09.511 Test App iOS[1561:60b] Packet response received

2013-10-23 14:13:12.610 Test App iOS[1561:60b] Packet sent
2013-10-23 14:13:14.496 Test App iOS[1561:60b] Packet sent confirmation, error = (null)
2013-10-23 14:13:14.498 Test App iOS[1561:60b] Packet response received

// E assim por diante...

A mensagem enviada por pacote é enviada na linha imediatamente após o comando writeValue para gravar o pacote de dados na característica.

O pacote enviado confirmação é saída na primeira linha no método delegado didWriteValueForCharacteristic.

A mensagem de resposta recebida do pacote é enviada no didUpdateValueForCharacteristic, que é chamado quando o dispositivo BTLE envia o pacote de resposta (através de uma característica de notificação secundária) para confirmar o recebimento do meu pacote enviado.

Como pode ser visto inicialmente, o tempo entre minha chamada do método writeValue forCharacteristic e o callback para confirmar que o pacote foi enviado em didWriteValueForCharacteristic é inicialmente 85ms (que já é lento, mas suportável). Eu envio esses pacotes aproximadamente a cada 5 segundos, e depois de apenas um pequeno número de pacotes enviados isso aumenta para ~ 2 segundos depois do qual parece ser estático continuamente a 2 segundos. O pacote de resposta enviado de volta do dispositivo BTLE é sempre ~ 2ms após a confirmação do pacote sendo enviado.

Não entendo por que estou tendo esse atraso nas bibliotecas do CoreBluetooth entre chamar writeValue e o callback de confirmação didWriteValueForCharacteristic.

Em todos os outros aspectos, o código está funcionando perfeitamente (o dispositivo BTLE está fazendo exatamente o que está sendo instruído a fazer e nenhum dos pacotes desaparece).

Eu tenho um aplicativo de exemplo que é fornecido pelo fabricante do módulo BT4.0 (incluindo a fonte) que não experimenta esse atraso crescente - infelizmente o aplicativo de amostra foi projetado para lidar com uma ampla gama de implementações do módulo, não apenas nossa implementação específica e assim é maciçamente complexo contendo muito código que não é relevante para nossa implementação - eu coloquei breakpoints em todas as funções na amostra e passei manualmente para determinar exatamente quais comandos eles estão emitindo, e eu acredito que estou copiando-os perfeitamente ( mas obviamente não).

Não vejo nada que eles estejam fazendo que eu não esteja fazendo e vice-versa. A única diferença que eu posso encontrar entre os dois projetos é que o meu usa o ARC e o deles usa a contagem de referência manual.

Outras informações: Tudo está sendo executado no thread principal (como é com o aplicativo de exemplo do fabricante do módulo) Eu crio o Central Manager usando a fila principal (da mesma forma no aplicativo de exemplo de fabricantes de módulo) A carga da CPU no dispositivo iOS é de apenas 3% meu aplicativo está em execução e nada parece estar atrasado devido à carga da CPU, etc.

Estou arrancando meu cabelo com isso e, se alguém puder sugerir quaisquer possíveis causas ou soluções para esse problema, ficaria eternamente grato!

Obrigado, rico

questionAnswers(2)

yourAnswerToTheQuestion