Service UUID — este un identificator unic de 16 sau 128 de biți Bluetooth Low Energy (BLE) care definește fără ambiguitate un serviciu funcțional pe un dispozitiv. Bluetooth SIG a alocat UUID-uri standard de 16 biți pentru servicii comune precum Battery Service (0x180F), Device Information (0x180A) și Heart Rate (0x180D), ceea ce simplifică compatibilitatea cross-platform. Conform Bluetooth Core Specification 5.4 (2023), serviciile personalizate ale dezvoltatorilor terți trebuie să utilizeze UUID-uri de 128 de biți, al căror format garantează unicitatea globală fără un registru central. Declararea corectă a Service UUID este primul pas către funcționarea corectă a serverului GATT pe dispozitivul periferic.
Principalele puncte
Service UUID — este un identificator atribuit unui serviciu GATT Bluetooth Low Energy pentru recunoașterea sa unică de către alte dispozitive. În arhitectura BLE, fiecare serviciu reprezintă un grup logic de caracteristici unite printr-o funcție comună. De exemplu, serviciul Battery Service conține caracteristica Battery Level, care transmite nivelul curent de încărcare a bateriei.
Bluetooth SIG (Special Interest Group) administrează registrul UUID-urilor standard de 16 biți care sunt atribuite celor mai comune servicii. Acest lucru permite dispozitivelor de la diferiți producători să recunoască serviciile reciproc fără configurare prealabilă. Un tracker de fitness de orice marcă poate declara Heart Rate Service cu UUID 0x180D, iar orice smartphone va înțelege că este un serviciu de puls.
Conform Bluetooth Core Specification 5.4 (2023), domeniul UUID-urilor de 16 biți (0x0000–0xFFFF) este împărțit în două părți: de la 0x0001 la 0xFFFE — serviciile standard Bluetooth SIG, iar 0xFFFF este rezervat. Dacă un dezvoltator are nevoie de un serviciu unic care nu există în registrul SIG, acesta folosește un UUID de 128 de biți.
Diferența dintre UUID-ul standard și cel personalizat nu este doar în lungime: UUID-urile de 16 biți economisesc timpul de emisie al pachetului de advertising, deoarece sunt transmise ca 2 octeți în loc de 16 octeți. Pentru dispozitivele cu limitări stricte ale dimensiunii pachetului de advertising (până la 31 de octeți), acest lucru este critic.
UUID-urile standard de 16 biți acoperă principalele categorii de dispozitive BLE: senzori medicali, trackere de fitness, electronice purtabile și accesorii. Dacă un dispozitiv implementează o funcție standard — dezvoltatorului i se recomandă să folosească UUID-ul corespunzător din registrul Bluetooth SIG pentru o compatibilitate maximă.
Iată câteva exemple de UUID-uri standard de servicii:
| UUID (hex) | Numele serviciului | Scop |
|---|---|---|
| 0x1800 | Generic Access | Gestionarea accesului, numele dispozitivului, aspectul exterior |
| 0x180A | Device Information | Producător, model, număr de serie, versiune software |
| 0x180D | Heart Rate | Măsurarea pulsului, localizarea senzorului, energia bateriei |
| 0x180F | Battery Service | Nivelul de încărcare a bateriei în procente |
| 0x181A | Environmental Sensing | Temperatură, umiditate, presiune, iluminare |
| 0x181C | User Data | Vârstă, greutate, înălțime, sex, puls în repaus |
UUID-urile personalizate de 128 de biți sunt necesare atunci când dispozitivul oferă funcționalitate unică. De exemplu, producătorul unui lacăt inteligent creează propriul serviciu Lock Control cu UUID de forma XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. Un astfel de UUID garantează că nu va intra în conflict cu alte servicii, deoarece spațiul valorilor de 128 de biți este practic inepuizabil.
UUID-ul de 128 de biți este scris în formatul standard UUID RFC 4122: opt caractere hexazecimale, cratimă, patru, cratimă, patru, cratimă, patru, cratimă, douăsprezece caractere. Pentru BLE se folosește versiunea în care partea de bază a UUID-ului Bluetooth SIG are biți fixați.
Bluetooth SIG definește UUID-ul de bază: 0000XXXX-0000-1000-8000-00805F9B34FB. Pentru serviciile standard de 16 biți, în această mască se înlocuiește valoarea UUID: de exemplu, 0x180F devine 0000180F-0000-1000-8000-00805F9B34FB. Serviciile personalizate folosesc un UUID complet independent, generat de dezvoltator.
La crearea unui UUID personalizat puteți folosi orice generator de UUID (UUID v4). Un UUID v4 aleatoriu asigură 122 de biți de entropie, ceea ce face coliziunile practic imposibile. Nu folosiți o versiune modificată a UUID-ului de bază Bluetooth SIG pentru servicii personalizate — acest lucru încalcă specificația.
Declararea serviciului cu UUID se realizează pe partea Peripheral la crearea serverului GATT. În iOS se folosește Core Bluetooth, în Android — android.bluetooth.le. Să analizăm ambele abordări.
În Swift, serviciul se creează prin CBMutableService cu specificarea UUID-ului, după care i se adaugă caracteristici prin CBMutableCharacteristic.
import CoreBluetooth
// UUID standard de 16 biți
let batteryServiceUUID = CBUUID("180F")
// UUID personalizat de 128 de biți
let customServiceUUID = CBUUID("E20A39F4-73F5-4BC4-A12F-17D1AD07A961")
let service = CBMutableService(
type: customServiceUUID,
primary: true
)
// Adăugare caracteristici
service.characteristics = [characteristic]
// Publicare serviciu prin peripheralManager
peripheralManager.add(service)
Pe Android, serviciul se înregistrează prin BluetoothGattServer și BluetoothGattService. UUID-ul este transmis ca șir de caractere în java.util.UUID.fromString.
import android.bluetooth.*;
// UUID personalizat al serviciului
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
);
// Adăugare caracteristici
service.addCharacteristic(characteristic);
// Înregistrare pe serverul GATT
gattServer.addService(service);
Scanarea după Service UUID permite Central să găsească dispozitive care oferă serviciul necesar fără a se conecta la toate Peripheral-urile detectate. Pachetul de advertising BLE poate conține o listă de UUID-uri de servicii, ceea ce permite Central să filtreze dispozitivele în etapa de scanare.
În iOS, CBCentralManager scanează dispozitivele cu filtru după UUID-ul serviciului. Acest lucru reduce consumul de energie și accelerează detectarea dispozitivelor necesare.
import CoreBluetooth
let centralManager = CBCentralManager()
func scanForHeartRateMonitor() {
let services: [CBUUID] = [
CBUUID("180D") // Heart Rate Service
]
centralManager.scanForPeripherals(
withServices: services,
options: nil
)
}
// Delegatul primește doar dispozitive Heart Rate Service
func centralManager(
_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber
) {
// peripheral are doar dispozitive cu UUID 0x180D
}
Pe Android, filtrarea după UUID este de asemenea suportată prin ScanFilter.Builder. Aceasta este o modalitate eficientă de a restrânge domeniul de căutare fără a se conecta la fiecare dispozitiv.
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
);
Un singur dispozitiv BLE poate declara mai multe servicii simultan. De exemplu, o brățară fitness poate conține Battery Service (0x180F), Heart Rate Service (0x180D) și un serviciu personalizat pentru sincronizarea datelor cu cloud-ul. Fiecare serviciu are propriul UUID și propriul set de caracteristici.
În cazul serviciilor multiple, este important să se ia în considerare limitarea pachetului de advertising. Pachetul de advertising BLE poate conține până la 31 de octeți de date. Dacă UUID-urile serviciilor ocupă prea mult spațiu, unele dintre ele pot să nu încapă în pachetul de advertising. În acest caz, se folosește scan response — al doilea pachet trimis la cererea Central.
Conform Bluetooth Core Specification 5.4 (2023), numărul maxim de servicii primare pe un singur server GATT nu este limitat de specificație, dar în practică este limitat de memoria dispozitivului și de cerințele de performanță. Pentru dispozitivele încorporate cu 256 KB de memorie flash, se recomandă nu mai mult de 5–10 servicii.
Întrebări frecvente
UUID-urile de 16 biți sunt rezervate de Bluetooth SIG pentru servicii standard și ocupă 2 octeți în pachetul de advertising. UUID-urile de 128 de biți sunt folosite pentru servicii personalizate și ocupă 16 octeți. Alegerea depinde de tipul serviciului: funcționalitatea standard folosește UUID de 16 biți, cea unică — UUID de 128 de biți.
Folosiți UUID v4 — un UUID aleatoriu generat de instrumente online, comanda terminală uuidgen sau API-ul limbajului dumneavoastră de programare. Exemplu: UUID.fromString(UUID.randomUUID().toString()) în Java sau UUID() în Swift.
Nu, înregistrarea nu este necesară. Bluetooth SIG înregistrează doar UUID-urile de 16 biți. UUID-urile personalizate de 128 de biți sunt generate independent de dezvoltator și garantează unicitatea datorită spațiului uriaș de adrese (2^128 de combinații).
Da, un serviciu GATT standard poate conține un număr nelimitat de caracteristici. De exemplu, Battery Service poate conține Battery Level (0x2A19) și Battery Power State (0x2A1A). Fiecare caracteristică are propriul UUID și propriul set de proprietăți.
Dacă UUID-urile coincid, Central nu va putea distinge un serviciu de celălalt fără informații suplimentare. Probabilitatea de coliziune a UUID v4 aleatorii este extrem de mică — aproximativ 5,3 × 10^−37. Folosiți un generator de UUID aleator, nu copiați UUID-uri din exemple.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și