ESP-C3入门7. WIFI 操作 扫描WIFI列表

Posted 编程圈子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ESP-C3入门7. WIFI 操作 扫描WIFI列表相关的知识,希望对你有一定的参考价值。

ESP-C3入门7. WIFI 操作 扫描WIFI列表

一、ESP-C3的WIFI 的功能简介

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() 函数初始化网络接口模块。
该函数主要负责初始化网络接口模块的基本框架和配置。在初始化完成后,程序就可以通过网络接口模块实现对网络连接的控制和管理。

3. 创建事件循环 esp_event_loop_create_default

通过调用 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);
    


运行效果:

以上是关于ESP-C3入门7. WIFI 操作 扫描WIFI列表的主要内容,如果未能解决你的问题,请参考以下文章

ESP-C3入门8. 连接WiFi并打印信息

ESP-C3入门8. 连接WiFi并打印信息

ESP-C3入门13. SoftAP模式

ESP-C3入门13. SoftAP模式

ESP-C3入门9. 创建TCP Server

ESP-C3入门9. 创建TCP Server