Central — to urządzenie w architekturze Bluetooth Low Energy, które inicjuje skanowanie, nawiązuje połączenie i zarządza wymianą danych z urządzeniami peryferyjnymi. W kontekście programowania mobilnego Central to smartfon lub tablet na iOS lub Android, który łączy się z czujnikami BLE, trackerami fitness i inteligentnymi akcesoriami. Według Bluetooth Core Specification 5.4 (2023), Central może jednocześnie obsługiwać do 7 połączeń z różnymi Peripheral, chociaż rzeczywiste ograniczenie zależy od producenta układu i wersji systemu operacyjnego. Core Bluetooth na iOS i android.bluetooth.le na Android zapewniają pełne API do zarządzania rolą Central.
Najważniejsze
Central — to klient GATT w architekturze Bluetooth Low Energy, który inicjuje całą komunikację. W przeciwieństwie do Peripheral, które pasywnie oczekuje na połączenie i reklamuje swoje usługi, Central aktywnie skanuje kanał radiowy, wykrywa pakiety reklamowe i inicjuje połączenie.
Asymetryczny model Central-Peripheral to fundamentalna cecha BLE. Central zarządza logiką interakcji: decyduje, z którym urządzeniem się połączyć, które usługi zbadać, które cechy odczytać i zapisać. Peripheral pełni rolę serwera danych — przechowuje usługi i cechy, ale nie inicjuje połączeń.
Według Bluetooth Core Specification 5.4 (2023), urządzenie może być jednocześnie Central i Peripheral (dual role). Na przykład smartfon może być Central dla opaski fitness i Peripheral dla innego smartfona przesyłającego pliki. Jednak jednoczesna praca w obu rolach zwiększa pobór mocy i złożoność zarządzania połączeniami.
W ekosystemie programowania mobilnego rola Central to najczęstszy scenariusz. Aplikacja na smartfonie szuka urządzeń BLE (czujników, słuchawek, opasek), łączy się z nimi i otrzymuje dane. Deweloper korzysta z API systemu operacyjnego do pracy z Central: CBCentralManager w iOS, BluetoothLeScanner i BluetoothGatt w Android.
Skanowanie — to pierwszy etap pracy Central. Urządzenie nasłuchuje kanałów radiowych BLE (37, 38, 39) w celu wykrycia pakietów reklamowych, które okresowo wysyłają Peripheral. Każdy pakiet reklamowy zawiera nazwę urządzenia, listę UUID usług i dane użytkownika.
Central może pracować w dwóch trybach skanowania: passive scanning (tylko odbiór pakietów reklamowych) i active scanning (wysyłanie scan request w celu uzyskania dodatkowych danych przez scan response). Passive scanning oszczędza energię, ale daje mniej informacji. Active scanning pozwala uzyskać pełne dane pakietu reklamowego, w tym nazwę urządzenia i pełną listę usług.
Filtracja po UUID — ważna optymalizacja. Central może skanować tylko urządzenia z określonym Service UUID, ignorując pozostałe. To nie tylko oszczędza energię, ale także upraszcza logikę aplikacji: delegat otrzymuje tylko istotne urządzenia.
import CoreBluetooth
class BLECentralManager: NSObject, CBCentralManagerDelegate {
private var centralManager: CBCentralManager!
override init() {
super.init()
centralManager = CBCentralManager(
delegate: self,
queue: nil
)
}
func centralManagerDidUpdateState(_ central: CBCentralManager) {
if central.state == .poweredOn {
central.scanForPeripherals(
withServices: nil,
options: [
CBCentralManagerScanOptionAllowDuplicatesKey: false
]
)
}
}
}
Zarządzanie połączeniami — kluczowy obowiązek Central. Po wykryciu odpowiedniego Peripheral Central inicjuje połączenie. Połączenie BLE jest nawiązywane poprzez procedurę connection establishment, która obejmuje wymianę parametrów: connection interval, slave latency i supervision timeout.
Connection interval określa, jak często Central i Peripheral wymieniają dane po połączeniu. Interwał może wynosić od 7.5 ms do 4 sekund. Im krótszy interwał, tym wyższa przepustowość, ale większy pobór mocy. Slave latency pozwala Peripheral na pominięcie kilku connection events w celu oszczędzania energii. Supervision timeout — maksymalny czas bez odpowiedzi, po którym połączenie jest uznawane za utracone.
Central odpowiada za zerwanie połączenia po zakończeniu wymiany danych. Urządzenia BLE zwykle nie utrzymują połączenia stale — Central łączy się, pobiera dane i rozłącza. To standardowy wzorzec dla czujników IoT: Central skanuje, znajduje czujnik temperatury, łączy się, odczytuje wartość i rozłącza się.
| Parametr | Zakres | Przeznaczenie | Zalecenie |
|---|---|---|---|
| Connection Interval | 7.5 ms – 4 s | Częstotliwość wymiany danych | 30–50 ms dla strumieni, 1–4 s dla rzadkich danych |
| Slave Latency | 0–499 zdarzeń | Pomijanie zdarzeń przez Peripheral | 4–10 dla oszczędzania energii czujnika |
| Supervision Timeout | 100 ms – 32 s | Limit czasu utraty łączności | 6–10 sekund dla większości scenariuszy |
| MTU | 23–517 bajtów | Rozmiar pakietu ATT | Zapytać o maksymalny przy połączeniu |
Core Bluetooth — framework Apple do pracy z BLE na iOS i macOS. Klasa CBCentralManager zapewnia pełne API do implementacji roli Central: skanowanie, łączenie, zarządzanie połączeniami. Praca z Central w iOS opiera się na modelu delegatów: CBCentralManagerDelegate otrzymuje zdarzenia zmiany stanu, wykrywania urządzeń i wyników połączenia.
Główne kroki pracy Central w iOS: inicjalizacja CBCentralManager, sprawdzenie stanu Bluetooth, uruchomienie skanowania, przetwarzanie wykrytych urządzeń przez delegata, połączenie z wybranym Peripheral, wykrywanie usług i cech, wymiana danych.
// Połącz się z wykrytym Peripheral
func centralManager(
_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber
) {
// Zachowaj referencję do peripheral i połącz
discoveredPeripheral = peripheral
central.connect(peripheral, options: nil)
}
// Pomyślne połączenie
func centralManager(
_ central: CBCentralManager,
didConnect peripheral: CBPeripheral
) {
peripheral.delegate = self
peripheral.discoverServices(nil)
}
iOS ogranicza pracę BLE w tle: w trybie tła aplikacja może skanować tylko z określonymi kluczami w Info.plist, a połączone urządzenia mogą powiadamiać Central o zmianie danych. Dla krytycznych aplikacji (urządzenia medyczne) używaj Background Modes z kluczem bluetooth-central.
Android udostępnia API BluetoothLeScanner do skanowania urządzeń BLE i BluetoothGatt do zarządzania połączeniami. Od Androida 5.0 (API 21), BluetoothLeScanner zastąpił przestarzały startLeScan. API wymaga uprawnień BLUETOOTH, BLUETOOTH_ADMIN i ACCESS_FINE_LOCATION (lub ACCESS_BACKGROUND_LOCATION dla Androida 10+).
import android.bluetooth.le.*;
import android.bluetooth.*;
private BluetoothLeScanner scanner;
private BluetoothGatt bluetoothGatt;
// Skonfiguruj skanowanie
ScanSettings settings = new ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
.build();
// Rozpocznij skanowanie
scanner.startScan(null, settings, new ScanCallback() {
@Override
public void onScanResult(
int callbackType,
ScanResult result
) {
BluetoothDevice device = result.getDevice();
// Połącz z urządzeniem
bluetoothGatt = device.connectGatt(
context, false, gattCallback
);
}
});
W Android ważne jest uwzględnienie ograniczeń skanowania: od Androida 7 (API 24) skanowanie nie może być uruchamiane częściej niż 5 razy na 30 sekund w aplikacjach niekorzystających z Location. Android 12+ wymaga uprawnień BLUETOOTH_SCAN, BLUETOOTH_CONNECT i ADVERTISE, a także żądania tych uprawnień w czasie wykonania.
Pobór mocy Central jest wyższy niż Peripheral ze względu na konieczność ciągłego skanowania kanałów radiowych. Central odbiera dane przez pakiety BLE, przetwarza je, zarządza połączeniami i często wykonuje obliczenia na procesorze aplikacji. Według Bluetooth SIG, skanowanie pobiera od 30 mA do 100 mA w zależności od trybu.
Istnieje kilka strategii oszczędzania energii dla Central. Skanowanie interwałowe — najskuteczniejsza metoda: Central skanuje w krótkich oknach (scan window) z długimi przerwami (scan interval). Na przykład przy scan window 30 ms i scan interval 1000 ms pobór mocy zmniejsza się o 97% w porównaniu do ciągłego skanowania.
Dodatkowa optymalizacja — filtracja po UUID. Central szybciej przetwarza tylko istotne pakiety reklamowe, ignorując pozostałe. To zmniejsza obciążenie procesora i wydłuża czas pracy urządzenia na baterii. Zaleca się również wyłączanie skanowania natychmiast po wykryciu potrzebnego urządzenia i nieutrzymywanie połączenia dłużej niż to konieczne.
Często zadawane pytania
Tak, BLE obsługuje dual role: urządzenie może być jednocześnie Central dla jednych urządzeń i Peripheral dla innych. Na przykład smartfon odczytuje dane z czujnika (jako Central) i jednocześnie reklamuje własną usługę (jako Peripheral) w celu przesyłania danych do innego urządzenia.
Specyfikacja BLE określa limit 7 połączeń dla jednego Central. W praktyce ograniczenie zależy od producenta układu: układy Nordic nRF52840 obsługują do 20 połączeń, a niektóre budżetowe adaptery Bluetooth — nie więcej niż 3–4.
Przyczyny mogą być różne: czujnik nie reklamuje się (nie jest w trybie advertising), filtr po UUID jest zbyt restrykcyjny, Bluetooth w smartfonie jest wyłączony, brakuje wymaganych uprawnień (Location na Android) lub czujnik jest poza zasięgiem (zalecane do 10 metrów w pomieszczeniu).
Niekoniecznie. W wielu scenariuszach stosuje się wzorzec connect-and-read: Central skanuje, łączy się, odczytuje potrzebne dane i zrywa połączenie. Stałe połączenie jest potrzebne tylko dla danych strumieniowych (puls, EKG) lub sterowania urządzeniem w czasie rzeczywistym.
Używaj skanowania interwałowego ze stosunkiem scan window 30–50 ms i scan interval 500–1000 ms. Filtruj urządzenia po UUID, aby przetwarzać tylko istotne pakiety reklamowe. Wyłączaj skanowanie natychmiast po wykryciu potrzebnego Peripheral.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również