ESP-C3 是一种小型,低功耗的 Wi-Fi 模块,具有集成的 TCP/IP 协议栈,可以方便地与其他电子设备进行连接。它的 Wi-Fi 功能是通过芯片内部的 ESP32 控制器来实现的。
ESP-C3 可以用作一个独立的 Wi-Fi 芯片,也可以嵌入到其他电子设备中,以实现远程控制和数据采集等功能。
ESP-C3支持两种操作模式:
- 热点模式(AP)
- 客户端模式(STA)
在 AP 模式下,ESP-C3 可以当作一个无线路由器,允许其他设备连接到它;
而在 STA 模式下,ESP-C3 可以连接到其他的 Wi-Fi 热点。
整体流程示意图:
二、ESP-C3 扫描WiFi操作的流程1. 初始化 NVS 模块nvs_flash_init首先,通过调用 nvs_flash_init 函数初始化 NVS 模块。
2. 初始化网络接口模块esp_netif_init通过调用 esp_netif_init() 函数初始化网络接口模块。
该函数主要负责初始化网络接口模块的基本框架和配置。在初始化完成后,程序就可以通过网络接口模块实现对网络连接的控制和管理。
通过调用 esp_event_loop_create_default() 函数创建事件循环,该循环将处理所有的网络事件。
该函数是ESP-IDF提供的一个创建默认事件循环的函数。事件循环是ESP-IDF中的一种基本机制,用于处理系统中各种事件,如 WiFi连接事件、TCP连接事件等。
该函数创建一个默认的事件循环后,就会将其注册到ESP-IDF系统中,在创建完成后,程序就可以通过该事件循环进行事件的处理。
4. 配置 WiFi 模块esp_wifi_init通过调用 esp_wifi_init() 函数配置 WiFi 模块,该函数的参数是一个 wifi_init_config_t 结构体,可以使用默认配置,也可以自定义配置。
esp_wifi_init() 函数是 ESP-IDF 中 WIFI 模块初始化的入口。它需要一个指向 wifi_init_config_t 结构体的指针作为参数。
wifi_init_config_t 结构体是 WIFI 模块初始化的配置结构体,它的作用是配置 WIFI 模块的一些初始化参数,如信道、功率、主动探测时间等。它包含以下成员:
- sta_conn_policy:指定当启动 WIFI 模块时的连接策略;
- sta_scan_method:指定扫描的方法;
- sta_sort_policy:指定扫描到的热点列表的排序策略;
- sta_scan_threshold:指定每次扫描的间隔时间。
如果不需要配置,也可以调用预定义好的常量 WIFI_INIT_CONFIG_DEFAULT() 进行初始化。
5. 设置 WiFi 模式esp_wifi_set_mode通过调用 esp_wifi_set_mode 函数设置 WiFi 模式,该模式应设置为 WIFI_MODE_STA,表示该 ESP-C3 芯片为 Station 模式。
6. 启动 WiFi 模块esp_wifi_start通过调用 esp_wifi_start 函数启动 WiFi 模块。
esp_wifi_start 函数是 ESP-IDF WiFi 库中的一个 API 函数,用于启动 WiFi 的工作。
在使用 WiFi 功能之前,需要先通过调用 esp_wifi_init 函数进行 WiFi 的初始化操作,然后再通过调用 esp_wifi_start 函数启动 WiFi。在调用该函数之后,设备就可以连接到 WiFi 网络并开始接收和发送数据了。
该函数的返回值为 esp_err_t 类型,当返回值为 ESP_OK 时,表示 WiFi 启动成功,否则表示 WiFi启动失败。
7. 开始扫描esp_wifi_scan_start通过调用 esp_wifi_scan_start 函数开始扫描可用的 WiFi 热点。
esp_wifi_scan_start是ESP-IDF中WiFi模块的一个API函数,用于开始一次WiFi扫描操作。该函数需要两个参数:
wifi_scan_config_t *config:WiFi扫描的配置参数,可以为空指针,表示使用默认配置。
bool blocking:扫描操作是否阻塞。如果为true,表示扫描操作阻塞当前线程,直到扫描结束。如果为false,表示扫描操作是异步的,函数立即返回,扫描结果需要通过回调函数获得。
返回值:
如果调用成功,返回ESP_OK;否则返回一个错误码,表示调用失败的原因。
8. 等待扫描结束延迟一段时间,以等待扫描结束。
9. 获取扫描结果通过调用自定义函数 wifi_scan 函数获取扫描到的 WiFi 热点列表。
三、完整demo#include "freertos/FreeRTOS.h"
#include "esp_wifi.h"
#include "esp_log.h"
#include "nvs_flash.h"
#define TAG "wifi_scan"
// 定义 wifi_scan 函数,扫描并打印 Wi-Fi 列表
void wifi_scan()
{
// 存储可用 Wi-Fi 热点数量
uint16_t ap_num;
// 存储 Wi-Fi 热点信息的指针
wifi_ap_record_t *ap_records;
// 获取可用 Wi-Fi 热点数量
esp_wifi_scan_get_ap_num(&ap_num);
if (ap_num == 0) {
// 如果没有可用 Wi-Fi 热点,输出提示信息
ESP_LOGI(TAG, "No AP found");
return;
}
// 分配内存空间存储 Wi-Fi 热点信息
ap_records = (wifi_ap_record_t *)malloc(sizeof(wifi_ap_record_t) * ap_num);
if (!ap_records) {
ESP_LOGE(TAG, "malloc error");
return;
}
// 获取所有可用 Wi-Fi 热点信息
ESP_ERROR_CHECK(esp_wifi_scan_get_ap_records(&ap_num, ap_records));
// 输出可用 Wi-Fi 热点数量
ESP_LOGI(TAG, "Found %d APs", ap_num);
// 遍历所有可用 Wi-Fi 热点,并输出信息
for (int i = 0; i < ap_num; i ) {
ESP_LOGI(TAG, "SSID:%s\t RSSI:%d\t BSSID:" MACSTR, ap_records[i].ssid, ap_records[i].rssi, MAC2STR(ap_records[i].bssid));
}
// 释放内存
free(ap_records);
}
void app_main()
{
// 初始化 NVS(Non-Volatile Storage,非易失性存储)模块
// 该函数用于在 flash 中初始化 NVS 存储区域,每个应用仅需调用一次该函数
ESP_ERROR_CHECK(nvs_flash_init());
// 初始化网络接口模块
ESP_ERROR_CHECK(esp_netif_init());
// 创建默认事件循环,该循环将处理所有的网络事件
ESP_ERROR_CHECK(esp_event_loop_create_default());
// 配置 WiFi 模块
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
// 设置 WiFi 模式为 STA(Station 模式)
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
// 启动WiFi
ESP_ERROR_CHECK(esp_wifi_start());
// 开始扫描可用的WIFI热点
ESP_ERROR_CHECK(esp_wifi_scan_start(NULL, true));
// 延迟2秒,等待扫描结束
vTaskDelay(2000 / portTICK_PERIOD_MS);
// 获取扫描结果
wifi_scan();
// 保持程序运行
while(1){
vTaskDelay(1);
}
}
运行效果: