Service UUID — egy egyedi 16 vagy 128 bites Bluetooth Low Energy (BLE) azonosító, amely egyértelműen meghatározza a funkcionális szolgáltatást egy eszközön. A Bluetooth SIG szabványos 16 bites UUID-eket jelölt ki gyakori szolgáltatásokhoz, mint a Battery Service (0x180F), Device Information (0x180A) és Heart Rate (0x180D), ami leegyszerűsíti a platformok közötti kompatibilitást. A Bluetooth Core Specification 5.4 (2023) szerint a külső fejlesztők egyedi szolgáltatásainak 128 bites UUID-eket kell használniuk, amelyek formátuma globális egyediséget garantál központi nyilvántartás nélkül. A Service UUID helyes deklarálása az első lépés a GATT szerver megfelelő működéséhez a periféria eszközön.
Főbb pontok
Service UUID — egy azonosító, amelyet egy Bluetooth Low Energy GATT szolgáltatáshoz rendelnek annak egyedi felismeréséhez más eszközök által. A BLE architektúrában minden szolgáltatás egy logikai csoportot alkot a jellemzőkből, amelyeket egy közös funkció egyesít. Például a Battery Service szolgáltatás tartalmazza a Battery Level jellemzőt, amely az aktuális akkumulátortöltöttségi szintet továbbítja.
A Bluetooth SIG (Special Interest Group) kezeli a szabványos 16 bites UUID-ek nyilvántartását, amelyeket a leggyakoribb szolgáltatásokhoz rendelnek. Ez lehetővé teszi a különböző gyártók eszközei számára, hogy előzetes konfiguráció nélkül felismerjék egymás szolgáltatásait. Bármely márka fitnesz követője deklarálhatja a Heart Rate Service-t 0x180D UUID-vel, és bármely okostelefon megérti, hogy ez egy pulzusmérő szolgáltatás.
A Bluetooth Core Specification 5.4 (2023) szerint a 16 bites UUID-k tartománya (0x0000–0xFFFF) két részre oszlik: 0x0001-től 0xFFFE-ig — a Bluetooth SIG szabványos szolgáltatásai, a 0xFFFF pedig fenntartott. Ha egy fejlesztőnek olyan egyedi szolgáltatásra van szüksége, amely nem szerepel a SIG nyilvántartásában, 128 bites UUID-t használ.
A különbség a szabványos és az egyedi UUID között nem csak a hosszban van: a 16 bites UUID-ek sugárzási időt takarítanak meg, mivel 2 bájtként kerülnek továbbításra 16 bájt helyett. Azoknál az eszközöknél, amelyeknél szigorú korlátozások vannak a reklámcsomag méretére (31 bájtig), ez kritikus jelentőségű.
Szabványos 16 bites UUID-ek lefedik a BLE eszközök fő kategóriáit: orvosi érzékelők, fitnesz követők, viselhető elektronika és tartozékok. Ha egy eszköz szabványos funkciót valósít meg — a fejlesztőnek ajánlott a megfelelő UUID használata a Bluetooth SIG nyilvántartásából a maximális kompatibilitás érdekében.
Íme néhány példa a szabványos szolgáltatás UUID-ekre:
| UUID (hex) | Szolgáltatás neve | Cél |
|---|---|---|
| 0x1800 | Generic Access | Hozzáférés-kezelés, eszköznév, külső megjelenés |
| 0x180A | Device Information | Gyártó, modell, sorozatszám, szoftververzió |
| 0x180D | Heart Rate | Pulzusmérés, érzékelő helye, akkumulátor energia |
| 0x180F | Battery Service | Akkumulátor töltöttségi szintje százalékban |
| 0x181A | Environmental Sensing | Hőmérséklet, páratartalom, nyomás, megvilágítás |
| 0x181C | User Data | Életkor, súly, magasság, nem, nyugalmi pulzus |
Egyedi 128 bites UUID-ek akkor szükségesek, amikor az eszköz egyedi funkcionalitást nyújt. Például egy intelligens zár gyártója létrehozza saját Lock Control szolgáltatását XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX alakú UUID-vel. Egy ilyen UUID garantálja, hogy nem ütközik más szolgáltatásokkal, mivel a 128 bites értékek tere gyakorlatilag kimeríthetetlen.
128 bites UUID a szabványos UUID RFC 4122 formátumban íródik: nyolc hexadecimális karakter, kötőjel, négy, kötőjel, négy, kötőjel, négy, kötőjel, tizenkét karakter. A BLE esetében azt a verziót használják, ahol a Bluetooth SIG UUID alaprészének fix bitjei vannak.
A Bluetooth SIG meghatározza az alap UUID-t: 0000XXXX-0000-1000-8000-00805F9B34FB. Szabványos 16 bites szolgáltatások esetén ebbe a maszkba kerül behelyettesítésre az UUID érték: például 0x180F 0000180F-0000-1000-8000-00805F9B34FB lesz. Az egyedi szolgáltatások teljesen független, a fejlesztő által generált UUID-t használnak.
Egyedi UUID létrehozásakor bármely UUID generátort (UUID v4) használhat. Egy véletlenszerű UUID v4 122 bit entrópiát biztosít, ami az ütközéseket gyakorlatilag lehetetlenné teszi. Ne használja a Bluetooth SIG alap UUID módosított verzióját egyedi szolgáltatásokhoz — ez megsérti a specifikációt.
A szolgáltatás deklarálása UUID-vel a Peripheral oldalán történik a GATT szerver létrehozásakor. iOS-ben ehhez Core Bluetooth-t használnak, Androidban — android.bluetooth.le-t. Vizsgáljuk meg mindkét megközelítést.
Swift-ben a szolgáltatás a CBMutableService segítségével jön létre az UUID megadásával, majd a jellemzők a CBMutableCharacteristic segítségével kerülnek hozzáadásra.
import CoreBluetooth
// Szabványos 16 bites UUID
let batteryServiceUUID = CBUUID("180F")
// Egyedi 128 bites UUID
let customServiceUUID = CBUUID("E20A39F4-73F5-4BC4-A12F-17D1AD07A961")
let service = CBMutableService(
type: customServiceUUID,
primary: true
)
// Jellemzők hozzáadása
service.characteristics = [characteristic]
// Szolgáltatás közzététele peripheralManager segítségével
peripheralManager.add(service)
Android-ban a szolgáltatás a BluetoothGattServer és BluetoothGattService segítségével kerül regisztrálásra. Az UUID stringként kerül átadásra a java.util.UUID.fromString-ben.
import android.bluetooth.*;
// Egyedi szolgáltatás 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
);
// Jellemzők hozzáadása
service.addCharacteristic(characteristic);
// Regisztráció a GATT szerveren
gattServer.addService(service);
Szolgáltatás UUID alapján történő szkennelés lehetővé teszi a Central számára, hogy megtalálja a kívánt szolgáltatást nyújtó eszközöket anélkül, hogy az összes észlelt Peripheral-hez csatlakozna. A BLE reklámcsomag tartalmazhatja a szolgáltatás UUID-ek listáját, ami lehetővé teszi a Central számára az eszközök szűrését a szkennelési szakaszban.
iOS-ben a CBCentralManager a szolgáltatás UUID-je alapján szűrve szkenneli az eszközöket. Ez csökkenti az energiafogyasztást és felgyorsítja a kívánt eszközök észlelését.
import CoreBluetooth
let centralManager = CBCentralManager()
func scanForHeartRateMonitor() {
let services: [CBUUID] = [
CBUUID("180D") // Heart Rate Service
]
centralManager.scanForPeripherals(
withServices: services,
options: nil
)
}
// A delegate csak Heart Rate Service eszközöket fogad
func centralManager(
_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber
) {
// a peripheral csak UUID 0x180D eszközökkel rendelkezik
}
Android-ban az UUID szerinti szűrés szintén támogatott a ScanFilter.Builder segítségével. Ez egy hatékony módja a keresési kör szűkítésének anélkül, hogy minden eszközhöz csatlakozni kellene.
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
);
Egy BLE eszköz egyszerre több szolgáltatást is deklarálhat. Például egy fitnesz karkötő tartalmazhat Battery Service-t (0x180F), Heart Rate Service-t (0x180D) és egy egyedi szolgáltatást a felhővel való adatszinkronizáláshoz. Minden szolgáltatásnak saját UUID-je és saját jellemzőkészlete van.
Több szolgáltatás esetén fontos figyelembe venni a reklámcsomag korlátozását. A BLE reklámcsomag legfeljebb 31 bájt adatot tartalmazhat. Ha a szolgáltatás UUID-ek túl sok helyet foglalnak, előfordulhat, hogy néhány nem fér bele a reklámcsomagba. Ebben az esetben scan response használatos — a második csomag, amelyet a Central kérésére küldenek.
A Bluetooth Core Specification 5.4 (2023) szerint az elsődleges szolgáltatások maximális száma egy GATT szerveren nincs korlátozva a specifikáció által, de a gyakorlatban az eszköz memóriája és a teljesítménykövetelmények korlátozzák. Beágyazott eszközök esetén 256 KB flash memóriával legfeljebb 5–10 szolgáltatás ajánlott.
Gyakran ismételt kérdések
A 16 bites UUID-ek a Bluetooth SIG által a szabványos szolgáltatások számára vannak fenntartva, és 2 bájtot foglalnak a reklámcsomagban. A 128 bites UUID-ek egyedi szolgáltatásokhoz használatosak és 16 bájtot foglalnak. A választás a szolgáltatás típusától függ: a szabványos funkcionalitás 16 bites UUID-t, az egyedi 128 bites UUID-t használ.
Használja a UUID v4-et — egy véletlenszerű UUID-t, amelyet online eszközök, a uuidgen terminálparancs vagy a programozási nyelv API-ja generál. Példa: UUID.fromString(UUID.randomUUID().toString()) Java-ban vagy UUID() Swift-ben.
Nem, regisztráció nem szükséges. A Bluetooth SIG csak 16 bites UUID-eket regisztrál. Az egyedi 128 bites UUID-eket a fejlesztő önállóan generálja, és az óriási címtér (2^128 kombináció) garantálja az egyediséget.
Igen, egy szabványos GATT szolgáltatás korlátlan számú jellemzőt tartalmazhat. Például a Battery Service tartalmazhat Battery Level (0x2A19) és Battery Power State (0x2A1A) jellemzőket. Minden jellemző saját UUID-vel és tulajdonságkészlettel rendelkezik.
Ha az UUID-k megegyeznek, a Central nem tudja megkülönböztetni az egyik szolgáltatást a másiktól további információk nélkül. A véletlenszerű UUID v4 ütközésének valószínűsége elhanyagolhatóan kicsi — körülbelül 5,3 × 10^−37. Használjon véletlenszerű UUID generátort, ne másolja az UUID-t példákból.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is