Characteristic: що це, типи даних та читання значень

Автор: IT Sectr Опубліковано: 2026-07-15 Час читання: 7 хв

Characteristic — це фундаментальна одиниця даних у Bluetooth Low Energy, через яку Central отримує або записує інформацію на периферійному пристрої. Кожна Characteristic належить певному GATT-сервісу, має унікальний UUID і набір властивостей (read, write, notify, indicate), що визначають можливі операції. За даними Bluetooth Core Specification 5.4 (2023), Bluetooth SIG специфікував понад 500 стандартних характеристик для медичних, фітнес- та промислових пристроїв. Розробник створює кастомні характеристики для передачі будь-яких користувацьких даних — від показів датчиків до команд керування пристроєм.

Головне

  • Characteristic — точка даних всередині GATT-сервісу BLE, що має UUID, властивості та значення певного типу.
  • Властивості визначають доступні операції: read (читання), write (запис), notify (сповіщення), indicate (підтверджене сповіщення).
  • Стандартні характеристики (рівень батареї, частота серцебиття) мають 16-бітні UUID з реєстру Bluetooth SIG.
  • Кожна Characteristic може містити дескриптори — метадані, що описують одиниці вимірювання або конфігурацію сповіщень.
  • Максимальний розмір одного пакета даних через Characteristic становить 20 байт (MTU 23) або до 244 байт при збільшенні MTU.

Що таке Characteristic у BLE?

Characteristic — це атрибут GATT-протоколу, який містить значення (value) та метадані. В архітектурі BLE дані передаються не безпосередньо між пристроями, а через читання та запис значень характеристик сервісу. Якщо сервіс — це папка, то Characteristic — це файл усередині папки.

Кожна Characteristic складається з трьох компонентів: оголошення (declaration), значення (value) та дескрипторів (descriptors). Оголошення містить UUID характеристики та її властивості. Значення — це власне дані, що передаються між Central та Peripheral. Дескриптори надають додаткову конфігурацію.

За даними Bluetooth Core Specification 5.4 (2023), усі обміни даними в BLE відбуваються через операції над характеристиками. Навіть стандартні профілі, такі як Heart Rate Profile або Battery Service, побудовані на наборі характеристик із попередньо визначеними UUID. Це забезпечує сумісність пристроїв різних виробників без попереднього налаштування.

Розробнику важливо розуміти: кожна Characteristic може підтримувати різні комбінації властивостей. Одна характеристика може бути лише для читання, інша — для запису, третя — для сповіщень. Правильний вибір властивостей визначає сценарій використання та енергоспоживання пристрою.

Властивості та дозволи Characteristic

Властивості (properties) характеристики визначають, які операції над нею дозволені. Це байтова маска, де кожен біт вмикає або вимикає певну операцію. Нижче перераховано основні властивості.

ВластивістьБітОписТипове застосування
Read0x02Central може читати поточне значенняСтатус, рівень батареї, конфігурація
Write0x08Central може записувати нове значенняКоманди керування, налаштування
Notify0x10Peripheral надсилає значення без підтвердженняПотокові дані (пульс, температура)
Indicate0x20Peripheral надсилає значення з підтвердженнямКритичні дані (тривоги, статуси)
Write Without Response0x04Запис без очікування підтвердження від сервераВисокошвидкісна передача команд

Дозволи (permissions) — це рівень доступу на рівні GATT-сервера. На відміну від властивостей, які декларуються в оголошенні характеристики, дозволи перевіряються при кожній операції. Вони можуть включати вимоги до шифрування та автентифікації.

Стандартні характеристики Bluetooth SIG

Bluetooth SIG специфікував понад 500 стандартних характеристик, які охоплюють більшість поширених сценаріїв використання BLE. Використання стандартних UUID гарантує, що будь-який пристрій-отримувач правильно інтерпретує дані без попереднього налаштування.

Ось найбільш часто використовувані стандартні характеристики:

UUIDІм’яТип данихСервіс
0x2A19Battery Leveluint8 (0–100%)Battery Service
0x2A37Heart Rate Measurementuint8 + прапорціHeart Rate
0x2A6ETemperatureint16 (0.01°C)Environmental Sensing
0x2A6FHumidityuint16 (0.01%)Environmental Sensing
0x2A00Device NameРядок UTF-8Generic Access
0x2A01Appearanceuint16Generic Access

Якщо існуюча стандартна характеристика покриває ваше завдання — використовуйте її. Це спрощує сертифікацію Bluetooth та підвищує сумісність з екосистемою. Кастомні характеристики створюйте лише для унікальних даних, яких немає в реєстрі SIG.

Як створити Characteristic у iOS та Android

Створення характеристики виконується на стороні Peripheral — пристрої, який надає дані. Розглянемо реалізацію на iOS (Swift) та Android (Java).

iOS: CBMutableCharacteristic

Core Bluetooth надає клас CBMutableCharacteristic для створення характеристики із зазначенням UUID, властивостей та початкового значення.

swift
import CoreBluetooth

let characteristicUUID = CBUUID("2A19") // Характеристика рівня батареї

let characteristic = CBMutableCharacteristic(
    type: characteristicUUID,
    properties: [.read, .notify],
    value: nil,
    permissions: [.readable]
)

// Оновити значення при зміні
let batteryData = Data([batteryLevel]) // uint8
peripheralManager.updateValue(
    batteryData,
    for: characteristic,
    onSubscribedCentrals: nil
)

Android: BluetoothGattCharacteristic

На Android характеристика створюється через BluetoothGattCharacteristic із зазначенням UUID, властивостей та дозволів.

