web-dev-qa-db-ja.com

Android BLEが予期せず繰り返し周辺機器に再接続する

BLEデバイスとインターフェイスするAndroidアプリを開発していますが、最近、奇妙な動作に遭遇しました。アプリがデバイスから切断されると、数秒後に何か他のものが接続を確立しているように見えます。

私は問題をより完全に特徴づける過程にあり、BluetoothMAPおよびPBAPプロファイルに焦点を合わせています。それらは問題のポイントの周りのログに表示されます。ただし、これが根本的な原因であるかどうかはわかりません。また、回避策も見つかりませんでした。

アプリはAPI23-25をサポートしています。これまで、SIMカードが存在する電話でのみ問題が発生しました。これは、多くの電話がSIMカードでのみこのプロファイルをサポートしているように見えるため、PBAPを示しています。 API 23で再現することはまだできていませんが、今のところ、これらのテスト用電話にはSIMカードがありません。

BLEデバイスは、自動車のアプリケーションとは関係がなく、連絡先やメッセージングを処理する機能もありません。アプリ内で意図的にこれを有効にしていません。さらに、アプリとデバイスの間にペアリング/ボンディングはありません。また、デバイスはペアリング/ボンディングをサポートしていません。

ほとんどの場合、再接続の試行は、アプリを介してデバイスが切断されてから数秒後に1回行われます。アプリ内の後続の接続-切断シーケンスも同じ動作をします。ただし、少なくとも1つのインスタンスで、(アプリの外部での)再接続が数秒ごとに無期限に継続することを確認しました。

この問題を短期的に解決すると思われる唯一のことは、電話でBluetoothを循環させるか、Bluetooth共有プロセスを強制的に停止することです。再接続が自然に戻るとは思いませんが、ユーザーが接続すると再接続するのが一般的です。アプリを介してデバイスとの接続を解除します。

私はPBAP/MAPにあまり詳しくないので、それらを有効にする方法、または可能であれば無効にする方法を知りません。それらが原因かどうかはわかりませんが、再接続時にログに表示されます。

以下は、切断ポイントとその後の再接続に関するログステートメントです。ここでのインターフェース名は「Foo04」で、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()

さらなる調査

関連する質問を Android BLE ACL_DISCONNECTEDが時々遅れる に投稿しました。

問題が発生したデバイスの共通点の1つは、SIMカードの存在ですが、もう1つはAPI 24または25です。API23デバイスで、またはバージョンに関係なく、まだ再現できていません。 SIMカードが物理的に取り付けられていないもの。

さらに調査した後、私はSIMカードの疑いが少なく、APIバージョンの方が多いです。関連する動作を持ついくつかの未解決の(または最近修正された)バグがあり、そのうちのいくつかはAPIバージョン> 23を指しています。ただし、その後API23で再現することができました。

これはPBAP/MAPプロファイルとはほとんど関係がないと感じています。むしろ、ログにそれらが存在することは、BLEの切断によってアクティブ化されているこれらのプロファイルを単に示しています。再接続動作を明示していませんが、TI SensorTagをいじると、同様のPBAP/MAPアクティベーションを確認できました。これらのプロファイルは、(アプリケーションとは関係のない)切断を再度ログに記録しました。

影響を受けるデバイスのリスト

この問題は、さまざまな程度で、次のデバイスで再現できました。

  • サムスンS6-API23
  • サムスンS7-API23
  • サムスンS7エッジ-API24
  • Sony Xperia Z5 Compact-API 24
  • Motorola Droid Turbo 2-API 24
  • Nexus 5x-API 25
  • Google Pixel-API 25
19
Steve Yohanan

多くの調査の結果、問題の根本原因であるSpotifyを特定することができました。

この異常な動作を明示するには、SpotifyをAndroidデバイスにインストールするだけで十分でした。ユーザーは、Spotifyアプリにログインしたり、アプリを起動したりする必要はありません。すべての場合において、アプリをアンインストールまたは強制停止すると、問題。

Spotifyには、any Bluetooth周辺機器からの切断を登録するサービスがあるようです。システムがSpotifyに通知すると、サービスは切断されたばかりの周辺機器にすぐに接続します---私はSpotifyからの通信を特徴づけることを気にしませんでした。約5秒後、接続が切断されます。ただし、SpotifyにはBluetooth切断イベントが通知されるため、サービスは再びペリフェラルとの接続を試みます。これは事実上、Spotifyを強制的に停止するか、AndroidデバイスでBluetoothを循環させることによってのみ中止できる、無限ループです。

調査するために、Bluetooth接続および切断(ACL_CONNECTED、ACL_DISCONNECTED)イベントを通知および報告する簡単なアプリを開発しました。 AndroidデバイスでBLEスキャナーを使用し、さまざまなBluetoothペリフェラルと接続/切断しました。テストアプリでは、ペリフェラルとの最初のやり取りに続いて、接続と切断のイベントの無限のストリームが表示されます繰り返しますが、これはSpotifyが強制的に停止されるまで続きます。

以下はロギングの例です...

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

Spotifyが根本的な原因であるかどうかを判断するのは困難でした。

私の最初の兆候は、開発者向けオプション->サービスの実行を見て、周辺機器の接続/切断に関連してSpotifyが定期的にポップアップすることに気づいたことです。

しかし、結局、それは消去法に帰着しました。異常な動作が始まると、インストールされているアプリのリストを選択的に調べ、Bluetoothに関心があると思われるアプリを強制的に停止し、最終的に問題がすぐに終了するのを確認しました。 Spotifyを停止しました。

数週間前にSpotifyに詳細なバグレポートを提供しましたが、まだ返信がありません。

20
Steve Yohanan

これは、2017年9月14日にリリースされたSpotify8.4.19.792以降で修正されているようです。

1
Pete Doyle