Bluetooth Low Energy (BLE) je standard bezdrátové komunikace optimalizovaný pro přenos malých objemů dat s minimální spotřebou energie. Podle Bluetooth SIG, 2025 je tato technologie používána ve více než 5 miliardách zařízení po celém světě. GATT (Generic Attribute Profile) organizuje data do hierarchie Service → Characteristic → Descriptor, která je základem všech BLE aplikací pro iOS a Android.
Klíčové body
Bluetooth Low Energy (BLE) pracuje na modelu klient-server se dvěma rolemi: Central (mobilní zařízení) a Peripheral (zařízení). Central skenuje éter a iniciuje připojení, zatímco Peripheral přenáší data. Na rozdíl od klasického Bluetooth není BLE určen pro audio streamy — jeho úkolem je přenášet malé pakety s minimální spotřebou energie. Podle Bluetooth SIG Core Specification 5.4 (2025) podporuje BLE rychlost až 2 Mbps při proudu menším než 15 mA v aktivním režimu.
GATT (Generic Attribute Profile) definuje datovou strukturu Bluetooth Low Energy. Service je logická skupina charakteristik (např. Heart Rate Service 0x180D). Characteristic je datový bod s konkrétní hodnotou. Descriptor jsou metadata charakteristiky, včetně CCCD pro správu oznámení. Každý prvek má UUID — 16bitové pro standardní profily Bluetooth SIG nebo 128bitové pro vlastní.
Bluetooth Low Energy v mobilních aplikacích používá tuto hierarchii k organizaci výměny dat mezi smartphonem a periferiemi. Správné pochopení GATT je základem vývoje BLE aplikací na obou platformách. Vývojář musí znát UUID služeb a charakteristik zařízení, stejně jako vlastnosti každé charakteristiky (read, write, notify, indicate).
Zařízení BLE vysílají reklamní pakety (advertising packets) pro detekci. Advertising Data obsahuje název zařízení, UUID služeb, RSSI a Manufacturer Specific Data. Velikost reklamního paketu je omezena na 31 bajtů. Pro přenos dalších dat se používá Scan Response — druhý paket, který centrální zařízení vyžádá po detekci.
Na iOS spravuje Bluetooth Low Energy framework Core Bluetooth. CBCentralManager spravuje skenování a připojení, CBPeripheral představuje vzdálené BLE zařízení. Proces je standardní: inicializace CBCentralManager, kontrola stavu poweredOn, spuštění scanForPeripherals, připojení a objevení služeb. Core Bluetooth automaticky spravuje napájení rádiového modulu — pokud se BLE nepoužívá, vypne se.
BLE v mobilním vývoji na iOS vyžaduje zohlednění režimů na pozadí. Režim na pozadí Core Bluetooth se zapíná přes Capabilities projektu (Uses Bluetooth LE accessories). Na pozadí může aplikace přijímat oznámení od charakteristik, ale skenování je omezeno — systém jej restartuje pouze při pohybu zařízení. Pro iBeacon funguje skenování na pozadí aktivněji přes CLLocationManager.
import CoreBluetooth
class DeviceScanner: NSObject, CBCentralManagerDelegate {
var centralManager: CBCentralManager!
func start() {
centralManager = CBCentralManager(delegate: self, queue: nil)
}
func centralManagerDidUpdateState(_ central: CBCentralManager) {
guard central.state == .poweredOn else { return }
central.scanForPeripherals(withServices: nil, options: nil)
}
func centralManager(_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber) {
print("Nalezeno: \(peripheral.name ?? "unknown")")
}
}
V tomto příkladu CBCentralManagerDelegate zpracovává všechny události BLE připojení. Metoda centralManagerDidUpdateState kontroluje, zda je Bluetooth na mobilním zařízení zapnutý. Po úspěšné inicializaci začne skenování. Callback didDiscover je volán pro každé nalezené zařízení.
Po objevení zařízení je třeba zavolat connect a discoverServices. CBPeripheralDelegate poskytuje metody pro každý krok: didDiscoverServices, didDiscoverCharacteristics, didUpdateValueFor. Každá metoda je asynchronní — data přicházejí přes delegované callbacky. RSSI (Received Signal Strength Indicator) ukazuje úroveň signálu: čím blíže je hodnota 0, tím silnější je signál.
Na Androidu je Bluetooth Low Energy implementován přes balíček android.bluetooth. BluetoothAdapter je vstupním bodem pro všechny BLE operace. BluetoothLeScanner spouští skenování s callbacky ScanCallback. Po objevení zařízení je vytvořeno BluetoothGatt — připojení k periferii. BluetoothGattCallback zpracovává události: připojení, objevení služeb, čtení charakteristik, změny RSSI.
Bluetooth Low Energy v mobilních aplikacích na Androidu vyžaduje explicitní oprávnění BLUETOOTH_SCAN, BLUETOOTH_CONNECT a ACCESS_FINE_LOCATION. Od Androidu 12 jsou oprávnění oddělena: BLUETOOTH_SCAN pro skenování, BLUETOOTH_CONNECT pro připojení. ACCESS_FINE_LOCATION je nutné pouze pro skenování určitých typů zařízení. Bez těchto oprávnění aplikace nemůže pracovat s BLE.
class BLEScanner(private val bluetoothAdapter: BluetoothAdapter) {
fun startScan() {
val scanner = bluetoothAdapter.bluetoothLeScanner
val settings = ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
.build()
scanner.startScan(null, settings, scanCallback)
}
private val scanCallback = object : ScanCallback() {
override fun onScanResult(callbackType: Int, result: ScanResult) {
val device = result.device
val rssi = result.rssi
Log.d("BLE", "Zařízení: ${device.name}, RSSI: $rssi")
}
}
}
ScanSettings umožňuje konfigurovat režim skenování: LOW_POWER pro úsporu baterie, BALANCED pro standardní úkoly, LOW_LATENCY pro maximální rychlost detekce. ScanFilter zužuje vyhledávání podle UUID služby, názvu zařízení nebo MAC adresy. Filtrování snižuje spotřebu energie a urychluje detekci požadovaného zařízení.
Po vytvoření BluetoothGatt přes connectGatt aplikace zavolá discoverServices. BluetoothGattCallback obsahuje onServicesDiscovered, onCharacteristicRead, onCharacteristicChanged. Pro příjem oznámení o změnách charakteristiky je třeba zavolat setCharacteristicNotification. Proces vyžaduje pozornost: každá operace GATT je asynchronní a výsledek přichází v samostatném callbacku.
iBeacon je technologie Apple pro BLE majáky, které vysílají UUID, Major a Minor. Zařízení-maják vysílá reklamní paket a mobilní aplikace na základě těchto dat určuje polohu a vzdálenost. Na iOS je iBeacon nativně podporován přes CLLocationManager. Na Androidu je vyžadována knihovna třetí strany (např. AltBeacon nebo Android iBeacon Library).
Bonding je postup vytvoření trvalého bezpečného připojení mezi BLE zařízeními. Po Bondingu jsou šifrovací klíče uloženy a zařízení se automaticky připojí při opětovném přiblížení. Na iOS je bonding spravován automaticky systémem. Na Androidu — přes BluetoothDevice.createBond(). Bonding je důležitý pro nositelná zařízení a fitness trackery, které vyžadují rychlé opětovné připojení.
Advertising Data je klíčový mechanismus detekce v Bluetooth Low Energy. Výrobci zařízení mohou přidat Manufacturer Specific Data do reklamního paketu pro přenos vlastních dat. Formát paketu zahrnuje Company Identifier (2 bajty) a libovolná data. Na iOS CBCentralManager přijímá pole UUID služeb pro filtrování — to šetří baterii. Na Androidu ScanFilter funguje na stejném principu.
| Parametr | iOS (Core Bluetooth) | Android (BluetoothGatt) |
|---|---|---|
| Správce | CBCentralManager | BluetoothLeScanner |
| Připojení | connect(to:) | connectGatt() |
| Služby | discoverServices() | discoverServices() |
| Čtení | readValue(for:) | readCharacteristic() |
| Oznámení | setNotifyValue(_:for:) | setCharacteristicNotification() |
| Oprávnění | Automatická | BLUETOOTH_SCAN, BLUETOOTH_CONNECT |
| iBeacon | CLLocationManager (nativní) | AltBeacon / knihovny |
MTU (Maximum Transmission Unit) je maximální velikost jednoho paketu dat Bluetooth Low Energy. Ve výchozím nastavení je MTU 23 bajtů (3 bajty hlavička + 20 bajtů data). Zvýšení MTU na 512 bajtů výrazně urychluje přenos při výměně konfigurací nebo logů. Na iOS maximumWriteValueLength ukazuje dostupné MTU. Na Androidu se pro zvýšení MTU používá requestMtu().
Connection Interval je frekvence, s jakou centrální zařízení dotazuje periferii. Čím kratší interval, tím vyšší rychlost přenosu, ale také vyšší spotřeba energie. Typické hodnoty se pohybují od 7,5 ms do 4 sekund. Pro fitness trackery stačí 100 ms, pro audio — 7,5 ms. BLE v mobilním vývoji vyžaduje rovnováhu mezi rychlostí přenosu a výdrží baterie zařízení.
iOS podporuje BLE v režimu na pozadí přes Background Modes, ale s omezeními. Aplikace na pozadí přijímá oznámení od charakteristik, ale nemůže aktivně skenovat. Systém restartuje skenování při změně polohy zařízení. Na Androidu vyžaduje skenování na pozadí Foreground Service s trvalým oznámením. Bez něj mobilní systém ukončí proces při minimalizaci aplikace.
Pro spolehlivý provoz BLE v mobilních aplikacích dodržujte tato pravidla. Používejte notify místo pollingu — charakteristika s oznámeními odesílá data při změně, šetří baterii. Nastavte optimální MTU na začátku připojení. Filtrujte zařízení podle UUID služby při skenování. Zkontrolujte kompatibilitu BLE zásobníku na různých modelech — výrobci (Xiaomi, Huawei, Samsung) provádějí změny ovlivňující chování Bluetooth.
Často kladené otázky
Bluetooth Low Energy (BLE) je optimalizován pro periodický přenos malých paketů s nízkou spotřebou energie. Klasické Bluetooth je určeno pro audio streamy a nepřetržitý přenos velkých objemů dat.
GATT (Generic Attribute Profile) je protokol výměny dat v BLE definující hierarchii Service → Characteristic → Descriptor. GATT se používá pro čtení, zápis a příjem oznámení z BLE zařízení.
Před Androidem 12 mohlo být skenování BLE používáno k určení polohy, proto Google tato oprávnění spojil. Od Androidu 12 bylo zavedeno samostatné oprávnění BLUETOOTH_SCAN bez vazby na polohu.
Zvyšte MTU pomocí requestMtu() na Androidu a maximumWriteValueLength na iOS. Connection Interval také ovlivňuje rychlost — čím menší, tím rychlejší přenos. Optimální kombinace poskytuje až 10násobné zlepšení.
Bonding je postup vytvoření trvalého bezpečného připojení mezi BLE zařízeními. Po Bondingu jsou šifrovací klíče uloženy a zařízení se automaticky připojí bez opakovaného vyhledávání.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.