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 string | Generic Access |
| 0x2A01 | Appearance | uint16 | Generic Access |
Если существующая стандартная характеристика покрывает вашу задачу — используйте её. Это упрощает сертификацию Bluetooth и повышает совместимость с экосистемой. Кастомные характеристики создавайте только для уникальных данных, которых нет в реестре SIG.
Создание характеристики выполняется на стороне Peripheral — устройстве, которое предоставляет данные. Рассмотрим реализацию на iOS (Swift) и Android (Java).
Core Bluetooth предоставляет класс CBMutableCharacteristic для создания характеристики с указанием UUID, свойств и начального значения.
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 с указанием UUID, свойств и Permission.
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 (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 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 требует подтверждения (ACK) на уровне протокола, что гарантирует доставку. Indicate медленнее, но надёжнее. Для критических данных (тревоги, команды) используйте Indicate.
Да, характеристика может иметь комбинацию свойств. Например, характеристика настройки может поддерживать Read (чтение текущего значения) и Write (изменение настройки). Комбинируйте свойства в соответствии с вашим сценарием использования.
Используйте MTU negotiation для увеличения размера пакета до 185–517 байт. Если данные всё ещё больше — реализуйте фрагментацию на уровне приложения: разбейте данные на несколько последовательных запросов с контролем целостности.
Если ваша задача покрывается стандартной характеристикой — используйте UUID из реестра Bluetooth SIG. Это упрощает сертификацию и обеспечивает совместимость с экосистемой. Кастомные UUID создавайте только для уникальных данных сторонних производителей.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также