web-dev-qa-db-ja.com

Bluetooth Low Energyデバイスを完全に切断する

AndroidのconnectGatt()メソッドを使用してBLEデバイスに接続します。これはうまくいきます。

切断するときは、次のようにします。

_private void disconnectDevice() {
    gatt.disconnect();
}
_

コールバックを受け取ったら、クローズします。

_private BluetoothGattCallback gattCallback = new BluetoothGattCallback() {
    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
        switch (newState) {
            case BluetoothProfile.STATE_CONNECTED:
                Log.d("BLED-GATT", "STATE_CONNECTED");
                setUIConnectionStatus("Discover services on device...", Color.YELLOW);
                checkEnableAddButton(simpleTrackEditText.getText().toString());
                gatt.discoverServices();
                break;
            case BluetoothProfile.STATE_DISCONNECTED:
                Log.d("BLED-GATT", "STATE_DISCONNECTED");
                setUIConnectionStatus("Not Connected!", Color.RED);
                gatt.close();
                break;
            default:
                Log.d("BLED-GATT", "STATE_OTHER");
        }
    }
}
_

これが実行され、disconnectDevice()を呼び出した後、デバイスを制御できなくなります。デバイス自体は、ブロードキャスト可視モードにすることができないため、まだ接続されていると考えているようです(すでに接続されている場合に発生します)。ただし、アプリケーションを終了して再度開くと、デバイスをブロードキャストモードに設定できます。これにより、アプリが適切に切断されなかったことがわかります。

ここで見逃したことはありますか?

9
nilsi

問題は、スキャン中に同じデバイスに複数回接続していて、アプリケーションで同時に多くの接続が開かれることでした。 !isConnected()を追加すると、問題が解決しました:

/**
 * Connects to the device. Does nothing if already connected.
 * @param macAddress the address of the device.
 */
private void connectDevice(String macAddress) {
    if (!isConnected()) {
        device = bluetoothAdapter.getRemoteDevice(macAddress);

        if (device == null) {
            this.sendToast("Device Not Available");
        } else {
            Log.d("BLED", "Connecting...");
            gatt = device.connectGatt(this, true, gattCallback);
        }
    }
}
10
nilsi

ガットを閉じる前に切断しないので、これは完全に論理です。

public void disconnect() {
        if (mBluetoothAdapter == null || mBluetoothGatt == null) {
            Log.w(TAG, "BluetoothAdapter not initialized");
            return;
        }
        mBluetoothGatt.disconnect();
    }

GATTを閉じる前にこのメソッドを呼び出してみてください

3
Fakher

同じ問題が発生し、次の2つの原因が考えられます。1. @nilsiの回答と同じで、1回のスキャンで同じデバイスに複数回接続した。 →ロックとリストによって解決2.一度のスキャンでデバイスに接続し、onConnectionStateChangeを取得しませんでした。もう一度スキャンしたよりも、同じデバイスに2番目の接続が発生しました。 →device.connectGatt()を呼び出すときにBluetoothGattオブジェクトを保持し、スキャンする前にobject.disconnect()、object.close()を呼び出すことで解決しました。

私のテスト用電話は4歳なので、onConnectionStateChange ....を返すのに20秒以上かかることがあります。

1
Ray Chung