是的,這會導致“怎么都連不上”。結論先說:
如果路由器把 5 GHz 固定在 40 MHz(或以上)帶寬,而你的 C5 只支持 5 GHz 的 20 MHz 帶寬,那么 STA 連接一定會失敗。固件里不可能“把 40 MHz AP 連成 20 MHz”,只能兩種思路:
1)讓路由器把 5 GHz 調到 20 MHz / “20/40 自動”;或
2)設備在配網階段只允許 2.4 GHz,避免用戶選中不兼容的 5 GHz SSID。
下面給你幾處“硬防呆”改法,選其一或全部上:
方案 A:配網期強制 2.4 GHz(推薦)
在進入配網/嘗試連接前加一行(配網完成再恢復為 DUAL):
// 進入配網時:
esp_wifi_set_band_mode(WIFI_BAND_MODE_2G_ONLY);// 配網成功后(要連回你實際想要的配置時):
esp_wifi_set_band_mode(WIFI_BAND_MODE_DUAL); // 或你需要的模式
這樣用戶就看不到 5 GHz 的 SSID(或看到了也不會去連),徹底規避 5 GHz 40 MHz 的坑。
方案 B:始終把 STA 側帶寬鎖定到 20 MHz
這行只限制本機帶寬,不會把 AP 的 40 MHz 變成 20 MHz(AP 固定 40 MHz 仍然會失敗),但能避免某些 AP 在 2.4 GHz 下嘗試 40 MHz 時造成的不兼容:
// 配置 STA 前/后均可
esp_wifi_set_bandwidth(WIFI_IF_STA, WIFI_BW_HT20);
方案 C:掃描結果里“識別并屏蔽不兼容的 5G@40MHz”
IDF v5 的 wifi_ap_record_t
里有 band
與 second
字段(副信道)。5 GHz 且 second ≠ NONE 基本就是 40 MHz。你可以在 AP/BLUFi 的“可選網絡”里直接做灰/隱藏,并在 Web/APP 上給出提示。
// 掃描后過濾
uint16_t ap_num = 0;
esp_wifi_scan_get_ap_num(&ap_num);
std::vector<wifi_ap_record_t> recs(ap_num);
esp_wifi_scan_get_ap_records(&ap_num, recs.data());for (auto &r : recs) {bool is_5g = (r.band == WIFI_BAND_5G); // 僅 v5+bool is_40m = (r.second != WIFI_SECOND_CHAN_NONE); // 有副信道 => 40MHzif (is_5g && is_40m) {// 標記為不兼容 / 不加入候選列表// (也可在 JSON 里帶 flag 給前端顯示“僅支持 20MHz”)continue;}// …正常加入候選
}
如果你的 IDF 版本沒有
band/second
,可以用primary
信道范圍粗判 5 GHz(36–165),副信道無法直接拿到,那就退而求其次:發現 5 GHz 就提示只支持 20 MHz。
方案 D:連接失敗時給出“可理解”的錯誤提示
在 WIFI_EVENT_STA_DISCONNECTED
里判斷原因,若是連接/關聯失敗并且目標是 5 GHz,可以提示“請把路由器 5G 帶寬改為 20 MHz,或使用 2.4 GHz”。
else if (event_id == WIFI_EVENT_STA_DISCONNECTED) {wifi_event_sta_disconnected_t *e = (wifi_event_sta_disconnected_t*)event_data;ESP_LOGW(TAG, "Disconnected, reason=%d", e->reason);// 這里可記錄上次嘗試連接的 BSS 頻段(在掃描/選擇時保存),若判定為 5GHz 則提示帶寬問題
}
放在你項目中的位置建議
你目前在
WifiConfigurationAp::StartAccessPoint()
里已經做了:#ifdef CONFIG_SOC_WIFI_SUPPORT_5G esp_wifi_set_band_mode(WIFI_BAND_MODE_2G_ONLY); #endif
把這段提前到“進入配網模式”更合適(AP + BLUFi 全程 2.4 GHz),配網成功再恢復為
DUAL
。在
ConnectToWifi()
里連接之前加:esp_wifi_set_bandwidth(WIFI_IF_STA, WIFI_BW_HT20);
(無害,2.4 G 下一般更穩)
在 Web 配網/BLUFi 返回的 AP 列表里做一次過濾/打標(方案 C)。
實際用戶操作的兜底話術(出廠提示)
“設備僅支持 5 GHz 20 MHz 帶寬。如果您的 5 GHz 路由器帶寬固定在 40/80/160 MHz,請在路由器中將 5 GHz 帶寬設置為 20 MHz 或 20/40 自動,或改用 2.4 GHz 進行連接。”
這樣做之后,配網時就不會再撞上“5 G 40 MHz”的坑了。需要我直接把上述改動 patch 到你現有 WifiConfigurationAp
/ BLUFi 列表輸出里嗎?