簡體   English   中英

使用 esp32 接入點流式傳輸 UDP 數據包會導致大量數據包丟失

[英]streaming UDP packets with esp32 access point cause massive packet loss

我目前正在將我的 esp32 wroom 作為接入點運行到 stream UDP 個數據包(每秒約 100 個數據包,每個數據包 1Ko)到不同的智能手機。 在近距離,我以穩定的速度丟失了大約 30% 的數據包。 使用 UDP 協議丟失數據包並不罕見,但是這個問題只發生在一些特定的和相當新的智能手機上。 在 Wireshark 對 Wifi 消息進行一些調查之后,我發現這種數據包丟失僅發生在使用 IEEE 802.11 節能機制的智能手機上。 在 ESP 32 配置中有很多關於省電模式的選項,我懷疑我可能錯誤配置了 ESP32。

您知道可能導致問題的原因嗎?

謝謝

我正在與您分享 ESP32 配置:

#
# Wi-Fi
#

CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=16
CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=64
CONFIG_ESP32_WIFI_STATIC_TX_BUFFER=y
# CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER is not set
CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=0
CONFIG_ESP32_WIFI_STATIC_TX_BUFFER_NUM=32
# CONFIG_ESP32_WIFI_CSI_ENABLED is not set
CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y
CONFIG_ESP32_WIFI_TX_BA_WIN=32
CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y
CONFIG_ESP32_WIFI_RX_BA_WIN=32
CONFIG_ESP32_WIFI_NVS_ENABLED=y
CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0=y
# CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1 is not set
CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752
CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32
# CONFIG_ESP32_WIFI_DEBUG_LOG_ENABLE is not set
CONFIG_ESP32_WIFI_IRAM_OPT=y
CONFIG_ESP32_WIFI_RX_IRAM_OPT=y
CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE=y
# CONFIG_ESP_WIFI_SLP_IRAM_OPT is not set
# CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE is not set
# end of Wi-Fi

查看接入點初始化代碼:

esp_err_t COM_wifi_access_point_start(void) 
    {    
    esp_err_t esp_err;
    
    do  {
        
        // Initialization of the physical WiFi port
        tcpip_adapter_init();

        // Shutdown of the DHCP server before reprogramming the IP address of the probe
        BREAK_ON_ERR( esp_err = tcpip_adapter_dhcps_stop(TCPIP_ADAPTER_IF_AP) );

        // Initialization of the structure containing the IP address of the probe
        tcpip_adapter_ip_info_t ip_info;
        IP4_ADDR(&ip_info.ip,EPF_IPV4_IP_ADDR_1,EPF_IPV4_IP_ADDR_2,EPF_IPV4_IP_ADDR_3,EPF_IPV4_IP_ADDR_4);
        IP4_ADDR(&ip_info.gw,EPF_IPV4_GW_ADDR_1,EPF_IPV4_GW_ADDR_2,EPF_IPV4_GW_ADDR_3,EPF_IPV4_GW_ADDR_4);
        IP4_ADDR(&ip_info.netmask,EPF_IPV4_NM_ADDR_1,EPF_IPV4_NM_ADDR_2,EPF_IPV4_NM_ADDR_3,EPF_IPV4_NM_ADDR_4);

        // The new IP address is applied
        BREAK_ON_ERR( esp_err = tcpip_adapter_set_ip_info(TCPIP_ADAPTER_IF_AP, &ip_info) );

        // Restarting the DHCP server
        BREAK_ON_ERR( esp_err = tcpip_adapter_dhcps_start(TCPIP_ADAPTER_IF_AP) );

        // Connecting the IT WiFi handler
        BREAK_ON_ERR( esp_err = esp_event_loop_init(wifi_event_handler, NULL) );

        // Initialization of the WiFi driver to the default configuration
        wifi_init_config_t wifi_init_config = WIFI_INIT_CONFIG_DEFAULT();
        BREAK_ON_ERR( esp_err = esp_wifi_init(&wifi_init_config) );

        // The driver is told to store all WiFi configuration in RAM
        // => We don't always write the configuration in flash each time
        BREAK_ON_ERR( esp_err = esp_wifi_set_storage(WIFI_STORAGE_RAM) );

        // Switching from the default connection mode to Access Point mode
        BREAK_ON_ERR( esp_err = esp_wifi_set_mode(WIFI_MODE_AP) );

        // The desired configuration is applied to the WiFi driver
        wifi_config_t ap_config =
            {
            .ap =
                {
                .ssid           = "",
                .channel        = EPF_WIFI_CHANNEL_NUMBER,
                .password       = EPF_WIFI_PASSWORD,
                .authmode       = WIFI_AUTH_WPA_WPA2_PSK,
                .ssid_hidden    = COM_WIFI_BROADCAST,                               // SSID in broadcast mode => Non-hidden network
                .max_connection = EPF_WIFI_NB_CONNECTION,                           // Only one connection allowed simultaneously
                .beacon_interval= COM_WIFI_BEACON_INT
                }
            };
        sprintf((char*)ap_config.ap.ssid, EPF_WIFI_SSID_TMPL, PAR_get_live_raw_fast(EPF_MAI_PROBE_SERIAL_NB) );
        
        BREAK_ON_ERR( esp_err = esp_wifi_set_config(WIFI_IF_AP, &ap_config) );

        // Starting WiFi
        // After calling this function, the access point is visible from remote WiFi devices
        BREAK_ON_ERR( esp_err = esp_wifi_start() );

        // Renaming the hostname
        BREAK_ON_ERR( esp_err = tcpip_adapter_set_hostname(TCPIP_ADAPTER_IF_AP, COM_LOCALHOSTNAME) );
        
        esp_err = ESP_OK;
        
        } while(0);

    return esp_err;
    }

ESP32-s WiFi 省電功能默認開啟。 您可以通過調用esp_wifi_set_ps(WIFI_PS_NONE); - 看看它是否適合你。 在我看到負載下有明顯的 ICMP 數據包丟失后,我不得不將其關閉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM