ATT를 알아야 BLE를 아는 것이다 (+ L2CAP)

진정한 개발자·2024년 11월 29일

Bluetooth

목록 보기
7/9
post-thumbnail

📡 블루투스 ATT와 L2CAP: BLE 데이터 전송의 핵심 이해

BLE(Bluetooth Low Energy) 통신은 저전력 환경에 최적화된 데이터 전송 프로토콜 스택으로 구성됩니다.

BLE에서 장치 간 데이터를 주고받는 데 필수적인 프로토콜은 ATT(Attribute Protocol)이며, 이를 하위 계층인 L2CAP(Logical Link Control and Adaptation Protocol)이 지원하여 효율적이고 안정적인 데이터 전송이 가능합니다.

이번 포스팅에서는 BLE 데이터 통신의 진짜 알맹이는 ATT라는 사실과, 이 ATT가 L2CAP과 함께 어떻게 상호작용하는지 집중적으로 설명합니다. ⚡
(참고: GATT는 이번 포스팅에서 다루지 않습니다.)


1. ATT란? BLE 데이터의 속성 관리 프로토콜

ATT (Attribute Protocol)은 BLE 장치 간 데이터 교환이 이루어지는 프로토콜 계층으로, 데이터를 속성(Attribute) 단위로 관리합니다.
이 속성들은 BLE 장치 간 데이터를 식별하고 요청/응답으로 교환할 수 있도록 설계되었습니다.

ATT의 주요 기능 🧩

1️⃣ 속성 관리: BLE 장치에서 데이터를 "속성(Attribute)"이라는 것으로 말하기로 함.
2️⃣ 클라이언트-서버 모델: 속성은 클라이언트와 서버 구조로 통신 되도록 설계 됨.
3️⃣ 데이터 요청/응답/명령 데이터를 읽거나 쓰고, 알림(Notification) 기능을 수행.

📌 BLE의 알맹이: ATT

BLE 장치 간 실제로 이루어지는 데이터 교환은 모두 ATT 프로토콜을 중심으로 이루어집니다.

  • BLE 연결의 모든 데이터 읽기/쓰기 요청, 알림(Notification), 서버 데이터 응답은 ATT 프로토콜을 통해 처리됩니다.
  • 즉, BLE 통신에 "실제 대화의 내용" 이 것이 바로 ATT입니다.

2. ATT PDU - 패킷 구조

ATT에서 모든 데이터 교환은 PDU(Protocol Data Unit)라는 패킷 단위로 이루어집니다.
PDU는 클라이언트와 서버 간 요청(Read/Write) 및 응답, 알림 등을 주고받는 데 사용되며, 다음과 같은 구조를 가집니다:

ATT PDU 구조 🎛️

  • Opcode (1 Byte): 수행할 작업(읽기, 쓰기, 알림 등)을 정의하는 명령 코드입니다.
Opcode (HEX)작업 이름설명
0x0BRead Response요청한 속성 값을 반환합니다.
0x13Write Response쓰기 작업이 성공적으로 완료되었음을 반환합니다.
0x09Find Information Response서버가 속성 핸들 및 UUID 정보를 반환합니다.
0x07Find By Type Value Response검색된 속성 핸들 및 값 정보를 반환합니다.
0x0DRead By Type Response동일 유형(Type)의 여러 속성 값을 반환합니다.
0x11Read By Group Type Response동일 그룹(Group)의 여러 속성 값을 반환합니다.
0x0FRead Blob Response큰 속성 데이터의 조각(Fragment)을 반환합니다.
0x53Prepare Write ResponsePrepare Write 요청 작업이 성공했음을 반환합니다.
0x17Execute Write ResponseExecute Write 결과를 반환합니다.

등 여러가지 더 있음.

  • Handle (2 Bytes): ATT를 식별하는 고유 식별자 (주민번호 같은 것)
    • 각 ATT는는 고유한 핸들을 가지며, 클라이언트는 이를 통해 데이터를 요청하거나 쓸 수 있습니다.
    • 예: 심박 센서 데이터는 Handle = 0x0025일 수 있음.
Example)

