Service UUID — је јединствени 16- или 128-битни идентификатор Bluetooth Low Energy (BLE) који недвосмислено дефинише функционални сервис на уређају. Bluetooth SIG је доделио стандардне 16-битне UUID-ове за уобичајене сервисе као што су Battery Service (0x180F), Device Information (0x180A) и Heart Rate (0x180D), што поједностављује међуплатформну компатибилност. Према Bluetooth Core Specification 5.4 (2023), прилагођени сервиси програмера трећих страна морају да користе 128-битне UUID-ове, чији формат гарантује глобалну јединственост без централног регистра. Исправно декларисање Service UUID-а је први корак ка исправном раду GATT сервера на периферном уређају.
Главне тачке
Service UUID — је идентификатор који се додељује GATT сервису Bluetooth Low Energy ради његовог јединственог препознавања од стране других уређаја. У BLE архитектури, сваки сервис представља логичку групу карактеристика обједињених заједничком функцијом. На пример, сервис Battery Service садржи карактеристику Battery Level, која преноси тренутни ниво напуњености батерије.
Bluetooth SIG (Special Interest Group) управља регистром стандардних 16-битних UUID-ова који се додељују најчешћим сервисима. Ово омогућава уређајима различитих произвођача да препознају сервисе једни других без претходне конфигурације. Фитнес тракер било које марке може да декларише Heart Rate Service са UUID-ом 0x180D, и сваки паметни телефон ће разумети да је то сервис пулса.
Према Bluetooth Core Specification 5.4 (2023), опсег 16-битних UUID-ова (0x0000–0xFFFF) је подељен на два дела: од 0x0001 до 0xFFFE — стандардни сервиси Bluetooth SIG, а 0xFFFF је резервисан. Ако је програмеру потребан јединствени сервис који не постоји у SIG регистру, користи 128-битни UUID.
Разлика између стандардног и прилагођеног UUID-а није само у дужини: 16-битни UUID-ови штеде време емитовања рекламног пакета, јер се преносе као 2 бајта уместо 16 бајтова. За уређаје са строгим ограничењима величине advertising пакета (до 31 бајта) ово је критично.
Стандардни 16-битни UUID-ови покривају главне категорије BLE уређаја: медицински сензори, фитнес тракери, носива електроника и додатна опрема. Ако уређај имплементира стандардну функцију — програмеру се препоручује да користи одговарајући UUID из Bluetooth SIG регистра за максималну компатибилност.
Ево неколико примера стандардних сервисних UUID-ова:
| UUID (hex) | Име сервиса | Намена |
|---|---|---|
| 0x1800 | Generic Access | Управљање приступом, име уређаја, спољашњи изглед |
| 0x180A | Device Information | Произвођач, модел, серијски број, верзија софтвера |
| 0x180D | Heart Rate | Мерење пулса, локација сензора, енергија батерије |
| 0x180F | Battery Service | Ниво напуњености батерије у процентима |
| 0x181A | Environmental Sensing | Температура, влажност, притисак, осветљење |
| 0x181C | User Data | Старост, тежина, висина, пол, пулс у мировању |
Прилагођени 128-битни UUID-ови су неопходни када уређај пружа јединствену функционалност. На пример, произвођач паметне браве креира сопствени сервис Lock Control са UUID-ом облика XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. Такав UUID гарантује да неће доћи у конфликт са другим сервисима, јер је простор 128-битних вредности практично неисцрпан.
128-битни UUID се записује у стандардном формату UUID RFC 4122: осам хексадецималних знакова, цртица, четири, цртица, четири, цртица, четири, цртица, дванаест знакова. За BLE се користи верзија где основни део Bluetooth SIG UUID-а има фиксне битове.
Bluetooth SIG дефинише основни UUID: 0000XXXX-0000-1000-8000-00805F9B34FB. За стандардне 16-битне сервисе, у ову маску се замењује вредност UUID-а: на пример, 0x180F постаје 0000180F-0000-1000-8000-00805F9B34FB. Прилагођени сервиси користе потпуно независни UUID, генерисан од стране програмера.
Приликом креирања прилагођеног UUID-а можете користити било који генератор UUID-а (UUID v4). Случајни UUID v4 обезбеђује 122 бита ентропије, што чини колизије практично немогућим. Немојте користити модификовану верзију основног Bluetooth SIG UUID-а за прилагођене сервисе — ово крши спецификацију.
Декларисање сервиса са UUID-ом се врши на страни Peripheral-а приликом креирања GATT сервера. У iOS-у се за то користи Core Bluetooth, у Android-у — android.bluetooth.le. Размотримо оба приступа.
У Swift-у сервис се креира кроз CBMutableService са навођењем UUID-а, након чега му се додају карактеристике кроз CBMutableCharacteristic.
import CoreBluetooth
// Стандардни 16-битни UUID
let batteryServiceUUID = CBUUID("180F")
// Прилагођени 128-битни UUID
let customServiceUUID = CBUUID("E20A39F4-73F5-4BC4-A12F-17D1AD07A961")
let service = CBMutableService(
type: customServiceUUID,
primary: true
)
// Додај карактеристике
service.characteristics = [characteristic]
// Објави сервис путем peripheralManager-а
peripheralManager.add(service)
На Android-у сервис се региструје кроз BluetoothGattServer и BluetoothGattService. UUID се преноси као стринг у java.util.UUID.fromString.
import android.bluetooth.*;
// Прилагођени 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
);
// Додај карактеристике
service.addCharacteristic(characteristic);
// Региструј на GATT серверу
gattServer.addService(service);
Скенирање по Service UUID-у омогућава Central-у да пронађе уређаје који пружају потребан сервис без повезивања на све откривене Peripheral-е. BLE advertising пакет може да садржи листу UUID-ова сервиса, што омогућава Central-у да филтрира уређаје у фази скенирања.
У iOS-у, CBCentralManager скенира уређаје са филтером по UUID-у сервиса. Ово смањује потрошњу енергије и убрзава откривање потребних уређаја.
import CoreBluetooth
let centralManager = CBCentralManager()
func scanForHeartRateMonitor() {
let services: [CBUUID] = [
CBUUID("180D") // Heart Rate Service
]
centralManager.scanForPeripherals(
withServices: services,
options: nil
)
}
// Делегат прима само уређаје Heart Rate Service
func centralManager(
_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber
) {
// peripheral има само уређаје са UUID 0x180D
}
На Android-у филтрирање по UUID-у је такође подржано кроз ScanFilter.Builder. Ово је ефикасан начин да се сузи круг претраге без повезивања на сваки уређај.
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
);
Један BLE уређај може да декларише више сервиса истовремено. На пример, фитнес наруквица може да садржи Battery Service (0x180F), Heart Rate Service (0x180D) и прилагођени сервис за синхронизацију података са облаком. Сваки сервис има сопствени UUID и сопствени скуп карактеристика.
Код вишеструких сервиса важно је узети у обзир ограничење рекламног пакета. BLE advertising пакет може да садржи до 31 бајта података. Ако UUID-ови сервиса заузимају превише простора, неки од њих можда неће стати у рекламни пакет. У овом случају се користи scan response — други пакет који се шаље на захтев Central-а.
Према Bluetooth Core Specification 5.4 (2023), максималан број примарних сервиса на једном GATT серверу није ограничен спецификацијом, али је у пракси ограничен меморијом уређаја и захтевима за перформансе. За уграђене уређаје са 256 KB флеш меморије препоручује се не више од 5–10 сервиса.
Често постављана питања
16-битни UUID-ови су резервисани од стране Bluetooth SIG-а за стандардне сервисе и заузимају 2 бајта у рекламном пакету. 128-битни UUID-ови се користе за прилагођене сервисе и заузимају 16 бајтова. Избор зависи од типа сервиса: стандардна функционалност користи 16-битни UUID, јединствена — 128-битни.
Користите UUID v4 — случајни UUID који се генерише онлајн алатима, терминалном командом uuidgen или API-јем вашег програмског језика. Пример: UUID.fromString(UUID.randomUUID().toString()) у Java-и или UUID() у Swift-у.
Не, регистрација није потребна. Bluetooth SIG региструје само 16-битне UUID-ове. Прилагођени 128-битни UUID-ови се генеришу самостално од стране програмера и гарантују јединственост захваљујући огромном адресном простору (2^128 комбинација).
Да, стандардни GATT сервис може да садржи неограничен број карактеристика. На пример, Battery Service може да садржи Battery Level (0x2A19) и Battery Power State (0x2A1A). Свака карактеристика има сопствени UUID и скуп својстава.
Ако се UUID-ови поклопе, Central неће моћи да разликује један сервис од другог без додатних информација. Вероватноћа колизије случајних UUID v4 је занемарљиво мала — приближно 5,3 × 10^−37. Користите генератор случајних UUID-ова, не копирајте UUID-ове из примера.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.