[16]ESP32 Wi-Fi 使用备忘录(基于 ESP-IDF v4.0+)

文章更新版本 时间 更新说明 修订人
V0.1 发布于2020-04-25 初始版本 libo
V0.2 发布于2020-04-27 添加注意事项,添加不同版本 Wi-Fi 库差异 libo

一、Wi-Fi 性能

ESP32 Wi-Fi 性能

项目 参数
Mode Station, AP, Coexistence
Protocol IEEE-802.11B, IEEE-802.11G, IEEE802.11N ,802.11 LR(乐鑫) 支持软件切换
Safety WPA/WPA2/WPA2-Enterprise and WPS
Keyfeature AMPDU, HT40, QoS
Distance 1 km with Espressif-specific protocol
Speed 20 MBit/sec TCP throughput, 30 MBit/sec UDP

ESP32-S2 Wi-Fi Throughput:https://docs.espressif.com/projects/esp-idf/en/latest/esp32s2/api-guides/wifi.html#esp32-s2-wi-fi-throughput

其它参数:https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/wifi.html#esp32-wi-fi-feature-list

ESP32-S2 Wi-Fi 性能(需要验证和补充)

项目 参数
Mode Station, AP, Coexistence
Protocol IEEE-802.11B, IEEE-802.11G, IEEE802.11N 支持软件切换
Safety WPA/WPA2/WPA2-Enterprise and WPS
Keyfeature AMPDU, HT40, QoS
Distance 1 km with Espressif-specific protocol
Speed 20 MBit/sec TCP throughput, 30 MBit/sec UDP

其他参数:https://docs.espressif.com/projects/esp-idf/en/latest/esp32s2/api-guides/wifi.html#esp32-s2-wi-fi-feature-list

二、Wi-Fi 编程框架

Wi-Fi Programming Model

  1. 应用层调用 Wi-Fi driver APIs 进行 Wi-Fi 初始化。
  2. Wi-Fi 可被看成一个独立工作的黑箱,当事件发生时向默认事件循环 default event loop
    发布event,应用程序可根据需求编写handle程序,进行注册。
  3. 网络接口组件 esp_netif 提供了一系列handle程序,与WiFi驱动event默认关联,例如 ESP32 作为 AP,当有用户接入时,esp_netif 将自动启动 DHCP 服务。

注意:Wi-Fi 初始化之前应该使用WIFI_INIT_CONFIG_DEFAULT获取初始化配置结构体,对该结构体进行个性化配置,然后进行初始化工作。防止结构体成员未初始化导致的问题,特别是 IDF 更新添加了新的结构体成员的时候。

2.1 一般使用过程

Sample Wi-Fi Event Scenarios in Station Mode

Sample Wi-Fi Event Scenarios in Station Mode

Sample Wi-Fi Event Scenarios in AP Mode

Sample Wi-Fi Event Scenarios in AP Mode

2.2 menuconfig 可配置项

  1. 修改 Wi-Fi Buffer 以节约空间
    Wi-Fi初始化之后,会静态分配一部分内存空间,如果用户对内存比较敏感,可以通过减小Static RX Buffer节约最大6400 Bytes 空间,通过将Static TX Buffer修改为Dynamic TX Buffer节约 (16 * 1600-32)Bytes左右空间。具体可参考:Wi-Fi Buffer Configure

  2. 将 WiFi 配置信息保持到 NVS 中
    通过使能 Wi-Fi NVS Flash,Wi-Fi 驱动将会保存配置信息到 NVS 中,下次启动可以跳过 WiFi配置阶段。用户也可关闭该选项,自行保存配置信息。

  3. 开启 AMPDU 提高网络吞吐量
    AMPDU默认开启。 802.11n标准中采用A-MPDU聚合帧格式,即将多个MPDU聚合为一个A-MPDU,只保留一个PHY头,删除其余MPDU的PHY头,减少了传输每个MPDU的PHY头的附加信息,同时也减少了ACK帧的数目,从而降低了协议的负荷,有效的提高网络吞吐量。

