下面是一段基于 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");
}
说明:
-
启动后在
WIFI_EVENT_STA_START回调中调用esp_wifi_scan_start()开始一次主动扫描。 -
在
WIFI_EVENT_SCAN_DONE回调里用esp_wifi_scan_get_ap_records()获取所有 AP 记录,遍历比较rssi字段,选出最大值。 -
将最佳 AP 的 SSID 填入
wifi_config_t.sta.ssid,然后esp_wifi_connect()发起连接。 -
断线后(
WIFI_EVENT_STA_DISCONNECTED),自动重新扫描,继续挑最强信号连接。
这样就能让 ESP32-C3 始终选择信号最强的网络进行连接。

6063

被折叠的 条评论
为什么被折叠?



