2017-06-13 20 views
0

私はカスタムBluetoothデバイスと通信するAndroidアプリで作業しています。 BluetoothGatt.Disconnect()を呼び出した後で、OnConnectionStateChangeコールバックが呼び出され、新しい状態がDisconnectedであることがわかりましたが、そのときとデバイス自体が実際に切断されている間に時間差があるようです。たとえば、接続したデバイスでBluetoothManager.GetConnectionState(...)を呼び出すと、Connectedが返されます。場合によっては、の前にGetConnectionStateが返され、Disconnectedが返されることがあります。これは正常ですか?私のアプリケーションでこれを引き起こしている可能性がありますか?例えば非UIトレッドから切断するか、それとも何か?または、物理的なブルートゥースデバイス自体が切断を適切に処理していない可能性があり、切断イベントを速やかに完了できない可能性がありますか?Android BLE GATT DisconnectedとDevice Disconnected

答えて

0

"disconnect()"を呼び出すと、クライアントオブジェクト(BluetoothGattオブジェクト)の接続を切断するだけです。同じ物理デバイスに複数のBluetoothGattオブジェクトを接続できます。複数のアプリは、同じデバイスに接続された独自のBluetoothGattオブジェクトを持つこともできます。

「disconnect()」と呼ぶと、リクエストはシステム内のBluetoothスタックで処理され、要求の処理が完了したらすぐにアプリケーションのonConnectionStateChangeコールバックを呼び出します。ただし、他のすべてのクライアントが切断されるまでリンクを切断しません。 Androidの新しいバージョンでは、数秒で物理的切断が遅れる(理由は不明)。また、切断要求がBluetoothコントローラに送信されると、リモートデバイスが切断(またはタイムアウト)を認識する必要があるため、実際に切断するには時間がかかることがあります。デフォルトのタイムアウトは、最近のAndroidバージョンで5秒に変更されるまで20秒でした。

+0

ご清聴ありがとうございます。デバイスが実際に切断されたときにコールバックイベントを取得できるかどうか知っていますか? – PICyourBrain

+0

https://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#ACTION_ACL_DISCONNECTEDを聞くには、放送受信機を登録するだけです。 – Emil

2

AndroidのBLEシステムが非常に混乱しています。あなたがAndroidから接続を解除したところで、もっと悪いことを除いて、あなたが何を記述したのか見てきましたが、それは周辺機器との永続的な接続を維持しています。

通常、最終的に切断するまでに30秒かかることがあります。すべてあなたがその時に使用していた電話に依存します。

能力がある場合は、周辺機器に切断特性を追加することを強く推奨します。そのため、実際に切断要求を書き留めて周辺機器に強制的に切断させ、その後Androidがそれを受け取るようにしてください。

私が見たメリットは、いつも動作しているということです(なぜなら、「ハード」切断は常にAndroidによって行われ、「ソフト」切断要求は特定の電話で問題を引き起こす可能性があるからです)。通常、「良い」電話機はこの動作(特にMarshmallowとon)を表示しませんが、それらのKitKatの日に戻ってきます.... Wow ....

別の利点... iOSを使用している場合、切断された周辺機器をスキャンまたは再接続することができます。

関連する問題