Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android BLE inesperada y repetidamente se vuelve a conectar a dispositivos periféricos

Estoy desarrollando una aplicación de Android que interactúa con un dispositivo BLE y recientemente tropezó con un comportamiento extraño: cuando la aplicación se desconecta del dispositivo, unos segundos más tarde algo más parece establecer la conexión.

Estoy en el proceso de caracterizar el problema más plenamente y me he centrado en los perfiles Bluetooth MAP y PBAP; Que aparecen en los registros alrededor del punto de emisión. No estoy seguro, sin embargo, si esta es la causa raíz, ni he encontrado una solución.

  • Android Sqlite obtiene la última inserción de fila id
  • "No se puede resolver el símbolo R" en Android Studio
  • Elementos de menú del fragmento de ActionBar. Poniéndolas delante
  • Mal rendimiento con Guava Cache en Android
  • Error en la compilación de gradle después de actualizar Android Studio con log4j
  • No se puede agregar biblioteca a mi proyecto android
  • La aplicación admite API 23-25. Hasta la fecha, sólo he experimentado el problema en los teléfonos con tarjetas SIM presentes, lo que señala de nuevo a PBAP ya que muchos teléfonos parecen apoyar este perfil sólo con una tarjeta SIM. Todavía no he podido reproducir en API 23, pero por ahora los teléfonos de prueba no tienen tarjetas SIM.

    El dispositivo BLE no tiene nada que ver con la aplicación automotriz, ni tiene la capacidad de tratar con contactos o mensajería. No he permitido intencionalmente nada de esto dentro de la aplicación. Además, no hay vinculación / vinculación entre mi aplicación y el dispositivo, ni el dispositivo de apoyo de vinculación / vinculación.

    En la mayoría de los casos, el intento de volver a conectar se produce una vez, unos segundos después de la desconexión del dispositivo a través de la aplicación. Secuencias subsecuentes de conexión-desconexión en la aplicación tienen el mismo comportamiento. Sin embargo, he visto en al menos un caso en el que los reconectos (fuera de la aplicación) continúan indefinidamente cada pocos segundos.

    Lo único que parece resolver el problema a corto plazo es el ciclo de Bluetooth en el teléfono, o la fuerza de detener el proceso de compartir Bluetooth. No creo que los reconectados vuelvan por sí mismos, pero es común que vuelvan a aparecer una vez que el usuario se conecta-se desconecta con el dispositivo a través de mi aplicación.

    No estoy muy familiarizado con PBAP / MAP, así que no sé cómo se habilitan o, si es posible, cómo deshabilitarlos. No estoy seguro de si son el culpable, pero aparecen en los registros en el momento de volver a conectar.

    A continuación se muestran las sentencias de registro alrededor del punto de desconexión y posterior reconexión. El nombre de la interfaz aquí es "Foo04" con 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_mark_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 clearing 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/BluetoothPbapReceiver(13168): PbapReceiver onReceive action = 03-31 14:27:45.404 D/BluetoothPbapReceiver(13168): Calling start 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 version 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 driver's ioctl() 03-31 14:27:48.421 I/WCNSS_FILTER(13194): ibs_msm_serial_clock_vote: vote UART CLK ON using UART driver'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 clearing 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/BluetoothPbapReceiver(13168): PbapReceiver onReceive action = android.bluetooth.device.action.ACL_DISCONNECTED 03-31 14:27:48.527 D/BluetoothPbapReceiver(13168): Calling start 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 driver's ioctl() 

    Investigación exahustiva

    He publicado una pregunta relacionada en Android BLE ACL_DISCONNECTED a veces con retraso .

    Una característica común entre los dispositivos donde he visto el problema ha sido la existencia de una tarjeta SIM, pero otra es API 24 o 25. Todavía no he podido reproducir en un dispositivo API 23 o, independientemente de la versión, Uno sin una tarjeta SIM instalada físicamente.

    Después de una investigación aún más , estoy menos sospechoso de la tarjeta SIM, y más de la versión de la API. Existen varios errores pendientes (o recientemente corregidos) que tienen un comportamiento relacionado, algunos de los cuales apuntan a versiones API> 23; Sin embargo, posteriormente he podido reproducir en API 23.

    • BLE: Tener dos conexiones directas pendientes y cancelar la segunda no funciona
    • BLE: Desconectar / cerrar GATT directamente después de conectarse a veces no tiene ningún efecto debido a las condiciones de carrera
    • BLE: cerrar gatt objeto o aplicación no quita la conexión pendiente ya Android N
    • Condición de carrera en BluetoothGatt cuando se utiliza BluetoothDevice # connectGatt ()

    Siento que esto tiene poco que ver con los perfiles PBAP / MAP. Más bien, la existencia de ellos en los registros apunta simplemente a estos perfiles que se activan con cualquier desconexión BLE. Aunque no manifesté el comportamiento de la reconexión, pude ver una activación similar de PBAP / MAP al manipular una TI SensorTag: estos perfiles registraron de nuevo cualquier desconexión (no relacionada con mi aplicación).

    Lista de dispositivos afectados

    He podido reproducir este problema, en diversos grados, en los siguientes 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

  • ¿Cómo notificar a los usuarios sobre la actualización de una aplicación para Android?
  • Unsatisfiedlinkerror con la actualización de Android 5.0.1
  • Dimensiones extraíbles de 9 parches Android. ¿Cómo manejan las diferentes densidades las áreas no estiradas?
  • Android: clic largo en un botón -> realizar acciones
  • Múltiples marcadores con texto en Google Maps API v2
  • Androide; MapView, ¿cómo puedo establecer la ubicación predeterminada?
  • 2 Solutions collect form web for “Android BLE inesperada y repetidamente se vuelve a conectar a dispositivos periféricos”

    Después de una gran cantidad de investigación, pude determinar la causa raíz de mi problema: Spotify.

    Tener Spotify instalado en el dispositivo Android fue suficiente para manifestar este comportamiento aberrante; El usuario no necesita haber iniciado la aplicación Spotify ni haber empezado a hacerlo. La desinstalación o la suspensión de la aplicación en todos los casos corrigió el problema.

    Parece que Spotify tiene un servicio que se registra para desconectarse de cualquier periférico bluetooth. Cuando el sistema notifica a Spotify, el servicio se conecta inmediatamente al periférico recién desconectado — No me molesté en caracterizar la comunicación de Spotify. Después de ~ 5 segundos la conexión se deja caer; Sin embargo, desde que Spotify es notificado de los eventos de desconexión Bluetooth, el servicio de nuevo intenta conectarse con el periférico. Esto es efectivamente un bucle infinito que puede ser abortado sólo por la fuerza de detención de Spotify o ciclismo bluetooth en el dispositivo Android.

    Para investigar, desarrollé una aplicación sencilla notificada de los eventos de conexión y desconexión de bluetooth (ACL_CONNECTED, ACL_DISCONNECTED). Utilicé un escáner BLE en mi dispositivo Android y conectado / desconectado con una variedad de periféricos bluetooth. Mi aplicación de prueba mostraría mi interacción inicial con el periférico seguida de una secuencia infinita de eventos de conexión y desconexión. Una vez más, esto continuaría hasta que Spotify fue detenido por la fuerza.

    A continuación se muestra un ejemplo de registro …

     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 ... 

    Fue difícil determinar Spotify fue la causa raíz.

    Mi primera indicación fue a través de las Opciones de Desarrollador -> Ejecución de Servicios y anotar Spotify regularmente apareciendo correlacionado con la conexión periférica / desconexión.

    Al final, sin embargo, vino abajo al proceso de la eliminación: Una vez que el comportamiento aberrante comenzó, selectivamente fui a través de la lista de aplicaciones instaladas, detener la fuerza que probablemente tenía algún interés en el bluetooth, eventualmente ver el problema cesar inmediatamente cuando yo Paró Spotify.

    He proporcionado un informe de error detallado a Spotify hace varias semanas, pero todavía tengo que escuchar de nuevo de ellos.

    También he tropezado con este problema desarrollando una aplicación Bluetooth BLE. Mi dispositivo Android es Sony ( http://www.gsmarena.com/sony_xperia_x_performance-7949.php ) con API 24. Fue actualizado desde la API 23. Desde Android 6 -> 7.

    No tiene una tarjeta SIM, así que no creo que la tarjeta SIM hace la diferencia. Pero sí tiene una ranura de tarjeta SIM, así que quizás esto es lo que quieres decir.

    Se equipara con BLE chip versión 4.2 – no estoy seguro si ese es el caso con su problema. Voy a tratar de trabajar en el tema más hoy.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.