์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

ESP32 ESP-NOW ๋‹ค์ค‘ ๋…ธ๋“œ ๋ฌด์„  ๋„คํŠธ์›Œํฌ ๊ตฌ์ถ• ์‹œ ํŒจํ‚ท ์ถฉ๋Œ ํ•ด๊ฒฐ๊ณผ ์†Œํ”„ํŠธ์›จ์–ด CSMA/CA ๋ฐฑ์˜คํ”„ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ตœ์ ํ™”

๊ฒŒ์ž„๊ต์ˆ˜ 2026. 9. 15. 16:01
๋ฐ˜์‘ํ˜•

๐ŸŒ English Abstract

This article provides a technical deep-dive into resolving packet loss caused by wireless collisions in multi-node ESP-NOW networks built on ESP32 microcontrollers. By implementing a custom software-based CSMA/CA (Carrier Sense Multiple Access with Collision Avoidance) with exponential backoff and random jitter, developers can significantly increase the Packet Delivery Ratio (PDR). We cover physical layer limitations, clear channel assessment logic, C++ implementations, and troubleshooting edge cases in high-density IoT deployments.

ESP32์˜ ESP-NOW๋Š” Wi-Fi ์—ฐ๊ฒฐ ๊ณผ์ •(Handshake) ์—†์ด MAC ์ฃผ์†Œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์งง์€ ํŒจํ‚ท์„ ๋น ๋ฅด๊ฒŒ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋งค์šฐ ํšจ์œจ์ ์ธ ๋ฌด์„  ํ†ต์‹  ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋…ธ๋“œ ์ˆ˜ ์ฆ๊ฐ€์— ๋”ฐ๋ผ ์ „์†ก ์„ฑ๊ณต๋ฅ ์ด ๊ธ‰๊ฒฉํžˆ ๋–จ์–ด์ง€๋Š” ํ•œ๊ณ„๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋ณธ ๊ธ€์—์„œ๋Š” ํŒจํ‚ท ์ถฉ๋Œ(Packet Collision)๊ณผ ๋ฐ์ดํ„ฐ ์œ ์‹ค(Packet Loss)์˜ ๊ทผ๋ณธ์  ์›์ธ์„ ๋ถ„์„ํ•˜๊ณ , ์ด๋ฅผ ์†Œํ”„ํŠธ์›จ์–ด ๋ ˆ๋ฒจ์˜ CSMA/CA(Carrier Sense Multiple Access with Collision Avoidance) ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ๊ณผ์ •์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.



ESP-NOW ๋„คํŠธ์›Œํฌ ์ถฉ๋Œ ๋ฉ”์ปค๋‹ˆ์ฆ˜๊ณผ ํ•œ๊ณ„ ๋ถ„์„

1. ESP-NOW์˜ ๋™์ž‘ ์›๋ฆฌ์™€ MAC ๋ ˆ์ด์–ด ํŠน์„ฑ

ESP-NOW๋Š” IEEE 802.11 Action Frame์„ ํ™œ์šฉํ•˜์—ฌ ๋ฌด์„  ๋ฌผ๋ฆฌ ๊ณ„์ธต(PHY Layer) ๋ฐ ๋ฐ์ดํ„ฐ ๋งํฌ ๊ณ„์ธต(Data Link Layer)์—์„œ ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด Wi-Fi ๋„คํŠธ์›Œํฌ์™€ ๋‹ฌ๋ฆฌ AP(Access Point) ๊ฒฐํ•ฉ ๊ณผ์ •์ด ์—†์œผ๋ฏ€๋กœ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๊ทน๋„๋กœ ์ ๊ณ  ์ „๋ ฅ ์†Œ๋น„๊ฐ€ ๋‚ฎ์ง€๋งŒ, ํ•˜๋“œ์›จ์–ด ์ฐจ์›์˜ ์™„๋ฒฝํ•œ ๋งค์ฒด ์ ‘๊ทผ ์ œ์–ด(Medium Access Control)๊ฐ€ ๋ณด์žฅ๋˜์ง€ ์•Š๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

