Service UUID: co to jest, format i gdzie jest stosowany

Autor: IT Sectr Opublikowano: 2026-07-14 Czas czytania: 8 min

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 — identyfikator usługi BLE, który może być 16-bitowy (standardowy) lub 128-bitowy (niestandardowy).
  • Bluetooth SIG przydzielił ponad 60 standardowych UUID dla powszechnych usług — Battery, Heart Rate, Device Information i innych.
  • 128-bitowe UUID są generowane przez programistę i gwarantują globalną unikalność usługi bez rejestracji w centralnym organie.
  • Podczas skanowania Central wykrywa usługi Peripheral po ich Service UUID, co określa kompatybilność urządzeń.
  • Jeden serwer GATT może deklarować wiele usług z różnymi UUID — każda usługa zawiera własne charakterystyki.

Czym jest Service UUID w BLE?

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 i niestandardowe UUID

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ługiPrzeznaczenie
0x1800Generic AccessZarządzanie dostępem, nazwa urządzenia, wygląd zewnętrzny
0x180ADevice InformationProducent, model, numer seryjny, wersja oprogramowania
0x180DHeart RatePomiar tętna, lokalizacja czujnika, poziom baterii
0x180FBattery ServicePoziom naładowania baterii w procentach
0x181AEnvironmental SensingTemperatura, wilgotność, ciśnienie, oświetlenie
0x181CUser DataWiek, 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.

Format 128-bitowego UUID

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

Jak zadeklarować usługę z UUID w kodzie

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.

iOS: Core Bluetooth

W Swift usługa jest tworzona przez CBMutableService z podaniem UUID, po czym dodaje się do niej charakterystyki przez CBMutableCharacteristic.

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

Android: Bluetooth GATT Server

Na Android usługa jest rejestrowana przez BluetoothGattServer i BluetoothGattService. UUID jest przekazywane jako ciąg znaków w java.util.UUID.fromString.

java
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 usług według UUID

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

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

java
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
);

Wiele usług na jednym urządzeniu

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

Czym różni się 16-bitowy UUID od 128-bitowego?

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.

Jak wygenerować niestandardowy 128-bitowy UUID dla usługi BLE?

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.

Czy trzeba rejestrować niestandardowy UUID w Bluetooth SIG?

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

Czy jedna usługa może zawierać wiele charakterystyk?

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.

Co się stanie, jeśli dwa urządzenia użyją tego samego niestandardowego UUID?

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

  • Service UUID — globalny identyfikator usługi BLE, który może być 16-bitowy (standardowy) lub 128-bitowy (niestandardowy).
  • Bluetooth SIG przydzielił ponad 60 standardowych UUID — używaj ich dla kompatybilności z urządzeniami innych producentów.
  • 128-bitowe UUID są tworzone przez programistę za pomocą UUID v4 i gwarantują unikalność bez centralnego rejestru.
  • Podczas skanowania Central filtruje urządzenia według Service UUID, co zmniejsza zużycie energii i przyspiesza wyszukiwanie.
  • Jedno urządzenie może deklarować wiele usług z różnymi UUID — liczba jest ograniczona pamięcią i pakietem reklamowym.
  • W iOS i Android usługi są deklarowane odpowiednio przez CBMutableService i BluetoothGattService z podaniem UUID.
  • Prawidłowy wybór UUID wpływa na kompatybilność, rozmiar pakietu reklamowego i poprawność działania profilu GATT.

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ż