write studio low example ble android bluetooth bluetooth-lowenergy

studio - Android BLE se vuelve a conectar de forma inesperada y repetida al periférico



bluetooth low energy android example (2)

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 sesión o haber iniciado la aplicación Spotify. Desinstalar o forzar la aplicación de la aplicación en todos los casos solucionó el problema.

Parece que Spotify tiene un servicio que se registra para las desconexiones 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 interrumpe; sin embargo, dado que Spotify recibe notificaciones de eventos de desconexión de Bluetooth, el servicio intenta conectarse de nuevo con el periférico. Esto efectivamente es un bucle infinito que se puede abortar solo con la detención forzada de Spotify o el ciclo Bluetooth en el dispositivo Android.

Para investigar, desarrollé una aplicación simple que se notifica e informa los eventos de conexión y desconexión de Bluetooth (ACL_CONECTADO, ACL_DISCONECTADO). Utilicé un escáner BLE en mi dispositivo Android y lo conecté / desconecté con una variedad de periféricos Bluetooth. Mi aplicación de prueba mostraría mi interacción inicial con el periférico seguido de un flujo infinito de conectar y luego desconectar eventos. De nuevo, esto continuaría hasta que Spotify fuera 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 ...

Era difícil determinar que Spotify fuera la causa raíz.

Mi primera indicación fue a través de mirar Opciones de desarrollador -> Servicios en ejecución y observar que Spotify aparece con frecuencia correlacionada con la conexión / desconexión periférica.

Al final, sin embargo, se redujo al proceso de eliminación: una vez que comenzó el comportamiento aberrante, revisé de forma selectiva la lista de aplicaciones instaladas, aplicaciones de detención de la fuerza que probablemente tenían algún interés en el bluetooth, y finalmente vi que el problema cesaba de inmediato cuando dejó de Spotify.

He proporcionado un informe detallado de errores a Spotify hace varias semanas, pero aún no he recibido respuesta de ellos.

Estoy desarrollando una aplicación para Android que interactúa con un dispositivo BLE y recientemente tropezé con algún 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 de manera más completa y me he centrado en los perfiles Bluetooth MAP y PBAP; 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 alternativa.

La aplicación es compatible con API 23-25. Hasta la fecha, solo he experimentado el problema en teléfonos con tarjetas SIM presentes, lo que apunta nuevamente a PBAP, ya que muchos teléfonos parecen admitir este perfil solo con una tarjeta SIM. Todavía no he podido reproducir en API 23, pero por ahora esos 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 lidiar con Contactos o Mensajería. No he habilitado 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 admite la vinculación / vinculación.

En la mayoría de los casos, el intento de reconectarse ocurre una vez, unos segundos después de que el dispositivo se desconecta a través de la aplicación. Las secuencias de conexión-desconexión subsiguientes en la aplicación tienen el mismo comportamiento. Sin embargo, he visto en al menos una instancia donde las reconexiones (fuera de la aplicación) continúan indefinidamente cada pocos segundos.

Lo único que parece resolver el problema a corto plazo es realizar un ciclo de Bluetooth en el teléfono o forzar la detención del proceso de Bluetooth Share. No creo que las reconexiones vuelvan por sí mismas, pero es común que vuelvan a aparecer una vez que el usuario se conecta y se desconecta con el dispositivo a través de mi aplicación.

No estoy muy familiarizado con PBAP / MAP, por lo que no sé cómo se habilitan o, si es posible, cómo deshabilitarlos. No estoy seguro de si son los culpables, pero aparecen en los registros en el momento de la reconexión.

A continuación se encuentran las declaraciones de registro alrededor del punto de desconexión y la reconexión posterior. 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

Publiqué una pregunta relacionada en Android BLE ACL_DISCONNECTED a veces con retraso .

Una coincidencia entre los dispositivos donde he visto el problema ha sido la existencia de una tarjeta SIM, pero otra es la 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 más profunda , soy menos sospechoso de la tarjeta SIM y más de la versión de la API. Hay varios errores pendientes (o arreglados recientemente) que tienen un comportamiento relacionado, algunos de los cuales apuntan a versiones de API> 23; sin embargo, posteriormente he podido reproducir en API 23.

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 que estos perfiles se activan con cualquier desconexión BLE. Mientras no manifestaba el comportamiento de reconexión, pude ver una activación PBAP / MAP similar al jugar con un SensorTag de TI: estos perfiles nuevamente registraron 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

Esto parece haberse solucionado a partir de Spotify 8.4.19.792 publicado el 2017-09-14.