只让esp32-c3选信号最强的连接,写一个这样的算法

实战派 ESP32-S3,双模无线开发板

ESP32-S3 原生支持 ESP-IDF,WiFi + 蓝牙一次搞定

下面是一段基于 ESP-IDF 的核心示例,演示如何让 ESP32-C3 扫描所有可见 Wi-Fi 热点,挑选 RSSI(信号强度)最大的那个进行连接:

#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "nvs_flash.h"

static const char *TAG = "best_ap";

static void wifi_event_handler(void* arg, esp_event_base_t event_base,
                               int32_t event_id, void* event_data)
{
    if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
        // 启动后立即开始扫描
        ESP_ERROR_CHECK( esp_wifi_scan_start(NULL, false) );
    } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_SCAN_DONE) {
        uint16_t ap_num = 0;
        ESP_ERROR_CHECK( esp_wifi_scan_get_ap_num(&ap_num) );
        if (ap_num == 0) {
            ESP_LOGW(TAG, "没有扫描到任何 AP");
            return;
        }

        wifi_ap_record_t *ap_list = malloc(sizeof(wifi_ap_record_t) * ap_num);
        ESP_ERROR_CHECK( esp_wifi_scan_get_ap_records(&ap_num, ap_list) );

        // 找出 RSSI 最大的 AP
        wifi_ap_record_t *best = &ap_list[0];
        for (int i = 1; i < ap_num; i++) {
            if (ap_list[i].rssi > best->rssi) {
                best = &ap_list[i];
            }
        }
        ESP_LOGI(TAG, "最佳 AP: SSID=%s, RSSI=%d", best->ssid, best->rssi);

        // 配置并连接
        wifi_config_t cfg = { 0 };
        memcpy(cfg.sta.ssid, best->ssid, sizeof(best->ssid));
        // 如果已知密码,可拷贝到 cfg.sta.password
        // memcpy(cfg.sta.password, best->password, sizeof(best->password));

        ESP_ERROR_CHECK( esp_wifi_set_config(WIFI_IF_STA, &cfg) );
        ESP_ERROR_CHECK( esp_wifi_connect() );

        free(ap_list);
    } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_CONNECTED) {
        ESP_LOGI(TAG, "已连接到最佳 AP");
    } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {
        ESP_LOGW(TAG, "连接断开,重新开始扫描");
        ESP_ERROR_CHECK( esp_wifi_scan_start(NULL, false) );
    }
}

void app_main(void)
{
    // 1. 初始化 NVS、TCP/IP、事件循环
    ESP_ERROR_CHECK( nvs_flash_init() );
    ESP_ERROR_CHECK( esp_netif_init() );
    ESP_ERROR_CHECK( esp_event_loop_create_default() );

    // 2. 创建默认 STA 网口
    esp_netif_create_default_wifi_sta();

    // 3. 初始化 WiFi 驱动
    wifi_init_config_t init_cfg = WIFI_INIT_CONFIG_DEFAULT();
    ESP_ERROR_CHECK( esp_wifi_init(&init_cfg) );

    // 4. 注册事件处理
    esp_event_handler_instance_t inst;
    ESP_ERROR_CHECK( esp_event_handler_instance_register(WIFI_EVENT,
                                                        ESP_EVENT_ANY_ID,
                                                        &wifi_event_handler,
                                                        NULL,
                                                        &inst) );

    // 5. 设置为 STA 模式并启动
    ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) );
    ESP_ERROR_CHECK( esp_wifi_start() );

    ESP_LOGI(TAG, "开始扫描并连接信号最强的 AP");
}

说明:

  1. 启动后在 WIFI_EVENT_STA_START 回调中调用 esp_wifi_scan_start() 开始一次主动扫描。

  2. WIFI_EVENT_SCAN_DONE 回调里用 esp_wifi_scan_get_ap_records() 获取所有 AP 记录,遍历比较 rssi 字段,选出最大值。

  3. 将最佳 AP 的 SSID 填入 wifi_config_t.sta.ssid,然后 esp_wifi_connect() 发起连接。

  4. 断线后(WIFI_EVENT_STA_DISCONNECTED),自动重新扫描,继续挑最强信号连接。

这样就能让 ESP32-C3 始终选择信号最强的网络进行连接。

实战派 ESP32-S3,双模无线开发板

ESP32-S3 原生支持 ESP-IDF,WiFi + 蓝牙一次搞定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值