Descriptor: nedir, Client Characteristic Configuration ve örnekler

Yazar: IT Sectr Yayınlanma: 2026-07-15 Okuma süresi: 8 dk

Descriptor, bir BLE karakteristiğinin değeri için meta veri veya yapılandırma sağlayan yardımcı bir özelliğidir. Bluetooth Core Specification 5.4, tanımlayıcıları GATT profilinin ayrılmaz bir parçası olarak tanımlar: ölçüm birimlerini, değer aralıklarını, metin adlarını tanımlar ve bildirim aboneliğini yönetir. En bilinen tanımlayıcı, Central'ın karakteristikten bildirimlere abone olmasını sağlayan Client Characteristic Configuration Descriptor'dır (CCCD, 0x2902). Bluetooth SIG'ye göre, 8 standart tanımlayıcı belirtilmiştir ve geliştirici tarafından herhangi bir ek meta veri için özel tanımlayıcılar oluşturulabilir.

Önemli Noktalar

  • Descriptor — bir karakteristiğin değerinin meta verisini veya yapılandırmasını içeren yardımcı bir özelliktir.
  • CCCD (0x2902) — en önemli tanımlayıcı: Central, bu tanımlayıcı aracılığıyla karakteristik değişiklikleri hakkında bildirimlere abone olur.
  • Standart tanımlayıcılar, metin adı için User Description (0x2901) ve veri biçimi için Presentation Format (0x2904) içerir.
  • Her karakteristik birden çok tanımlayıcıya sahip olabilir, ancak her standart türden en fazla bir tane olabilir.
  • Core Bluetooth tanımlayıcıları otomatik olarak oluşturur, ancak belirli meta veriler için özelleştirilebilir.

BLE'de Descriptor Nedir?

Descriptor, bir Characteristic'e eklenen ve değeri veya kullanım şekli hakkında ek bilgi sağlayan bir GATT protokolü özelliğidir. GATT terminolojisinde, karakteristik veridir ve tanımlayıcı bu verinin meta verisidir.

Her Characteristic sıfır veya daha fazla tanımlayıcıya sahip olabilir. Tanımlayıcılar, GATT tablosunda ayrı özellikler olarak tanımlanır ve Bluetooth SIG alanında kendi 16 bit UUID'lerine sahiptir. Tanımlayıcılar bağımsız olarak var olamaz — her zaman belirli bir karakteristiğe bağlıdırlar.

Bluetooth Core Specification 5.4 (2023)'e göre tanımlayıcılar iki kategoriye ayrılır: standart (Bluetooth SIG tarafından tanımlanan) ve özel (geliştirici tarafından tanımlanan). Standart tanımlayıcıların UUID'leri 0x2900–0x2908 aralığındadır ve kesin olarak tanımlanmış işlevleri yerine getirir. Özel tanımlayıcılar, özel hizmetler ve karakteristikler gibi 128 bit UUID kullanır.

Tanımlayıcılar, bir BLE bağlantısının davranışını yapılandırmak için önemli bir mekanizmadır. CCCD (0x2902) olmadan bildirimlere abone olmak imkansızdır, Presentation Format (0x2904) olmadan Central, karakteristiğin ham baytlarını nasıl yorumlayacağını bilemez.

Client Characteristic Configuration Descriptor (CCCD)

CCCD (UUID 0x2902), BLE'deki en önemli ve yaygın olarak kullanılan tanımlayıcıdır. Karakteristikten Notify ve Indicate için Central'ın aboneliğini yönetir. CCCD'ye yazılmazsa, Notify özelliği olsa bile karakteristik bildirim göndermez.

CCCD, en düşük anlamlı bitin (0x0001) Notify'yi ve ikinci bitin (0x0002) Indicate'i etkinleştirdiği 16 bitlik bir değerdir. Central, CCCD'ye istenen değeri yazarak bildirimlere abone olur. Central 0x0000 yazarsa — abonelik iptal edilir.

