BLE(Bluetooth Low Energy) 통신은 저전력 환경에 최적화된 데이터 전송 프로토콜 스택으로 구성됩니다.
BLE에서 장치 간 데이터를 주고받는 데 필수적인 프로토콜은 ATT(Attribute Protocol)이며, 이를 하위 계층인 L2CAP(Logical Link Control and Adaptation Protocol)이 지원하여 효율적이고 안정적인 데이터 전송이 가능합니다.
이번 포스팅에서는 BLE 데이터 통신의 진짜 알맹이는 ATT라는 사실과, 이 ATT가 L2CAP과 함께 어떻게 상호작용하는지 집중적으로 설명합니다. ⚡
(참고: GATT는 이번 포스팅에서 다루지 않습니다.)
ATT (Attribute Protocol)은 BLE 장치 간 데이터 교환이 이루어지는 프로토콜 계층으로, 데이터를 속성(Attribute) 단위로 관리합니다.
이 속성들은 BLE 장치 간 데이터를 식별하고 요청/응답으로 교환할 수 있도록 설계되었습니다.
1️⃣ 속성 관리: BLE 장치에서 데이터를 "속성(Attribute)"이라는 것으로 말하기로 함.
2️⃣ 클라이언트-서버 모델: 속성은 클라이언트와 서버 구조로 통신 되도록 설계 됨.
3️⃣ 데이터 요청/응답/명령 데이터를 읽거나 쓰고, 알림(Notification) 기능을 수행.
BLE 장치 간 실제로 이루어지는 데이터 교환은 모두 ATT 프로토콜을 중심으로 이루어집니다.
ATT에서 모든 데이터 교환은 PDU(Protocol Data Unit)라는 패킷 단위로 이루어집니다.
PDU는 클라이언트와 서버 간 요청(Read/Write) 및 응답, 알림 등을 주고받는 데 사용되며, 다음과 같은 구조를 가집니다:

| Opcode (HEX) | 작업 이름 | 설명 |
|---|---|---|
0x0B | Read Response | 요청한 속성 값을 반환합니다. |
0x13 | Write Response | 쓰기 작업이 성공적으로 완료되었음을 반환합니다. |
0x09 | Find Information Response | 서버가 속성 핸들 및 UUID 정보를 반환합니다. |
0x07 | Find By Type Value Response | 검색된 속성 핸들 및 값 정보를 반환합니다. |
0x0D | Read By Type Response | 동일 유형(Type)의 여러 속성 값을 반환합니다. |
0x11 | Read By Group Type Response | 동일 그룹(Group)의 여러 속성 값을 반환합니다. |
0x0F | Read Blob Response | 큰 속성 데이터의 조각(Fragment)을 반환합니다. |
0x53 | Prepare Write Response | Prepare Write 요청 작업이 성공했음을 반환합니다. |
0x17 | Execute Write Response | Execute Write 결과를 반환합니다. |
등 여러가지 더 있음.
Handle = 0x0025일 수 있음. Example)
Handle Type Description
--------------------------------------------------
0x0001 Primary Service Handle 심박수 측정 서비스 시작.
0x0025 Characteristic Declaration 심박수 데이터 특성 선언.
0x0026 Characteristic Value 심박수 데이터 값.
0x0027 Descriptor (CCCD) 클라이언트 알림 활성화 설정.
0x0101 Included Service Handle 배터리 상태 서비스 포함.
➡️ 핸들(Handle)이 포함되어 있어야 ATT 프로토콜이 어느 속성에 접근할지를 정확히 지정할 수 있습니다.
클라이언트가 서버의 속성 값을 읽고 싶을 때, Request PDU는 다음과 같은 형식을 따릅니다:

0x0A (Read Request). 0x0025 (클라이언트가 읽으려는 서버의 고유 ATT id)서버는 요청받은 핸들에 해당하는 데이터를 반환하며, Response PDU를 통해 응답합니다:

0x0B (Read Response). ➡️ 클라이언트는 서버로부터 Value 데이터를 응답받게 됩니다.
BLE 프로토콜 스택에서 L2CAP(Logical Link Control and Adaptation Protocol)은 상위 프로토콜(ATT 등)의 데이터를 하위 계층(링크 계층)으로 전달하는 중간 계층입니다.
1️⃣ 캡슐화(Encapsulation): ATT PDU를 포함한 상위 프로토콜 데이터를 받아 BLE 데이터 패킷으로 변환.
2️⃣ 조각화(Fragmentation) 및 재조립(Reassembly): 큰 데이터를 링크 계층의 MTU 제한에 맞춰 나누고, 다시 합침.
4️⃣ 전송 채널 관리: 특정 프로토콜 데이터를 전송할 채널을 식별 (Channel ID).
➡️ ATT 데이터를 BLE 물리 계층에서 실제 전송하려면 L2CAP의 지원이 필수적입니다.

0x0004). 이 데이터는 물리계층으로 보내지며 물리계층은 최종적으로 전송을 시작됩니다.
BLE 장치 간의 데이터 교환은 궁극적으로 ATT를 통해 이루어집니다.
➡️ BLE에서 데이터를 "이야기"하는 것(즉, 대화의 내용)은 ATT(핸들 기반)이고, L2CAP은 이 대화를 "전달"하는 메신저라 볼 수 있습니다.
BLE의 내부를 들여다보면, 결국 ATT는 BLE 데이터 통신의 알맹이라고 할 수 있습니다. 🌟
GATT와의 관계는 이후의 포스팅에서 다루도록 하겠습니다.
이번엔 ATT와 L2CAP의 협력을 통해 BLE 데이터 전송의 기본 원리를 이해해 보았길 바랍니다. 😊
끝.