A publicidade do Bluetooth LE falha ao iniciar e parar ciclicamente
Experimentei a publicidade Bluetooth LE, ou seja, usando um telefone Android como um dispositivo "periférico" BLE. Iniciar e interromper uma publicidade constante funciona uma vez, mas se eu realmente quiser transmitir alguns dados variáveis, preciso iniciar, interromper e reiniciar a publicidade em um ciclo e sempre alterar o pacote de publicidade.
Estou usando esses métodos, é claro:
BluetoothLeAdvertiser.startAdvertising ()
BluetoothLeAdvertiser.stopAdvertising ()
Pelo menos em um Motorola Moto G 4G de segunda geração. (XT1072) com Android 5.0.2, o ciclo dura apenas um tempo e, em seguida, algo sai errado na pilha Bluetooth e uma nova publicidade não pode mais ser iniciada. Ao executar o ciclo rapidamente, isso acontece rapidamente e, se estiver lento, leva mais tempo para que possa estar relacionado ao preenchimento de algum buffer.
Minha pergunta é: Isso também acontece em outros dispositivos que não a Motorola?
(E quaisquer outros comentários relacionados são obviamente bem-vindos.)
Teoricamente, isso pode depender de alguma implementação específica do fabricante do HAL, etc., então eu gostaria de saber se devo obter outro dispositivo para poder trabalhar nisso, pois qualquer correção do Google / Motorola levaria algum tempo, é claro.
Este aplicativo de teste. pode ser usado para tentar isso:
https://bitbucket.org/MarkusKauppinen/bleadvertisertest
Se tudo correr bem, manteremos a publicidade para sempre e, se esse problema se reproduzir, ele exibirá uma caixa de diálogo em alguns minutos. Se o seu dispositivo não suportar publicidade Bluetooth LE ou BLE, ele simplesmente trava. (É apenas um aplicativo de teste rápido e sujo).
Outra maneira fácil de reproduzir isso é executar o aplicativo "bluetoothadvertiser" dehttps://github.com/devunwired/accessory-samples e continue tocando rapidamente no botão "Atualizar anúncio" na interface do usuário por um tempo.
Detalhes adicionais:
O suporte ao modo periférico Bluetooth LE (necessário para publicidade) foi adicionado no Lollipop e não está disponível na 4.x. Apenas determinados dispositivos têm o suporte ao modo periférico. A compatibilidade é coberta pelo menos em:
https://altbeacon.github.io/android-beacon-library/beacon-transmitter-devices.html Chipsets / dispositivos compatíveis com o modo periférico Android 5 BLE chipsets com suporte à função periférica BLE no Android 5
Por exemplo, esses dispositivos devem ter o suporte: Motorola Moto E 4G (2015), Motorola Moto G 4G (2ª geração), Sony Xperia M4 Aqua, ZTE Blade S6, Motorola Moto X (2014), Samsung Galaxy S6, Google Nexus 6 , Google Nexus 9, HTC One M9, Samsung Galaxy S6 Edge.
Quanto aos "detalhes sujos", sempre vejo uma "GKI_Exception" no LogCat antes que isso aconteça:
GKI_exception (): 65524 getbuf: sem buffers
Logo após a primeira "GKI_Exception", o anúncio falha com AdvertiseCallback.ADVERTISE_FAILED_INTERNAL_ERROR. A linha...
E / BtGatt.btif? ### ASSERT: externo / bluetooth / bluedroid / main /../ btif / src / btif_gatt_client.c linha 803 A transferência de contexto falhou! (3) ###
... provavelmente é relevante, mas não estou familiarizado com o BlueDroid. A afirmação mencionada está aqui:
Alguns problemas possivelmente relacionados:
https://code.google.com/p/android/issues/detail?id=65455 <- Adicionei alguns comentários e arquivos de log a este.
https://code.google.com/p/android-developer-preview/issues/detail?id=1753
Digitalizando um grande número de tags BLE
Falha no Bluetooth no Samsung S4