2. ๋‹ค์ค‘ ๋…ธ๋“œ(Multi-Node) ํ™˜๊ฒฝ์—์„œ ํŒจํ‚ท ์œ ์‹ค์ด ๋ฐœ์ƒํ•˜๋Š” ์›์ธ

๋…ธ๋“œ ๊ฐœ์ˆ˜๊ฐ€ 10~20๊ฐœ๋ฅผ ์ดˆ๊ณผํ•˜๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ ์ „์†ก ์ฃผ๊ธฐ๊ฐ€ ๋ฐ€์ง‘๋˜๋Š” ํ™˜๊ฒฝ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์›์ธ์œผ๋กœ ์ธํ•ด ์‹ฌ๊ฐํ•œ ๋ฐ์ดํ„ฐ ์œ ์‹ค์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  • ์ฑ„๋„ ํฌํ™”(Channel Saturation): ๋™์ผํ•œ 2.4GHz Wi-Fi ์ฑ„๋„์„ ๊ณต์œ ํ•˜๋Š” ๋…ธ๋“œ๋“ค์ด ๋™์‹œ์— ๋ฌด์„  ๋งค์ฒด์— ์ ‘๊ทผํ•˜๋ ค ํ•  ๋•Œ ์‹ ํ˜ธ ์ค‘์ฒฉ์ด ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค.
  • ์ˆจ์€ ๋…ธ๋“œ ๋ฌธ์ œ(Hidden Node Problem): ์†ก์‹  ๋…ธ๋“œ A์™€ C๊ฐ€ ์„œ๋กœ์˜ ์‹ ํ˜ธ๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์—†๋Š” ๊ฑฐ๋ฆฌ๋‚˜ ์žฅ์• ๋ฌผ ๋’ค์— ์œ„์น˜ํ•˜๊ณ , ์ˆ˜์‹  ๋…ธ๋“œ B๊ฐ€ ์ค‘์•™์— ์žˆ์„ ๋•Œ, A์™€ C๊ฐ€ ๋™์‹œ์— B๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋ฉด B ์œ„์น˜์—์„œ ์‹ ํ˜ธ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ACK ํ”ผ๋“œ๋ฐฑ ๋ฌด๋ ฅํ™”: ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ(Broadcast) ์ „์†ก ๋ชจ๋“œ์—์„œ๋Š” ์ˆ˜์‹  ํ™•์ธ ์‘๋‹ต(ACK)์„ ๋ฐ›์ง€ ์•Š์œผ๋ฏ€๋กœ ํŒจํ‚ท ์œ ์‹ค ์—ฌ๋ถ€๋ฅผ ํ”„๋ ˆ์ž„ ๋‹จ์œ„์—์„œ ๊ฐ์ง€ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์œ ๋‹ˆ์บ์ŠคํŠธ(Unicast) ๋ชจ๋“œ์—์„œ๋„ ํ•˜๋“œ์›จ์–ด ์žฌ์ „์†ก ์‹คํŒจ ์‹œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ์ด์–ด๋กœ์˜ ํ”ผ๋“œ๋ฐฑ ์ง€์—ฐ์ด ๋ฌธ์ œ๋ฉ๋‹ˆ๋‹ค.

์†Œํ”„ํŠธ์›จ์–ด CSMA/CA ๋ฐฑ์˜คํ”„(Backoff) ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๊ณ„

1. CSMA/CA ํ•ต์‹ฌ ๋™์ž‘ ์›๋ฆฌ