Handle   Type                          Description  
--------------------------------------------------
0x0001   Primary Service Handle        심박수 측정 서비스 시작.
0x0025   Characteristic Declaration    심박수 데이터 특성 선언.
0x0026   Characteristic Value          심박수 데이터 값.
0x0027   Descriptor (CCCD)             클라이언트 알림 활성화 설정.
0x0101   Included Service Handle       배터리 상태 서비스 포함.
  • Payload (Variable): 작업과 관련된 실제 데이터를 담음.
    • 예: 쓰기 요청 시 전송 데이터, 또는 읽기 응답 시 반환 데이터.

➡️ 핸들(Handle)이 포함되어 있어야 ATT 프로토콜이 어느 속성에 접근할지를 정확히 지정할 수 있습니다.


3. ATT PDU의 예제 - 읽기 요청/응답

(1) 클라이언트 → 서버 (Read Request)

클라이언트가 서버의 속성 값을 읽고 싶을 때, Request PDU는 다음과 같은 형식을 따릅니다:

  • Opcode: 0x0A (Read Request).
  • Handle: 0x0025 (클라이언트가 읽으려는 서버의 고유 ATT id)

(2) 서버 → 클라이언트 (Read Response)

서버는 요청받은 핸들에 해당하는 데이터를 반환하며, Response PDU를 통해 응답합니다:

  • Opcode: 0x0B (Read Response).
  • Value: 요청된 속성 값, 예: "Sensor Data".

➡️ 클라이언트는 서버로부터 Value 데이터를 응답받게 됩니다.


4. L2CAP의 역할: ATT 데이터를 전송 가능한 형태로 캡슐화

L2CAP이란?

BLE 프로토콜 스택에서 L2CAP(Logical Link Control and Adaptation Protocol)상위 프로토콜(ATT 등)의 데이터를 하위 계층(링크 계층)으로 전달하는 중간 계층입니다.

L2CAP의 주요 역할 🔗:

1️⃣ 캡슐화(Encapsulation): ATT PDU를 포함한 상위 프로토콜 데이터를 받아 BLE 데이터 패킷으로 변환.
2️⃣ 조각화(Fragmentation) 및 재조립(Reassembly): 큰 데이터를 링크 계층의 MTU 제한에 맞춰 나누고, 다시 합침.
4️⃣ 전송 채널 관리: 특정 프로토콜 데이터를 전송할 채널을 식별 (Channel ID).

➡️ ATT 데이터를 BLE 물리 계층에서 실제 전송하려면 L2CAP의 지원이 필수적입니다.

L2CAP PDU 구조 🧩

  • Length (2 Bytes): PDU의 데이터 크기를 정의 (ATT PDU의 크기 포함).
  • Channel ID (2 Bytes): ATT 데이터가 전송될 BLE L2CAP 채널을 식별 (Channel ID = 0x0004).
  • Payload (Variable): ATT PDU (Opcode, Handle, Value 포함).

이 데이터는 물리계층으로 보내지며 물리계층은 최종적으로 전송을 시작됩니다.


5. 결론: BLE 데이터를 움직이는 진짜 알맹이는 ATT 🏁

BLE 장치 간의 데이터 교환은 궁극적으로 ATT를 통해 이루어집니다.

  • ATT는 BLE 속성 데이터 교환의 중심이며, 모든 데이터 요청, 응답, 알림은 ATT 프로토콜로 처리됩니다.
  • Handle(핸들)은 ATT에서 속성을 식별하는 필수 요소로 데이터 액세스의 핵심입니다.
  • L2CAP은 ATT 데이터를 BLE 네트워크 상에서 캡슐화하여 효율적으로 전송합니다.

➡️ BLE에서 데이터를 "이야기"하는 것(즉, 대화의 내용)은 ATT(핸들 기반)이고, L2CAP은 이 대화를 "전달"하는 메신저라 볼 수 있습니다.

BLE의 내부를 들여다보면, 결국 ATT는 BLE 데이터 통신의 알맹이라고 할 수 있습니다. 🌟

GATT와의 관계는 이후의 포스팅에서 다루도록 하겠습니다.
이번엔 ATT와 L2CAP의 협력을 통해 BLE 데이터 전송의 기본 원리를 이해해 보았길 바랍니다. 😊

끝.

profile
개발자 진정한 입니다

0개의 댓글