Characteristic Bluetooth Low Energy’de, Central’in bir çevre biriminde bilgi okuduğu veya yazdığı temel bir veri birimidir. Her Characteristic belirli bir GATT hizmetine aittir, benzersiz bir UUID’ye ve olası işlemleri tanımlayan bir dizi özelliğe (read, write, notify, indicate) sahiptir. Bluetooth Core Specification 5.4 (2023)’e göre Bluetooth SIG, tıbbi, fitness ve endüstriyel cihazlar için 500’den fazla standart karakteristik belirlemiştir. Geliştiriciler, sensör okumalarından cihaz kontrol komutlarına kadar her tür kullanıcı verisini iletmek için özel karakteristikler oluşturur.
Ana Noktalar
Characteristic, bir değer ve meta veri içeren GATT protokolünün bir özniteliğidir. BLE mimarisinde veriler doğrudan cihazlar arasında aktarılmaz, hizmetin karakteristik değerlerinin okunması ve yazılması yoluyla aktarılır. Bir hizmet bir klasörse, Characteristic o klasör içindeki bir dosyadır.
Her Characteristic üç bileşenden oluşur: beyan (declaration), değer (value) ve tanımlayıcılar (descriptors). Beyan, karakteristiğin UUID’sini ve özelliklerini içerir. Değer, Central ve Peripheral arasında aktarılan gerçek verilerdir. Tanımlayıcılar ek yapılandırma sağlar.
Bluetooth Core Specification 5.4 (2023)’e göre, BLE’deki tüm veri alışverişleri karakteristikler üzerindeki işlemler yoluyla gerçekleşir. Heart Rate Profile veya Battery Service gibi standart profiller bile önceden tanımlanmış UUID’lere sahip bir dizi karakteristik üzerine inşa edilmiştir. Bu, farklı üreticilerin cihazlarının ön yapılandırma olmadan uyumluluğunu sağlar.
Geliştiricinin şunu anlaması önemlidir: her Characteristic farklı özellik kombinasyonlarını destekleyebilir. Bir karakteristik yalnızca okuma için, diğeri yazma için, üçüncüsü bildirimler için olabilir. Özelliklerin doğru seçimi, kullanım senaryosunu ve cihazın güç tüketimini belirler.
Bir karakteristiğin özellikleri (properties), üzerinde hangi işlemlerin izin verildiğini tanımlar. Her bir bitin belirli bir işlemi etkinleştirdiği veya devre dışı bıraktığı bir bayt maskesidir. Aşağıda temel özellikler listelenmiştir.
| Özellik | Bit | Açıklama | Tipik Kullanım |
|---|---|---|---|
| Read | 0x02 | Central mevcut değeri okuyabilir | Durum, pil seviyesi, yapılandırma |
| Write | 0x08 | Central yeni bir değer yazabilir | Kontrol komutları, ayarlar |
| Notify | 0x10 | Peripheral değeri onaysız gönderir | Akış verileri (nabız, sıcaklık) |
| Indicate | 0x20 | Peripheral değeri onaylı gönderir | Kritik veriler (uyarılar, durumlar) |
| Write Without Response | 0x04 | Sunucudan onay beklemeden yazma | Yüksek hızlı komut iletimi |
İzinler (permissions), GATT sunucu düzeyindeki erişim seviyesidir. Karakteristik beyanında bildirilen özelliklerin aksine, izinler her işlemde kontrol edilir. Şifreleme ve kimlik doğrulama gereksinimlerini içerebilirler.
Bluetooth SIG, en yaygın BLE kullanım durumlarının çoğunu kapsayan 500’den fazla standart karakteristik belirlemiştir. Standart UUID’lerin kullanımı, herhangi bir alıcı cihazın ön yapılandırma olmadan verileri doğru şekilde yorumlamasını sağlar.
En sık kullanılan standart karakteristikler şunlardır:
| UUID | Ad | Veri Türü | Hizmet |
|---|---|---|---|
| 0x2A19 | Battery Level | uint8 (0–100%) | Battery Service |
| 0x2A37 | Heart Rate Measurement | uint8 + bayraklar | Heart Rate |
| 0x2A6E | Temperature | int16 (0.01°C) | Environmental Sensing |
| 0x2A6F | Humidity | uint16 (0.01%) | Environmental Sensing |
| 0x2A00 | Device Name | UTF-8 dizesi | Generic Access |
| 0x2A01 | Appearance | uint16 | Generic Access |
Mevcut bir standart karakteristik görevinizi kapsıyorsa, onu kullanın. Bu, Bluetooth sertifikasyonunu basitleştirir ve ekosistem uyumluluğunu artırır. Yalnızca SIG kaydında bulunmayan benzersiz veriler için özel karakteristikler oluşturun.
Bir karakteristik oluşturma, verileri sağlayan cihaz olan Peripheral tarafında yapılır. iOS (Swift) ve Android (Java)’daki uygulamalara bakalım.
Core Bluetooth, bir UUID, özellikler ve başlangıç değeri ile bir karakteristik oluşturmak için CBMutableCharacteristic sınıfını sağlar.
import CoreBluetooth
let characteristicUUID = CBUUID("2A19") // Pil seviyesi özelliği
let characteristic = CBMutableCharacteristic(
type: characteristicUUID,
properties: [.read, .notify],
value: nil,
permissions: [.readable]
)
// Değişiklikte değeri güncelle
let batteryData = Data([batteryLevel]) // uint8
peripheralManager.updateValue(
batteryData,
for: characteristic,
onSubscribedCentrals: nil
)
Android’de, bir karakteristik UUID, özellikler ve izinler ile BluetoothGattCharacteristic kullanılarak oluşturulur.
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
);
// Değeri ayarla
characteristic.setValue(batteryLevel, BluetoothGattCharacteristic.FORMAT_UINT8, 0);
gattServer.notifyCharacteristicChanged(device, characteristic, false);
Bir Characteristic üzerindeki işlemler üç türe ayrılır: okuma (read), yazma (write) ve bildirimler (notify/indicate). Seçim senaryoya bağlıdır: talep üzerine veriler okunur, komutlar yazılır, akış verileri bildirimlere abone olur.
Read: Central, karakteristik değerini okumak için bir istek gönderir. Peripheral mevcut değerle yanıt verir. İşlem eş zamanlıdır ve her iki taraftan açık bir istek gerektirir. Nadiren değişen veriler için kullanılır: ürün yazılımı sürümü, seri numarası, ayarlar.
Write: Central, Peripheral’e veri gönderir. İki mod vardır: Write with Response (Peripheral’den onay) ve Write Without Response (onaysız). Write with Response teslimatı garanti eder — Peripheral yazmadan sonra onay gönderir. Write Without Response daha hızlıdır ancak teslimatı garanti etmez.
Notify ve Indicate: Peripheral, Central’e veri iletimini başlatır. Notify’da veriler onaysız gönderilir — Central paketi alamazsa kaybolur. Indicate’te Central onay (PDU düzeyi) gönderir, teslimatı garanti eder. Indicate daha yavaş ancak daha güvenilirdir. Bildirimlere abone olmak için Central, CCCD’ye (Client Characteristic Configuration Descriptor) 0x0001 değerini yazar.
MTU (Maximum Transmission Unit), tek bir BLE veri paketinin maksimum boyutunu tanımlar. Varsayılan olarak MTU 23 bayttır ve bunun 3 baytı başlıktır — yük (ATT payload) 20 bayttır. Bu, çoğu sensör verisi için yeterlidir ancak dosya aktarımı veya büyük yapılandırmalar için yeterli değildir.
Bluetooth Core Specification 5.4, MTU pazarlığını (MTU negotiation) destekler — Central ve Peripheral, 517 bayta kadar daha büyük bir paket boyutu üzerinde anlaşabilir. Süreç şöyle çalışır: Central, önerilen MTU’su ile bir MTU Exchange isteği gönderir; Peripheral kendi MTU’su ile yanıt verir; iki değerden küçük olanı kullanılır.
// iOS bağlantıda MTU ister
// iOS’te maksimum MTU 185 bayttır
func peripheral(
_ peripheral: CBPeripheral,
didDiscoverServices error: Error?
) {
// Belirli bir çevre birimi için MTU iste
peripheral.maximumWriteValueLength(for: .withResponse)
}
Bluetooth SIG (2023)’e göre, MTU’yu 23’ten 185 bayta çıkarmak, daha az paket sayesinde veri iletim yükünü %80’e kadar azaltır. Yüksek frekanslı okumalar ileten uygulamalar için (örn. EKG veya ivmeölçer), MTU artışı akış kararlılığı için kritiktir.
Sıkça Sorulan Sorular
BLE Şartnamesi, bir hizmetteki karakteristik sayısını sınırlamaz. Pratikte sınırlama, GATT sunucusunun kullanılabilir belleği ve performans gereksinimleri tarafından belirlenir. Gömülü cihazlar için hizmet başına 10–15’ten fazla karakteristik önerilmez.
Notify verileri onaysız gönderir — paket göndericiye haber verilmeden kaybolabilir. Indicate, protokol düzeyinde onay (ACK) gerektirir ve teslimatı garanti eder. Indicate daha yavaş ancak daha güvenilirdir. Kritik veriler (uyarılar, komutlar) için Indicate kullanın.
Evet, bir karakteristik özellik kombinasyonuna sahip olabilir. Örneğin, bir ayarlar karakteristiği Read (mevcut değeri okuma) ve Write (ayarı değiştirme) destekleyebilir. Özellikleri kullanım senaryonuza göre birleştirin.
Paket boyutunu 185–517 bayta çıkarmak için MTU pazarlığını kullanın. Veriler hala daha büyükse, uygulama düzeyinde parçalamayı uygulayın: verileri bütünlük kontrolü ile birkaç sıralı isteğe bölün.
Göreviniz standart bir karakteristik tarafından kapsanıyorsa, Bluetooth SIG kaydından UUID’ler kullanın. Bu, sertifikasyonu basitleştirir ve ekosistem uyumluluğunu sağlar. Yalnızca benzersiz üçüncü taraf verileri için özel UUID’ler oluşturun.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun