Characteristic: 개념, 데이터 유형 및 값 읽기

저자: IT Sectr 게시일: 2026-07-15 읽는 시간: 7 분

Characteristic은 Bluetooth Low Energy에서 Central이 페리페러 장치에 정보를 읽거나 쓰는 기본 데이터 단위입니다. 각 Characteristic은 특정 GATT 서비스에 속하며, 고유한 UUID와 가능한 작업을 정의하는 특성(read, write, notify, indicate)의 집합을 가집니다. Bluetooth Core Specification 5.4 (2023)에 따르면 Bluetooth SIG는 의료, 피트니스 그리고 산업용 장치를 위한 500개 이상의 표준 특성을 지정했습니다. 개발자는 센서 읽기부터 장치 제어 명령까지 사용자 데이터를 전송하기 위해 사용자 정의 특성을 만듭니다.

중요 포인트

  • Characteristic은 UUID, 특성 그리고 특정 유형의 값을 가진 BLE GATT 서비스 내의 데이터 포인트입니다.
  • 특성은 사용 가능한 작업을 정의합니다: read(읽기), write(쓰기), notify(알림), indicate(확인 알림).
  • 표준 특성(배터리 레벨, 심박수)은 Bluetooth SIG 등록에서 16비트 UUID를 가집니다.
  • 각 Characteristic은 디스크립터를 포함할 수 있습니다 — 측정 단위나 알림 구성을 설명하는 메타데이터입니다.
  • Characteristic을 통한 단일 데이터 패킷의 최대 크기는 20바이트(MTU 23) 문이며, MTU 증가 시 244바이트까지 가능합니다.

BLE에서 Characteristic이란?

Characteristic은 값과 메타데이터를 포함하는 GATT 프로토콜의 속성입니다. BLE 아키텍처에서 데이터는 장치 간에 직접 전송되지 않고, 서비스의 특성 값을 읽고 쓰는 것으로 전송됩니다. 서비스가 폴더라면 Characteristic은 폴더 안의 파일입니다.

각 Characteristic은 선언(declaration), 값(value), 디스크립터(descriptors)의 세 가지 구성 요소로 구성됩니다. 선언에는 특성의 UUID와 그 특성이 포함됩니다. 값은 Central과 Peripheral 간에 전송되는 실제 데이터입니다. 디스크립터는 추가 구성을 제공합니다.

Bluetooth Core Specification 5.4 (2023)에 따르면 BLE에서 모든 데이터 교환은 특성에 대한 작업을 통해 일어납니다. Heart Rate Profile이나 Battery Service와 같은 표준 프로파일조쳐도 미리 정의된 UUID를 가진 특성 집합에 기반합니다. 이를 통해 서로 다른 제조사의 장치가 사전 구성 없이도 호환됨을 보장합니다.

개발자가 이해해야 할 중요한 점은 각 Characteristic이 서로 다른 특성 조합을 지원할 수 있다는 것입니다. 특성은 읽기 전용일 수도, 다른 특성은 쓰기 용일 수도, 셋째 특성은 알림용일 수 있습니다. 특성의 올바른 선택이 사용 시나리오와 장치의 전력 소비를 결정합니다.

Characteristic 특성 및 권한

특성의 특성(properties)은 해당 특성에 대해 어떤 작업이 허용되는지 정의합니다. 이는 각 비트가 특정 작업을 활성화하거나 비활성화하는 바이트 마스크입니다. 아래에 주요 특성이 나열되어 있습니다.

특성비트설명일반적 사용
Read0x02Central이 현재 값을 읽을 수 있음상태, 배터리 레벨, 구성
Write0x08Central이 새 값을 쓸 수 있음제어 명령, 설정
Notify0x10Peripheral이 확인 없이 값 전송스트리밍 데이터(맥박, 온도)
Indicate0x20Peripheral이 확인을 통해 값 전송중요 데이터(경고, 상태)
Write Without Response0x04서버의 확인을 기다리지 않고 쓰기고속 명령 전송

권한(permissions)은 GATT 서버 레벨의 액세스 레벨입니다. 특성 선언에서 선언되는 특성과 달리, 권한은 각 작업마다 확인됩니다. 암호화와 인증 요구 사항을 포함할 수 있습니다.

Bluetooth SIG 표준 특성

Bluetooth SIG는 대부분의 일반적인 BLE 사용 사례를 포그하는 500개 이상의 표준 특성을 지정했습니다. 표준 UUID를 사용하면 수신 장치가 사전 구성 없이 데이터를 올바르게 해석할 수 있습니다.

가장 많이 사용되는 표준 특성은 다음과 같습니다:

UUID이름데이터 유형서비스
0x2A19Battery Leveluint8 (0–100%)Battery Service
0x2A37Heart Rate Measurementuint8 + 플래그Heart Rate
0x2A6ETemperatureint16 (0.01°C)Environmental Sensing
0x2A6FHumidityuint16 (0.01%)Environmental Sensing
0x2A00Device NameUTF-8 문자열Generic Access
0x2A01Appearanceuint16Generic Access

기존 표준 특성이 타스크를 다루는 경우 그것을 사용하십시오. 이는 Bluetooth 인증을 간단하게 하고 생태계 호환성을 향상시킵니다. SIG 등록에 없는 고유한 데이터에 대해서만 사용자 정의 특성을 만드십시오.

iOS 및 Android에서 Characteristic 생성

특성 생성은 데이터를 제공하는 장치인 Peripheral 쪽에서 수행됩니다. iOS(Swift) 및 Android(Java)에서의 구현을 살펴보겠습니다.

iOS: CBMutableCharacteristic

Core Bluetooth는 UUID, 특성 그리고 초기 값을 가진 특성을 생성하기 위한 CBMutableCharacteristic 클래스를 제공합니다.

swift
import CoreBluetooth

let characteristicUUID = CBUUID("2A19") // 배터리 레벨 특성

let characteristic = CBMutableCharacteristic(
    type: characteristicUUID,
    properties: [.read, .notify],
    value: nil,
    permissions: [.readable]
)

// 변경 시 값 업데이트
let batteryData = Data([batteryLevel]) // uint8
peripheralManager.updateValue(
    batteryData,
    for: characteristic,
    onSubscribedCentrals: nil
)

Android: BluetoothGattCharacteristic

Android에서는 UUID, 특성 및 권한을 가진 BluetoothGattCharacteristic을 사용하여 특성이 생성됩니다.

java
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
    );

// 값 설정
characteristic.setValue(batteryLevel, BluetoothGattCharacteristic.FORMAT_UINT8, 0);
gattServer.notifyCharacteristicChanged(device, characteristic, false);

읽기, 쓰기 및 알림

Characteristic에 대한 작업은 세 가지 유형으로 나놨니다: 읽기(read), 쓰기(write), 알림(notify/indicate). 선택은 시나리오에 따라 달라집니다. 요청에 따른 데이터는 읽고, 명령은 쓰고, 스트리밍 데이터는 알림에 구독합니다.

Read: Central이 특성 값을 읽도록 요청을 보냅니다. Peripheral이 현재 값으로 응답합니다. 작업은 동기적이며 각 쪽의 명시적 요청이 필요합니다. 거의 변경되지 않는 데이터(펌웨어 버전, 시리얼 번호, 설정)에 사용됩니다.

Write: Central이 Peripheral에 데이터를 보냅니다. 두 가지 모드가 있습니다: Write with Response(Peripheral의 확인) 및 Write Without Response(확인 없음). Write with Response는 전달을 보장합니다 — Peripheral이 쓰기 후 확인을 보냅니다. Write Without Response는 더 빠르지만 전달을 보장하지 않습니다.

Notify 및 Indicate: Peripheral이 Central로의 데이터 전송을 시작합니다. Notify에서는 데이터가 확인 없이 전송됩니다 — Central이 패킷을 받지 못하면 손실됩니다. Indicate에서는 Central이 확인(PDU 레벨)을 보내 전달을 보장합니다. Indicate는 더 느리지만 더 신뢰합니다. 알림에 구독하려면 Central이 CCCD(Client Characteristic Configuration Descriptor)에 값 0x0001을 쓱니다.

MTU 및 전송 데이터 크기

MTU (Maximum Transmission Unit)은 단일 BLE 데이터 패킷의 최대 크기를 정의합니다. 기본적으로 MTU는 23바이트이며, 그 중 3바이트는 헤더입니다 — 페이로드(ATT payload)는 20바이트입니다. 이것은 대부분의 센서 데이터에 대해 충분하지만 파일 전송이나 큰 구성에는 충분하지 않습니다.

