web-dev-qa-db-ja.com

close()とdisconnect()の違いは?

Android Bluetooth Low Energy APIは、デバイスconnectGatt()に接続するための1つのメソッドを実装しますが、接続disconnect()およびclose()を閉じるための2つのメソッドを実装します。

ドキュメントは言う:

  • disconnect():確立された接続を切断するか、現在進行中の接続試行をキャンセルします。

  • close():アプリケーションは、このGATTクライアントでの処理が完了した後、できるだけ早くこのメソッドを呼び出す必要があります。

BluetoothGatt.Java のソースコードは、close()がアプリケーションを登録解除し、disconnect()がクライアントを切断することを示しています。しかし、それが実際に何を意味するかは述べていません。つまり、クライアントに接続する方法が1つしかない場合、接続を閉じる/切断する方法が2つあるのはなぜですか?

42
Arturs Vancans

disconnect()を使用すると、後でconnect()を呼び出して、そのサイクルを続行できます。

close()を呼び出すと完了です。再度接続する場合は、BluetoothDeviceconnectGatt()を再度呼び出す必要があります。 close()は、BluetoothGattが保持しているリソースを解放します。

62
Douglas Jones

考えてみてください。

Gattでcloseを呼び出していない限り、Gattに接続したり、発見したりできます。そのため、マシンのサービスを検出しようとすると、通常、一定の時間マシンに接続する要求を行うスレッドまたは実行可能ファイルを実行します。

マシン接続での最初の試行では、BluetoothGattオブジェクトが返されます。このオブジェクトは、後でBluetoothDeviceオブジェクトのサービスを検出するために使用できます。接続するのはかなり簡単に思えますが、マシンのサービスを見つけるのははるかに困難です。

mBluetoothGatt = machine.getDevice().connectGatt(this, false, mGattCallback);

したがって、私のスレッド/実行可能ファイルで、BluetoothGattがnullかどうかを確認します。そうである場合、上記のコード行を再度呼び出します。それ以外の場合は、BluetoothGattサービス自体を検出しようとします。

mBluetoothGatt.discoverServices();

ああ、私は常に、サービスの発見の接続を試みる前に、必ずBluetoothAdapter.cancelDiscovery()を呼び出すようにしてください。

mBluetoothAdapter.cancelDiscovery();

ここに私の実行可能ファイルなどに接続するために使用される方法があります:

public void connectToMachineService(BLEMachine machine) {
    Log.i(SERVICE_NAME, "ATTEMPTING TO CONNECT TO machine.getDevice().getName());

    mBluetoothAdapter.cancelDiscovery();

    if(mBluetoothGatt == null)
        mBluetoothGatt = machine.getDevice().connectGatt(this, false, mGattCallback);
    else
        mBluetoothGatt.discoverServices();
}

最後に、接続したBluetoothGattオブジェクトを必ず閉じてください。 「Androidは5つのBluetoothGattオブジェクトを処理できてから、「Gattサーバーに接続できません」などのことを言います。

作成するすべてのBluetoothGattで、closeを呼び出し、接続が閉じられたことを示す更新をブロードキャストします。 BluetootGattが切断されたときに状態の変化で応答しない場合が多いようです。 BluetoothGattを閉じる方法は次のようになります。アクティビティ用にメソッドを開いたままにして、サービスを呼び出し、マシンが応答しなくなり、切断状態が呼び出されない場合は切断します。

public void disconnectGatt(BluetoothGatt gatt) {
    if(gatt != null) {
        gatt.close();
        gatt = null;
    }

    broadcastUpdate(ACTION_STATE_CLOSED);
}
13
Droid Chris

close()を呼び出さないと、モジュールが再起動すると、電話機は自動的にモジュールに再接続します。

Bleの重要な機能だと思います。

0
Xixiaxixi