Characteristic — це фундаментальна одиниця даних у Bluetooth Low Energy, через яку Central отримує або записує інформацію на периферійному пристрої. Кожна Characteristic належить певному GATT-сервісу, має унікальний UUID і набір властивостей (read, write, notify, indicate), що визначають можливі операції. За даними Bluetooth Core Specification 5.4 (2023), Bluetooth SIG специфікував понад 500 стандартних характеристик для медичних, фітнес- та промислових пристроїв. Розробник створює кастомні характеристики для передачі будь-яких користувацьких даних — від показів датчиків до команд керування пристроєм.
Головне
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 може підтримувати різні комбінації властивостей. Одна характеристика може бути лише для читання, інша — для запису, третя — для сповіщень. Правильний вибір властивостей визначає сценарій використання та енергоспоживання пристрою.
Властивості (properties) характеристики визначають, які операції над нею дозволені. Це байтова маска, де кожен біт вмикає або вимикає певну операцію. Нижче перераховано основні властивості.
| Властивість | Біт | Опис | Типове застосування |
|---|---|---|---|
| Read | 0x02 | Central може читати поточне значення | Статус, рівень батареї, конфігурація |
| Write | 0x08 | Central може записувати нове значення | Команди керування, налаштування |
| Notify | 0x10 | Peripheral надсилає значення без підтвердження | Потокові дані (пульс, температура) |
| Indicate | 0x20 | Peripheral надсилає значення з підтвердженням | Критичні дані (тривоги, статуси) |
| Write Without Response | 0x04 | Запис без очікування підтвердження від сервера | Високошвидкісна передача команд |
Дозволи (permissions) — це рівень доступу на рівні GATT-сервера. На відміну від властивостей, які декларуються в оголошенні характеристики, дозволи перевіряються при кожній операції. Вони можуть включати вимоги до шифрування та автентифікації.
Bluetooth SIG специфікував понад 500 стандартних характеристик, які охоплюють більшість поширених сценаріїв використання BLE. Використання стандартних UUID гарантує, що будь-який пристрій-отримувач правильно інтерпретує дані без попереднього налаштування.
Ось найбільш часто використовувані стандартні характеристики:
| UUID | Ім’я | Тип даних | Сервіс |
|---|---|---|---|
| 0x2A19 | Battery Level | uint8 (0–100%) | Battery Service |
| 0x2A37 | Heart Rate Measurement | uint8 + прапорці | Heart Rate |
| 0x2A6E | Temperature | int16 (0.01°C) | Environmental Sensing |
| 0x2A6F | Humidity | uint16 (0.01%) | Environmental Sensing |
| 0x2A00 | Device Name | Рядок UTF-8 | Generic Access |
| 0x2A01 | Appearance | uint16 | Generic Access |
Якщо існуюча стандартна характеристика покриває ваше завдання — використовуйте її. Це спрощує сертифікацію Bluetooth та підвищує сумісність з екосистемою. Кастомні характеристики створюйте лише для унікальних даних, яких немає в реєстрі SIG.
Створення характеристики виконується на стороні Peripheral — пристрої, який надає дані. Розглянемо реалізацію на iOS (Swift) та Android (Java).
Core Bluetooth надає клас CBMutableCharacteristic для створення характеристики із зазначенням UUID, властивостей та початкового значення.
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 із зазначенням UUID, властивостей та дозволів.
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 (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; використовується мінімальне з двох значень.
// 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 потребує підтвердження (ACK) на рівні протоколу, що гарантує доставку. Indicate повільніше, але надійніше. Для критичних даних (тривоги, команди) використовуйте Indicate.
Так, характеристика може мати комбінацію властивостей. Наприклад, характеристика налаштування може підтримувати Read (читання поточного значення) та Write (зміна налаштування). Комбінуйте властивості відповідно до вашого сценарію використання.
Використовуйте MTU negotiation для збільшення розміру пакета до 185–517 байт. Якщо дані все ще більші — реалізуйте фрагментацію на рівні додатка: розбийте дані на кілька послідовних запитів з контролем цілісності.
Якщо ваше завдання покривається стандартною характеристикою — використовуйте UUID з реєстру Bluetooth SIG. Це спрощує сертифікацію та забезпечує сумісність з екосистемою. Кастомні UUID створюйте лише для унікальних даних сторонніх виробників.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також