C5仅支持20MHZ带宽,如果路由器5Gwifi处于40MHZ带宽信道时,会出现配网失败

发布于:2025-08-30 ⋅ 阅读:(19) ⋅ 点赞:(0)

是的,这会导致“怎么都连不上”。结论先说:

如果路由器把 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 里有 bandsecond 字段(副信道)。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); // 有副信道 => 40MHz

    if (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 列表输出里吗?