안녕하세요. 오늘은 1편에 이어서 ESP32 Bluedroid_Beacon 예제코드를 분석해보겠습니다.
1편에서는 프로젝트에서 사용한 전역변수 3개에대해 알아봤습니다.
2편에서는 프로젝트 main문의 흐름에대해 알아보겠습니다.
Bluetooth stack에는 Host랑 controller가 있습니다.
(1) Controller는 하드웨어+저수준 펌웨어가 동작하는 영역입니다. 실제 전파를 주고받는 부분이고 Physical Layer(실제 BLE radio 신호), Link Layer(광고, 연결관리, timing, encryption)가 여기에 속합니다.
(2) Host는 소프트웨어 스택입니다. GAP(연결/페어링/역할관리) , GATT(서비스, characteristic 읽기/쓰기) , ATT(실제 읽기/쓰기 요청 수행), L2CAP (패킷 분할/재조립+multiplexing), SMP(Pairing,Bonding, key교환)가 여기에 속합니다.
(3) HCI(Host Controller Interface)는 Host와 Controller가 데이터를 주고받는 표준 인터페이스입니다.

ESP32의 Bluetooth host에는 Bluedroid랑 Nimble이 있습니다.
Bluedroid는 Classic Bluetooth와 BLE가 가능합니다. Nimble은 BLE만 가능합니다. 그래서 Nimble은 Bluedroid대비 코드용량이 40~60% 더 적습니다.
이 글에서 사용하는 프로젝트는 Bluedroid 프로젝트입니다.

위에서 두가지를 말한 이유가 있습니다. app_main의 흐름은 다음과 같습니다.
1. NVS(Non-volatile Storage) 초기화 : ESP32안에 있는 플래시메모리 초기화
2. bt controller 초기화 : controller영역 초기화
3. bluedroid 초기화 : host영역 초기화
4. GAP 콜백등록 : GAP관련 이벤트 처리 준비
5. 광고데이터/SCAN데이터 시스템에 세팅
6. 광고시작
여기서 중요한게 4~5번입니다.
코드에서 adv_config_done에 ADV_CONFIG_FLAG랑 SCAN_RSP_CONFIG_FLAG를 줍니다.
그 이유는 esp_gap_cb에서 ADV DATA랑 SCAN DATA를 SET하고나서 광고를 시작하기 위함입니다.
esp_ble_gap_config_adv_data_raw는 광고데이터를 설정하는 API라서 스택이 설정작업을 끝내면 ESP_GAP_BLE_ADV_DATA_RAW_SET_COMPLETE_EVT 이벤트를 esp_gap_cb로 전달합니다.
그럼 아래 로그메세지 (503) BLE_BEACON: Advertising data raw set. status 0가 나옵니다.
esp_ble_gap_get_local_used_addr는 local address를 얻어외서 local_addr 변수에 값을 넣습니다.
그리고나서 scan_rsp_raw_data배열의 2~7번에 주소를 넣습니다. 이전에 해당배열을 선언할때 2~7번은 0x00으로 초기화했었습니다. {0x08, ESP_BLE_AD_TYPE_LE_DEV_ADDR, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ...}

그렇게되면 scan data로 위의 그림과같이 주소가 나오게 됩니다.
esp_ble_gap_config_scan_rsp_data_raw는 마찬가지로 작업이끝나면 ESP_GAP_BLE_SCAN_RSP_DATA_RAW_SET_COMPLETE_EVT이벤트를 esp_gap_cb로 전달하고 I (503) BLE_BEACON: Scan response data raw set, status 0 로그가 나오게됩니다.
해당함수에서 이제 adv_config_done가 0이므로 esp_ble_gap_start_advertising를 하게되고ESP_GAP_BLE_ADV_START_COMPLETE_EVT 이벤트를 호출합니다. 그럼 로그(I (513) BLE_BEACON: Advertising start successfully)가 나오고 광고가 시작됩니다.

'지식 > BLE' 카테고리의 다른 글
| 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을 BLE Sniffer로 측정하기 (0) | 2025.11.08 |
| BLE GAP 예시를 통해서 알아보기 (0) | 2025.11.02 |