802.11n协议定义了一个新的MAC特性A-MSDU,该特性实现了将多个MSDU组合成一个MSDU发送,与A-MPDU类似,通过聚合,A-MSDU减少了传输每个MSDU的MAC头的附加信息,提高了MAC层的传输效率。802.11n支持在物理层的优化,提供短间隔功能。原11a/g的GI时长800us,而短间隔Short GI时长为400us,在使用Short GI的情况下,可提高10%的速率。ESP32-S2 supports receiving AMSDU but doesn’t support transmitting AMSDU. The transmitting AMSDU is not necessary since ESP32-S2 has transmitting AMPDU.

三、Wi-Fi 调试

3.1 提升信号质量

  1. 将默认 HT40 修改为固定 HT20,可减少外界干扰,但理论传输率从 150Mbps 下降为 72Mbps(raw PHY data rate)。

3.2 Wireshark 网络分析工具

Espressif Wireshark User Guide

3.3 错误码监测

错误码定义在 esp_err.h 文件中

ESP-IDF 提供了默认的错误码监测宏 ESP_ERROR_CHECK 可用于监测错误位置和信息,但是建议用户自定义监测宏,用于实现错误信息的自动化处理。

错误类型 处理方法
ESP_OK 下一步

四、不同版本 Wi-Fi 库差异

4.1 事件命名不同

所有的事件名称都发生了变化,主要是将SYSTEM_EVENT_XXX_YYY对应改为了WIFI_EVENT_XXX_YYYIP_EVENT_XXX_YYY

v3.3 v4.0+ 备注
SYSTEM_EVENT_WIFI_READY WIFI_EVENT_WIFI_READY v4.0 版本该事件不会触发
SYSTEM_EVENT_SCAN_DONE WIFI_EVENT_SCAN_DONE
SYSTEM_EVENT_XXX_YYY WIFI_EVENT_XXX_YYY
SYSTEM_EVENT_STA_GOT_IP IP_EVENT_STA_GOT_IP
SYSTEM_EVENT_AP_STA_GOT_IP6 IP_EVENT_GOT_IP6
SYSTEM_EVENT_STA_LOST_IP IP_EVENT_STA_LOST_IP 官方文档有误?

4.2 函数接口定义不同

v3.3 v4.0+ 备注
tcpip_adapter_init() esp_netif_init() 创建并初始化 LwIP 线程
esp_event_loop_init() esp_event_loop_init() 创建系统事件循环线程,注册事件回调函数
esp_netif_create_default_wifi_ap(), esp_netif_create_default_wifi_sta() 创建默认网络接口,并与 TCP/IP 协议栈绑定
esp_wifi_init() esp_wifi_init() 创建并初始化 Wi-Fi 驱动线程

五、注意事项

  1. 初始化流程并不是固定,但是应尽量遵守 General Scenario
  2. WiFi 的配置工作,尽量在 WiFi 连接之前完成,中途对 WiFi 进行配置,将触发 WiFi 重新连接。
  3. WiFi station 模式获取 IP 的过程将花费一些时间,请勿在IP_EVENT_STA_GOT_IP触发之前开始套接字相关工作。
  4. 如果 AP 关闭或 RSSI 弱,WIFI_EVENT_STA_DISCONNECTED 会被触发,之后 LwIP 线程将断开和清除 UDP/TCP 连接,之后套接字相关函数将返回错误码,注意错误监测
  5. 如果 IP 地址改变,IP_EVENT_STA_GOT_IP 会被触发同时 ip_change 为真,如果收到这样的事件,需要关闭所有已经创建的套接字,重新进行创建
  6. 长距离模式,需要两端均支持乐鑫 802.11LR,该模式相比 802.11 B 有 4 dB增益提升,原理上传输距离是 802.11 B 的 2-2.5 倍,但是该模式吞吐量很有限为 1/2 Mbits

猜你喜欢

转载自blog.csdn.net/qq_20515461/article/details/105711981