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") // Battery Level characteristic

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

// Update value on change
let batteryData = Data([batteryLevel]) // uint8
peripheralManager.updateValue(
    batteryData,
    for: characteristic,
    onSubscribedCentrals: nil
)

Android: BluetoothGattCharacteristic

На Android характеристика создаётся через BluetoothGattCharacteristic с указанием UUID, свойств и Permission.

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

// Set the value
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 requests MTU on connect
// Max MTU in iOS is 185 bytes
func peripheral(
    _ peripheral: CBPeripheral,
    didDiscoverServices error: Error?
) {
    // Request MTU for specific peripheral
    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 года. Мы проконсультируем вас и предложим наилучшее решение.

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

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