안녕하세요. 오늘은 이전에 알아봤던 BLE GATT를 BLE Sniffer로 측정해보겠습니다.
측정하는 방식과 알아보는 방식은 이전에 BLE GAP을 BLE Sniffer로 측정했던 방식과 동일합니다.

스마트폰 앱에서 CONNECT 버튼을 확인할 수 있습니다.

(1) ADV_IND
- CONNECT를 하기전에는 ESP32가 advertising 하고있습니다.
(2) CONNECT_IND
- 스마트폰에서 CONNECT를하면 연결시도를 합니다.
CONNECT_IND 패킷 안에 설정정보를 만듭니다. 이중에 Access Address가 있는데, 데이터 채널에서 사용되는 32bit 주소입니다. 이 주소로 LL/ATT/GATT 패킷이 전송됩니다. CONNECT_IND 이후부터는 데이터채널로 전환됩니다.

(3) Control Opcode: LL_VERSION_IND
- 연결시도 이후에 BLE 버전정보를 교환하게 됩니다.
(4) Empty PDU
- 연결을 유지하려고 스마트폰과 ESP32는 서로 패킷을 보냅니다.

(5) LL_FEATURE_REQ/LL_FEATURE_RSP
- 지원 기능(Encrption, DLE, PHY등) 동기화 과정입니다.
(6) LL_LENGTH_REQ/LL_LENGTH_RSP
- 데이터 길이 협상입니다.
(7) Sent Read By Group Type Request, Primary Service, Handles : 0x0001..0xffff (No.26662)
- 스마트폰이 ESP32의 GATT Primary Service(0x2800) 목옥을 요청하는 패킷입니다.

(8) Rcvd Read By Group Type Response, Attribute List Length: 3, GATT, GAP, Heart Rate (No.26669)
- ESP32가 Primary Service목록 3개 (GAP,GATT,Heart Rate)를 가지고있다고 답변한 패킷입니다.
마지막 Attribute Data의 Group End Handle을 보면 0x002b입니다. 그 의미는 Attribute Data가 더 있다는 말입니다.

(9) Sent Read By Group Type Request, Primary Service, Handles: 0x002c..0xffff(No. 26676)
- GATT Primary Service 목록을 다시 요청합니다. Group End Handle가 0x002b였으므로 0x002b+1부터 시작합니다.
(10) Rcvd Read By Group Type Response, Attribute List Length: 1, Automation IO (No.26679)
- 응답입니다. Group end Handle가 0xffff이므로 서비스의 끝을 의미합니다.

(11) 그 다음에는 각각의 UUID들의 Include Service와 Characteristic을 요청합니다.
여기까지 했으면 스마트폰에서는 아래의 UI들이 보입니다.

이 상태에서는 스마트폰과 ESP32는 Empty PDU 패킷을 교환하고있습니다.

[테스트]

Generic Access의 Device Name을 얻으면 ESP32가 읽힙니다.

(1) Sent Read Request, Handle: 0x0016 (GAP: Device Name)
- 스마트폰에서 Handle 0x0016을 Read Request합니다.

(2) Rcvd Read Response, Handle: 0x0016 (GAP: Device Name)
- ESP32가 Request에 대해서 응답을 합니다.

'지식 > BLE' 카테고리의 다른 글
| BLE ESP32 Bluedroid_Beacon 코드 분석하기 2편-코드흐름 (1) | 2025.11.25 |
|---|---|
| BLE ESP32 Bluedroid_Beacon 코드 분석하기 1편-전역변수 (0) | 2025.11.22 |
| BLE GATT 예시를 통해서 알아보기 (0) | 2025.11.10 |
| BLE GAP을 BLE Sniffer로 측정하기 (0) | 2025.11.08 |
| BLE GAP 예시를 통해서 알아보기 (0) | 2025.11.02 |