Подтвердить что ты не робот

Разница между close() и disnect()?

Android Bluetooth Low Energy API реализует 1 метод подключения к устройству connectGatt(), но 2 метода для закрытия соединения disconnect() и close().

Документация гласит:

  • disconnect(): Отключает установленное соединение или отменяет попытку подключения  в настоящее время.

  • close(): приложение должно вызывать этот метод как можно раньше после его завершения    этот клиент GATT.

Исходный код BluetoothGatt.java показывает, что close() отменяет регистрацию приложения и отключает() отключение клиента. Однако он не говорит, что это на самом деле означает. Я имею в виду, если есть только один способ подключения к клиенту, почему есть два способа закрыть/отключить соединение?

4b9b3361

Ответ 1

С помощью disconnect() вы можете позже вызвать connect() и продолжить этот цикл.

Как только вы звоните close(), вы закончите. Если вы хотите снова подключиться, вам нужно будет снова вызвать connectGatt() на BluetoothDevice; close() освободит ресурсы, сохраненные BluetoothGatt.

Ответ 2

Вот пища для размышлений:

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

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

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

Итак, в моем потоке /runnable, я проверю, имеет ли BluetoothGatt значение null. Если это так, я снова вызову вышеуказанную строку кода, иначе я попытаюсь обнаружить службы BluetoothGatt как таковые.

mBluetoothGatt.discoverServices();

О, и я ВСЕГДА обязательно вызываю BluetoothAdapter.cancelDiscovery() перед любой попыткой подключения к обнаружению службы.

mBluetoothAdapter.cancelDiscovery();

Здесь используется метод для подключения в моем runnable и т.д.:

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 может обрабатывать пять объектов BluetoothGatt, прежде чем он начнет говорить "не удается подключиться к серверу Gatt" или что-то в этом роде.

На каждом BluetoothGatt, который я создаю, я позвоню на него, а затем передаст обновление с сообщением о закрытии соединения. Кажется, что много раз, когда BluetootGatt не будет реагировать с изменением состояния, когда он будет отключен. Мой метод закрытия BluetoothGatt выглядит примерно так. Я оставляю метод открытым для Activity для вызова службы и отключения, если машина становится неактивной и состояние разъединения не вызывается.

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

    broadcastUpdate(ACTION_STATE_CLOSED);
}

Ответ 3

Я обнаружил, что мой телефон автоматически подключится к моему модулю при перезапуске модуля, если я не позвоню close() & нет передачи данных между периодом отключения питания.

Я думаю, что это важная особенность BLE.