๋ฌด์„  LAN ํ‘œ์ค€์—์„œ ์‚ฌ์šฉ๋˜๋Š” CSMA/CA ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ž„๋ฒ ๋””๋“œ ๋ฆฌ์†Œ์Šค์— ๋งž๊ฒŒ ๊ฒฝ๋Ÿ‰ํ™”ํ•˜์—ฌ ์†Œํ”„ํŠธ์›จ์–ด ๋ ˆ์ด์–ด์— ๊ตฌ์ถ•ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•ต์‹ฌ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์บ๋ฆฌ์–ด ์„ผ์‹ฑ(Carrier Sensing): ํŒจํ‚ท์„ ์ „์†กํ•˜๊ธฐ ์ „์— ๋ฌด์„  ์ฑ„๋„์ด ์‚ฌ์šฉ ์ค‘(Busy)์ธ์ง€ ๋น„์–ด ์žˆ๋Š”์ง€(Idle) ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ฒฝํ•ฉ ์ฐฝ(Contention Window, CW) ๊ด€๋ฆฌ: ์ฑ„๋„์ด ์‚ฌ์šฉ ์ค‘์ด๋ฉด, ์ •ํ•ด์ง„ ๋ฒ”์œ„ ๋‚ด์—์„œ ๋ฌด์ž‘์œ„ ๋Œ€๊ธฐ ์‹œ๊ฐ„(Backoff Time)์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
  3. ์ง€์ˆ˜ ๋ฐฑ์˜คํ”„(Binary Exponential Backoff, BEB): ์ถฉ๋Œ์ด ์—ฐ์†์œผ๋กœ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ๊ฒฝํ•ฉ ์ฐฝ์˜ ํฌ๊ธฐ๋ฅผ 2๋ฐฐ๋กœ ๋Š˜๋ ค ๋„คํŠธ์›Œํฌ ๋ถ€ํ•˜๋ฅผ ๋ถ„์‚ฐ์‹œํ‚ต๋‹ˆ๋‹ค.

2. ๋žœ๋ค ์ง€ํ„ฐ(Random Jitter) ๋„์ž…์˜ ์ค‘์š”์„ฑ

๋ชจ๋“  ESP32 ๋…ธ๋“œ๊ฐ€ ๋™์ผํ•œ ํƒ€์ด๋จธ๋‚˜ ๊ณ ์ • ๊ฐ„๊ฒฉ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋ฉด ๋™๊ธฐํ™”๋œ ์ถฉ๋Œ(Synchronized Collision)์ด ๋ฌดํ•œํžˆ ๋ฐ˜๋ณต๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์†Œ ๋ฐฑ์˜คํ”„ ์‹œ๊ฐ„ ๋’ค์— ๋ฌด์ž‘์œ„ ์ง€ํ„ฐ(Random Jitter)๋ฅผ ๋ฐ˜๋“œ์‹œ ๊ฐ€์‚ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฐฑ์˜คํ”„ ์‹œ๊ฐ„ ๊ณ„์‚ฐ ๊ณต์‹:
Backoff_Time = Base_Slot_Time * Random(0, (2^retries * CW_MIN) - 1) + Jitter

3. CSMA/CA ์ƒํƒœ ๋จธ์‹ (State Machine) ๊ตฌ์กฐ

ESP32์˜ FreeRTOS ํ™˜๊ฒฝ์—์„œ ์ œ์–ดํ•  ์ƒํƒœ ๋จธ์‹ ์€ IDLE, CHANNEL_CHECK, BACKOFF, TRANSMIT, WAIT_ACK ๊ณ„์ธต์œผ๋กœ ๋ถ„๋ฅ˜ํ•˜์—ฌ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.



์‹ค์ „ C++ ์ฝ”๋“œ ๊ตฌํ˜„ ๋ฐ ์„ฑ๋Šฅ ์ตœ์ ํ™” (Troubleshooting)

1. Clear Channel Assessment (CCA) ๋ฐ ๋ฐฑ์˜คํ”„ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„