java
import android.bluetooth.*;

UUID charUuid = UUID.fromString("00002A19-0000-1000-8000-00805F9B34FB");

BluetoothGattCharacteristic characteristic =
    new BluetoothGattCharacteristic(
        charUuid,
        BluetoothGattCharacteristic.PROPERTY_READ
            | BluetoothGattCharacteristic.PROPERTY_NOTIFY,
        BluetoothGattCharacteristic.PERMISSION_READ
    );

// Встановити значення
characteristic.setValue(batteryLevel, BluetoothGattCharacteristic.FORMAT_UINT8, 0);
gattServer.notifyCharacteristicChanged(device, characteristic, false);

Читання, запис та сповіщення

Операції над Characteristic поділяються на три типи: читання (read), запис (write) та сповіщення (notify/indicate). Вибір операції залежить від сценарію: дані за запитом читаються, команди записуються, потокові дані підписуються на сповіщення.

Read — Central надсилає запит на читання значення характеристики. Peripheral відповідає поточним значенням. Операція синхронна та потребує явного запиту з кожного боку. Використовується для даних, які змінюються рідко: версія прошивки, серійний номер, налаштування.

Write — Central надсилає дані на Peripheral. Є два режими: Write with Response (підтвердження від Peripheral) та Write Without Response (без підтвердження). Write with Response гарантує доставку — Peripheral надсилає підтвердження після запису. Write Without Response швидше, але не гарантує доставку.

Notify та Indicate — Peripheral ініціює надсилання даних Central. При Notify дані надсилаються без підтвердження — якщо Central не встиг прийняти пакет, він втрачається. При Indicate Central надсилає підтвердження (PDU-рівень), що гарантує доставку. Indicate повільніше, але надійніше. Для підписки на сповіщення Central записує значення 0x0001 у CCCD (Client Characteristic Configuration Descriptor).

MTU та розмір даних, що передаються

MTU (Maximum Transmission Unit) визначає максимальний розмір одного пакета даних BLE. За замовчуванням MTU становить 23 байти, з яких 3 байти займає заголовок — корисне навантаження (ATT payload) дорівнює 20 байтам. Цього достатньо для більшості сенсорних даних, але недостатньо для передачі файлів або великих конфігурацій.

Bluetooth Core Specification 5.4 підтримує MTU negotiation (узгодження MTU) — Central та Peripheral можуть домовитися про більший розмір пакета до 517 байт. Процес виглядає так: Central надсилає запит MTU Exchange зі своїм MTU; Peripheral відповідає своїм MTU; використовується мінімальне з двох значень.

swift
// iOS запитує MTU при підключенні
// Максимальний MTU в iOS становить 185 байтів
func peripheral(
    _ peripheral: CBPeripheral,
    didDiscoverServices error: Error?
) {
    // Запитати MTU для певного периферійного пристрою
    peripheral.maximumWriteValueLength(for: .withResponse)
}

За даними Bluetooth SIG (2023), збільшення MTU з 23 до 185 байт знижує накладні витрати на передачу даних до 80% завдяки зменшенню кількості пакетів. Для додатків, що передають покази з високою частотою (наприклад, ЕКГ або акселерометр), збільшення MTU критичне для стабільності потоку.

Часті питання

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

Специфікація BLE не обмежує кількість характеристик у сервісі. На практиці обмеження визначається доступною пам’яттю GATT-сервера та вимогами до продуктивності. Для вбудованих пристроїв рекомендується не більше 10–15 характеристик на сервіс.

У чому різниця між Notify та Indicate?

Notify надсилає дані без підтвердження — пакет може бути втрачений без повідомлення відправника. Indicate потребує підтвердження (ACK) на рівні протоколу, що гарантує доставку. Indicate повільніше, але надійніше. Для критичних даних (тривоги, команди) використовуйте Indicate.

Чи може характеристика мати одночасно Read та Write?

Так, характеристика може мати комбінацію властивостей. Наприклад, характеристика налаштування може підтримувати Read (читання поточного значення) та Write (зміна налаштування). Комбінуйте властивості відповідно до вашого сценарію використання.

Як передати дані більше 20 байт через BLE?

Використовуйте MTU negotiation для збільшення розміру пакета до 185–517 байт. Якщо дані все ще більші — реалізуйте фрагментацію на рівні додатка: розбийте дані на кілька послідовних запитів з контролем цілісності.

Чи потрібно використовувати стандартні UUID характеристик?

Якщо ваше завдання покривається стандартною характеристикою — використовуйте UUID з реєстру Bluetooth SIG. Це спрощує сертифікацію та забезпечує сумісність з екосистемою. Кастомні UUID створюйте лише для унікальних даних сторонніх виробників.

Підсумки

  • Characteristic — основний механізм передачі даних у BLE, що являє собою значення з UUID, властивостями та дескрипторами.
  • Властивості (Read, Write, Notify, Indicate) визначають, які операції доступні над характеристикою.
  • Bluetooth SIG специфікував понад 500 стандартних характеристик — використовуйте їх для сумісності пристроїв.
  • Створення характеристики виконується на стороні Peripheral через Core Bluetooth (iOS) або BluetoothGattCharacteristic (Android).
  • Сповіщення (Notify/Indicate) ефективніші за регулярне опитування для потокових даних — вони не потребують постійних запитів від Central.
  • Розмір одного пакета обмежений MTU (20 байт за замовчуванням), але може бути збільшений до 517 байт через MTU Exchange.
  • Правильний вибір властивостей та UUID визначає енергоспоживання, надійність та продуктивність BLE-з’єднання.

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

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