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 используется версия, где базовая часть UUID Bluetooth SIG имеет фиксированные биты.
Bluetooth SIG определяет базовый UUID: 0000XXXX-0000-1000-8000-00805F9B34FB. Для стандартных 16-битных сервисов в эту маску подставляется значение UUID: например, 0x180F превращается в 0000180F-0000-1000-8000-00805F9B34FB. Кастомные сервисы используют полностью независимый UUID, сгенерированный разработчиком.
При создании кастомного UUID можно использовать любой генератор UUID (UUID v4). Случайный UUID v4 обеспечивает 122 бита энтропии, что делает коллизии практически невозможными. Не используйте модифицированную версию базового UUID Bluetooth SIG для кастомных сервисов — это нарушает спецификацию.
Объявление сервиса с UUID выполняется на стороне Peripheral при создании GATT-сервера. В iOS для этого используется Core Bluetooth, в Android — android.bluetooth.le. Рассмотрим оба подхода.
В Swift сервис создаётся через CBMutableService с указанием UUID, после чего к нему добавляются характеристики через CBMutableCharacteristic.
import CoreBluetooth
// Standard 16-bit UUID
let batteryServiceUUID = CBUUID("180F")
// Custom 128-bit UUID
let customServiceUUID = CBUUID("E20A39F4-73F5-4BC4-A12F-17D1AD07A961")
let service = CBMutableService(
type: customServiceUUID,
primary: true
)
// Add characteristics
service.characteristics = [characteristic]
// Publish service via peripheralManager
peripheralManager.add(service)
На Android сервис регистрируется через BluetoothGattServer и BluetoothGattService. UUID передаётся как строка в java.util.UUID.fromString.
import android.bluetooth.*;
// Custom 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
);
// Add characteristics
service.addCharacteristic(characteristic);
// Register on GATT server
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
)
}
// Delegate receives only Heart Rate Service devices
func centralManager(
_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber
) {
// peripheral has only devices with 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 и собственный набор характеристик.
При множественных сервисах важно учитывать ограничение рекламного пакета. Advertising-пакет BLE может содержать до 31 байта данных. Если UUID сервисов занимают слишком много места, некоторые из них могут не поместиться в рекламный пакет. В этом случае используется scan response — второй пакет, который отправляется по запросу Central.
По данным Bluetooth Core Specification 5.4 (2023), максимальное количество первичных сервисов на одном GATT-сервере не ограничено спецификацией, но на практике ограничено памятью устройства и требованиями к производительности. Для встраиваемых устройств с 256 КБ флеш-памяти рекомендуется не более 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 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также