web-dev-qa-db-fra.com

Android BLE se reconnecte de manière inattendue et répétée au périphérique

Je développe une application Android qui s'interface avec un appareil BLE et a récemment rencontré un comportement étrange: lorsque l'application se déconnecte de l'appareil, quelques secondes plus tard, quelque chose d'autre semble établir la connexion.

Je suis en train de décrire le problème de manière plus complète et je me suis concentré sur les profils Bluetooth MAP et PBAP; ils apparaissent dans les journaux autour du point de problème. Je ne sais pas si c'est la cause première du problème, ni n'ai trouvé de solution de contournement.

L'application prend en charge l'API 23-25. À ce jour, je n’ai rencontré le problème que dans les téléphones dotés de cartes SIM, ce qui nous renvoie de nouveau au PBAP, car de nombreux téléphones semblent prendre en charge ce profil uniquement avec une carte SIM. Je n'ai pas encore été en mesure de reproduire l'API 23, mais pour l'instant, ces téléphones de test n'ont pas de carte SIM.

L'appareil BLE n'a rien à voir avec l'application automobile, il n'a pas non plus la capacité de gérer les contacts ou la messagerie. Je n'ai pas intentionnellement activé cela dans l'application. De plus, il n'y a pas d'appariement/de liaison entre mon application et l'appareil, et l'appareil ne prend pas en charge l'appariement/la liaison.

Dans la plupart des cas, la tentative de reconnexion a lieu une fois, quelques secondes après la déconnexion du périphérique via l'application. Les séquences de connexion-déconnexion suivantes dans l'application ont le même comportement. Cependant, j'ai constaté dans au moins un cas où les reconnexions (en dehors de l'application) se poursuivaient indéfiniment toutes les quelques secondes.

La seule chose qui semble résoudre le problème à court terme consiste à activer Bluetooth sur le téléphone ou à forcer le processus de partage Bluetooth. Je ne crois pas que les reconnexions reviennent d'elles-mêmes, mais il est fréquent qu'elles réapparaissent une fois que l'utilisateur s'est connecté-déconnecté avec l'appareil via mon application.

Je ne connais pas très bien PBAP/MAP, je ne sais donc pas comment ils sont activés ni, si possible, comment les désactiver. Je ne suis pas sûr qu'ils soient le coupable, mais ils apparaissent dans les journaux au moment de la reconnexion.

Voici les instructions du journal autour du point de déconnexion et de reconnexion ultérieure. Le nom de l'interface ici est "Foo04" avec 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()

Enquête supplémentaire

J'ai posté une question connexe dans Android BLE ACL_DISCONNECTED parfois retardé .

L’un des points communs entre les appareils sur lesquels j’ai vu le problème est l’existence d’une carte SIM, mais c’est l’autre API 24 ou 25. Je n’ai pas encore été en mesure de reproduire sur un appareil API 23 ou, quelle que soit sa version, un sans une carte SIM physiquement installée.

Après une enquête plus poussée encore , je suis moins suspect de la carte SIM et plus de la version de l’API. Plusieurs bogues en suspens (ou récemment corrigés) ont un comportement lié, certains d'entre eux pointant vers des versions d'API> 23; Cependant, j'ai pu par la suite reproduire sur l'API 23.

Je pense que cela a peu à voir avec les profils PBAP/MAP. Leur présence dans les journaux indique simplement que ces profils sont activés lors de toute déconnexion BLE. Tout en ne manifestant pas le comportement de reconnexion, j'ai pu voir une activation PBAP/MAP similaire lors d'une conversation avec un SensorTag de TI: ces profils ont à nouveau enregistré toute déconnexion (sans lien avec mon application).

Liste des périphériques concernés

J'ai pu reproduire ce problème, à des degrés divers, sur les appareils suivants:

  • 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
17
Steve Yohanan

Après de nombreuses recherches, j'ai pu déterminer la cause première de mon problème: Spotify.

Avoir Spotify installé sur le périphérique Android suffisait à manifester ce comportement aberrant; l'utilisateur n'a pas besoin de s'identifier ou de ne jamais avoir lancé l'application Spotify. La désinstallation ou l’arrêt forcé de l’application dans tous les cas a corrigé le problème.

Il semble que Spotify dispose d’un service qui enregistre les déconnexions des périphériques any bluetooth. Lorsque le système en informe Spotify, le service se connecte immédiatement au périphérique qui vient d'être déconnecté - je n'ai pas pris la peine de décrire la communication de Spotify. Après environ 5 secondes, la connexion est interrompue. Toutefois, comme Spotify est averti des événements de déconnexion Bluetooth, le service tente à nouveau de se connecter au périphérique. Il s’agit bien d’une boucle infinie qui ne peut être interrompue qu’en bloquant Spotify ou en activant le bluetooth sur le périphérique Android.

Pour étudier, j'ai développé une application simple qui est avertie et rapporte les événements de connexion et déconnexion Bluetooth (ACL_CONNECTED, ACL_DISCONNECTED). J'ai utilisé un scanner BLE sur mon appareil Android et connecté/déconnecté avec une variété de périphériques Bluetooth. Mon application de test afficherait mon interaction initiale avec le périphérique, suivie d'un flux infini d'événements de connexion, puis de déconnexion. Encore une fois, cela continuerait jusqu'à ce que Spotify soit arrêté de force.

Voici un exemple de journalisation ...

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

Il était difficile de déterminer que Spotify était la cause fondamentale.

Ma première indication a été de regarder Options du développeur -> Services en cours et de noter que Spotify apparaissait régulièrement en corrélation avec la connexion/déconnexion de périphérique.

En fin de compte, cependant, le processus d’élimination a été déterminant: une fois que le comportement aberrant a commencé, j’ai parcouru de manière sélective la liste des applications installées, qui bloquaient de force les applications susceptibles de présenter un intérêt certain pour le blu arrêté Spotify.

J'ai fourni un rapport de bogue détaillé à Spotify il y a plusieurs semaines, mais je n'ai pas encore eu de leurs nouvelles.

18
Steve Yohanan

Cela semble être résolu à partir de Spotify 8.4.19.792 publié le 14/09/2017.

1
Pete Doyle