지식/BLE

BLE GAP 예시를 통해서 알아보기

원원 2025. 11. 2. 23:05

안녕하세요. 오늘은 BLE GAP에 대해 알아보겠습니다.

GAP(Generic Access Profile)은 기기가 서로 어떻게 찾고 연결하는지 관리를 합니다.
GAP는 프로파일 계층에서 최상위에 존재합니다.

Core_v5.0.pdf / 1981page

GAP가 실제로 어떻게 사용하는지 ESP32와 스마트폰앱(nRF Connect)를 이용해서 알아보겠습니다.
ESP32에 넣은 예제는 "Bluedroid_Beacon" 입니다. 비콘으로 동작하는 펌웨어입니다.
FW : https://github.com/espressif/esp-idf/tree/master/examples/bluetooth/ble_get_started/bluedroid/Bluedroid_Beacon

OPEN 버튼을 클릭하면 해당사이트로 가집니다


스마트폰앱으로 보면 위의 그림처럼 나와있습니다.
- Device type : esp_bt_controller_mem_release결과와 Flags비트를 조합해서 표시
- Advertising type : 광고 PDU형식과 Controller PHY 설정으로 판단됨

앱에서 표시된 데이터들이 코드에서 어느부분이 매칭되는지 확인해보겠습니다.

표시 항목 설명
Device type LE only esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT)
Advertising type Legacy esp_ble_gap_start_advertising(&adv_params);
Flags LE General Discoverable, BR/EDR Not Supported ESP_BLE_AD_TYPE_FLAG (0x01) = 0x06
Complete Local Name Bluedroid_Beacon ESP_BLE_AD_TYPE_NAME_CMPL (0x09)
Tx Power Level 9 dBm ESP_BLE_AD_TYPE_TX_PWR (0x0A) = 0x09
Appearance [512] Generic Tag ESP_BLE_AD_TYPE_APPEARANCE (0x19) = 0x0200
LE Role Only Peripheral Role supported ESP_BLE_AD_TYPE_LE_ROLE (0x1C) = 0x00
BLE Address DC:DA:0C:22:A4:D2 esp_ble_gap_get_local_used_addr() 에서 가져옴
URI https://espressif.com ESP_BLE_AD_TYPE_URI (0x24) = URI_PREFIX_HTTPS (0x17) + "//espressif.com"


가장 직관적인  Tx Power Level을 보겠습니다. 값은 9입니다.

//configure raw data for advertising packet
static uint8_t adv_raw_data[] = {
    0x02, ESP_BLE_AD_TYPE_FLAG, 0x06,
    0x11, ESP_BLE_AD_TYPE_NAME_CMPL, 'B', 'l', 'u', 'e', 'd', 'r', 'o', 'i', 'd', '_', 'B', 'e', 'a', 'c', 'o', 'n',
    0x02, ESP_BLE_AD_TYPE_TX_PWR, 0x09,
    0x03, ESP_BLE_AD_TYPE_APPEARANCE, 0x00,0x02,
    0x02, ESP_BLE_AD_TYPE_LE_ROLE, 0x00,
};
 
static uint8_t scan_rsp_raw_data[] = {
    0x08, ESP_BLE_AD_TYPE_LE_DEV_ADDR, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x11, ESP_BLE_AD_TYPE_URI, URI_PREFIX_HTTPS, '/', '/', 'e', 's', 'p', 'r', 'e', 's', 's', 'i', 'f', '.', 'c', 'o', 'm',
};

AD types의 기본 포맷은 아래의 그림과 같습니다.
length, AD Type, AD Data입니다.

Core_v5.0.pdf / 2086page

TX Power Level을 보면 아래와 같고 길이가 0x02이고 AD Type은 ESP_BLE_AD_TYPE_TX_PWR이고 데이터는 0x09입니다.
    0x02, ESP_BLE_AD_TYPE_TX_PWR, 0x09,
ESP_BLE_AD_TYPE_TX_PWR은 0x0A입니다.
    ESP_BLE_AD_TYPE_TX_PWR                   = 0x0A,
AD Type은 아래의 문서에 정의되어있습니다.
https://www.bluetooth.com/wp-content/uploads/Files/Specification/HTML/Assigned_Numbers/out/en/Assigned_Numbers.pdf

다른 GAP 데이터들도 찾아보면 해당문서에 나와있것과 일치합니다. 

////

BLE 이므로 광고를 계속하는데 아래의 데이터로 설정합니다.
20ms 주기로 광고를 합니다.

static esp_ble_adv_params_t adv_params = {
    .adv_int_min = 0x20,  // 20ms
    .adv_int_max = 0x20,  // 20ms
    .adv_type = ADV_TYPE_SCAN_IND,
    .own_addr_type = BLE_ADDR_TYPE_PUBLIC,
    .channel_map = ADV_CHNL_ALL,
    .adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY,
};

해당데이터도 문서에 정의되어있습니다. 해당 adv type 설명은 아래의 링크에 나와있습니다.
https://wowon.tistory.com/377

Core_v5.0.pdf 1251 page



다음글에서는 GAP를 Sniffer로 측정해보겠습니다.