Разница между close() и disnect()?
Android Bluetooth Low Energy API реализует 1 метод подключения к устройству connectGatt()
, но 2 метода для закрытия соединения disconnect()
и close()
.
Документация гласит:
-
disconnect()
: Отключает установленное соединение или отменяет попытку подключения в настоящее время.
-
close()
: приложение должно вызывать этот метод как можно раньше после его завершения этот клиент GATT.
Исходный код BluetoothGatt.java показывает, что close() отменяет регистрацию приложения и отключает() отключение клиента. Однако он не говорит, что это на самом деле означает. Я имею в виду, если есть только один способ подключения к клиенту, почему есть два способа закрыть/отключить соединение?
Ответы
Ответ 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.