Bluetooth Core Specification 5.4는 MTU 협상(MTU negotiation)을 지원하여 Central과 Peripheral이 최대 517바이트까지 더 큰 패킷 크기에 동의할 수 있습니다. 과정은 다음과 같이 작동합니다: Central이 제안한 MTU를 가진 MTU Exchange 요청을 보내고, Peripheral이 자신의 MTU로 응답하며, 두 값 중 작은 값이 사용됩니다.

swift
// iOS가 연겱 시 MTU 요청
// iOS에서 최대 MTU는 185 바이트
func peripheral(
    _ peripheral: CBPeripheral,
    didDiscoverServices error: Error?
) {
    // 특정 페리페러에 대한 MTU 요청
    peripheral.maximumWriteValueLength(for: .withResponse)
}

Bluetooth SIG (2023)에 따르면 MTU를 23에서 185바이트로 증가하면 패킷 수 감소로 데이터 전송 오버헤드가 최대 80% 감소합니다. 고주파수 읽기(예: ECG 또는 가속도계)를 전송하는 애플리케이션에서는 MTU 증가가 스트림 안정성에 필수적입니다.

자주 묻는 질문

하나의 서비스에 몇 개의 특성이 들어갈 수 있나요?

BLE 규격은 서비스의 특성 수를 제한하지 않습니다. 실제로는 GATT 서버의 사용 가능한 메모리와 성능 요구 사항에 따라 제한이 결정됩니다. 임베디드 장치의 경우 서비스당 10–15개 이상의 특성은 권장되지 않습니다.

Notify와 Indicate의 차이점은 뭐인가요?

Notify는 확인 없이 데이터를 전송합니다 — 패킷이 보낸이에게 알림 없이 손실될 수 있습니다. Indicate는 프로토콜 레벨에서 확인(ACK)을 필요로 하며 전달을 보장합니다. Indicate는 더 느리지만 더 신뢰합니다. 중요한 데이터(경고, 명령)에는 Indicate를 사용하십시오.

특성이 동시에 Read와 Write를 가질 수 있나요?

네, 특성은 특성의 조합을 가질 수 있습니다. 예를 들어, 설정 특성은 Read(현재 값 읽기)와 Write(설정 변경)를 모두 지원할 수 있습니다. 사용 사례에 따라 특성을 조합하십시오.

BLE를 통해 20바이트 이상의 데이터를 어떻게 전송하나요?

MTU 협상을 사용하여 패킷 크기를 185–517바이트로 확대하세요. 데이터가 여전히 큰 경우 애플리케이션 레벨에서 조조화를 구현하세요: 데이터를 무결성 제어와 함께 여러 순차적 요청으로 나누세요.

표준 특성 UUID를 사용해야 하나요?

타스크가 표준 특성으로 다루어지는 경우 Bluetooth SIG 등록의 UUID를 사용하십시오. 이는 인증을 간단하게 하고 생태계 호환성을 보장합니다. 고유한 제3자 데이터에 대해서만 사용자 정의 UUID를 만드십시오.

요약

  • Characteristic은 BLE에서 주요 데이터 전송 메커니즘으로, UUID, 특성 및 디스크립터가 있는 값을 나타냅니다.
  • 특성(Read, Write, Notify, Indicate)은 특성에서 사용 가능한 작업을 정의합니다.
  • Bluetooth SIG는 500개 이상의 표준 특성을 지정했습니다 — 장치 호환을 위해 이것들을 사용하십시오.
  • 특성 생성은 Core Bluetooth(iOS) 또는 BluetoothGattCharacteristic(Android)을 통해 Peripheral 쪽에서 수행됩니다.
  • 알림(Notify/Indicate)은 스트리밍 데이터에 대한 정기 폴링보다 더 효율적입니다 — Central에서 지속적인 요청이 필요하지 않습니다.
  • 단일 패킷의 크기는 MTU(기본 20바이트)에 의해 제한되지만 MTU Exchange를 통해 517바이트까지 확대할 수 있습니다.
  • 특성과 UUID의 올바른 선택이 BLE 연결의 전력 소비, 신뢰성 및 성능을 결정합니다.

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기