Bluetooth i BLE: co to jest, różnica między Classic a Low Energy i jak działa

Autor: IT Sectr Opublikowano: 2026-03-24 Czas czytania: 12 min

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 Classic — standard BR/EDR do ciągłego przesyłania audio i danych z prędkością do 3 Mbit/s i poborem prądu 10–30 mA
  • Bluetooth Low Energy — protokół do przerywanego przesyłania małych ilości danych z prądem szczytowym 5–15 mA i żywotnością baterii sięgającą kilku lat
  • Profil GATT — ujednolicony model klient-serwer określający, jak aplikacja mobilna odczytuje charakterystyki urządzenia peryferyjnego
  • Advertising — mechanizm, w którym urządzenie BLE okresowo wysyła pakiety sygnalizacyjne w celu wykrycia przez urządzenie centralne (smartfon)
  • iOS i Android — platformy używają różnych API (Core Bluetooth i android.bluetooth), ale obie obsługują GATT — kod jest przenośny przy minimalnych poprawkach

Czym są Bluetooth i BLE?

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.

Bluetooth Classic vs BLE: porównanie

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.

ParametrBluetooth Classic (BR/EDR)Bluetooth Low Energy (BLE)
Prędkość transmisji1–3 Mbit/s (EDR)125 kbit/s – 2 Mbit/s (LE 2M PHY)
Prąd szczytowy10–30 mA5–15 mA
Czas nadawania~100 ms~3 ms
TopologiaPiconet (1 master, do 7 slave)Broadcaster / Observer / Peripheral / Central
ProfileHFP, A2DP, HSP, SPP, OPPGATT-based (HRS, BLS, CTS itp.)
Typowe urządzeniaZestawy słuchawkowe, głośniki, zestawy samochodowe hands-freeOpaski fitness, znaczniki, pulsometry, czujniki IoT
KompatybilnośćNiewspółpracuje z BLE na poziomie fizycznymUkł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.

Architektura BLE: Controller, Host i Application

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.

Profil GATT: usługi, charakterystyki i deskryptory

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.

Przykład pracy z GATT w Kotlin (Android)

kotlin
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, skanowanie i nawiązywanie połączenia

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.

Przykład skanowania urządzeń BLE w Swift (iOS)

swift
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.

Bluetooth LE w tworzeniu aplikacji mobilnych: Core Bluetooth i android.bluetooth

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:

  • iOS — obsługuje do 7 równoczesnych połączeń; tryb tła BLE wymaga wpisu UIBackgroundModes = bluetooth-central; po wyjściu z tła system może opóźnić callbacki o kilka minut
  • Android — nie ma stałego limitu połączeń (ograniczenie pamięciowe); wymaga uprawnień BLUETOOTH_SCAN i BLUETOOTH_CONNECT (Android 12+); foreground service jest niezbędny do niezawodnego skanowania w tle
  • Flutter — pakiet flutter_blue_plus abstrahuje platformowe API za pomocą jednolitego interfejsu Dart: kod do skanowania i operacji GATT jest identyczny na obu platformach

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.

Przykład podłączenia BLE w Dart (Flutter)

dart
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

Jaka jest różnica między Bluetooth Classic a BLE?

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.

Czy Bluetooth Classic i BLE są ze sobą kompatybilne?

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.

Czym jest connection interval w 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.

Jak działa pairing w BLE?

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.

Jakie profile BLE są używane w aplikacjach mobilnych?

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

  • Bluetooth — standard WPAN w paśmie 2,4 GHz, podzielony na Classic (BR/EDR) i Low Energy (BLE) od wersji 4.0
  • Bluetooth Classic zapewnia prędkość do 3 Mbit/s i jest używany do zestawów słuchawkowych i przesyłania plików
  • BLE jest zoptymalizowany pod kątem niskiego poboru energii (5–15 mA) i używany w IoT, opaskach fitness i czujnikach
  • Profil GATT organizuje dane w hierarchię Service → Characteristic → Descriptor z wymianą przez protokół ATT
  • Advertising pozwala urządzeniom peryferyjnym przesyłać dane bez nawiązywania połączenia na trzech głównych kanałach
  • iOS (Core Bluetooth) i Android (android.bluetooth) udostępniają natywne API z różnym podejściem do pracy w tle i uprawnień
  • Flutter (flutter_blue_plus) łączy platformowe API w jednolity interfejs Dart do tworzenia aplikacji cross-platformowych

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.

Omów projekt

Przeczytaj również