์•„๋ž˜ ์ฝ”๋“œ๋Š” ESP32 ESP-NOW ํ™˜๊ฒฝ์—์„œ ์†Œํ”„ํŠธ์›จ์–ด ๋ฐฉ์‹์˜ CSMA/CA ๋ฐ ์ง€์ˆ˜ ๋ฐฑ์˜คํ”„ ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

#include <esp_now.h>
#include <WiFi.h>
#include <esp_wifi.h>

#define MAX_RETRIES 5
#define CW_MIN 4
#define CW_MAX 64
#define SLOT_TIME_MS 10

typedef struct {
    uint8_t mac_addr[6];
    uint8_t data[250];
    size_t length;
} esp_now_packet_t;

volatile bool transfer_success = false;
volatile bool ack_received = false;

// ์ „์†ก ์™„๋ฃŒ ์ฝœ๋ฐฑ ํ•จ์ˆ˜
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
    ack_received = true;
    if (status == ESP_NOW_SEND_SUCCESS) {
        transfer_success = true;
    } else {
        transfer_success = false;
    }
}

// ์ฑ„๋„ ์ ์œ  ์—ฌ๋ถ€ ๊ฐ์ง€ (Software Carrier Sense)
bool is_channel_clear() {
    wifi_promiscuous_pkt_cnt_t count;
    // Wi-Fi RSSI ๋ฐ ๋ฌผ๋ฆฌ ์ฑ„๋„ ์ƒํƒœ ์ ๊ฒ€ (๊ฐ€์ƒ CCA ๊ตฌํ˜„)
    wifi_csi_config_t csi_config;
    int16_t rssi = WiFi.RSSI();
    
    // ์ž„๊ณ„๊ฐ’(-80dBm) ์ด์ƒ์ด๋ฉด ์ฑ„๋„์ด ์‚ฌ์šฉ ์ค‘์ธ ๊ฒƒ์œผ๋กœ ํŒ๋‹จ
    if (rssi > -80 && rssi != 0) {
        return false;
    }
    return true;
}

// CSMA/CA ๋ฐฑ์˜คํ”„ ๊ธฐ๋ฐ˜ ESP-NOW ์ „์†ก ํ•จ์ˆ˜
bool send_esp_now_csmaca(const uint8_t *peer_mac, const uint8_t *payload, size_t len) {
    uint8_t retry_count = 0;
    uint16_t cw = CW_MIN;

    while (retry_count < MAX_RETRIES) {
        // 1. Carrier Sensing
        if (is_channel_clear()) {
            ack_received = false;
            transfer_success = false;

            // 2. Transmit Packet
            esp_err_t result = esp_now_send(peer_mac, payload, len);
            
            if (result == ESP_OK) {
                // ์ˆ˜์‹  ์ฝœ๋ฐฑ ๋Œ€๊ธฐ (Timeout: 20ms)
                uint32_t start_time = millis();
                while (!ack_received && (millis() - start_time < 20)) {
                    vTaskDelay(1 / portTICK_PERIOD_MS);
                }

                if (ack_received && transfer_success) {
                    return true; // ์ „์†ก ์„ฑ๊ณต
                }
            }
        }

        // 3. Collision detected or Channel Busy -> Exponential Backoff
        retry_count++;
        cw = (cw * 2 > CW_MAX) ? CW_MAX : cw * 2;
        
        // Random Backoff Time Calculation
        uint32_t random_slots = random(0, cw);
        uint32_t jitter = random(1, 5); // Random Jitter (1~5ms)
        uint32_t backoff_delay = (random_slots * SLOT_TIME_MS) + jitter;

        vTaskDelay(pdMS_TO_TICKS(backoff_delay));
    }

    return false; // ์ตœ์ข… ์ „์†ก ์‹คํŒจ (Drop Packet)
}

2. ํ˜„์—… ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…: ์—ฃ์ง€ ์ผ€์ด์Šค(Edge Cases) ๋Œ€์‘

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„ ํ›„ ์‹ค์ œ ํ˜„์žฅ์— ์ ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ฃผ์š” ์žฅ์•  ์š”์†Œ์™€ ํ•ด๊ฒฐ๋ฒ•์ž…๋‹ˆ๋‹ค.

  • FreeRTOS ํƒœ์Šคํฌ ๊ต์ฐฉ ์ƒํƒœ(Deadlock) ๋ฐฉ์ง€: esp_now_send ์ฝœ๋ฐฑ ๋‚ด๋ถ€์—์„œ ๋ธ”๋กœํ‚น ํ•จ์ˆ˜๋‚˜ ์„ธ๋งˆํฌ์–ด(Semaphore) ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ๋ฌดํ•œ๋Œ€(portMAX_DELAY)๋กœ ์„ค์ •ํ•˜๋ฉด ์‹œ์Šคํ…œ ์ „์ฒด๊ฐ€ ๋ฉˆ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋“œ์‹œ ํƒ€์ž„์•„์›ƒ์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ(Queue Overflow): ์—ฐ์†์ ์ธ ๋ฐฑ์˜คํ”„๋กœ ์ธํ•ด ์ „์†ก์ด ์ง€์—ฐ๋˜๋ฉด ์†ก์‹  ํ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์Œ“์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ(OOM) ํ˜„์ƒ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. Ring Buffer ๋˜๋Š” Priority Queue ๊ตฌ์กฐ๋ฅผ ๋„์ž…ํ•˜์—ฌ ์˜ค๋ž˜๋œ ํŒจํ‚ท์„ ๋ฒ„๋ฆฌ๋Š”(Drop) ์ •์ฑ…์„ ์ˆ˜๋ฆฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Wi-Fi ์ฑ„๋„ ๊ณ ์ •(Channel Locking): ESP-NOW๋Š” AP ๋ชจ๋“œ๋‚˜ STA ๋ชจ๋“œ์˜ ์ฑ„๋„ ๋ณ€๊ฒฝ ์‹œ ๋™์ž‘์ด ๋ถˆ์•ˆ์ •ํ•ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋ชจ๋“  ๋…ธ๋“œ์˜ Wi-Fi ์ฑ„๋„์„ ์ˆ˜๋™(e.g., Channel 6)์œผ๋กœ ๊ณ ์ •ํ•˜์—ฌ ์ฑ„๋„ ์Šค์บ๋‹ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์„ฑ๋Šฅ ์ธก์ • ๋ฐ ๋ฒค์น˜๋งˆํฌ ๊ฒฐ๊ณผ ๋น„๊ต

1. ์ˆ˜์‹  ์„ฑ๊ณต๋ฅ (PDR) ๋ฐ ์ง€์—ฐ ์‹œ๊ฐ„(Latency) ๊ฐœ์„  ๊ฒฐ๊ณผ

๋…ธ๋“œ 30๊ฐœ๊ฐ€ ๋™์ผ ๊ตฌ์—ญ ๋‚ด์—์„œ 100ms ๊ฐ„๊ฒฉ์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•˜๋Š” ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜์—ฌ ์ผ๋ฐ˜ ESP-NOW ์ „์†ก ๋ฐฉ์‹๊ณผ ์†Œํ”„ํŠธ์›จ์–ด CSMA/CA ์ตœ์ ํ™” ๋ฐฉ์‹์„ ๋น„๊ต ์ธก์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ง€ํ‘œ (Metric) ๊ธฐ์กด ESP-NOW ์ „์†ก CSMA/CA ๋ฐฑ์˜คํ”„ ์ ์šฉ ํ›„
ํŒจํ‚ท ์ „๋‹ฌ๋ฅ  (PDR) 62.4% 96.8%
ํ‰๊ท  ํŒจํ‚ท ์œ ์‹ค๋ฅ  37.6% 3.2%
ํ‰๊ท  ์ „์†ก ์ง€์—ฐ์‹œ๊ฐ„ 4.2 ms (์ถฉ๋Œ ์‹œ ์œ ์‹ค) 18.5 ms (๋Œ€๊ธฐ์‹œ๊ฐ„ ํฌํ•จ)

