Service UUID — är en unik 16- eller 128-bitars identifierare för Bluetooth Low Energy (BLE) som entydigt definierar en funktionell tjänst på en enhet. Bluetooth SIG har tilldelat standard 16-bitars UUID för vanliga tjänster som Battery Service (0x180F), Device Information (0x180A) och Heart Rate (0x180D), vilket förenklar plattformsoberoende kompatibilitet. Enligt Bluetooth Core Specification 5.4 (2023) måste anpassade tjänster från tredjepartsutvecklare använda 128-bitars UUID, vars format garanterar global unikhet utan centralt register. Korrekt deklaration av Service UUID är det första steget mot korrekt funktion av GATT-servern på den perifera enheten.
Huvudpunkter
Service UUID — är en identifierare som tilldelas en GATT-tjänst för Bluetooth Low Energy för unik igenkänning av andra enheter. I BLE-arkitekturen representerar varje tjänst en logisk grupp av egenskaper förenade av en gemensam funktion. Till exempel innehåller tjänsten Battery Service egenskapen Battery Level, som överför den aktuella batteriladdningsnivån.
Bluetooth SIG (Special Interest Group) hanterar registret över standard 16-bitars UUID som tilldelas de vanligaste tjänsterna. Detta gör att enheter från olika tillverkare kan känna igen varandras tjänster utan föregående konfiguration. En fitness-tracker av vilket märke som helst kan deklarera Heart Rate Service med UUID 0x180D, och vilken smartphone som helst förstår att det är en pulstjänst.
Enligt Bluetooth Core Specification 5.4 (2023) är intervallet för 16-bitars UUID (0x0000–0xFFFF) uppdelat i två delar: från 0x0001 till 0xFFFE — standard Bluetooth SIG-tjänster, och 0xFFFF är reserverat. Om en utvecklare behöver en unik tjänst som inte finns i SIG-registret, använder han ett 128-bitars UUID.
Skillnaden mellan standard och anpassat UUID är inte bara i längd: 16-bitars UUID sparar sändningstid för reklampaketet eftersom de överförs som 2 byte istället för 16 byte. För enheter med strikta begränsningar av storleken på advertising-paketet (upp till 31 byte) är detta kritiskt.
Standard 16-bitars UUID täcker huvudkategorierna av BLE-enheter: medicinska sensorer, fitness-trackers, bärbar elektronik och tillbehör. Om en enhet implementerar en standardfunktion — rekommenderas utvecklaren att använda motsvarande UUID från Bluetooth SIG-registret för maximal kompatibilitet.
Här är några exempel på standard UUID för tjänster:
| UUID (hex) | Tjänstens namn | Syfte |
|---|---|---|
| 0x1800 | Generic Access | Åtkomsthantering, enhetsnamn, yttre utseende |
| 0x180A | Device Information | Tillverkare, modell, serienummer, programvaruversion |
| 0x180D | Heart Rate | Pulsmätning, sensorplacering, batterienergi |
| 0x180F | Battery Service | Batteriladdningsnivå i procent |
| 0x181A | Environmental Sensing | Temperatur, luftfuktighet, tryck, belysning |
| 0x181C | User Data | Ålder, vikt, längd, kön, vilopuls |
Anpassade 128-bitars UUID är nödvändiga när enheten tillhandahåller unik funktionalitet. Till exempel skapar en tillverkare av ett smart lås sin egen tjänst Lock Control med UUID av formen XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. Ett sådant UUID garanterar att det inte kommer i konflikt med andra tjänster, eftersom utrymmet för 128-bitars värden är praktiskt taget outtömligt.
128-bitars UUID skrivs i standardformatet UUID RFC 4122: åtta hexadecimala tecken, bindestreck, fyra, bindestreck, fyra, bindestreck, fyra, bindestreck, tolv tecken. För BLE används versionen där basdelen av Bluetooth SIG UUID har fasta bitar.
Bluetooth SIG definierar bas-UUID: 0000XXXX-0000-1000-8000-00805F9B34FB. För standard 16-bitars tjänster sätts UUID-värdet in i denna mask: till exempel blir 0x180F 0000180F-0000-1000-8000-00805F9B34FB. Anpassade tjänster använder ett helt oberoende UUID som genererats av utvecklaren.
När du skapar ett anpassat UUID kan du använda vilken UUID-generator som helst (UUID v4). Ett slumpmässigt UUID v4 ger 122 bitar entropi, vilket gör kollisioner praktiskt taget omöjliga. Använd inte en modifierad version av Bluetooth SIG bas-UUID för anpassade tjänster — detta bryter mot specifikationen.
Deklaration av tjänsten med UUID utförs på Peripheral-sidan när GATT-servern skapas. I iOS används Core Bluetooth för detta, i Android — android.bluetooth.le. Låt oss titta på båda metoderna.
I Swift skapas tjänsten via CBMutableService med angivande av UUID, varefter egenskaper läggs till via CBMutableCharacteristic.
import CoreBluetooth
// Standard 16-bitars UUID
let batteryServiceUUID = CBUUID("180F")
// Anpassat 128-bitars UUID
let customServiceUUID = CBUUID("E20A39F4-73F5-4BC4-A12F-17D1AD07A961")
let service = CBMutableService(
type: customServiceUUID,
primary: true
)
// Lägg till egenskaper
service.characteristics = [characteristic]
// Publicera tjänst via peripheralManager
peripheralManager.add(service)
På Android registreras tjänsten via BluetoothGattServer och BluetoothGattService. UUID skickas som en sträng i java.util.UUID.fromString.
import android.bluetooth.*;
// Anpassat tjänst-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
);
// Lägg till egenskaper
service.addCharacteristic(characteristic);
// Registrera på GATT-server
gattServer.addService(service);
Skanning efter Service UUID gör det möjligt för Central att hitta enheter som erbjuder den önskade tjänsten utan att ansluta till alla upptäckta Peripheral. BLE-reklampaketet kan innehålla en lista över UUID för tjänster, vilket gör att Central kan filtrera enheter i skanningsfasen.
I iOS skannar CBCentralManager enheter med filter baserat på tjänstens UUID. Detta minskar strömförbrukningen och påskyndar upptäckten av önskade enheter.
import CoreBluetooth
let centralManager = CBCentralManager()
func scanForHeartRateMonitor() {
let services: [CBUUID] = [
CBUUID("180D") // Heart Rate Service
]
centralManager.scanForPeripherals(
withServices: services,
options: nil
)
}
// Delegat tar endast emot Heart Rate Service-enheter
func centralManager(
_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber
) {
// peripheral har endast enheter med UUID 0x180D
}
På Android stöds filtrering efter UUID också via ScanFilter.Builder. Detta är ett effektivt sätt att begränsa sökningen utan att ansluta till varje enhet.
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
);
En BLE-enhet kan deklarera flera tjänster samtidigt. Till exempel kan ett fitnessarmband innehålla Battery Service (0x180F), Heart Rate Service (0x180D) och en anpassad tjänst för datasynkronisering med molnet. Varje tjänst har sitt eget UUID och sin egen uppsättning egenskaper.
Vid flera tjänster är det viktigt att ta hänsyn till begränsningen av reklampaketet. BLE-reklampaketet kan innehålla upp till 31 byte data. Om UUID för tjänsterna tar för mycket plats kan några av dem inte få plats i reklampaketet. I sådana fall används scan response — det andra paketet som skickas på begäran av Central.
Enligt Bluetooth Core Specification 5.4 (2023) är det maximala antalet primära tjänster på en GATT-server inte begränsat av specifikationen, men i praktiken begränsas det av enhetens minne och prestandakrav. För inbyggda enheter med 256 KB flash-minne rekommenderas högst 5–10 tjänster.
Vanliga frågor
16-bitars UUID är reserverade av Bluetooth SIG för standardtjänster och tar 2 byte i reklampaketet. 128-bitars UUID används för anpassade tjänster och tar 16 byte. Valet beror på tjänstetypen: standardfunktionalitet använder 16-bitars UUID, unik — 128-bitars UUID.
Använd UUID v4 — ett slumpmässigt UUID som genereras av onlineverktyg, terminalkommandot uuidgen eller API för ditt programmeringsspråk. Exempel: UUID.fromString(UUID.randomUUID().toString()) i Java eller UUID() i Swift.
Nej, registrering krävs inte. Bluetooth SIG registrerar endast 16-bitars UUID. Anpassade 128-bitars UUID genereras oberoende av utvecklaren och garanterar unikhet tack vare det enorma adressutrymmet (2^128 kombinationer).
Ja, en standard GATT-tjänst kan innehålla obegränsat antal egenskaper. Till exempel kan Battery Service innehålla Battery Level (0x2A19) och Battery Power State (0x2A1A). Varje egenskap har sitt eget UUID och uppsättning egenskaper.
Om UUID matchar kan Central inte skilja en tjänst från en annan utan ytterligare information. Sannolikheten för kollision av slumpmässiga UUID v4 är försumbar — cirka 5,3 × 10^−37. Använd en slumpmässig UUID-generator, kopiera inte UUID från exempel.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också