Characteristic je základní jednotka dat v Bluetooth Low Energy, prostřednictvím které Central přijímá nebo zapisuje informace na periferním zařízení. Každá Characteristic patří ke konkrétní službě GATT, má jedinečné UUID a sadu vlastností (read, write, notify, indicate), které určují možné operace. Podle Bluetooth Core Specification 5.4 (2023) Bluetooth SIG specifikoval více než 500 standardních charakteristik pro lékařská, fitness a průmyslová zařízení. Vývojář vytváří vlastní charakteristiky pro přenos jakýchkoli uživatelských dat — od údajů ze senzorů až po příkazy k ovládání zařízení.
Hlavní body
Characteristic je atribut protokolu GATT, který obsahuje hodnotu (value) a metadata. V architektuře BLE se data nepřenášejí přímo mezi zařízeními, ale prostřednictvím čtení a zápisu hodnot charakteristik služby. Pokud je služba složka, pak Characteristic je soubor v této složce.
Každá Characteristic se skládá ze tří komponent: deklarace (declaration), hodnota (value) a deskriptory (descriptors). Deklarace obsahuje UUID charakteristiky a její vlastnosti. Hodnota jsou vlastní data přenášená mezi Central a Peripheral. Deskriptory poskytují dodatečnou konfiguraci.
Podle Bluetooth Core Specification 5.4 (2023) probíhají všechny výměny dat v BLE prostřednictvím operací nad charakteristikami. Dokonce i standardní profily, jako je Heart Rate Profile nebo Battery Service, jsou postaveny na sadě charakteristik s předdefinovanými UUID. To zajišťuje kompatibilitu zařízení různých výrobců bez předchozí konfigurace.
Pro vývojáře je důležité pochopit: každá Characteristic může podporovat různé kombinace vlastností. Jedna charakteristika může být pouze pro čtení, druhá — pro zápis, třetí — pro oznámení. Správný výběr vlastností určuje scénář použití a spotřebu energie zařízení.
Vlastnosti (properties) charakteristiky určují, jaké operace jsou na ní povoleny. Jedná se o bajtovou masku, kde každý bit zapíná nebo vypíná určitou operaci. Níže jsou uvedeny hlavní vlastnosti.
| Vlastnost | Bit | Popis | Typické použití |
|---|---|---|---|
| Read | 0x02 | Central může číst aktuální hodnotu | Stav, úroveň baterie, konfigurace |
| Write | 0x08 | Central může zapsat novou hodnotu | Příkazy ovládání, nastavení |
| Notify | 0x10 | Peripheral odesílá hodnotu bez potvrzení | Datový proud (puls, teplota) |
| Indicate | 0x20 | Peripheral odesílá hodnotu s potvrzením | Kritická data (alarmy, stavy) |
| Write Without Response | 0x04 | Zápis bez čekání na potvrzení od serveru | Rychlý přenos příkazů |
Oprávnění (permissions) jsou úroveň přístupu na úrovni serveru GATT. Na rozdíl od vlastností, které jsou deklarovány v deklaraci charakteristiky, oprávnění se kontrolují při každé operaci. Mohou zahrnovat požadavky na šifrování a autentizaci.
Bluetooth SIG specifikoval více než 500 standardních charakteristik, které pokrývají většinu běžných scénářů použití BLE. Použití standardních UUID zaručuje, že jakékoli přijímací zařízení správně interpretuje data bez předchozí konfigurace.
Zde jsou nejčastěji používané standardní charakteristiky:
| UUID | Název | Typ dat | Služba |
|---|---|---|---|
| 0x2A19 | Battery Level | uint8 (0–100%) | Battery Service |
| 0x2A37 | Heart Rate Measurement | uint8 + vlajky | 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 |
Pokud existující standardní charakteristika pokrývá váš úkol — použijte ji. To zjednodušuje certifikaci Bluetooth a zvyšuje kompatibilitu s ekosystémem. Vlastní charakteristiky vytvářejte pouze pro jedinečná data, která nejsou v registru SIG.
Vytvoření charakteristiky se provádí na straně Peripheral — zařízení, které poskytuje data. Podívejme se na implementaci na iOS (Swift) a Android (Java).
Core Bluetooth poskytuje třídu CBMutableCharacteristic pro vytvoření charakteristiky s uvedením UUID, vlastností a počáteční hodnoty.
import CoreBluetooth
let characteristicUUID = CBUUID("2A19") // Charakteristika úrovně baterie
let characteristic = CBMutableCharacteristic(
type: characteristicUUID,
properties: [.read, .notify],
value: nil,
permissions: [.readable]
)
// Aktualizovat hodnotu při změně
let batteryData = Data([batteryLevel]) // uint8
peripheralManager.updateValue(
batteryData,
for: characteristic,
onSubscribedCentrals: nil
)
Na Androidu se charakteristika vytváří pomocí BluetoothGattCharacteristic s uvedením UUID, vlastností a oprávnění.
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
);
// Nastavit hodnotu
characteristic.setValue(batteryLevel, BluetoothGattCharacteristic.FORMAT_UINT8, 0);
gattServer.notifyCharacteristicChanged(device, characteristic, false);
Operace nad Characteristic se dělí na tři typy: čtení (read), zápis (write) a oznámení (notify/indicate). Výběr operace závisí na scénáři: data na vyžádání se čtou, příkazy se zapisují, datové toky se odebírají prostřednictvím oznámení.
Read — Central odešle požadavek na čtení hodnoty charakteristiky. Peripheral odpoví aktuální hodnotou. Operace je synchronní a vyžaduje explicitní požadavek z obou stran. Používá se pro data, která se mění zřídka: verze firmwaru, sériové číslo, nastavení.
Write — Central odešle data na Peripheral. Existují dva režimy: Write with Response (potvrzení od Peripheral) a Write Without Response (bez potvrzení). Write with Response zaručuje doručení — Peripheral pošle potvrzení po zápisu. Write Without Response je rychlejší, ale nezaručuje doručení.
Notify a Indicate — Peripheral iniciuje odesílání dat Central. Při Notify jsou data odeslána bez potvrzení — pokud Central nestihl paket přijmout, je ztracen. Při Indicate Central odešle potvrzení (na úrovni PDU), což zaručuje doručení. Indicate je pomalejší, ale spolehlivější. Pro odběr oznámení zapíše Central hodnotu 0x0001 do CCCD (Client Characteristic Configuration Descriptor).
MTU (Maximum Transmission Unit) určuje maximální velikost jednoho datového paketu BLE. Ve výchozím nastavení je MTU 23 bajtů, z nichž 3 bajty tvoří hlavička — užitečné zatížení (ATT payload) je 20 bajtů. To je dostatečné pro většinu senzorových dat, ale nedostatečné pro přenos souborů nebo velkých konfigurací.
Bluetooth Core Specification 5.4 podporuje vyjednávání MTU (MTU negotiation) — Central a Peripheral se mohou dohodnout na větší velikosti paketu až do 517 bajtů. Proces vypadá takto: Central odešle požadavek MTU Exchange s návrhem svého MTU; Peripheral odpoví svým MTU; použije se menší z obou hodnot.
// iOS požaduje MTU při připojení
// Maximální MTU v iOS je 185 bajtů
func peripheral(
_ peripheral: CBPeripheral,
didDiscoverServices error: Error?
) {
// Požadovat MTU pro konkrétní periferní zařízení
peripheral.maximumWriteValueLength(for: .withResponse)
}
Podle Bluetooth SIG (2023) snižuje zvýšení MTU z 23 na 185 bajtů režii přenosu dat až o 80 % díky snížení počtu paketů. Pro aplikace přenášející údaje s vysokou frekvencí (např. EKG nebo akcelerometr) je zvýšení MTU kritické pro stabilitu datového toku.
Často kladené otázky
Specifikace BLE neomezuje počet charakteristik ve službě. V praxi je omezení určeno dostupnou pamětí serveru GATT a požadavky na výkon. Pro vestavěná zařízení se doporučuje nejvýše 10–15 charakteristik na službu.
Notify odesílá data bez potvrzení — paket může být ztracen bez upozornění odesílatele. Indicate vyžaduje potvrzení (ACK) na úrovni protokolu, což zaručuje doručení. Indicate je pomalejší, ale spolehlivější. Pro kritická data (alarmy, příkazy) používejte Indicate.
Ano, charakteristika může mít kombinaci vlastností. Například charakteristika nastavení může podporovat Read (čtení aktuální hodnoty) a Write (změna nastavení). Kombinujte vlastnosti podle vašeho scénáře použití.
Použijte vyjednávání MTU pro zvýšení velikosti paketu na 185–517 bajtů. Pokud jsou data stále příliš velká — implementujte fragmentaci na úrovni aplikace: rozdělte data do několika sekvenčních požadavků s kontrolou integrity.
Pokud váš úkol pokrývá standardní charakteristika — použijte UUID z registru Bluetooth SIG. To zjednodušuje certifikaci a zajišťuje kompatibilitu s ekosystémem. Vlastní UUID vytvářejte pouze pro jedinečná data výrobců třetích stran.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také