Является ли вызов disnect () и close () впоследствии правильным подходом в приложении BLE Android? - PullRequest
1 голос
/ 30 марта 2020

Я работаю над реализацией приложения Android, которое подключается к устройствам BLE, но отсутствие надлежащей документации убивает меня. Кажется, что ничего не работает одинаково дважды, если я запускаю приложение, как только оно может работать, но в следующий раз где-то останавливается (не знаю, где), но я вроде как пришел к выводу, что, возможно, я не использовал disconnect() и close() в правильном порядке.

После, скажем, ошибки, я сначала вызываю disnect ():

 public void disconnect() {
    mScanning = true;
    mConnected = false;
    startedConnect = false;
    if (mBluetoothAdapter == null || mBluetoothGatt == null) {
        scanLeDevice(true);
        return;
    }
    mBluetoothGatt.disconnect();
    scanLeDevice(true);
}

, затем я вызываю close ():

public void close() {
    if (mBluetoothGatt == null) {
        return;
    }
    mBluetoothGatt.close();
    mBluetoothGatt = null;
}

Это правильный путь или нет? Помните, что я звоню scanLeDevice(true); сразу после отсоединения, но затем вызывается close(), который, я думаю, просто "завершает" все и останавливает сканирование, верно?

1 Ответ

0 голосов
/ 30 марта 2020

Когда вы создаете объект BluetoothGatt, вызывая connectGatt для BluetoothDevice, вы запрашиваете один из 32 (в текущей версии Android) доступных стеков в стеке Bluetooth.

Вкл. Этот объект теперь можно вызывать connect и disconnect, чтобы изменить состояние «цели», если Android должен попытаться сохранить соединение с устройством или нет. Пока вы не наберете disconnect, Android будет (навсегда) пытаться подключиться к устройству и автоматически переподключиться к устройству, если соединение по какой-либо причине оборвется. Повторный вызов connect после disconnect заставит его попытаться подключиться снова.

Примечание: установка autoConnect в false при первоначальном вызове connectGatt установит начальное время ожидания для первого неявного подключения попытка (обычно 30 секунд), и если устройство подключается, а затем соединение обрывается, оно не будет автоматически пытаться повторно подключиться.

Таким образом, объект BluetoothGatt может находиться в состоянии «отключено», но все равно принимать до одного из 32 слотов в стеке Bluetooth. Когда вы вызываете close, вы освобождаете все ресурсы для объекта BluetoothGatt и возвращаете слот в стек Bluetooth. Поэтому закрытие неявно также означает разъединение. Чтобы потенциально обойти некоторые неисправные устройства Android, вы можете вызвать disconnect для объекта BluetoothGatt до close. Обратите внимание, что после вызова close вы не можете вызывать другие методы для этого объекта BluetoothGatt.

Примечание: отключение Bluetooth означает автоматическое уничтожение всех BluetoothGatt объектов.

Возвращаясь к вашему вопросу, я не совсем понимаю, какое отношение имеет ваше BLE-сканирование к подключению / отключению / закрытию. Сканирование полностью отделено от подключений и BluetoothGatt объектов, и нет проблем с подключением и выполнением сканирования одновременно. Чтобы остановить сканирование, позвоните stopScan на BluetoothLeScanner.

...