Service UUID — je jedinečný 16- nebo 128-bitový identifikátor Bluetooth Low Energy (BLE), který jednoznačně definuje funkční službu na zařízení. Bluetooth SIG přidělil standardní 16-bitová UUID pro běžné služby jako Battery Service (0x180F), Device Information (0x180A) a Heart Rate (0x180D), což zjednodušuje kompatibilitu napříč platformami. Podle Bluetooth Core Specification 5.4 (2023) musí vlastní služby vývojářů třetích stran používat 128-bitová UUID, jejichž formát zaručuje globální jedinečnost bez centrálního registru. Správné deklarování Service UUID je prvním krokem ke správnému fungování GATT serveru na periferním zařízení.
Hlavní body
Service UUID — je identifikátor, který je přidělen službě GATT Bluetooth Low Energy pro její jedinečné rozpoznání jinými zařízeními. V architektuře BLE každá služba představuje logickou skupinu charakteristik spojených společnou funkcí. Například služba Battery Service obsahuje charakteristiku Battery Level, která přenáší aktuální úroveň nabití baterie.
Bluetooth SIG (Special Interest Group) spravuje registr standardních 16-bitových UUID, která jsou přidělována nejběžnějším službám. To umožňuje zařízením různých výrobců rozpoznávat služby navzájem bez předchozí konfigurace. Fitness tracker jakékoli značky může deklarovat Heart Rate Service s UUID 0x180D a každý smartphone pochopí, že se jedná o službu tepové frekvence.
Podle Bluetooth Core Specification 5.4 (2023) je rozsah 16-bitových UUID (0x0000–0xFFFF) rozdělen na dvě části: od 0x0001 do 0xFFFE — standardní služby Bluetooth SIG, a 0xFFFF je rezervován. Pokud vývojář potřebuje jedinečnou službu, která není v registru SIG, použije 128-bitové UUID.
Rozdíl mezi standardním a vlastním UUID není pouze v délce: 16-bitová UUID šetří vysílací čas reklamního paketu, protože jsou přenášena jako 2 bajty místo 16 bajtů. Pro zařízení s přísnými omezeními velikosti advertising paketu (do 31 bajtů) je to kritické.
Standardní 16-bitová UUID pokrývají hlavní kategorie BLE zařízení: lékařské senzory, fitness trackery, nositelnou elektroniku a příslušenství. Pokud zařízení implementuje standardní funkci — vývojáři se doporučuje použít odpovídající UUID z registru Bluetooth SIG pro maximální kompatibilitu.
Zde je několik příkladů standardních UUID služeb:
| UUID (hex) | Název služby | Účel |
|---|---|---|
| 0x1800 | Generic Access | Správa přístupu, název zařízení, vnější vzhled |
| 0x180A | Device Information | Výrobce, model, sériové číslo, verze softwaru |
| 0x180D | Heart Rate | Měření pulsu, umístění senzoru, energie baterie |
| 0x180F | Battery Service | Úroveň nabití baterie v procentech |
| 0x181A | Environmental Sensing | Teplota, vlhkost, tlak, osvětlení |
| 0x181C | User Data | Věk, váha, výška, pohlaví, klidový puls |
Vlastní 128-bitová UUID jsou nezbytná, když zařízení poskytuje jedinečnou funkcionalitu. Například výrobce chytrého zámku vytvoří vlastní službu Lock Control s UUID ve tvaru XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. Takové UUID zaručuje, že nebude kolidovat s jinými službami, protože prostor 128-bitových hodnot je prakticky nevyčerpatelný.
128-bitové UUID se zapisuje ve standardním formátu UUID RFC 4122: osm hexadecimálních znaků, pomlčka, čtyři, pomlčka, čtyři, pomlčka, čtyři, pomlčka, dvanáct znaků. Pro BLE se používá verze, kde základní část UUID Bluetooth SIG má pevné bity.
Bluetooth SIG definuje základní UUID: 0000XXXX-0000-1000-8000-00805F9B34FB. Pro standardní 16-bitové služby se do této masky dosadí hodnota UUID: například 0x180F se změní na 0000180F-0000-1000-8000-00805F9B34FB. Vlastní služby používají zcela nezávislé UUID generované vývojářem.
Při vytváření vlastního UUID můžete použít libovolný generátor UUID (UUID v4). Náhodné UUID v4 poskytuje 122 bitů entropie, což činí kolize prakticky nemožnými. Nepoužívejte modifikovanou verzi základního UUID Bluetooth SIG pro vlastní služby — to porušuje specifikaci.
Deklarování služby s UUID se provádí na straně Peripheral při vytváření GATT serveru. V iOS se k tomu používá Core Bluetooth, v Androidu — android.bluetooth.le. Podívejme se na oba přístupy.
Ve Swiftu se služba vytváří přes CBMutableService s uvedením UUID, poté se k ní přidávají charakteristiky přes CBMutableCharacteristic.
import CoreBluetooth
// Standardní 16-bitové UUID
let batteryServiceUUID = CBUUID("180F")
// Vlastní 128-bitové UUID
let customServiceUUID = CBUUID("E20A39F4-73F5-4BC4-A12F-17D1AD07A961")
let service = CBMutableService(
type: customServiceUUID,
primary: true
)
// Přidat charakteristiky
service.characteristics = [characteristic]
// Publikovat službu přes peripheralManager
peripheralManager.add(service)
Na Androidu se služba registruje přes BluetoothGattServer a BluetoothGattService. UUID se předává jako řetězec v java.util.UUID.fromString.
import android.bluetooth.*;
// Vlastní UUID služby
private static final UUID CUSTOM_SERVICE_UUID =
UUID.fromString("E20A39F4-73F5-4BC4-A12F-17D1AD07A961");
BluetoothGattService service = new BluetoothGattService(
CUSTOM_SERVICE_UUID,
BluetoothGattService.SERVICE_TYPE_PRIMARY
);
// Přidat charakteristiky
service.addCharacteristic(characteristic);
// Registrovat na GATT serveru
gattServer.addService(service);
Skenování podle Service UUID umožňuje Centralu najít zařízení poskytující požadovanou službu bez připojování ke všem detekovaným Peripheral. BLE reklamní paket může obsahovat seznam UUID služeb, což umožňuje Centralu filtrovat zařízení ve fázi skenování.
V iOS CBCentralManager skenuje zařízení s filtrem podle UUID služby. To snižuje spotřebu energie a urychluje detekci požadovaných zařízení.
import CoreBluetooth
let centralManager = CBCentralManager()
func scanForHeartRateMonitor() {
let services: [CBUUID] = [
CBUUID("180D") // Heart Rate Service
]
centralManager.scanForPeripherals(
withServices: services,
options: nil
)
}
// Delegát přijímá pouze zařízení Heart Rate Service
func centralManager(
_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber
) {
// peripheral má pouze zařízení s UUID 0x180D
}
Na Androidu je filtrování podle UUID také podporováno přes ScanFilter.Builder. To je efektivní způsob, jak zúžit okruh vyhledávání bez připojování ke každému zařízení.
import android.bluetooth.le.*;
ScanFilter filter = new ScanFilter.Builder()
.setServiceUuid(
new ParcelUuid(
UUID.fromString("0000180D-0000-1000-8000-00805F9B34FB")
)
)
.build();
BluetoothLeScanner scanner = bluetoothAdapter.getBluetoothLeScanner();
scanner.startScan(
Collections.singletonList(filter),
scanSettings,
scanCallback
);
Jedno BLE zařízení může deklarovat několik služeb současně. Například fitness náramek může obsahovat Battery Service (0x180F), Heart Rate Service (0x180D) a vlastní službu pro synchronizaci dat s cloudem. Každá služba má vlastní UUID a vlastní sadu charakteristik.
Při několika službách je důležité zohlednit omezení reklamního paketu. BLE reklamní paket může obsahovat až 31 bajtů dat. Pokud UUID služeb zabírají příliš mnoho místa, některá z nich se nemusí vejít do reklamního paketu. V tomto případě se používá scan response — druhý paket odeslaný na žádost Centralu.
Podle Bluetooth Core Specification 5.4 (2023) není maximální počet primárních služeb na jednom GATT serveru omezen specifikací, ale v praxi je omezen pamětí zařízení a požadavky na výkon. Pro vestavěná zařízení s 256 KB flash paměti se doporučuje nejvýše 5–10 služeb.
Často kladené otázky
16-bitová UUID jsou rezervována Bluetooth SIG pro standardní služby a zabírají 2 bajty v reklamním paketu. 128-bitová UUID se používají pro vlastní služby a zabírají 16 bajtů. Volba závisí na typu služby: standardní funkcionalita používá 16-bitové UUID, jedinečná — 128-bitové UUID.
Použijte UUID v4 — náhodné UUID generované online nástroji, terminálovým příkazem uuidgen nebo API vašeho programovacího jazyka. Příklad: UUID.fromString(UUID.randomUUID().toString()) v Javě nebo UUID() ve Swiftu.
Ne, registrace není vyžadována. Bluetooth SIG registruje pouze 16-bitová UUID. Vlastní 128-bitová UUID jsou generována samostatně vývojářem a zaručují jedinečnost díky obrovskému adresnímu prostoru (2^128 kombinací).
Ano, standardní služba GATT může obsahovat neomezený počet charakteristik. Například Battery Service může obsahovat Battery Level (0x2A19) a Battery Power State (0x2A1A). Každá charakteristika má vlastní UUID a sadu vlastností.
Pokud se UUID shodují, Central nebude schopen rozlišit jednu službu od druhé bez dodatečných informací. Pravděpodobnost kolize náhodných UUID v4 je zanedbatelně malá — přibližně 5,3 × 10^−37. Používejte generátor náhodných UUID, nekopírujte UUID z příkladů.
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í.