CCCD mekanizması şöyle çalışır: Central, Notify'ı destekleyen bir karakteristik keşfettiğinde, CCCD tanımlayıcısını bulur ve 0x0001 yazar. Bundan sonra, Peripheral karakteristik değerini her güncellediğinde, Handle Value Notification aracılığıyla abone olan Central'a otomatik olarak gönderilir (Central'dan istek olmadan).

Apple Core Bluetooth Programming Guide'a göre, bir karakteristik için setNotifyValue çağrıldığında CCCD sistem tarafından otomatik olarak yönetilir. Geliştiricinin CCCD'yi manuel olarak bulup yazması gerekmez — Core Bluetooth, bildirimler etkinleştirildiğinde bunu otomatik olarak yapar.

Bildirimlere programatik abonelik

iOS'ta abonelik, CBPeripheral nesnesi üzerindeki setNotifyValue yöntemiyle yapılır.

swift
import CoreBluetooth

// Karakteristik bildirimlerine abone ol
peripheral.setNotifyValue(true, for: characteristic)

// Temsilci güncellenmiş değerleri alır
func peripheral(
    _ peripheral: CBPeripheral,
    didUpdateValueFor characteristic: CBCharacteristic,
    error: Error?
) {
    // characteristic.value yeni verilere sahip
    guard let data = characteristic.value else { return }
}

Android'de bildirimlere abonelik, BluetoothGatt.setCharacteristicNotification aracılığıyla yapılır. Geliştirici ayrıca CCCD'ye manuel olarak 0x0001 değerini yazmalıdır.

java
import android.bluetooth.*;

// Bildirimleri etkinleştir
bluetoothGatt.setCharacteristicNotification(characteristic, true);

// CCCD'ye 0x0001 yaz
BluetoothGattDescriptor descriptor = characteristic
    .getDescriptor(
        UUID.fromString("00002902-0000-1000-8000-00805F9B34FB")
    );
descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
bluetoothGatt.writeDescriptor(descriptor);

Bluetooth SIG Standart Tanımlayıcıları

Bluetooth SIG, yaygın karakteristik yapılandırma görevleri için 8 standart tanımlayıcı tanımlamıştır. Her tanımlayıcının kesin olarak tanımlanmış bir UUID'si ve değer biçimi vardır.

UUIDTanımlayıcı adıAmaçDeğer türü
0x2900Characteristic Extended PropertiesKarakteristiğin ek özellikleriuint16 (bit maskesi)
0x2901Characteristic User DescriptionKarakteristiğin metin adıUTF-8 dizesi
0x2902Client Characteristic ConfigurationBildirim yönetimiuint16
0x2903Server Characteristic ConfigurationYayın için sunucu yapılandırmasıuint16
0x2904Characteristic Presentation FormatVeri sunum biçimiYapı (7 bayt)
0x2905Characteristic Aggregate FormatBirden çok karakteristiği birleştirmeUUID listesi
0x2906Valid RangeGeçerli değer aralığıuint16 × 2 (min, maks)
0x2907External Report ReferenceHarici rapor referansıuint16
0x2908Report ReferenceDahili rapor referansıuint8 + uint16

Characteristic User Description (0x2901), kullanıcı arayüzü için özellikle yararlıdır: uygulama arayüzünde görüntülenebilecek karakteristiğin insan tarafından okunabilir adını içerir. Örneğin, bir Battery Level karakteristiği, “Pil şarj seviyesi” değerine sahip bir User Description tanımlayıcısına sahip olabilir.

Characteristic Presentation Format (0x2904), karakteristik değerinin nasıl yorumlanacağı hakkında bilgi içerir: biçim (uint8, uint16, float), üs, ölçüm birimi (Bluetooth SIG kayıt defterinden UUID aracılığıyla), ad alanı ve açıklama. Örneğin, sıcaklık üs -2 (bölme değeri 0,01°C) ve “Santigrat derece” ölçüm birimiyle int16 olabilir.

iOS ve Android'de Descriptor Kullanımı

Tanımlayıcılara erişim iOS ve Android'de farklılık gösterir. Core Bluetooth, bildirimler etkinleştirildiğinde CCCD'yi otomatik olarak yönetirken, Android tanımlayıcıya manuel olarak değer yazılmasını gerektirir. Her iki yaklaşıma da bakalım.

iOS: Otomatik CCCD Yönetimi

iOS'ta geliştirici genellikle tanımlayıcılarla doğrudan etkileşime girmez. setNotifyValue çağrıldığında Core Bluetooth otomatik olarak CCCD'yi bulur ve gerekli değeri yazar. Tanımlayıcıları okumak için discoverDescriptors yöntemi kullanılır.

swift
// Tanımlayıcıları keşfet
peripheral.discoverDescriptors(for: characteristic)

// User Description değerini oku
func peripheral(
    _ peripheral: CBPeripheral,
    didDiscoverDescriptorsFor characteristic: CBCharacteristic,
    error: Error?
) {
    for descriptor in characteristic.descriptors ?? [] {
        if descriptor.uuid == CBUUID("2901") {
            peripheral.readValue(for: descriptor)
        }
    }
}

Android: Manuel CCCD Yönetimi

Android'de geliştirici, karakteristiğin CCCD tanımlayıcısını bulmalı ve bildirimleri etkinleştirmek için değeri yazmalıdır. Bu, iOS'a kıyasla ek bir adımdır.

java
// User Description tanımlayıcı değerini oku
BluetoothGattDescriptor userDesc = characteristic
    .getDescriptor(
        UUID.fromString("00002901-0000-1000-8000-00805F9B34FB")
    );

if (userDesc != null) {
    bluetoothGatt.readDescriptor(userDesc);
}

Özel Tanımlayıcı Oluşturma

Özel tanımlayıcılar, Bluetooth SIG standart tanımlayıcıları yeterli olmadığında kullanılır. Örneğin, bir tıbbi sensör üreticisi, sensör kalibrasyon bilgilerini içeren bir tanımlayıcı veya hata günlüğü olan bir tanımlayıcı ekleyebilir.

Özel bir tanımlayıcı, özel bir karakteristik gibi 128 bit UUID ile oluşturulur. Peripheral tarafında, geliştirici onu uygun API aracılığıyla karakteristiğe ekler. Central tarafında, tanımlayıcı discoverDescriptors çağrıldığında otomatik olarak keşfedilir.

Özel bir tanımlayıcı oluştururken şu kurallara uyun: değer uzunluğu beklenen veri türüyle eşleşmeli ve erişim hakları (okuma/yazma) açıkça belirtilmelidir. Özel amaçlar için Bluetooth SIG standart tanımlayıcı aralığındaki (0x2900–0x2908) UUID'leri kullanmayın.

Descriptor ve Characteristic Arasındaki Fark

Karakteristik ve tanımlayıcı, GATT özelliklerinin farklı seviyeleridir. Karakteristik bir veri noktasıdır, tanımlayıcı ise onun meta verisi veya yapılandırmasıdır. Fark, birkaç açıdan kendini gösterir: amaç, UUID ve erişim kuralları.

Bir karakteristiğin GATT tablosunda her zaman bulunan zorunlu bir bildirimi vardır. Tanımlayıcı isteğe bağlıdır — bir karakteristiğin hiç tanımlayıcısı olmayabilir. Bir karakteristik bağımsız olarak okunabilir, yazılabilir veya bildirim gönderebilir. Bir tanımlayıcı her zaman bir karakteristiğe bağlıdır ve ayrı olarak var olmaz.

Bluetooth Core Specification 5.4'e göre, GATT tablosundaki özelliklerin sırası şöyledir: hizmet bildirimi, karakteristik bildirimi, karakteristik değeri, karakteristik tanımlayıcıları (varsa), ardından bir sonraki hizmet. Bu sıra, GATT istemcilerinin doğru çalışması için zorunludur.

Sıkça Sorulan Sorular

Karakteristikte zaten Notify özelliği varsa neden CCCD gereklidir?

CCCD, abonelik yönetimi için gereklidir: Notify özelliği yalnızca karakteristiğin bildirim gönderebileceğini belirtir, ancak bunları etkinleştirmez. Central, CCCD'ye 0x0001 yazarak açıkça abone olmalıdır. Bu, hazır olmayan bir Central'a istenmeyen veri gönderilmesini önler.

Tek bir karakteristik kaç tanımlayıcıya sahip olabilir?

Spesifikasyon, tanımlayıcı sayısını sınırlamaz. Pratikte, her karakteristik genellikle 1–3 tanımlayıcıya sahiptir: CCCD (Notify/Indicate içeren karakteristikler için), isteğe bağlı olarak User Description ve Presentation Format. Çok fazla tanımlayıcı GATT tablosunun boyutunu artırır.

Peripheral üzerinde manuel olarak tanımlayıcı oluşturmam gerekir mi?

Çoğu durumda, hayır. iOS ve Android'de Core Bluetooth, Notify veya Indicate özelliklerine sahip karakteristiklere otomatik olarak CCCD ekler. Özel tanımlayıcılar yalnızca belirli meta veriler için manuel olarak oluşturulur.

CCCD'ye özel veriler yazabilir miyim?

Hayır, CCCD'nin kesin olarak tanımlanmış bir biçimi (uint16) ve amacı vardır — bildirim yönetimi. Diğer değerleri yazmak Bluetooth spesifikasyonunu ihlal eder ve aboneliğin çalışmamasına neden olabilir. Özel veriler için, 128 bit UUID'li özel tanımlayıcılar kullanın.

Characteristic User Description bir uygulama için nasıl yararlıdır?

User Description, karakteristiğin insan tarafından okunabilir adını içerir — örneğin, UUID 0x2A6E yerine “Cihaz sıcaklığı”. Uygulama bu adı arayüzde görüntüleyerek, sabit kodlanmış dizeler olmadan kullanıcının BLE cihazıyla etkileşimini anlaşılır hale getirebilir.

Özet

  • Descriptor — meta veri veya yapılandırma depolamak için bir karakteristiğe eklenen yardımcı bir GATT özelliği.
  • CCCD (0x2902) — karakteristiğin bildirim ve göstergelerine Central'ın aboneliğini yöneten anahtar tanımlayıcı.
  • Bluetooth SIG, yaygın görevler için 8 standart tanımlayıcı (0x2900–0x2908) belirtmiştir — açıklama, biçimlendirme ve yapılandırma.
  • iOS'ta CCCD otomatik olarak yönetilir; Android'de bildirimleri etkinleştirmek için manuel olarak 0x0001 değerinin yazılması gerekir.
  • Özel tanımlayıcılar, standart tanımlayıcılar tarafından kapsanmayan benzersiz meta veriler için 128 bit UUID ile oluşturulur.
  • Tanımlayıcılar bağımsız olarak var olmaz — her zaman bir karakteristiğe bağlıdır ve GATT tablosunda onu takip eder.
  • Tanımlayıcıların doğru kullanımı, doğru BLE bağlantı yapılandırmasını ve uygulama için veri netliğini sağlar.

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.

Projeyi tartış

Ayrıca okuyun