Подключаемся к устройству:poll = true;
deviceNumber = 0;
characteristicValues = new String[bleDevices.size()];
characteristicValues[deviceNumber] = "ERROR"; // в случае успеха "ERROR" заменится на значение характеристики
handler.postDelayed(responseWaiting, RESPONSE_TIMEOUT); //RESPONSE_TIMEOUT=10000
bleDevices.get(deviceNumber).connectGatt(appContext, false, bluetoothGattCallback);
Получаем статус подключения и обрабатываем его:
private BluetoothGattCallback bluetoothGattCallback = new BluetoothGattCallback() {
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
handler.removeCallbacks(responseWaiting);
currentGatt = gatt;
switch (newState) {
case BluetoothGatt.STATE_CONNECTED:
if (poll) {
if (status == BluetoothGatt.GATT_SUCCESS) {
handler.postDelayed(responseWaiting, RESPONSE_TIMEOUT);
gatt.discoverServices();
} else {
nextDevice();
}
} else {
handler.postDelayed(disconnectWaiting, RESPONSE_TIMEOUT);
currentGatt.disconnect();
}
break;
case BluetoothGatt.STATE_DISCONNECTED:
if (poll) {
nextDevice();
} else {
currentGatt.close();
}
break;
}
}
@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
//…
}
@Override
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
//…
}
};
Подключение к следующему устройству:private void nextDevice() {
currentGatt.close();
deviceNumber++;
if (deviceNumber < bleDevices.size()) {
characteristicValues[deviceNumber] = "ERROR"; // в случае успеха "ERROR" заменится на значение характеристики
handler.postDelayed(responseWaiting, RESPONSE_TIMEOUT);
bleDevices.get(deviceNumber).connectGatt(appContext, false, bluetoothGattCallback);
} else {
fireListeners();
}
}
Завершение опроса и отправка результатов внешнему слушателю:
private void fireListeners() {
for (BLEClientListener bleClientListener : bleClientListeners) {
if (poll) {
poll = false;
bleClientListener.onValuesReceived(characteristicValues);
}
}
}