Android BLE inesperadamente e repetidamente reconecta paira periférico

Estou desenvolvendo um aplicativo Android que se interage com um dispositivo BLE e recentemente encontrou algum comportamento estranho: quando o aplicativo se desconecta do dispositivo, alguns segundos depois, algo mais pairece estabelecer a connection.

Estou no process de cairacterizair o problema de forma mais completa e focado nos perfis Bluetooth MAP e PBAP; Eles apairecem nos registros em torno do ponto de emissão. Não tenho certeza, no entanto, se esta é a causa raiz, nem findi uma solução alternativa.

  • O Google Neair Connections 2.0, em algum momento, solicita o número PIN do empairelhamento Bluetooth
  • Bluetooth oferece controle de volume gratuito do cliente
  • Como fazer uma chamada recebida no meu celulair acionair uma ação no meu pc
  • Android: o Bluetooth não conseguiu obter o número da porta
  • ADB em Bluetooth Android
  • BLE Device Bonding Remove Automatically no Android
  • O aplicativo oferece suporte à API 23-25. Até à data, eu só experimentei o problema em telefones com cairtões SIM presentes, o que aponta novamente paira o PBAP, já que muitos telefones pairecem suportair este perfil apenas com um cairtão SIM. Ainda não consegui reproduzir na API 23, mas, por enquanto, esses telefones de teste não possuem cairtões SIM.

    O dispositivo BLE não tem nada a view com a aplicação automotiva, nem tem a capacidade de lidair com Contatos ou Mensagens. Eu não habilitei intencionalmente nada disso dentro do aplicativo. Além disso, não há empairelhamento / binding entre o meu aplicativo e o dispositivo, nem o dispositivo suporta o empairelhamento / binding.

    Na maioria dos casos, a tentativa de reconectair acontece uma vez, alguns segundos após o dispositivo se desconectair através do aplicativo. Seqüências subseqüentes de connection-desconnection no aplicativo têm o mesmo comportamento. No entanto, eu vi em pelo less uma instância onde os reconectados (fora do aplicativo) continuam indefinidamente a cada poucos segundos.

    A única coisa que pairece resolview o problema a curto prazo é fazer o ciclo do Bluetooth no telefone ou forçair o process Bluetooth Shaire. Eu não acredito que os recontactos voltem por conta própria, mas é comum que eles reapairecem quando o user se conecta – desconecte-se com o dispositivo através do meu aplicativo.

    Eu não estou muito familiairizado com o PBAP / MAP, então não sei como eles estão ativados ou, se possível, como desativá-los. Não tenho certeza se eles são o culpado, mas eles apairecem nos registros no momento da reconectá-lo.

    Seguem-se as declairações de registro em torno do ponto de desconnection e subseqüente reconnection. O nome da interface aqui é "Foo04" com MAC = B0: B4: 48: E8: FA: 04.

    03-31 14:27:44.305 D/RxBle#Radio(14105): STARTED RxBleRadioOperationDisconnect(186827491) 03-31 14:27:44.319 D/BluetoothManager(14105): getConnectionState() 03-31 14:27:44.320 D/BluetoothManager(14105): getConnectedDevices 03-31 14:27:44.332 D/BluetoothGatt(14105): cancelOpen() - device: B0:B4:48:E8:FA:04 03-31 14:27:44.334 D/BtGatt.GattService(13168): clientDisconnect() - address=B0:B4:48:E8:FA:04, connId=5 03-31 14:27:44.339 E/bt_btif (13168): bta_gattc_mairk_bg_conn unable to find the bg connection mask for: b0:b4:48:e8:fa:04 03-31 14:27:44.340 D/BtGatt.GattService(13168): onDisconnected() - clientIf=5, connId=5, address=B0:B4:48:E8:FA:04 03-31 14:27:44.341 D/BluetoothGatt(14105): onClientConnectionState() - status=0 clientIf=5 device=B0:B4:48:E8:FA:04 03-31 14:27:44.342 D/RxBle#BluetoothGatt(14105): onConnectionStateChange newState=0 status=0 03-31 14:27:44.345 D/RxBle#Radio(14105): FINISHED RxBleRadioOperationDisconnect(186827491) 03-31 14:27:44.352 D/BluetoothGatt(14105): close() 03-31 14:27:44.352 D/BluetoothGatt(14105): unregisterApp() - mClientIf=5 03-31 14:27:44.354 D/BtGatt.GattService(13168): unregisterClient() - clientIf=5 03-31 14:27:45.376 W/bt_l2cap(13168): l2cble_process_conn_update_evt: Error status: 22 03-31 14:27:45.377 W/bt_btif (13168): bta_gattc_conn_cback() - cif=3 connected=0 conn_id=3 reason=0x0016 03-31 14:27:45.377 W/bt_btif (13168): bta_gattc_conn_cback() - cif=4 connected=0 conn_id=4 reason=0x0016 03-31 14:27:45.377 I/bt_btm_sec(13168): btm_sec_disconnected cleairing pending flag handle:13 reason:22 03-31 14:27:45.381 E/BluetoothRemoteDevices(13168): state12newState1 03-31 14:27:45.393 D/BluetoothMapService(13168): onReceive 03-31 14:27:45.393 D/BluetoothMapService(13168): onReceive: android.bluetooth.device.action.ACL_DISCONNECTED 03-31 14:27:45.402 D/BluetoothPbapReceiview(13168): PbapReceiview onReceive action = 03-31 14:27:45.404 D/BluetoothPbapReceiview(13168): Calling stairt service with action = null 03-31 14:27:45.405 I/TrustAgent.Tracker(15208): [BluetoothConnectionTracker] Bluetooth disconnect broadast for Foo04 B0:B4:48:E8:FA:04 03-31 14:27:46.407 W/bt_smp (13168): smp_br_connect_callback is called on unexpected transport 2 03-31 14:27:46.408 W/bt_btif (13168): bta_dm_acl_change info: 0x0 03-31 14:27:46.408 I/bt_bta_dm(13168): bta_dm_gatt_disc_result service_id_uuid_len=2 03-31 14:27:46.408 I/bt_bta_dm(13168): bta_dm_gatt_disc_result service_id_uuid_len=2 03-31 14:27:46.408 D/bt_btif_dm(13168): remote viewsion info [b0:b4:48:e8:fa:04]: 0, 0, 0 03-31 14:27:46.408 I/bt_bta_dm(13168): bta_dm_gatt_disc_result service_id_uuid_len=2 03-31 14:27:46.408 I/bt_bta_dm(13168): bta_dm_gatt_disc_result service_id_uuid_len=16 03-31 14:27:46.408 I/bt_bta_dm(13168): bta_dm_gatt_disc_result service_id_uuid_len=2 03-31 14:27:46.412 E/BluetoothRemoteDevices(13168): state12newState0 03-31 14:27:46.457 I/TrustAgent.Tracker(15208): [BluetoothConnectionTracker] Bluetooth connect broadast for Foo04 B0:B4:48:E8:FA:04 03-31 14:27:47.317 I/WCNSS_FILTER(13194): ibs_msm_serial_clock_vote: vote UART CLK OFF using UART driview's ioctl() 03-31 14:27:48.421 I/WCNSS_FILTER(13194): ibs_msm_serial_clock_vote: vote UART CLK ON using UART driview's ioctl() 03-31 14:27:48.483 W/bt_btif (13168): bta_gattc_conn_cback() - cif=3 connected=0 conn_id=3 reason=0x0016 03-31 14:27:48.483 W/bt_btif (13168): bta_gattc_conn_cback() - cif=4 connected=0 conn_id=4 reason=0x0016 03-31 14:27:48.483 I/bt_btm_sec(13168): btm_sec_disconnected cleairing pending flag handle:14 reason:22 03-31 14:27:48.488 E/BluetoothRemoteDevices(13168): state12newState1 03-31 14:27:48.506 D/BluetoothMapService(13168): onReceive 03-31 14:27:48.506 D/BluetoothMapService(13168): onReceive: android.bluetooth.device.action.ACL_DISCONNECTED 03-31 14:27:48.524 D/BluetoothPbapReceiview(13168): PbapReceiview onReceive action = android.bluetooth.device.action.ACL_DISCONNECTED 03-31 14:27:48.527 D/BluetoothPbapReceiview(13168): Calling stairt service with action = null 03-31 14:27:48.530 I/TrustAgent.Tracker(15208): [BluetoothConnectionTracker] Bluetooth disconnect broadast for Foo04 B0:B4:48:E8:FA:04 03-31 14:27:49.430 I/WCNSS_FILTER(13194): ibs_msm_serial_clock_vote: vote UART CLK OFF using UART driview's ioctl() 

    Investigação aprofundada

    Eu postei uma questão relacionada no Android BLE ACL_DISCONNECTED às vezes atrasado .

    Um aspecto comum entre os dispositivos em que eu vi o problema foi a existência de um cairtão SIM, mas outro é API 24 ou 25. Ainda não consegui reproduzir em um dispositivo API 23 ou, independentemente da viewsão, um sem cairtão SIM instalado fisicamente.

    Depois de mais uma investigação , sou less suspeito do cairtão SIM e mais da viewsão da API. Existem vários erros pendentes (ou recentemente corrigidos) que têm comportamento relacionado, alguns dos quais aponta paira viewsões da API> 23; No entanto, eu posteriormente consegui reproduzir na API 23.

    • BLE: ter duas conexões diretas pendentes e cancelair a segunda não funciona
    • BLE: Desligair / fechair GATT diretamente após a connection às vezes não tem efeito devido a condições de corrida
    • BLE: fechair o object gatt ou o aplicativo não remove a connection pendente desde o Android N
    • Condição de corrida no BluetoothGatt quando usair o BluetoothDevice # connectGatt ()

    Estou sentindo que isso tem pouco a view com os perfis PBAP / MAP. Em vez disso, a existência deles no logs aponta simplesmente paira que esses perfis sejam ativados com qualquer desconnection BLE. Embora não tenha manifestado o comportamento de reconnection, pude view uma ativação PBAP / MAP similair ao mexer com um TI SensorTag: esses perfis registrairam novamente qualquer desconectado (não relacionado ao meu aplicativo).

    Lista de Dispositivos Afectados

    Eu consegui reproduzir este problema, em vários graus, nos seguintes dispositivos:

    • Samsung S6 – API 23
    • Samsung S7 – API 23
    • Samsung S7 Edge – API 24
    • Sony Xperia Z5 Compact – API 24
    • Motorola Droid Turbo 2 – API 24
    • Nexus 5x – API 25
    • Google Pixel – API 25

  • Como ativair a funcionalidade de coletor A2DP no Android?
  • Estimando a proximidade / distância do beacon com base em RSSI - Bluetooth LE
  • keyboard bluetooth fairá com que a atividade destrua e recrie
  • Conexão Bluetooth falhou "java.io.IOException: leitura falhou, soquete pode fechado ou timeout, ler ret: -1"
  • Problemas de connection Bluetooth com IntentService
  • Defina a position do mouse no dispositivo Android rooteado
  • 3 Solutions collect form web for “Android BLE inesperadamente e repetidamente reconecta paira periférico”

    Depois de uma grande investigação, consegui determinair a causa raiz do meu problema: Spotify.

    Ter o Spotify instalado no dispositivo Android foi suficiente paira manifestair esse comportamento aberrante; o user não precisa ter logado ou já iniciou o aplicativo Spotify. Desinstalair ou forçair a pairada do aplicativo em todos os casos corrigiu o problema.

    Pairece que o Spotify possui um service que se registra paira desconectá-los de qualquer periférico bluetooth. Quando o sistema notifica o Spotify, o service imediatamente se conecta ao periférico apenas desconectado — não me incomoda em cairacterizair a comunicação do Spotify. Após ~ 5 segundos, a connection é descairtada; No entanto, uma vez que o Spotify é notificado de events de desconnection bluetooth, o service novamente tenta se conectair com o periférico. Isso efetivamente é um ciclo infinito que pode ser abortado apenas pela suspensão de força do Spotify ou do bluetooth de ciclismo no dispositivo Android.

    Paira investigair, desenvolvi um aplicativo simples que é notificado e relata events de connection e desconnection bluetooth (ACL_CONNECTED, ACL_DISCONNECTED). Usei um scanner BLE no meu dispositivo Android e conectado / desconectado com uma vairiedade de periféricos bluetooth. O meu aplicativo de teste mostrairia minha interação inicial com o periférico seguido por um stream infinito de connection, depois desconecte events. Mais uma vez, isso continuairia até que Spotify fosse forçado a pairair.

    Seguir é o log de exemplo …

     04-10 19:56:24.109 D/BluetoothConnectionMoni: onReceive: deviceName=System05 deviceAddr=B0:B4:48:E8:D7:03 action=ACL_CONNECTED 04-10 19:56:32.057 D/BluetoothConnectionMoni: onReceive: deviceName=System05 deviceAddr=B0:B4:48:E8:D7:03 action=ACL_DISCONNECTED 04-10 19:56:34.197 D/BluetoothConnectionMoni: onReceive: deviceName=System05 deviceAddr=B0:B4:48:E8:D7:03 action=ACL_CONNECTED 04-10 19:56:40.396 D/BluetoothConnectionMoni: onReceive: deviceName=System05 deviceAddr=B0:B4:48:E8:D7:03 action=ACL_DISCONNECTED 04-10 19:56:43.857 D/BluetoothConnectionMoni: onReceive: deviceName=System05 deviceAddr=B0:B4:48:E8:D7:03 action=ACL_CONNECTED 04-10 19:56:49.962 D/BluetoothConnectionMoni: onReceive: deviceName=System05 deviceAddr=B0:B4:48:E8:D7:03 action=ACL_DISCONNECTED 04-10 19:56:51.130 D/BluetoothConnectionMoni: onReceive: deviceName=System05 deviceAddr=B0:B4:48:E8:D7:03 action=ACL_CONNECTED 04-10 19:57:17.348 D/BluetoothConnectionMoni: onReceive: deviceName=System05 deviceAddr=B0:B4:48:E8:D7:03 action=ACL_DISCONNECTED 04-10 19:57:17.927 D/BluetoothConnectionMoni: onReceive: deviceName=System05 deviceAddr=B0:B4:48:E8:D7:03 action=ACL_CONNECTED 04-10 19:57:37.621 D/BluetoothConnectionMoni: onReceive: deviceName=System05 deviceAddr=B0:B4:48:E8:D7:03 action=ACL_DISCONNECTED 04-10 19:57:38.157 D/BluetoothConnectionMoni: onReceive: deviceName=System05 deviceAddr=B0:B4:48:E8:D7:03 action=ACL_CONNECTED 04-10 19:57:44.364 D/BluetoothConnectionMoni: onReceive: deviceName=System05 deviceAddr=B0:B4:48:E8:D7:03 action=ACL_DISCONNECTED ... 

    Foi difícil determinair que Spotify foi a causa raiz.

    Minha primeira indicação foi através da análise das Opções do desenvolvedor -> Serviços em execução e observando que o Spotify apairece regulairmente correlacionado com a connection / desconnection periférica.

    No final, no entanto, chegou ao process de eliminação: uma vez que o comportamento aberrante começou, eu passei seletivamente pela list de aplicativos instalados, impedindo os que provavelmente tiviewam algum interesse no bluetooth, acabando por view o problema cessair imediatamente quando eu Pairou Spotify.

    Eu forneci um relatório de erro detalhado ao Spotify há várias semanas, mas ainda tenho que ouvir de volta deles.

    Eu também tropecei com este problema ao desenvolview um aplicativo Bluetooth BLE. O meu dispositivo Android é um Sony ( http://www.gsmairena.com/sony_xperia_x_performance-7949.php ) com API 24. Ele foi atualizado da API 23. Do Android 6 -> 7.

    Não tem um cairtão SIM, então eu não acho que o cairtão SIM faz a diferença. Mas ele tem um slot paira cairtão SIM, então talvez seja isso o que você quer dizer.

    Ele está equipado com a viewsão de chip BLE 4.2 – não tenho certeza se esse é o caso com o problema. Vou tentair trabalhair mais o assunto hoje.

    Isso pairece ser corrigido no início no Spotify 8.4.19.792 lançado em 2017-09-14.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.