Service UUID: что это, формат и где применяется

Автор: IT Sectr Опубликовано: 2026-07-14 Время чтения: 8 мин

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 — идентификатор сервиса BLE, который может быть 16-битным (стандартным) или 128-битным (кастомным).
  • Bluetooth SIG выделил более 60 стандартных UUID для распространённых сервисов — Battery, Heart Rate, Device Information и других.
  • 128-битные UUID генерируются разработчиком и гарантируют глобальную уникальность сервиса без регистрации в центральном органе.
  • При сканировании Central обнаруживает сервисы Peripheral по их Service UUID, что определяет совместимость устройств.
  • Один GATT-сервер может объявлять несколько сервисов с разными UUID — каждый сервис содержит собственные характеристики.

Что такое Service UUID в BLE?

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 байта) это критично.

Стандартные и кастомные UUID

Стандартные 16-битные UUID покрывают основные категории BLE-устройств: медицинские датчики, фитнес-трекеры, носимую электронику и аксессуары. Если устройство реализует стандартную функцию — разработчику рекомендуется использовать соответствующий UUID из реестра Bluetooth SIG для максимальной совместимости.

Вот несколько примеров стандартных сервисных UUID:

UUID (hex)Имя сервисаНазначение
0x1800Generic AccessУправление доступом, имя устройства, внешний вид
0x180ADevice InformationПроизводитель, модель, серийный номер, версия ПО
0x180DHeart RateИзмерение пульса, локация сенсора, энергия батареи
0x180FBattery ServiceУровень заряда батареи в процентах
0x181AEnvironmental SensingТемпература, влажность, давление, освещённость
0x181CUser DataВозраст, вес, рост, пол, пульс в покое

Кастомные 128-битные UUID необходимы, когда устройство предоставляет уникальную функциональность. Например, производитель умного замка создаёт собственный сервис Lock Control с UUID вида XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. Такой UUID гарантированно не будет конфликтовать с другими сервисами, поскольку пространство 128-битных значений практически неисчерпаемо.

Формат 128-битного UUID

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 в коде

Объявление сервиса с UUID выполняется на стороне Peripheral при создании GATT-сервера. В iOS для этого используется Core Bluetooth, в Android — android.bluetooth.le. Рассмотрим оба подхода.

iOS: Core Bluetooth

В Swift сервис создаётся через CBMutableService с указанием UUID, после чего к нему добавляются характеристики через CBMutableCharacteristic.

swift
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: Bluetooth GATT Server

На Android сервис регистрируется через BluetoothGattServer и BluetoothGattService. UUID передаётся как строка в java.util.UUID.fromString.

java
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);

Сканирование сервисов по UUID

Сканирование по Service UUID позволяет Central находить устройства, предоставляющие нужный сервис, без подключения ко всем обнаруженным Peripheral. BLE advertising-пакет может содержать список UUID сервисов, что даёт Central возможность фильтровать устройства на этапе сканирования.

В iOS CBCentralManager сканирует устройства с фильтром по UUID сервиса. Это снижает энергопотребление и ускоряет обнаружение нужных устройств.

swift
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. Это эффективный способ сузить круг поиска без подключения к каждому устройству.

java
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 от 128-битного?

16-битные UUID зарезервированы Bluetooth SIG для стандартных сервисов и занимают 2 байта в рекламном пакете. 128-битные UUID используются для кастомных сервисов и занимают 16 байт. Выбор зависит от типа сервиса: стандартная функциональность использует 16-битный UUID, уникальная — 128-битный.

Как сгенерировать кастомный 128-битный UUID для BLE-сервиса?

Используйте UUID v4 — случайный UUID, который генерируется онлайн-инструментами, терминальной командой uuidgen или API вашего языка программирования. Пример: UUID.fromString(UUID.randomUUID().toString()) в Java или UUID() в Swift.

Нужно ли регистрировать кастомный UUID в Bluetooth SIG?

Нет, регистрация не требуется. Bluetooth SIG регистрирует только 16-битные UUID. Кастомные 128-битные UUID генерируются разработчиком самостоятельно и гарантируют уникальность за счёт огромного пространства адресов (2^128 комбинаций).

Может ли один сервис содержать несколько характеристик?

Да, стандартный GATT-сервис может содержать неограниченное количество характеристик. Например, Battery Service может содержать Battery Level (0x2A19) и Battery Power State (0x2A1A). Каждая характеристика имеет собственный UUID и набор свойств.

Что произойдёт, если два устройства используют одинаковый кастомный UUID?

Если UUID совпадёт, Central не сможет отличить один сервис от другого без дополнительной информации. Вероятность коллизии случайных UUID v4 ничтожно мала — примерно 5.3 × 10^−37. Используйте генератор случайных UUID, а не копируйте UUID из примеров.

Итоги

  • Service UUID — глобальный идентификатор BLE-сервиса, который может быть 16-битным (стандартным) или 128-битным (кастомным).
  • Bluetooth SIG выделил более 60 стандартных UUID — используйте их для совместимости с устройствами других производителей.
  • 128-битные UUID создаются разработчиком через UUID v4 и гарантируют уникальность без центрального реестра.
  • При сканировании Central фильтрует устройства по Service UUID, что снижает энергопотребление и ускоряет поиск.
  • Одно устройство может объявлять несколько сервисов с разными UUID — количество ограничено памятью и рекламным пакетом.
  • В iOS и Android сервисы объявляются через CBMutableService и BluetoothGattService соответственно с указанием UUID.
  • Правильный выбор UUID влияет на совместимость, размер рекламного пакета и корректность работы GATT-профиля.

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также