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 (потвърдено уведомление).
  • Стандартните характеристики (battery level, heart rate) имат 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 NameUTF-8 stringGeneric 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 договаряне (MTU negotiation) — 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 договаряне за увеличаване на размера на пакета до 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 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също