Какой правильный флаг autoConnect в connectGatt BLE?

Моя цель - сделать автоматическое соединение между устройством Bluetooth Low Energy и телефоном. Я следовал примеру кода и нашел строку

// We want to directly connect to the device, so we are setting the autoConnect parameter to false.
mBluetoothGatt = device.connectGatt(this, false, mGattCallback);

Код выше означает, что false использует для автоподключения. Тем не менее, я нашел API здесь, он сказал, что

BluetoothGatt connectGatt (Контекст контекста, логическое автоконнект, обратный вызов BluetoothGattCallback, int transport) Подключитесь к серверу GATT, расположенному на этом устройстве.

И я также попробовал два флага: true а также false, и только true это работа. Я использую версию>= Android 5.0. Есть что-то несовместимое между кодом и API? Какой флаг правильный? Нужно ли что-то записывать, если я хочу установить автоматическое соединение?

Это мой код

public boolean connect(final String address) {
    if (mBluetoothAdapter == null || address == null) {
        Log.w(TAG, "BluetoothAdapter not initialized or unspecified address.");
        return false;
    }

    // Previously connected device.  Try to reconnect.
    if (mBluetoothDeviceAddress != null && address.equals(mBluetoothDeviceAddress)
            && mBluetoothGatt != null) {
        Log.d(TAG, "Trying to use an existing mBluetoothGatt for connection.");
        if (mBluetoothGatt.connect()) {
            mConnectionState = STATE_CONNECTING;
            return true;
        } else {
            return false;
        }
    }

    final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
    if (device == null) {
        Log.w(TAG, "Device not found.  Unable to connect.");
        return false;
    }
    // We want to directly connect to the device, so we are setting the autoConnect
    // parameter to false.
    mBluetoothGatt = device.connectGatt(this, true, mGattCallback);
    Log.d(TAG, "Trying to create a new connection.");
    mBluetoothDeviceAddress = address;
    mConnectionState = STATE_CONNECTING;
    return true;
}

2 ответа

Решение

"Прямое подключение" противоположно "автоматическому подключению", поэтому, если вы установите для параметра autoConnect значение false, вы получите "прямое подключение". Обратите внимание, что выполнение "mBluetoothGatt.connect()" также будет использовать автоматическое подключение.

Остерегайтесь https://code.google.com/p/android/issues/detail?id=69834 который является ошибкой, затрагивающей более старые версии Android, которые вместо этого могут сделать ваши автоматические подключения прямыми. Это можно обойти с отражением.

Существует несколько недокументированных различий между прямым и автоматическим подключением:

Прямое подключение - это попытка подключения с тайм-аутом 30 секунд. Он приостановит все текущие автоматические подключения, пока идет прямое подключение. Если прямое подключение уже находится в состоянии ожидания, последнее прямое подключение не будет выполнено немедленно, а будет поставлено в очередь и начнется после завершения предыдущего.

При автоматическом подключении вы можете иметь несколько ожидающих подключений одновременно, и они никогда не будут превышать время ожидания (до явного прерывания или до отключения Bluetooth).

Если соединение было установлено с помощью автоматического подключения, Android будет автоматически пытаться повторно подключиться к удаленному устройству, когда оно будет отключено, до тех пор, пока вы не вызовете вручную Disnect () или close(). Как только соединение, установленное через прямое соединение, отключается, не предпринимается никаких попыток переподключиться к удаленному устройству.

Прямое подключение имеет другой интервал сканирования и окно сканирования с более высокой нагрузкой, чем автоматическое подключение, что означает, что он будет уделять больше времени радиосвязи для прослушивания подключаемой рекламы для удаленного устройства, то есть соединение будет установлено быстрее.

Параметр autoConnect определяет, следует ли активно подключаться к удаленному устройству, или, скорее, пассивно сканировать и завершать соединение, когда удаленное устройство находится в зоне действия / доступно. Как правило, первое соединение с устройством должно быть прямым (для autoConnect задано значение false), а последующие подключения к известным устройствам должны вызываться с параметром autoConnect, установленным в значение true.

Другие вопросы по тегам