Characteristic är den grundläggande dataenheten i Bluetooth Low Energy genom vilken Central tar emot eller skriver information på en perifer enhet. Varje Characteristic tillhör en specifik GATT-tjänst, har ett unikt UUID och en uppsättning egenskaper (read, write, notify, indicate) som bestämmer möjliga operationer. Enligt Bluetooth Core Specification 5.4 (2023) har Bluetooth SIG specificerat över 500 standardkarakteristiker för medicinska, fitness- och industriella enheter. Utvecklaren skapar anpassade karakteristiker för att överföra alla användardata — från sensora v läsningar till enhetskontrollkommandon.
Huvudpunkter
Characteristic är ett attribut i GATT-protokollet som innehåller ett värde (value) och metadata. I BLE-arkitekturen överförs data inte direkt mellan enheter utan genom att läsa och skriva värden på tjänstens karakteristiker. Om tjänsten är en mapp, är Characteristic en fil i den mappen.
Varje Characteristic består av tre komponenter: deklaration (declaration), värde (value) och deskriptorer (descriptors). Deklarationen innehåller karakteristikens UUID och dess egenskaper. Värdet är själva data som överförs mellan Central och Peripheral. Deskriptorer tillhandahåller ytterligare konfiguration.
Enligt Bluetooth Core Specification 5.4 (2023) sker all datautbyte i BLE genom operationer på karakteristiker. Även standardprofiler som Heart Rate Profile eller Battery Service är byggda på en uppsättning karakteristiker med fördefinierade UUID. Detta säkerställer kompatibilitet mellan enheter från olika tillverkare utan föregående konfiguration.
Det är viktigt för utvecklaren att förstå: varje Characteristic kan stödja olika kombinationer av egenskaper. En karakteristik kan vara skrivskyddad, en annan — skrivbar, den tredje — för meddelanden. Rätt val av egenskaper bestämmer användningsscenariot och enhetens energiförbrukning.
Egenskaper (properties) för karakteristiken bestämmer vilka operationer som är tillåtna på den. Det är en bytemask där varje bit aktiverar eller inaktiverar en specifik operation. Nedan listas de viktigaste egenskaperna.
| Egenskap | Bit | Beskrivning | Typisk användning |
|---|---|---|---|
| Read | 0x02 | Central kan läsa aktuellt värde | Status, batterinivå, konfiguration |
| Write | 0x08 | Central kan skriva ett nytt värde | Kontrollkommandon, inställningar |
| Notify | 0x10 | Peripheral skickar värde utan bekräftelse | Strömmande data (puls, temperatur) |
| Indicate | 0x20 | Peripheral skickar värde med bekräftelse | Kritisk data (larm, statusar) |
| Write Without Response | 0x04 | Skrivning utan att vänta på bekräftelse från servern | Höghastighetskommandoöverföring |
Behörigheter (permissions) är åtkomstnivån på GATT-servernivå. Till skillnad från egenskaper som deklareras i karakteristikens deklaration, kontrolleras behörigheter vid varje operation. De kan inkludera krypterings- och autentiseringskrav.
Bluetooth SIG har specificerat över 500 standardkarakteristiker som täcker de flesta vanliga BLE-användningsscenarier. Användning av standard UUID garanterar att alla mottagande enheter korrekt tolkar data utan föregående konfiguration.
Här är de mest använda standardkarakteristikerna:
| UUID | Namn | Datatyp | Tjänst |
|---|---|---|---|
| 0x2A19 | Battery Level | uint8 (0–100%) | Battery Service |
| 0x2A37 | Heart Rate Measurement | uint8 + flaggor | 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 |
Om en befintlig standardkarakteristik täcker din uppgift — använd den. Detta förenklar Bluetooth-certifiering och ökar kompatibiliteten med ekosystemet. Skapa anpassade karakteristiker endast för unik data som inte finns i SIG-registret.
Skapande av karakteristik sker på Peripheral-sidan — enheten som tillhandahåller data. Låt oss titta på implementeringen på iOS (Swift) och Android (Java).
Core Bluetooth tillhandahåller klassen CBMutableCharacteristic för att skapa en karakteristik med angivelse av UUID, egenskaper och initialt värde.
import CoreBluetooth
let characteristicUUID = CBUUID("2A19") // Batterinivåkarakteristik
let characteristic = CBMutableCharacteristic(
type: characteristicUUID,
properties: [.read, .notify],
value: nil,
permissions: [.readable]
)
// Uppdatera värde vid ändring
let batteryData = Data([batteryLevel]) // uint8
peripheralManager.updateValue(
batteryData,
for: characteristic,
onSubscribedCentrals: nil
)
På Android skapas karakteristiken via BluetoothGattCharacteristic med angivelse av UUID, egenskaper och behörigheter.
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
);
// Ställ in värdet
characteristic.setValue(batteryLevel, BluetoothGattCharacteristic.FORMAT_UINT8, 0);
gattServer.notifyCharacteristicChanged(device, characteristic, false);
Operationer på Characteristic delas in i tre typer: läsning (read), skrivning (write) och meddelanden (notify/indicate). Valet av operation beror på scenariot: data på begäran läses, kommandon skrivs, strömmande data prenumereras via meddelanden.
Read — Central skickar en begäran om att läsa karakteristikens värde. Peripheral svarar med det aktuella värdet. Operationen är synkron och kräver en explicit begäran från båda sidor. Används för data som sällan ändras: firmwareversion, serienummer, inställningar.
Write — Central skickar data till Peripheral. Det finns två lägen: Write with Response (bekräftelse från Peripheral) och Write Without Response (utan bekräftelse). Write with Response garanterar leverans — Peripheral skickar en bekräftelse efter skrivning. Write Without Response är snabbare men garanterar inte leverans.
Notify och Indicate — Peripheral initierar sändning av data till Central. Vid Notify skickas data utan bekräftelse — om Central inte hann ta emot paketet går det förlorat. Vid Indicate skickar Central en bekräftelse (på PDU-nivå), vilket garanterar leverans. Indicate är långsammare men mer tillförlitlig. För att prenumerera på meddelanden skriver Central värdet 0x0001 i CCCD (Client Characteristic Configuration Descriptor).
MTU (Maximum Transmission Unit) bestämmer den maximala storleken på ett enda BLE-datapaket. Som standard är MTU 23 byte, varav 3 byte är header — nyttolasten (ATT payload) är 20 byte. Detta är tillräckligt för de flesta sensordata men otillräckligt för att överföra filer eller stora konfigurationer.
Bluetooth Core Specification 5.4 stöder MTU-förhandling (MTU negotiation) — Central och Peripheral kan komma överens om en större paketstorlek upp till 517 byte. Processen ser ut så här: Central skickar en MTU Exchange-begäran med sitt MTU-förslag; Peripheral svarar med sitt MTU; det minsta av de två värdena används.
// iOS begär MTU vid anslutning
// Maximal MTU i iOS är 185 byte
func peripheral(
_ peripheral: CBPeripheral,
didDiscoverServices error: Error?
) {
// Begär MTU för specifik perifer enhet
peripheral.maximumWriteValueLength(for: .withResponse)
}
Enligt Bluetooth SIG (2023) minskar en ökning av MTU från 23 till 185 byte dataöverföringskostnaderna med upp till 80% på grund av minskat antal paket. För applikationer som överför avläsningar med hög frekvens (t.ex. EKG eller accelerometer) är MTU-ökning avgörande för strömmens stabilitet.
Vanliga frågor
BLE-specifikationen begränsar inte antalet karakteristiker i en tjänst. I praktiken bestäms begränsningen av GATT-serverns tillgängliga minne och prestandakrav. För inbyggda enheter rekommenderas högst 10–15 karakteristiker per tjänst.
Notify skickar data utan bekräftelse — paketet kan gå förlorat utan att avsändaren meddelas. Indicate kräver bekräftelse (ACK) på protokollnivå, vilket garanterar leverans. Indicate är långsammare men mer tillförlitlig. För kritisk data (larm, kommandon) använd Indicate.
Ja, en karakteristik kan ha en kombination av egenskaper. Till exempel kan en inställningskarakteristik stödja Read (läsning av aktuellt värde) och Write (ändring av inställning). Kombinera egenskaper enligt ditt användningsscenario.
Använd MTU-förhandling för att öka paketstorleken till 185–517 byte. Om data fortfarande är för stor — implementera fragmentering på applikationsnivå: dela upp data i flera sekventiella begäranden med integritetskontroll.
Om din uppgift täcks av en standardkarakteristik — använd UUID från Bluetooth SIG-registret. Detta förenklar certifiering och säkerställer kompatibilitet med ekosystemet. Skapa anpassade UUID endast för unik data från tredjepartstillverkare.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också