Android 6.0 Marshmallow BLE: parâmetros de conexão

O gerenciamento de parâmetros de conexão Bluetooth Low Energy parece ter sido alterado no Android 6.

Eu tenho um dispositivo periférico BLE que precisa usar alguns parâmetros de conexão específicos (principalmente o intervalo de conexão) e quero usar o intervalo mínimo de conexão permitido pela especificação BLE (ou seja, 7,5ms).

O SDK do Android não permite escolhê-lo no lado do BLE GAP Central (o smartphone); portanto, a maneira correta de fazer isso é fazer com que meu dispositivo periférico GAP envie umL2CAP Connection Parameter Update Request após a conexão GAP.

Os parâmetros solicitados são:

intervalo de conexão min: 7,5msintervalo de conexão máx: 7,5mslatência do escravo: 0timeout de supervisão: 2000ms

Isso funcionou como esperado com todos os dispositivos Android que eu testava, da 4.3 à 5.x: depois de enviar oL2CAP Connection Parameter Update Request, meu dispositivo recebe umL2CAP Connection Parameter Update Response com 0x0000 (aceito), seguido por umLE Connection Update Complete event onde posso ver que os parâmetros de conexão solicitados foram bem considerados.

Agora, com um tablet Nexus 9 ou 2 dispositivos Nexus 5 diferentes, todos com Android 6.0.1, posso ver que oL2CAP Connection Parameter Update Request é sempre rejeitado (recebo umL2CAP Connection Parameter Update Response com 0x0001 (rejeitado)). Então eu recebo umLE Connection Update Complete event onde posso ver que os parâmetros de conexão solicitados NÃO foram levados em consideração.

Eu tenho tentado isso com 2 implementações diferentes no lado periférico (um com o BlueNRG da ST Microelectronics, outro com o nRF52 da Nordic Semiconductor), ambos com exatamente o mesmo resultado.

Depois de mais testes: tentei diferentes conjuntos de parâmetros, alterando o intervalo de conexão máximo (mantive os outros parâmetros da mesma forma). Aqui está o que eu encontrei:

com intervalo de conexão máximo = 18,75 ms, a solicitação de atualização foi aceita com intervalo definido em 18,75 mscom intervalo de conexão máximo = 17,50 ms, a solicitação de atualização foi aceita com intervalo definido para 15,00 mscom intervalo de conexão máximo = 15,00 ms, a solicitação de atualização foi aceita com intervalo definido para 15,00 mscom intervalo de conexão máximo = 13,75 ms, a solicitação de atualização foi aceita com intervalo definido para 11,25 mscom intervalo de conexão máximo = 11,25ms, a solicitação de atualização foi aceita com intervalo definido para 11,25mscom qualquer outro valor máximo do intervalo de conexão abaixo de 11,25ms, sou rejeitado.

Portanto, a observação é que algo mudou claramente com a maneira como a pilha BLE do Android 6 lida com os parâmetros de conexão. Mas não parece haver nenhum tipo de informação ou documentação para confirmar isso.

Minhas observações levam a uma conclusão de que o intervalo mínimo de conexão permitido agora é 11.25ms (o que realmente se adequa às minhas necessidades) em vez de 7.5ms nas versões anteriores do Android. Mas, tendo encontrado empiricamente, gostaria de ter certeza de que não estou perdendo outras restrições / regras ou se esse mínimo não seria dinâmico, dependendo, por exemplo, do nível atual da bateria ...

O que seria ótimo seria ter o equivalente aDiretrizes de design do Bluetooth da Apple (cf. §3.6) para esclarecer as coisas sobre como um periférico LE deve lidar com esse tópico.

Alguém está com o mesmo problema ou conhece algumas informações mais úteis do Google?

questionAnswers(4)

yourAnswerToTheQuestion