0
点赞
收藏
分享

微信扫一扫

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


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

  • ​​一、ESP-C3的WIFI 的功能简介​​
  • ​​二、ESP-C3 扫描WiFi操作的流程​​
  • ​​1. 初始化 NVS 模块 `nvs_flash_init`​​
  • ​​2. 初始化网络接口模块 `esp_netif_init`​​
  • ​​3. 创建事件循环 `esp_event_loop_create_default`​​
  • ​​4. 配置 WiFi 模块 `esp_wifi_init`​​
  • ​​5. 设置 WiFi 模式 `esp_wifi_set_mode`​​
  • ​​6. 启动 WiFi 模块 `esp_wifi_start`​​
  • ​​7. 开始扫描 `esp_wifi_scan_start`​​
  • ​​8. 等待扫描结束​​
  • ​​9. 获取扫描结果​​
  • ​​三、完整demo​​

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

一、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入门7. WIFI 操作 扫描WIFI列表_网络接口_02

二、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列表_初始化_03

ESP-C3入门7. WIFI 操作 扫描WIFI列表_初始化_04


举报

相关推荐

0 条评论