Service UUID — is een unieke 16- of 128-bits identificatie van Bluetooth Low Energy (BLE) die ondubbelzinnig een functionele service op een apparaat definieert. Bluetooth SIG heeft standaard 16-bits UUID's toegewezen voor veelvoorkomende services zoals Battery Service (0x180F), Device Information (0x180A) en Heart Rate (0x180D), wat cross-platform compatibiliteit vereenvoudigt. Volgens Bluetooth Core Specification 5.4 (2023) moeten aangepaste services van externe ontwikkelaars 128-bits UUID's gebruiken, waarvan het formaat wereldwijde uniciteit garandeert zonder centraal register. De juiste declaratie van Service UUID is de eerste stap naar correcte werking van de GATT-server op het perifere apparaat.
Belangrijkste punten
Service UUID — is een identificatie die wordt toegewezen aan een GATT-service van Bluetooth Low Energy voor unieke herkenning door andere apparaten. In de BLE-architectuur vormt elke service een logische groep kenmerken die verenigd zijn door een gemeenschappelijke functie. Bijvoorbeeld, de service Battery Service bevat het kenmerk Battery Level, dat het huidige batterijniveau doorgeeft.
Bluetooth SIG (Special Interest Group) beheert het register van standaard 16-bits UUID's die worden toegewezen aan de meest voorkomende services. Dit stelt apparaten van verschillende fabrikanten in staat om elkaars services te herkennen zonder voorafgaande configuratie. Een fitness-tracker van elk merk kan Heart Rate Service met UUID 0x180D declareren, en elke smartphone begrijpt dat dit een hartslagsensor is.
Volgens Bluetooth Core Specification 5.4 (2023) is het bereik van 16-bits UUID's (0x0000–0xFFFF) verdeeld in twee delen: van 0x0001 tot 0xFFFE — standaard Bluetooth SIG-services, en 0xFFFF is gereserveerd. Als een ontwikkelaar een unieke service nodig heeft die niet in het SIG-register bestaat, gebruikt hij een 128-bits UUID.
Het verschil tussen standaard en aangepaste UUID zit niet alleen in lengte: 16-bits UUID's besparen zendtijd van het advertising-pakket, omdat ze worden verzonden als 2 bytes in plaats van 16 bytes. Voor apparaten met strikte beperkingen op de grootte van het advertising-pakket (tot 31 bytes) is dit cruciaal.
Standaard 16-bits UUID's dekken de belangrijkste categorieën BLE-apparaten: medische sensoren, fitness-trackers, draagbare elektronica en accessoires. Als een apparaat een standaardfunctie implementeert — wordt de ontwikkelaar aanbevolen om de bijbehorende UUID uit het Bluetooth SIG-register te gebruiken voor maximale compatibiliteit.
Hier zijn enkele voorbeelden van standaard service-UUID's:
| UUID (hex) | Servicenaam | Doel |
|---|---|---|
| 0x1800 | Generic Access | Toegangsbeheer, apparaatnaam, uiterlijk |
| 0x180A | Device Information | Fabrikant, model, serienummer, softwareversie |
| 0x180D | Heart Rate | Hartslagmeting, sensorlocatie, batterijvermogen |
| 0x180F | Battery Service | Batterijniveau in procenten |
| 0x181A | Environmental Sensing | Temperatuur, luchtvochtigheid, druk, verlichting |
| 0x181C | User Data | Leeftijd, gewicht, lengte, geslacht, rustpols |
Aangepaste 128-bits UUID's zijn nodig wanneer het apparaat unieke functionaliteit biedt. Bijvoorbeeld, een fabrikant van een slim slot creëert zijn eigen service Lock Control met UUID van de vorm XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. Zo'n UUID garandeert dat het niet conflicteert met andere services, omdat de ruimte van 128-bits waarden praktisch onuitputtelijk is.
128-bits UUID wordt geschreven in het standaard UUID-formaat RFC 4122: acht hexadecimale tekens, koppelteken, vier, koppelteken, vier, koppelteken, vier, koppelteken, twaalf tekens. Voor BLE wordt de versie gebruikt waarbij het basisdeel van de Bluetooth SIG UUID vaste bits heeft.
Bluetooth SIG definieert de basis-UUID: 0000XXXX-0000-1000-8000-00805F9B34FB. Voor standaard 16-bits services wordt in dit masker de UUID-waarde ingevuld: bijvoorbeeld 0x180F wordt 0000180F-0000-1000-8000-00805F9B34FB. Aangepaste services gebruiken een volledig onafhankelijke UUID, gegenereerd door de ontwikkelaar.
Bij het maken van een aangepaste UUID kun je elke UUID-generator (UUID v4) gebruiken. Een willekeurige UUID v4 biedt 122 bits entropie, waardoor botsingen praktisch onmogelijk zijn. Gebruik geen aangepaste versie van de basis Bluetooth SIG UUID voor aangepaste services — dit schendt de specificatie.
Declaratie van de service met UUID wordt uitgevoerd aan de kant van Peripheral bij het maken van de GATT-server. In iOS wordt hiervoor Core Bluetooth gebruikt, in Android — android.bluetooth.le. Laten we beide benaderingen bekijken.
In Swift wordt de service gemaakt via CBMutableService met vermelding van UUID, waarna er kenmerken aan worden toegevoegd via CBMutableCharacteristic.
import CoreBluetooth
// Standaard 16-bits UUID
let batteryServiceUUID = CBUUID("180F")
// Aangepaste 128-bits UUID
let customServiceUUID = CBUUID("E20A39F4-73F5-4BC4-A12F-17D1AD07A961")
let service = CBMutableService(
type: customServiceUUID,
primary: true
)
// Kenmerken toevoegen
service.characteristics = [characteristic]
// Service publiceren via peripheralManager
peripheralManager.add(service)
Op Android wordt de service geregistreerd via BluetoothGattServer en BluetoothGattService. UUID wordt doorgegeven als string in java.util.UUID.fromString.
import android.bluetooth.*;
// Aangepaste service-UUID
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
);
// Kenmerken toevoegen
service.addCharacteristic(characteristic);
// Registreren op GATT-server
gattServer.addService(service);
Scannen op Service UUID stelt Central in staat om apparaten te vinden die de benodigde service bieden zonder verbinding te maken met alle gedetecteerde Peripheral-apparaten. Het BLE advertising-pakket kan een lijst met service-UUID's bevatten, waardoor Central apparaten kan filteren in de scanfase.
In iOS scant CBCentralManager apparaten met een filter op service-UUID. Dit vermindert het energieverbruik en versnelt de detectie van benodigde apparaten.
import CoreBluetooth
let centralManager = CBCentralManager()
func scanForHeartRateMonitor() {
let services: [CBUUID] = [
CBUUID("180D") // Heart Rate Service
]
centralManager.scanForPeripherals(
withServices: services,
options: nil
)
}
// Delegate ontvangt alleen Heart Rate Service-apparaten
func centralManager(
_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber
) {
// peripheral heeft alleen apparaten met UUID 0x180D
}
Op Android wordt filteren op UUID ook ondersteund via ScanFilter.Builder. Dit is een effectieve manier om de zoekopdracht te verfijnen zonder verbinding te maken met elk apparaat.
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
);
Eén BLE-apparaat kan meerdere services tegelijk declareren. Bijvoorbeeld, een fitnessarmband kan Battery Service (0x180F), Heart Rate Service (0x180D) en een aangepaste service voor synchronisatie met de cloud bevatten. Elke service heeft zijn eigen UUID en eigen set kenmerken.
Bij meerdere services is het belangrijk om rekening te houden met de beperking van het advertising-pakket. Het BLE advertising-pakket kan maximaal 31 bytes aan gegevens bevatten. Als de service-UUID's te veel ruimte innemen, passen sommige mogelijk niet in het advertising-pakket. In dit geval wordt scan response gebruikt — het tweede pakket dat op verzoek van Central wordt verzonden.
Volgens Bluetooth Core Specification 5.4 (2023) wordt het maximale aantal primaire services op één GATT-server niet beperkt door de specificatie, maar in de praktijk wordt het beperkt door het geheugen van het apparaat en prestatie-eisen. Voor embedded apparaten met 256 KB flash-geheugen wordt niet meer dan 5–10 services aanbevolen.
Veelgestelde vragen
16-bits UUID's zijn gereserveerd door Bluetooth SIG voor standaard services en nemen 2 bytes in beslag in het advertising-pakket. 128-bits UUID's worden gebruikt voor aangepaste services en nemen 16 bytes in beslag. De keuze hangt af van het type service: standaardfunctionaliteit gebruikt een 16-bits UUID, unieke functionaliteit een 128-bits UUID.
Gebruik UUID v4 — een willekeurige UUID die wordt gegenereerd door online tools, het terminalcommando uuidgen of de API van uw programmeertaal. Voorbeeld: UUID.fromString(UUID.randomUUID().toString()) in Java of UUID() in Swift.
Nee, registratie is niet vereist. Bluetooth SIG registreert alleen 16-bits UUID's. Aangepaste 128-bits UUID's worden onafhankelijk gegenereerd door de ontwikkelaar en garanderen uniciteit dankzij de enorme adresruimte (2^128 combinaties).
Ja, een standaard GATT-service kan een onbeperkt aantal kenmerken bevatten. Bijvoorbeeld, Battery Service kan Battery Level (0x2A19) en Battery Power State (0x2A1A) bevatten. Elk kenmerk heeft zijn eigen UUID en set eigenschappen.
Als de UUID overeenkomt, kan Central de ene service niet van de andere onderscheiden zonder aanvullende informatie. De kans op een botsing van willekeurige UUID v4 is verwaarloosbaar klein — ongeveer 5,3 × 10^−37. Gebruik een generator voor willekeurige UUID's, kopieer geen UUID's uit voorbeelden.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook