Мне нужно постоянно поддерживать связь между 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 в правом углу клиента, чтобы разорвать соединение:
Когда я нажимаю 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.Это говорит о том, что конец сервера работает нормально.Тем не менее я предпочитаю повторно использовать существующее соединение, поскольку повторное установление соединения может создавать проблемы в реальном коде.