ESP32无线芯片模组方案——Wi-Fi常用调试API

Wi-Fi常用调试API

在使用 esp32 调试 Wi-Fi 功能时,由于场景和各种因素的影响,难免会遇到各种连接不上,Wi-Fi断连等问题。

下面介绍一些 API,方便新手调试 Wi-Fi 时更好的定位并解决问题。

常见问题

1、ESP32 进行 Wi-Fi 连接时,如何判断失败原因?

在ESP-IDF 4.0以上的版本,可以在 Wi-Fi 断连事件处理中加入以下代码,从而通过错误码来判断连接失败的原因。

if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {
 	wifi_event_sta_disconnected_t* disconnected = (wifi_event_sta_disconnected_t*) event_data;
 	ESP_LOGE(TAG, "Disconnect reason : %d", disconnected->reason);
	……
    ……
}

当回调函数接收到 WIFI_EVENT_STA_DISCONNECTED 事件时,可以通过结构体 wifi_event_sta_disconnected_t 的变量 reason 获取到失败原因。

常见的错误码

原因代码 问题描述 可能原因
NO_AP_FOUND 201 station 未扫描到目标 AP 目标 AP rssi 值过低 或 STA 连接的 SSID 不正确
4WAY_HANDSHAKE_TIMEOUT 15 四次握手超时 STA 在连接加密的 AP 的时候输入了错误的密码
CONNECTION_FAIL 205 AP 连接失败 STA 扫描到了匹配的 AP,但是这个 AP 在黑名单里。AP 在黑名单里面的原因是上次 AP 主动踢掉了 STA,或者 STA 连接 AP 的过程中失败了

完整的错误码请参考[这里](Wi-Fi 驱动程序 - ESP32 - — ESP-IDF 编程指南 latest 文档)。

2、Wi-Fi 在断连后如何自动重连?

在收到 WIFI_EVENT_STA_DISCONNECTED 事件时,调用 esp_wifi_connect API,具体代码如下

if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {
	……
	……
	esp_wifi_connect(); 
}

3、ESP32 Wi-Fi 发射功率最高值是多少?如何调整 Wi-Fi 的发射功率?

ESP32 的 Wi-Fi 功率输出最高可以配置为 20 dBm。高功率输出会对电池寿命和 Wi-Fi 信号稳定性产生影响,因此在选择功率输出水平时,需要根据具体的应用场景和要求进行权衡和选择。

可通过 menuconfig 配置中,改变 ESP_PHY_MAX_WIFI_TX_POWER 的值来调整发射功率,配置项如下

Component config > PHY > Max Wi-Fi TX power(dBm)   //最大是 20 dBm

或者在代码中调用 esp_wifi_set_max_tx_power() 这个 API 来设置调整。

4、连接 Wi-Fi,打印 bcn_timeout, ap_probe_send_start 是什么情况?

默认设置下,ESP32 默认六秒未收到 AP 的 beacon 帧,就会提示 bcn_timeout。造成这个问题的原因有可能会有以下几点

  • 内存资源不足。ESP32_WIFI_MGMT_SBUF_NUM 不够 (log 中会打出 “esf_buf: t=8, l=beacon_len, …” 这样的 Error)。如果内存不够,可在收到 disconnect event 时打出 heap 大小来排查。
  • AP 未发出 beacon 帧。可通过抓包 AP 的 beacon 帧来排查。
  • AP Rssi 值太低。在复杂环境下 Rssi 值较低时,可能导致 STA 收不到 beacon帧,可通过调用 [esp_wifi_sta_get_ap_info()](Wi-Fi 库 - ESP32 - — ESP-IDF 编程指南 v5.2.3 文档) 获取 Rssi 值来排查。
  • 硬件原因。收包性能太差。

注意:在出现 bcn_timeout 时,STA 会尝试发送 5 次 Probe Request,如果 AP 回 Probe Reponse,就保持连接;如果 AP 未回复,STA 发送 Disconnect 事件,并断开连接。

5、如果环境中存在多个相同 ssid/password 时,能否默认选择信号最好的 AP 连接?

默认 ESP32 会连接扫描到的第一个符合的 AP,并不会自动选择信号值最强的 AP。如果要连接最佳 AP,需要在配置 station 时,添加信号强度优先配置,具体配置代码如下:

wifi_config_t wifi_config = {
 .sta = {
 .ssid = ……
 .password = ……
 .scan_method = WIFI_ALL_CHANNEL_SCAN,  	//全频道扫描,扫描所有频道后结束扫描
 .sort_method = WIFI_CONNECT_AP_BY_SIGNAL,	//按 RSSI值 对扫描列表中的匹配接入点进行排序
 .threshold.rssi = -90,   					//信号值低于-90不连接
 	},
 };

你可能感兴趣的:(乐鑫方案,网络,物联网,智能家居)