Service UUID — to unikalny 16- lub 128-bitowy identyfikator Bluetooth Low Energy (BLE), który jednoznacznie określa funkcjonalną usługę na urządzeniu. Bluetooth SIG przydzielił standardowe 16-bitowe UUID dla powszechnych usług, takich jak Battery Service (0x180F), Device Information (0x180A) i Heart Rate (0x180D), co upraszcza kompatybilność międzyplatformową. Według Bluetooth Core Specification 5.4 (2023), niestandardowe usługi zewnętrznych programistów muszą używać 128-bitowych UUID, których format gwarantuje globalną unikalność bez centralnego rejestru. Prawidłowe zadeklarowanie Service UUID to pierwszy krok do poprawnego działania serwera GATT na urządzeniu peryferyjnym.
Najważniejsze
Service UUID — to identyfikator, który jest przypisywany usłudze GATT Bluetooth Low Energy w celu jej jednoznacznego rozpoznawania przez inne urządzenia. W architekturze BLE każda usługa stanowi logiczną grupę charakterystyk połączonych wspólną funkcją. Na przykład usługa Battery Service zawiera charakterystykę Battery Level, która przekazuje bieżący poziom naładowania baterii.
Bluetooth SIG (Special Interest Group) zarządza rejestrem standardowych 16-bitowych UUID, które są przypisywane najczęściej spotykanym usługom. Pozwala to urządzeniom różnych producentów rozpoznawać wzajemnie swoje usługi bez wcześniejszej konfiguracji. Fitness tracker dowolnej marki może zadeklarować Heart Rate Service z UUID 0x180D, a każdy smartfon zrozumie, że to usługa tętna.
Według Bluetooth Core Specification 5.4 (2023), zakres 16-bitowych UUID (0x0000–0xFFFF) jest podzielony na dwie części: od 0x0001 do 0xFFFE — standardowe usługi Bluetooth SIG, a 0xFFFF jest zarezerwowany. Jeśli programista potrzebuje unikalnej usługi, której nie ma w rejestrze SIG, używa 128-bitowego UUID.
Różnica między standardowym a niestandardowym UUID nie polega tylko na długości: 16-bitowe UUID oszczędzają czas antenowy pakietu reklamowego, ponieważ są przesyłane jako 2 bajty zamiast 16 bajtów. Dla urządzeń z ostrymi ograniczeniami rozmiaru pakietu advertisingowego (do 31 bajtów) jest to krytyczne.
Standardowe 16-bitowe UUID obejmują główne kategorie urządzeń BLE: czujniki medyczne, fitness trackery, elektronikę noszoną i akcesoria. Jeśli urządzenie realizuje standardową funkcję — programiście zaleca się użycie odpowiedniego UUID z rejestru Bluetooth SIG dla maksymalnej kompatybilności.
Oto kilka przykładów standardowych UUID usług:
| UUID (hex) | Nazwa usługi | Przeznaczenie |
|---|---|---|
| 0x1800 | Generic Access | Zarządzanie dostępem, nazwa urządzenia, wygląd zewnętrzny |
| 0x180A | Device Information | Producent, model, numer seryjny, wersja oprogramowania |
| 0x180D | Heart Rate | Pomiar tętna, lokalizacja czujnika, poziom baterii |
| 0x180F | Battery Service | Poziom naładowania baterii w procentach |
| 0x181A | Environmental Sensing | Temperatura, wilgotność, ciśnienie, oświetlenie |
| 0x181C | User Data | Wiek, waga, wzrost, płeć, tętno spoczynkowe |
Niestandardowe 128-bitowe UUID są niezbędne, gdy urządzenie zapewnia unikalną funkcjonalność. Na przykład producent inteligentnego zamka tworzy własną usługę Lock Control z UUID postaci XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. Taki UUID gwarantuje brak konfliktów z innymi usługami, ponieważ przestrzeń 128-bitowych wartości jest praktycznie niewyczerpana.
128-bitowy UUID jest zapisywany w standardowym formacie UUID RFC 4122: osiem znaków szesnastkowych, myślnik, cztery, myślnik, cztery, myślnik, cztery, myślnik, dwanaście znaków. Dla BLE używana jest wersja, w której podstawowa część UUID Bluetooth SIG ma ustalone bity.
Bluetooth SIG definiuje podstawowy UUID: 0000XXXX-0000-1000-8000-00805F9B34FB. Dla standardowych 16-bitowych usług do tej maski podstawiana jest wartość UUID: na przykład 0x180F zamienia się w 0000180F-0000-1000-8000-00805F9B34FB. Niestandardowe usługi używają całkowicie niezależnego UUID, wygenerowanego przez programistę.
Podczas tworzenia niestandardowego UUID można użyć dowolnego generatora UUID (UUID v4). Losowy UUID v4 zapewnia 122 bity entropii, co sprawia, że kolizje są praktycznie niemożliwe. Nie używaj zmodyfikowanej wersji podstawowego UUID Bluetooth SIG dla niestandardowych usług — narusza to specyfikację.
Deklaracja usługi z UUID jest wykonywana po stronie Peripheral podczas tworzenia serwera GATT. W iOS używa się do tego Core Bluetooth, w Android — android.bluetooth.le. Omówimy oba podejścia.
W Swift usługa jest tworzona przez CBMutableService z podaniem UUID, po czym dodaje się do niej charakterystyki przez CBMutableCharacteristic.
import CoreBluetooth
// Standardowy 16-bitowy UUID
let batteryServiceUUID = CBUUID("180F")
// Niestandardowy 128-bitowy UUID
let customServiceUUID = CBUUID("E20A39F4-73F5-4BC4-A12F-17D1AD07A961")
let service = CBMutableService(
type: customServiceUUID,
primary: true
)
// Dodaj charakterystyki
service.characteristics = [characteristic]
// Opublikuj usługę przez peripheralManager
peripheralManager.add(service)
Na Android usługa jest rejestrowana przez BluetoothGattServer i BluetoothGattService. UUID jest przekazywane jako ciąg znaków w java.util.UUID.fromString.
import android.bluetooth.*;
// Niestandardowy UUID usługi
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
);
// Dodaj charakterystyki
service.addCharacteristic(characteristic);
// Zarejestruj na serwerze GATT
gattServer.addService(service);
Skanowanie według Service UUID pozwala Central znajdować urządzenia oferujące potrzebną usługę bez łączenia się ze wszystkimi wykrytymi Peripheral. Pakiet reklamowy BLE może zawierać listę UUID usług, co umożliwia Central filtrowanie urządzeń na etapie skanowania.
W iOS CBCentralManager skanuje urządzenia z filtrem według UUID usługi. Zmniejsza to zużycie energii i przyspiesza wykrywanie potrzebnych urządzeń.
import CoreBluetooth
let centralManager = CBCentralManager()
func scanForHeartRateMonitor() {
let services: [CBUUID] = [
CBUUID("180D") // Heart Rate Service
]
centralManager.scanForPeripherals(
withServices: services,
options: nil
)
}
// Delegat otrzymuje tylko urządzenia Heart Rate Service
func centralManager(
_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber
) {
// peripheral ma tylko urządzenia z UUID 0x180D
}
Na Android filtrowanie według UUID jest również obsługiwane przez ScanFilter.Builder. Jest to skuteczny sposób zawężenia zakresu wyszukiwania bez łączenia się z każdym urządzeniem.
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 urządzenie BLE może deklarować wiele usług jednocześnie. Na przykład opaska fitness może zawierać Battery Service (0x180F), Heart Rate Service (0x180D) i niestandardową usługę synchronizacji danych z chmurą. Każda usługa ma własny UUID i własny zestaw charakterystyk.
W przypadku wielu usług ważne jest uwzględnienie ograniczenia pakietu reklamowego. Pakiet advertisingowy BLE może zawierać do 31 bajtów danych. Jeśli UUID usług zajmują zbyt dużo miejsca, niektóre z nich mogą nie zmieścić się w pakiecie reklamowym. W takim przypadku używana jest scan response — drugi pakiet wysyłany na żądanie Central.
Według Bluetooth Core Specification 5.4 (2023), maksymalna liczba podstawowych usług na jednym serwerze GATT nie jest ograniczona przez specyfikację, ale w praktyce jest ograniczona pamięcią urządzenia i wymaganiami wydajnościowymi. Dla urządzeń wbudowanych z 256 KB pamięci flash zaleca się nie więcej niż 5–10 usług.
Często zadawane pytania
16-bitowe UUID są zarezerwowane przez Bluetooth SIG dla standardowych usług i zajmują 2 bajty w pakiecie reklamowym. 128-bitowe UUID są używane dla niestandardowych usług i zajmują 16 bajtów. Wybór zależy od typu usługi: standardowa funkcjonalność używa 16-bitowego UUID, unikalna — 128-bitowego.
Użyj UUID v4 — losowego UUID, który jest generowany przez narzędzia online, polecenie terminalowe uuidgen lub API twojego języka programowania. Przykład: UUID.fromString(UUID.randomUUID().toString()) w Java lub UUID() w Swift.
Nie, rejestracja nie jest wymagana. Bluetooth SIG rejestruje tylko 16-bitowe UUID. Niestandardowe 128-bitowe UUID są generowane samodzielnie przez programistę i gwarantują unikalność dzięki ogromnej przestrzeni adresowej (2^128 kombinacji).
Tak, standardowa usługa GATT może zawierać nieograniczoną liczbę charakterystyk. Na przykład Battery Service może zawierać Battery Level (0x2A19) i Battery Power State (0x2A1A). Każda charakterystyka ma własny UUID i zestaw właściwości.
Jeśli UUID się pokryje, Central nie będzie w stanie odróżnić jednej usługi od drugiej bez dodatkowych informacji. Prawdopodobieństwo kolizji losowych UUID v4 jest znikome — około 5,3 × 10^−37. Używaj generatora losowych UUID, nie kopiuj UUID z przykładów.
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ż