안녕하세요. 오늘은 이전에 알아봤던 BLE GAP를 BLE Sniffer로 측정해보겠습니다.
측정 할 장비는 이전글에서 사용했었던 ESP32 beacon 프로젝트입니다.
(https://wowon.tistory.com/373)
측정장비는 NRF52832 USB이고 wireshark를 사용합니다.
(A) 스마트폰 nRF 앱으로 측정한 데이터입니다.

(B) sniffer장비로 측정한 데이터입니다.
로그에서 찍히는 데이터는 크게 두 부분으로 나뉩니다.

- nRF Sniffer for Bluetooth LE
Sniffer 장비가 BLE 기기가 보낸 무선 신호(RF) 를 수신하고, 그 신호로부터 신호 세기(RSSI), 채널 번호, 타임스탬프 등의 물리 계층(PHY) 정보를 계산하여 Wireshark로 전달한 데이터
- Bluetooth Low Energy Link Layer
Sniffer 장비가 수신한 RF 신호를 Wireshark가 BLE 프로토콜 구조에 따라 해석한 데이터로, 패킷의 형식(ADV_IND, SCAN_REQ 등), 송신 주소(AdvA), UUID, 페이로드 내용 등 링크 계층(LL)의 논리적인 통신 정보를 나타냄
파랑색부분이 nRF Sniffer for Bluetooth LE이고 흰색부분이 Bluetooth Low Energy Link Layer입니다.

nRF Sniffer for Bluetooth LE에서 RSSI와 채널이 있는것을 확인할수있습니다.

Bluetooth Low Energy Link Layer은 자세히 알아보겠습니다. (ADV_SCAN_IND)

-Access Address(빨강네모)
계층 : PHY(물리계층)
역할 : 패킷의 시작을 식별하기 위한 고유 32비트 패턴입니다. 광고 채널 (37,38,39)에서는 항상 고정값 0x8e89bed6을 사용합니다. sniffer는 이 패턴을 보고 BLE 패킷이 시작인것을 인지합니다.

- Packey Header(주황네모)
계층 : Link Layer(논리 계층)
역할 : 패킷이 어떤 종류인지, 길이가 얼마나 되는지를 알려주는 메타데이터
| 필드 | 비트 수 | 설명 |
| PDU Type | 4bit | 패킷 종류 (ADV_IND, ADV_SCAN_IND, CONNECT_REQ 등) |
| RFU | 1bit | 예약 |
| TxAdd | 1bit | 송신 주소 형식 (0: Public, 1: Random) |
| RxAdd | 1bit | 수신 주소 형식 |
| Length | 8bit | Payload 길이 (0~37 byte) |

- Advertising Address(노랑네모)
계층 : Link Layer
역할 : BLE 기기의 송신자 주소(MAC Adress 또는 랜덤 주소)입니다. 실제로 패킷을 보낸 BLE장치의 주소입니다. 이 값을 보고 누가 광고 패킷을 보냈는지 식별합니다.

- Advertising Data (초록네모)
계층 : GAP
역할 : 실제로 전달하려는 정보가 들어있는 영역입니다.
구조는 길이+타입+값 형태로 반복됩니다.

- CRC (파랑네모)
계층 : PHY(물리 계층)
역할 : 패킷에 오류가 생겼는지 확인하는 에러 검출 코드입니다.

* 앱 vs sniffer 데이터 비교
앱에서 봤던 데이터랑 sniffer의 Advertising Data를 보면 같고 코드에 적혀있는 데이터랑 매칭이 됩니다.(주황)
0x0201061109426C756564726F69645F426561636F6E020A0903190002021C00
앱에서는 이 데이터가 있는데 sniffer에서는 이 데이터가 없습니다. (초록)
081BD2A4220CDADC001124172F2F6573707265737369662E636F6E
※ 코드는 081B0000..인데 실제 데이터는 081BDA4..인 이유는 ESP32 FW에서 local_addr을 읽어서 넣기때문입니다.
제가 봤던 sniffer 데이터는 ESP가 주기적으로 광고하는 ADV_SCAN_IND타입이기때문입니다.
scan_rsp데이터는 SCAN_RSP타입의 데이터를 봐야합니다.

타입은 Packet Header에 나와있습니다.



ADV_SCAN_IND는 ESP가 광고하는데이터이고, SCAN_REQ는 스캐너가 SCAN을 요청하는 데이터입니다. SCAN_RSP는 ESP가 SCAN에 응답하는 데이터입니다.
SCAN_RSQ 데이터입니다.

SCAN_RSP 데이터입니다.


빨강색부분이 Advertising Data이고 앱에있는 데이터랑 같습니다.
다음 글에서는 GAPP에 대해 알아보겠습니다.
'지식 > BLE' 카테고리의 다른 글
| BLE ESP32 Bluedroid_Beacon 코드 분석하기 2편-코드흐름 (1) | 2025.11.25 |
|---|---|
| BLE ESP32 Bluedroid_Beacon 코드 분석하기 1편-전역변수 (0) | 2025.11.22 |
| BLE GATT를 Ble Sniffer로 측정하기 (0) | 2025.11.16 |
| BLE GATT 예시를 통해서 알아보기 (0) | 2025.11.10 |
| BLE GAP 예시를 통해서 알아보기 (0) | 2025.11.02 |