web-dev-qa-db-ja.com

android接続が遅い

こんにちは、Androidアプリを作成しています。Android 4.4.2、Galaxy Nexus。

デバイスに接続状態を示すLEDがあります。

問題はconnectGatt()呼び出しからonConnectionStateChange STATE_CONNECTEDの受信ポイントまでの期間に一貫性がないためです。一部の時間は非常に高速ですが、ほとんどの場合、5秒以上かかります。 Bluetoothをオフ/オンにしても効果はありません。

私はTI BToolTI BLEドングルでPCで試しました接続を非常に高速に確立します。

私もiPhone 5Sで試してみましたが、それも高速です。

  1. 誰もがこの問題を経験しましたか?
  2. これを改善できる可能性はありますか?
32
user2810131

ConnectGatt()autoconnect引数にtrueを渡すとバック​​グラウンド接続が要求され、falseを渡すと直接接続が要求されます。 BluetoothGatt#connect()は常にバックグラウンド接続を要求します。

バックグラウンド接続(4.4.2 AOSPのBluedroidソースによる)のスキャン間隔は1280ミリ秒、ウィンドウは11.25ミリ秒です。これは、約0.9%のデューティサイクルに対応します。これは、スキャンしていないときに接続が完了するまでに長い時間がかかる理由を説明しています。

直接接続の間隔は60ミリ秒、ウィンドウは30ミリ秒なので、接続ははるかに速く完了します。さらに、一度に保留できる直接接続要求は1つだけで、30秒後にタイムアウトになります。 onConnectionStateChange()は、このタイムアウトを示すために、state = 2、status = 133で呼び出されます。

Nexus5でこの動作を確認しましたが、明らかにYMMVです。

BluetoothG#.Javaには、autoconnect = trueがBluetoothDevice#connectGatt()に渡されても直接接続要求を引き起こす可能性のある競合状態があることを述べておきます。

53
Juha Kuikka

低速接続を実験しましたが、リモートデバイスを再接続しようとした場合にのみ、最初にデバイスを接続しても問題はありませんが、再接続するとonClientRegistered()メソッドの接続が残ります

2
J Sanchez