こんにちは、Androidアプリを作成しています。Android 4.4.2、Galaxy Nexus。
デバイスに接続状態を示すLEDがあります。
問題はconnectGatt()呼び出しからonConnectionStateChange STATE_CONNECTED
の受信ポイントまでの期間に一貫性がないためです。一部の時間は非常に高速ですが、ほとんどの場合、5秒以上かかります。 Bluetoothをオフ/オンにしても効果はありません。
私はTI BToolをTI BLEドングルでPCで試しました接続を非常に高速に確立します。
私もiPhone 5Sで試してみましたが、それも高速です。
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()に渡されても直接接続要求を引き起こす可能性のある競合状態があることを述べておきます。
低速接続を実験しましたが、リモートデバイスを再接続しようとした場合にのみ、最初にデバイスを接続しても問題はありませんが、再接続するとonClientRegistered()メソッドの接続が残ります