Bluetooth i Bluetooth Low Energy to standardy komunikacji bezprzewodowej do przesyłania danych na krótkie odległości. Bluetooth Classic (BR/EDR) zapewnia stabilny kanał strumieniowy dla audio i plików, a BLE jest zoptymalizowany do energooszczędnej pracy z czujnikami i urządzeniami peryferyjnymi. Według danych Bluetooth SIG, 2025, rocznie dostarczanych jest ponad 5 miliardów urządzeń z obsługą BLE — standard stał się podstawą IoT, elektroniki noszonej i akcesoriów mobilnych.
Najważniejsze
Bluetooth — to standard bezprzewodowej sieci osobistej (WPAN) działający w paśmie ISM 2,4 GHz i przeznaczony do łączności między urządzeniami w odległości do 100 metrów. Specyfikacja IEEE 802.15.1 określa warstwę fizyczną i MAC, a stos Bluetooth SIG definiuje profile wyższego poziomu dla konkretnych scenariuszy: zestawów słuchawkowych (HSP), przesyłania plików (OPP), wprowadzania danych z klawiatury (HID).
Standard został podzielony na dwie gałęzie od wersji 4.0 (2010): Bluetooth Classic (BR/EDR — Basic Rate / Enhanced Data Rate) i Bluetooth Low Energy (BLE, wcześniej Bluetooth Smart). Classic jest przeznaczony do ciągłych strumieni — połączeń audio, muzyki, plików. BLE został stworzony dla aplikacji, w których dane są przesyłane krótkimi pakietami z przerwami rzędu dziesiątek sekund lub minut — pulsometry, znaczniki, czujniki temperatury.
Według Bluetooth SIG (2025), 99% nowych smartfonów obsługuje obie wersje, a ekosystem BLE obejmuje ponad 15 typów profili od Blood Pressure po Environmental Sensing.
Wybór między Classic a BLE zależy od scenariusza: do strumieniowego przesyłania audio nadaje się tylko Classic, do odczytu czujnika raz na godzinę — tylko BLE. BR/EDR wykorzystuje 79 kanałów z krokiem 1 MHz i adaptacyjną modulację częstotliwości (AFH), zapewniając odporność na zakłócenia Wi-Fi.
| Parametr | Bluetooth Classic (BR/EDR) | Bluetooth Low Energy (BLE) |
|---|---|---|
| Prędkość transmisji | 1–3 Mbit/s (EDR) | 125 kbit/s – 2 Mbit/s (LE 2M PHY) |
| Prąd szczytowy | 10–30 mA | 5–15 mA |
| Czas nadawania | ~100 ms | ~3 ms |
| Topologia | Piconet (1 master, do 7 slave) | Broadcaster / Observer / Peripheral / Central |
| Profile | HFP, A2DP, HSP, SPP, OPP | GATT-based (HRS, BLS, CTS itp.) |
| Typowe urządzenia | Zestawy słuchawkowe, głośniki, zestawy samochodowe hands-free | Opaski fitness, znaczniki, pulsometry, czujniki IoT |
| Kompatybilność | Niewspółpracuje z BLE na poziomie fizycznym | Układy dwutrybowe obsługują oba stosy |
BLE 5.x dodał LE Coded PHY w celu zwiększenia zasięgu do 1 km (na otwartym terenie) oraz LE Audio z kodekiem LC3 — nowa wersja stopniowo zaciera granicę między Classic a BLE w scenariuszach audio.
Stos BLE jest podzielony na trzy warstwy: Controller (warstwa fizyczna i łācza), Host (L2CAP, ATT, GATT, Security Manager) i Application (implementacja profilu w aplikacji). Takie rozdzielenie pozwala producentowi układu zaimplementować Controller w firmware, a programiście aplikacji mobilnej — pracować tylko z abstrakcjami GATT.
Link Layer (LL) zarządza czasem nadawania: urządzenie przełącza się między stanami Standby, Advertising, Scanning, Initiating i Connection. W stanie Connected Central i Peripheral uzgadniają connection interval — częstotliwość wymiany pakietów danych. Typowy interwał wynosi 7,5–1000 ms; im częstsza wymiana, tym większa przepustowość i wyższe zużycie energii.
Security Manager (SM) implementuje szyfrowanie AES-128 z wymianą kluczy przez protokół pairing. Wyróżnia się trzy tryby: Just Works (bez wprowadzania PIN), Passkey Entry (6-cyfrowy kod na ekranie) i OOB (NFC lub QR). W przypadku urządzeń noszonych zwykle używa się Just Works, a w medycznych — OOB z dodatkową weryfikacją.
Według Bluetooth Core Specification 5.4 (2023), czas nawiązania bezpiecznego połączenia w trybie LE Secure Connections nie przekracza 300 ms przy connection interval równym 30 ms.
Protokół ATT (Attribute Protocol) — podstawowy model transportowy, w którym serwer (urządzenie peryferyjne) przechowuje atrybuty, a klient (smartfon) je odczytuje lub zapisuje. GATT (Generic Attribute Profile) nadbudowuje nad ATT hierarchię: Service → Characteristic → Descriptor.
Każda usługa to logiczna grupa charakterystyk opisująca jedną funkcję urządzenia: Heart Rate Service (UUID 0x180D) zawiera charakterystykę Heart Rate Measurement (UUID 0x2A37) z Descriptor Client Characteristic Configuration (0x2902) zarządzającym powiadomieniami. Programista aplikacji mobilnej pobiera listę usług przez discoverServices(), następnie znajduje potrzebną charakterystykę po UUID i subskrybuje powiadomienia.
BLE używa 16-bitowych UUID dla standaryzowanych usług Bluetooth SIG i 128-bitowych UUID dla niestandardowych usług producenta. Na przykład etui-śledzik może zdefiniować usługę A000-… z charakterystyką do przesyłania poziomu naładowania własnej baterii.
private val gattCallback = object BluetoothGattCallback() {
override fun onServicesDiscovered(
gatt: BluetoothGatt, status: Int
) {
val service = gatt.getService(UUID.fromString("0000180d-0000-1000-8000-00805f9b34fb"))
val char = service?.getCharacteristic(
UUID.fromString("00002a37-0000-1000-8000-00805f9b34fb")
)
gatt.setCharacteristicNotification(char, true)
}
override fun onCharacteristicChanged(
gatt: BluetoothGatt, char: BluetoothGattCharacteristic
) {
val heartRate = char.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT8, 1)
updateUi("Tętno: $heartRate ud/min")
}
}
W przykładzie aplikacja znajduje usługę Heart Rate po standardowym UUID Bluetooth SIG, pobiera charakterystykę pomiaru pulsu i subskrybuje jej powiadomienia — przy każdej zmianie pulsu urządzenie peryferyjne wysyła dane bez jawnego żądania ze strony Central.
Advertising — kluczowy mechanizm BLE, w którym urządzenie Peripheral okresowo wysyła pakiety rozgłoszeniowe (advertising PDUs) na trzech głównych kanałach (37, 38, 39). Urządzenie centralne skanuje te kanały, odbiera dane advertisingowe i może zainicjować połączenie.
Pakiet advertisingowy zawiera do 31 bajtów użytecznego ładunku: flagi, TX power level, nazwę lokalną, UUID usług, dane producenta. To wystarcza do przesyłania odczytów z czujnika bez nawiązywania połączenia — tryb Connectionless (typ Broadcaster). Do ciągłego przesyłania danych (np. temperatury co minutę) używa się połączenia z connection interval do 1000 ms.
Na platformie mobilnej skanowanie uruchamia się przez startScan() (Android) lub scanForPeripherals() (iOS). Filtrowanie po UUID usługi pozwala nie marnować energii na przetwarzanie wszystkich widocznych urządzeń — aplikacja otrzymuje callback tylko dla interesujących ją znaczników lub czujników.
import CoreBluetooth
class ScannerViewController: UIViewController {
private var centralManager: CBCentralManager!
override func viewDidLoad() {
centralManager = CBCentralManager(
delegate: self, queue: nil
)
}
func centralManagerDidUpdateState(central: CBCentralManager) {
if central.state == .poweredOn {
centralManager.scanForPeripherals(
withServices: nil, options: nil
)
}
}
func centralManager(
central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String : Any],
rssi RSSI: NSNumber
) {
if let name = advertisementData[CBAdvertisementDataLocalNameKey] {
print("Znaleziono urządzenie: \(name)")
}
}
}
Po wykryciu urządzenia Central wywołuje connect(), przekazując obiekt CBPeripheral. Parametry połączenia (interval, latency, supervision timeout) są uzgadniane na poziomie Link Layer — programista nie zarządza nimi bezpośrednio, ale może wpływać przez requestConnectionPriority na Androidzie.
Obie platformy mobilne udostępniają natywne API do pracy z BLE. Core Bluetooth (iOS) używa podejścia delegowanego: menedżer centralny inicjuje operacje, a obiekt peryferyjny informuje o wynikach przez metody delegowane. android.bluetooth (Android) jest zbudowany na interfejsach callback i obsługuje równoległe operacje GATT z wieloma urządzeniami.
Kluczowe różnice między platformami:
Według testów Bluetooth SIG (2024), czas połączenia BLE smartfona z opaską fitness wynosi średnio 150–300 ms na Androidzie i 100–250 ms na iOS — różnica wynika z polityk zarządzania modułem radiowym.
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
class BleService {
final FlutterBluePlus fbp = FlutterBluePlus();
Future<void> scanAndConnect(String deviceName) async {
await fbp.startScan(timeout: Duration(seconds: 15));
await for (final result in fbp.scanResults) {
if (result.device.advName == deviceName) {
await fbp.stopScan();
await result.device.connect();
break;
}
}
}
}
Programista Flutter otrzymuje jednolity interfejs API, pod którym flutter_blue_plus tłumaczy wywołania na natywne android.bluetooth lub Core Bluetooth. Takie podejście skraca czas tworzenia aplikacji do pracy z peryferiami BLE na obu platformach.
Często zadawane pytania
Bluetooth Classic (BR/EDR) jest przeznaczony do ciągłego przesyłania strumieniowego — połączeń audio, muzyki, przesyłania plików. BLE jest zoptymalizowany do krótkich pakietów danych przy minimalnym zużyciu energii — czujniki, znaczniki, trackery fitness. Classic zużywa 10–30 mA, BLE — 5–15 mA w szczycie.
Na poziomie fizycznym nie są kompatybilne — różna modulacja i mapa kanałów. Jednak większość nowoczesnych układów jest dwutrybowa (dual-mode) i implementuje oba stosy. Smartfon z dwutrybowym układem może jednocześnie komunikować się ze słuchawką Classic i trackerem BLE.
Connection interval to odstęp czasu między dwoma pakietami danych w nawiązanym połączeniu. Wartość waha się od 7,5 ms do 4 sekund. Im krótszy interwał, tym wyższa przepustowość i większe zużycie energii. Dla czujnika temperatury odczytującego raz na minutę używa się interwału 1000 ms.
Pairing to proces wymiany kluczy szyfrowania między Central a Peripheral. BLE obsługuje trzy metody: Just Works (bez potwierdzania), Passkey Entry (wprowadzenie PIN na ekranie) i OOB (wymiana przez NFC lub QR). Po sparowaniu urządzenia zapisują klucze (bonding) i przy ponownym połączeniu nie żądają ponownej autoryzacji.
Najczęstsze: Heart Rate Profile (0x180D) dla pulsometrów, Blood Pressure Profile (0x1810) dla ciśnieniomierzy, Environmental Sensing (0x181A) dla czujników temperatury i wilgotności, Battery Service (0x180F) dla poziomu naładowania, Device Information (0x180A) dla modelu i numeru seryjnego.
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ż