Atualmente, estou desenvolvendo um aplicativo que utilizará o Bluetooth Low Energy (teste no Nexus 4). Depois de começar com as APIs oficiais do BLE no Android 4.3, notei que, depois de conectar um dispositivo pela primeira vez, raramente consigo conectar / me comunicar com esse dispositivo ou com qualquer outro dispositivo.
Seguindo o guia aqui , posso conectar-me com êxito a um dispositivo, verificar serviços e características e ler / gravar / receber notificações sem problemas. No entanto, após desconectar e reconectar, muitas vezes não consigo verificar os serviços / características ou não consigo concluir uma leitura / gravação. Não consigo encontrar nada nos logs para indicar por que isso está acontecendo.
Quando isso acontece, tenho que desinstalar o aplicativo, desativar o Bluetooth e reiniciar o telefone antes que ele comece a funcionar novamente.
Sempre que um dispositivo é desconectado, lembre-se de chamar close () no objeto BluetoothGatt e defina-o como nulo. Alguma ideia?
EDIT:
Despejos de log: para esses logs, enraíquei meu telefone e aumentamos os níveis de rastreamento de itens relacionados no /etc/bluetooth/bt_stack.conf
Conexão bem-sucedida - Primeira tentativa após reiniciar o telefone e instalar o aplicativo. Sou capaz de conectar, descobrir todos os serviços / características e ler / escrever.
Tentativa com falha 1 - Esta é a próxima tentativa após desconectar da conexão bem-sucedida acima. Parece que fui capaz de descobrir características, mas a primeira tentativa de leitura retornou um valor nulo e foi desconectada logo depois.
Tentativa com falha 2 - Um exemplo em que eu nem consigo descobrir serviços / características.
EDIT 2:
O dispositivo ao qual estou tentando conectar é baseado no chip CC2541 da TI. Eu obtive uma TI SensorTag (também baseada no CC2541) para brincar e descobri que a TI lançou um aplicativo Android para a SensorTag ontem. No entanto, este aplicativo tem o mesmo problema. Eu testei isso em outros dois Nexus 4s com o mesmo resultado: A conexão com o SensorTag foi bem-sucedida na primeira ou na segunda vez, mas (de acordo com os registros) falha ao descobrir serviços a partir de então, causando todos os tipos de falhas. Estou começando a me perguntar se é um problema com esse chip específico?
Respostas:
Dicas importantes de implementação
(Talvez algumas dessas dicas não sejam mais necessárias devido a atualizações do sistema operacional Android.)
android.bluetooth.BluetoothGatt#close()
onLeScan(..)
e conecte-se. Motivo:BluetoothDevice#connectGatt(Context context, boolean autoConnect, BluetoothGattCallback callback)
sempre falha, se chamado dentroLeScanCallback() {...}.onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord)
do mesmo encadeamento no Samsung Galaxy S3 com Android 4.3 (pelo menos para a compilação JSS15J.I9300XXUGMK6)android.bluetooth.BluetoothAdapter#startLeScan(UUID[] serviceUuids, LeScanCallback callback)
com o parâmetro para filtrar determinados UUIDs de serviço, porque isso é completamente quebrado no Samsung Galaxy S3 com Android 4.3 e não funciona para UUIDs de 128 bits em geral.Tutorial para iniciantes
Um bom ponto de entrada para os novatos pode ser este tutorial em vídeo: Desenvolvendo aplicativos inteligentes Bluetooth para Android http://youtu.be/x1y4tEHDwk0
O problema e a solução alternativa descritos abaixo provavelmente foram corrigidos agora pelas atualizações do sistema operacional
Solução alternativa: eu poderia "estabilizar" meu aplicativo fazendo isso ...
Esta solução alternativa é baseada em experiências a seguir ...
fonte
DESLIGANDO WIFI:
Também posso confirmar que desativar o WIFI torna o Bluetooth 4.0 mais estável, especialmente no Google Nexus (eu tenho um Nexus 7).
O problema
é que a aplicação que estou desenvolvendo precisa tanto Wi-Fi e contínuo de varredura Bluetooth LE . Então, desligar o Wi-Fi não era uma opção para mim.
Além disso, percebi que a varredura contínua do Bluetooth LE pode realmente matar a conexão WIFI e tornar o adaptador WIFI incapaz de se reconectar a qualquer rede WIFI até que a varredura BLE esteja ativada. (Não tenho certeza sobre redes móveis e internet móvel).
Isso definitivamente aconteceu nos seguintes dispositivos:
No entanto, a digitalização BLE com WIFI ativado parecia bastante estável em:
Minha solução alternativa
Eu digitalizo o BLE por um curto período de tempo 3 a 4 segundos, depois desligo a digitalização por 3-4 segundos . Depois ligue novamente.
services
oucharacteristics
falhar.fonte
Verifique se o seu Nexus está emparelhado com o dispositivo. Não consigo verificar se a comunicação funciona ou não corretamente, mas você poderá se conectar mais de uma vez sem uma reinicialização. Parece que a primeira conexão não está exigindo emparelhamento, mas todas as tentativas subseqüentes o fazem.Atualizarei esta resposta em alguns dias quando testar a descoberta de serviço e solicitar solicitações de leitura e gravação sem necessidade de reinicialização.
EDIT: Acontece que eu estava testando em uma versão de firmware de desenvolvimento (nosso sensor) que estava causando problemas se não emparelhado. Nossa versão mais recente do firmware de produção funciona bem nos 2540s e 2541s.
EDIT: notei que no Nexus 7 2013, as conexões são mais estáveis quando o Wi-Fi está desativado. Eu gostaria de saber se isso ajuda alguém.
EDIT: Eu pareço tê-lo ao contrário com o emparelhamento. Tudo funciona bem quando não está emparelhado. Após o emparelhamento, estou apresentando exatamente os mesmos sintomas do OP. Ainda não se sabe se isso está relacionado ao nosso firmware ou à API BLE do Android. Tenha cuidado ao testar isso porque, uma vez emparelhado, talvez não seja possível desemparelhar devido a um bug explicado em 3b desta postagem .
fonte
Em alguns modelos, há um defeito: https://code.google.com/p/android/issues/detail?id=180440
Por outro lado, no meu caso, o problema era que minha conexão não estava corretamente fechada no método onDestroy. Após o fechamento correto, o problema para mim não existe, não importa se o wifi está ativado ou desativado.
fonte
close
necessário?Eu estava enfrentando um problema semelhante. Minha correção foi
e chamando fechar após desconectar.
fonte