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") // Карактеристика нивоа батерије
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 преговарање (MTU negotiation) — 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 преговарање за повећање величине пакета на 185–517 бајтова. Ако су подаци и даље превелики — имплементирајте фрагментацију на нивоу апликације: поделите податке на неколико узастопних захтева са контролом интегритета.
Ако је ваш задатак покривен стандардном карактеристиком — користите UUID из регистра Bluetooth SIG. Ово поједностављује сертификацију и обезбеђује компатибилност са екосистемом. Прилагођене UUID-ове креирајте само за јединствене податке произвођача трећих страна.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође