Восстановление подключения к серверу Bluetooth LE (BluetoothGatt.connect () не работает) - PullRequest
0 голосов
/ 15 декабря 2018

Мне нужно постоянно поддерживать связь между Bluetooth-сервером и клиентом.С классическим BT-соединением все было в порядке, однако с BT LE соединение теряется, когда сервер переходит в спящий режим.Несмотря на то, что сервер Gatt восстанавливается после пробуждения, клиент, похоже, не восстанавливает соединение, а gatt.reconnect () не помогает восстановить соединение.

Для простоты возьмем примеры приложений Android для сервера:

https://github.com/androidthings/sample-bluetooth-le-gattserver

и для клиента:

https://github.com/googlesamples/android-BluetoothLeGatt

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

  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()) {
                Log.d(TAG, "Re-using existing mBluetoothGatt succeeded.");
                mConnectionState = STATE_CONNECTING;
                return true;
            } else {
                Log.d(TAG, "Re-using existing mBluetoothGatt FAILED.");
                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, false, mGattCallback);
        Log.d(TAG, "Trying to create a new connection.");
        mBluetoothDeviceAddress = address;
        mConnectionState = STATE_CONNECTING;
        return true;
    }

Можно заметить, что device.connectGatt вызывается с autoconnect = false.Действительно, если я изменяю его на true, соединение всегда прерывается.

Также видно, что если Gatt уже настроен и устройство соответствует устройству Gatt, вместо создания нового соединения, приложение будетвсегда пытайтесь повторно использовать существующий Gatt с функцией connect connect (), которая может быть успешной или неудачной, но даже в случае неудачи новое соединение не предпринимается.

Теперь запустите сервер и клиент.После того, как соединение установлено, нажмите DISCONNECT в правом углу клиента, чтобы разорвать соединение:

enter image description here

Когда я нажимаю CONNECT, повторное соединение никогда не происходитplace и я получаю следующие сообщения журнала:

Trying to use an existing mBluetoothGatt for connection.
Re-using existing mBluetoothGatt succeeded.
onClientConnectionState() - status=133 clientIf=6 device=40:4E:36:42:DC:35
Disconnected from GATT server.

Отсюда видно, что gatt.connect () возвращает true, однако соединение не восстанавливается.

Соединение восстановлено, если я полностью удаляю код, связанный с переподключением, поэтому всегда используется новый Gatt.Это говорит о том, что конец сервера работает нормально.Тем не менее я предпочитаю повторно использовать существующее соединение, поскольку повторное установление соединения может создавать проблемы в реальном коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...