文章更新版本 | 时间 | 更新说明 | 修订人 |
---|---|---|---|
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
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 |
二、Wi-Fi 编程框架
- 应用层调用 Wi-Fi driver APIs 进行 Wi-Fi 初始化。
- Wi-Fi 可被看成一个独立工作的黑箱,当事件发生时向默认事件循环 default event loop
发布event
,应用程序可根据需求编写handle
程序,进行注册。 - 网络接口组件 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 AP Mode
2.2 menuconfig 可配置项
-
修改 Wi-Fi Buffer 以节约空间
Wi-Fi初始化之后,会静态分配一部分内存空间,如果用户对内存比较敏感,可以通过减小Static RX Buffer
节约最大6400 Bytes 空间,通过将Static TX Buffer
修改为Dynamic TX Buffer
节约 (16 * 1600-32)Bytes左右空间。具体可参考:Wi-Fi Buffer Configure -
将 WiFi 配置信息保持到 NVS 中
通过使能 Wi-Fi NVS Flash,Wi-Fi 驱动将会保存配置信息到 NVS 中,下次启动可以跳过 WiFi配置阶段。用户也可关闭该选项,自行保存配置信息。 -
开启 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 提升信号质量
- 将默认 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_YYY
或IP_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 驱动线程 |
五、注意事项
- 初始化流程并不是固定,但是应尽量遵守 General Scenario。
- WiFi 的配置工作,尽量在 WiFi 连接之前完成,中途对 WiFi 进行配置,将触发 WiFi 重新连接。
- WiFi station 模式获取 IP 的过程将花费一些时间,请勿在
IP_EVENT_STA_GOT_IP
触发之前开始套接字相关工作。 - 如果 AP 关闭或 RSSI 弱,
WIFI_EVENT_STA_DISCONNECTED
会被触发,之后 LwIP 线程将断开和清除 UDP/TCP 连接,之后套接字相关函数将返回错误码,注意错误监测。 - 如果 IP 地址改变,
IP_EVENT_STA_GOT_IP
会被触发同时ip_change
为真,如果收到这样的事件,需要关闭所有已经创建的套接字,重新进行创建。 - 长距离模式,需要两端均支持乐鑫 802.11LR,该模式相比 802.11 B 有 4 dB增益提升,原理上传输距离是 802.11 B 的 2-2.5 倍,但是该模式吞吐量很有限为 1/2 Mbits