Descriptor: o que é, Client Characteristic Configuration e exemplos

Autor: IT Sectr Publicado: 2026-07-15 Tempo de leitura: 8 min

Descriptor é um atributo auxiliar de uma característica BLE que fornece metadados ou configuração para seu valor. A Bluetooth Core Specification 5.4 define descritores como parte integrante do perfil GATT: eles descrevem unidades de medida, faixas de valores, nomes de texto e gerenciam a assinatura de notificações. O descritor mais conhecido é o Client Characteristic Configuration Descriptor (CCCD, 0x2902), que permite ao Central assinar notificações da característica. Segundo a Bluetooth SIG, 8 descritores padrão são especificados, e descritores personalizados podem ser criados pelo desenvolvedor para quaisquer metadados adicionais.

Principais pontos

  • Descriptor — um atributo auxiliar de uma característica que contém metadados ou configuração do valor.
  • CCCD (0x2902) — o descritor mais importante: através dele, o Central assina notificações sobre alterações na característica.
  • Os descritores padrão incluem User Description (0x2901) para nome de texto e Presentation Format (0x2904) para formato de dados.
  • Cada característica pode ter vários descritores, mas não mais de um de cada tipo padrão.
  • O Core Bluetooth cria descritores automaticamente, mas eles podem ser personalizados para metadados específicos.

O que é um Descriptor em BLE?

Descriptor é um atributo do protocolo GATT que se anexa a uma Characteristic e fornece informações adicionais sobre seu valor ou modo de uso. Na terminologia GATT, a característica são os dados, e o descritor são os metadados desses dados.

Cada Characteristic pode ter zero ou mais descritores. Os descritores são definidos como atributos separados na tabela GATT e têm seus próprios UUIDs de 16 bits no espaço Bluetooth SIG. Os descritores não podem existir independentemente — estão sempre vinculados a uma característica específica.

De acordo com a Bluetooth Core Specification 5.4 (2023), os descritores são divididos em duas categorias: padrão (definidos pela Bluetooth SIG) e personalizados (definidos pelo desenvolvedor). Os descritores padrão têm UUIDs no intervalo 0x2900–0x2908 e executam funções estritamente definidas. Os descritores personalizados usam UUIDs de 128 bits, semelhantes a serviços e características personalizados.

Os descritores são um mecanismo chave para configurar o comportamento de uma conexão BLE. Sem CCCD (0x2902) é impossível assinar notificações, sem Presentation Format (0x2904) o Central não saberá como interpretar os bytes brutos da característica.

Client Characteristic Configuration Descriptor (CCCD)

CCCD com UUID 0x2902 é o descritor mais importante e amplamente utilizado em BLE. Ele gerencia a assinatura do Central em Notify e Indicate da característica. Sem escrever no CCCD, a característica não enviará notificações, mesmo que tenha a propriedade Notify.

CCCD é um valor de 16 bits onde o bit menos significativo (0x0001) habilita Notify, e o segundo bit (0x0002) habilita Indicate. O Central escreve o valor desejado no CCCD, inscrevendo-se assim nas notificações. Se o Central escrever 0x0000 — a assinatura é cancelada.

O mecanismo CCCD funciona assim: quando o Central descobre uma característica que suporta Notify, ele encontra seu descritor CCCD e escreve 0x0001. Depois disso, sempre que o Peripheral atualiza o valor da característica, ele é enviado automaticamente ao Central inscrito via Handle Value Notification (sem solicitação do Central).

De acordo com o Apple Core Bluetooth Programming Guide, o CCCD é gerenciado automaticamente pelo sistema quando setNotifyValue é chamado para uma característica. O desenvolvedor não precisa localizar e escrever manualmente o CCCD — o Core Bluetooth faz isso automaticamente ao ativar as notificações.

Assinatura programática de notificações

Em iOS, a assinatura é feita através do método setNotifyValue no objeto CBPeripheral.

swift
import CoreBluetooth

// Assinar notificações da característica
peripheral.setNotifyValue(true, for: characteristic)

// O delegado recebe valores atualizados
func peripheral(
    _ peripheral: CBPeripheral,
    didUpdateValueFor characteristic: CBCharacteristic,
    error: Error?
) {
    // characteristic.value tem novos dados
    guard let data = characteristic.value else { return }
}

No Android, a assinatura de notificações é feita através de BluetoothGatt.setCharacteristicNotification. O desenvolvedor também deve escrever manualmente o valor 0x0001 no CCCD.

java
import android.bluetooth.*;

// Ativar notificações
bluetoothGatt.setCharacteristicNotification(characteristic, true);

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

Descritores padrão Bluetooth SIG

Bluetooth SIG definiu 8 descritores padrão para tarefas comuns de configuração de características. Cada descritor tem um UUID estritamente definido e formato de valor.

UUIDNome do descritorPropósitoTipo de valor
0x2900Characteristic Extended PropertiesPropriedades adicionais da característicauint16 (máscara de bits)
0x2901Characteristic User DescriptionNome textual da característicaString UTF-8
0x2902Client Characteristic ConfigurationGerenciamento de notificaçõesuint16
0x2903Server Characteristic ConfigurationConfiguração do servidor para broadcastuint16
0x2904Characteristic Presentation FormatFormato de apresentação de dadosEstrutura (7 bytes)
0x2905Characteristic Aggregate FormatCombinação de múltiplas característicasLista de UUIDs
0x2906Valid RangeFaixa de valores válidosuint16 × 2 (min, max)
0x2907External Report ReferenceReferência a relatório externouint16
0x2908Report ReferenceReferência a relatório internouint8 + uint16

Characteristic User Description (0x2901) é especialmente útil para IU: contém um nome legível da característica que pode ser exibido na interface do aplicativo. Por exemplo, uma característica Battery Level pode ter um descritor User Description com o valor “Nível de carga da bateria”.

Characteristic Presentation Format (0x2904) contém informações sobre como interpretar o valor da característica: formato (uint8, uint16, float), expoente, unidade de medida (via UUID do registro Bluetooth SIG), namespace e descrição. Por exemplo, a temperatura pode ser int16 com expoente -2 (valor de divisão 0,01°C) e unidade de medida “grau Celsius”.

Como usar Descriptors em iOS e Android

O acesso aos descritores difere no iOS e Android. O Core Bluetooth gerencia automaticamente o CCCD quando as notificações são ativadas, enquanto o Android requer escrita manual do valor no descritor. Vamos analisar ambas as abordagens.

iOS: Gerenciamento automático de CCCD

Em iOS, o desenvolvedor normalmente não interage diretamente com os descritores. O Core Bluetooth encontra automaticamente o CCCD e escreve o valor necessário quando setNotifyValue é chamado. Para ler descritores, usa-se o método discoverDescriptors.

swift
// Descobrir descritores
peripheral.discoverDescriptors(for: characteristic)

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

Android: Gerenciamento manual de CCCD

No Android, o desenvolvedor deve encontrar o descritor CCCD da característica e escrever o valor para ativar as notificações. Esta é uma etapa adicional em comparação ao iOS.

java
// Ler o valor do descritor User Description
BluetoothGattDescriptor userDesc = characteristic
    .getDescriptor(
        UUID.fromString("00002901-0000-1000-8000-00805F9B34FB")
    );

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

Criação de descritores personalizados

Descritores personalizados são usados quando os descritores padrão Bluetooth SIG não são suficientes. Por exemplo, um fabricante de sensores médicos pode adicionar um descritor com informações de calibração do sensor ou um descritor com log de erros.

Um descritor personalizado é criado com um UUID de 128 bits, semelhante a uma característica personalizada. No lado do Peripheral, o desenvolvedor o adiciona à característica através da API apropriada. No lado do Central, o descritor é descoberto automaticamente ao chamar discoverDescriptors.

Ao criar um descritor personalizado, siga estas regras: o comprimento do valor deve corresponder ao tipo de dado esperado, e os direitos de acesso (leitura/escrita) devem ser explicitamente especificados. Não use UUIDs do intervalo de descritores padrão Bluetooth SIG (0x2900–0x2908) para fins personalizados.

Diferença entre Descriptor e Characteristic

Característica e descritor são diferentes níveis de atributos GATT. Uma característica é um ponto de dados, enquanto um descritor são seus metadados ou configuração. A diferença se manifesta em vários aspectos: propósito, UUID e regras de acesso.

Uma característica tem uma declaração obrigatória que está sempre presente na tabela GATT. Um descritor é opcional — uma característica pode não ter descritores. Uma característica pode ser lida, escrita ou enviar notificações independentemente. Um descritor está sempre vinculado a uma característica e não existe separadamente.

De acordo com a Bluetooth Core Specification 5.4, a ordem dos atributos na tabela GATT é a seguinte: declaração do serviço, declaração da característica, valor da característica, descritores da característica (se houver), depois o próximo serviço. Esta ordem é obrigatória para o correto funcionamento dos clientes GATT.

Perguntas frequentes

Por que o CCCD é necessário se a característica já possui a propriedade Notify?

CCCD é necessário para gerenciamento de assinatura: a propriedade Notify apenas indica que a característica pode enviar notificações, mas não as ativa. O Central deve assinar explicitamente escrevendo 0x0001 no CCCD. Isso evita o envio indesejado de dados para um Central não preparado.

Quantos descritores uma única característica pode ter?

A especificação não limita o número de descritores. Na prática, cada característica geralmente tem 1–3 descritores: CCCD (para características com Notify/Indicate), opcionalmente User Description e Presentation Format. Muitos descritores aumentam o tamanho da tabela GATT.

Preciso criar descritores manualmente no Peripheral?

Na maioria dos casos, não. O Core Bluetooth no iOS e Android adiciona automaticamente CCCD às características que possuem propriedades Notify ou Indicate. Descritores personalizados são criados manualmente apenas para metadados específicos.

Posso escrever dados personalizados no CCCD?

Não, o CCCD tem formato (uint16) e propósito estritamente definidos — gerenciamento de notificações. Escrever outros valores viola a especificação Bluetooth e pode fazer a assinatura parar de funcionar. Para dados personalizados, use descritores personalizados com UUID de 128 bits.

Como o Characteristic User Description é útil para um aplicativo?

A User Description contém um nome legível da característica — por exemplo, “Temperatura do dispositivo” em vez do UUID 0x2A6E. O aplicativo pode exibir este nome na interface, tornando a interação com o dispositivo BLE compreensível para o usuário sem strings codificadas.

Resumo

  • Descriptor — um atributo GATT auxiliar anexado a uma característica para armazenar metadados ou configuração.
  • CCCD (0x2902) — o descritor chave que gerencia a assinatura do Central em notificações e indicações da característica.
  • Bluetooth SIG especificou 8 descritores padrão (0x2900–0x2908) para tarefas comuns — descrição, formatação e configuração.
  • Em iOS, o CCCD é gerenciado automaticamente; no Android, é necessária escrita manual do valor 0x0001 para ativar notificações.
  • Descritores personalizados são criados com UUID de 128 bits para metadados únicos não cobertos por descritores padrão.
  • Descritores não existem independentemente — estão sempre vinculados a uma característica e a seguem na tabela GATT.
  • O uso correto de descritores garante a configuração correta da conexão BLE e clareza dos dados para o aplicativo.

Vamos desenvolver um aplicativo móvel chave na mão

A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.

Discutir o projeto

Leia também