์†Œํ”„ํŠธ์›จ์–ด CSMA/CA ๋ฐฉ์‹์„ ์ ์šฉํ–ˆ์„ ๋•Œ ํ‰๊ท  ์ง€์—ฐ ์‹œ๊ฐ„(Latency)์€ ์†Œํญ ์ฆ๊ฐ€ํ–ˆ์ง€๋งŒ, **ํŒจํ‚ท ์ „๋‹ฌ๋ฅ (Packet Delivery Ratio, PDR)**์ด 62.4%์—์„œ **96.8%**๋กœ ๋Œ€ํญ ์ƒ์Šนํ•˜์—ฌ ๋„คํŠธ์›Œํฌ ์‹ ๋ขฐ์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.

2. ๋…ธ๋“œ ๊ทœ๋ชจ๋ณ„ ํŒŒ๋ผ๋ฏธํ„ฐ ํŠœ๋‹ ๊ฐ€์ด๋“œ

  • ์†Œ๊ทœ๋ชจ ๋…ธ๋“œ (10๊ฐœ ๋ฏธ๋งŒ): CW_MIN = 2, CW_MAX = 16, SLOT_TIME = 5ms ๋กœ ์„ค์ •ํ•˜์—ฌ ์ „์†ก ์ง€์—ฐ ๋‹จ์ถ•.
  • ๋Œ€๊ทœ๋ชจ ๋…ธ๋“œ (30๊ฐœ ์ด์ƒ): CW_MIN = 8, CW_MAX = 128, SLOT_TIME = 10ms ๋กœ ์„ค์ •ํ•˜์—ฌ ๋งค์ฒด ๊ฒฝํ•ฉ ์™„ํ™”.


๊ฒฐ๋ก  ๋ฐ ํ˜„์—… ์ ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ

ESP32 ๊ธฐ๋ฐ˜์˜ ESP-NOW๋Š” ์ดˆ์ €์ „๋ ฅ, ์ดˆ๊ณ ์† ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•œ ๊ฐ•๋ ฅํ•œ ๋ฌด์„  ํ†ต์‹  ๊ธฐ์ˆ ์ด์ง€๋งŒ, ๋…ธ๋“œ ์ˆ˜ ์ฆ๊ฐ€ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌด์„  ํŒจํ‚ท ์ถฉ๋Œ์„ ์ œ์–ดํ•˜์ง€ ๋ชปํ•˜๋ฉด ๋Œ€๊ทœ๋ชจ ์‚ฌ๋ฌผ์ธํ„ฐ๋„ท(IoT) ์‹œ์Šคํ…œ ๊ตฌ์ถ•์— ํ•œ๊ณ„๊ฐ€ ๋“œ๋Ÿฌ๋‚ฉ๋‹ˆ๋‹ค.

๋ณธ ๊ฐ€์ด๋“œ์—์„œ ๋‹ค๋ฃฌ ์†Œํ”„ํŠธ์›จ์–ด CSMA/CA ๋ฐฑ์˜คํ”„ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์ง€ํ„ฐ ์ œ์–ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ ์šฉํ•˜๋ฉด, ๋ณ„๋„์˜ ์ถ”๊ฐ€ ํ•˜๋“œ์›จ์–ด ์—†์ด ์†Œํ”„ํŠธ์›จ์–ด ์ตœ์ ํ™”๋งŒ์œผ๋กœ๋„ ์‚ฐ์—…์šฉ ํ˜„์žฅ์— ์ ํ•ฉํ•œ ๊ณ ์‹ ๋ขฐ์„ฑ ๋‹ค์ค‘ ๋…ธ๋“œ ๋ฌด์„  ์„ผ์„œ ๋„คํŠธ์›Œํฌ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•