ESP32 WiFi扫描、WiFi通道查询

文章介绍了ESP32如何使用代码扫描周围WiFi网络,并识别指定名称的WiFi以配合esp-now协议进行正常通信。esp-now要求设备在同一物理网络且相同信道。代码示例展示了如何更改WiFi信道以及扫描和打印WiFi网络的SSID和信号强度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ESP32WiFi扫描程序

代码解决什么问题?

扫描周围WiFi并识别指定WiFi名称的WiFi通道(为了ESP32的esp-now协议正常通信)。
在这里插入图片描述

这跟ESP32 now有什么关系?

ESP32使用NOW协议进行通信时,要求参与通信的设备必须处于同一物理网络中(例如,连接到同一个路由器或接入点)。这是因为NOW协议是基于WiFi的,并且只能在同一个WiFi通道上进行通信。
NOW协议使用广播方式发送数据包,而广播数据包只能在同一个无线电信道上传输。如果两个设备不在同一个通道上,则它们将无法互相看到彼此的数据包。

如何更改WiFi的通道

首先包含头文件

#include <esp_wifi.h>
WiFi.mode(WIFI_STA); // 设置为WiFi站点
esp_wifi_set_channel(1, WIFI_SECOND_CHAN_NONE);

注意,如果要更改WiFi信道,请确保将其放在WiFi.begin()之前,因为该方法会触发ESP32与指定的WiFi网络建立连接。
在这里插入图片描述

WiFi扫描代码

#include <WiFi.h>


void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);  // Set WiFi mode to station (client)
  WiFi.disconnect();
  delay(100);
  Serial.println("Scanning for WiFi networks...");
  int networkCount = WiFi.scanNetworks();  // Start scanning for available networks
  if (networkCount == 0) {
    Serial.println("No WiFi networks found.");
  } else {
    Serial.print(networkCount);
    Serial.println(" WiFi networks found:");
    for (int i = 0; i < networkCount; ++i) {
      Serial.print(i + 1);
      Serial.print(": ");
      Serial.print(WiFi.SSID(i));  // Get the SSID (name) of the network
      Serial.print(" (");
      Serial.print(WiFi.RSSI(i));  // Get the signal strength in dBm
      Serial.println(")");
      if (WiFi.SSID(i) == "ssid") { // Check if the current network has the specified name
        Serial.println("WiFi network found");
        Serial.print("wifi_channel: ");
        Serial.println(WiFi.channel(i));  // Get the channel number of the network
      }
      delay(10);
    }
  }
}


void loop() {
  // Empty loop
}

下面是代码详细讲解:


#include <WiFi.h>

这行代码导入了WiFi.h库,该库提供了ESP32 WiFi模块所需的函数和方法。


void setup() {
  Serial.begin(115200);

setup()函数中,我们启用了ESP32的串行调试接口,并设置为115200波特率。这将允许我们通过串行监视器与ESP32通信。


  WiFi.mode(WIFI_STA); // Set WiFi mode to station (client)



接下来,我们使用WiFi.mode()方法将ESP32的WiFi模式设置为客户端模式(即连接到现有的WiFi网络)。


  WiFi.disconnect();
  delay(100);

然后,我们使用WiFi.disconnect()方法断开任何之前的WiFi连接,并使用delay()函数等待100毫秒以确保断开连接。


  Serial.println("Scanning for WiFi networks...");


我们向串行监视器输出一条消息,表示ESP32正在扫描附近的WiFi网络。


  int networkCount = WiFi.scanNetworks(); // Start scanning for available networks

我们使用WiFi.scanNetworks()方法开始扫描可用网络,并将结果存储在networkCount变量中。


if (networkCount == 0) {
    Serial.println("No WiFi networks found.");
  } else {
    Serial.print(networkCount);
    Serial.println(" WiFi networks found:");
    for (int i = 0; i < networkCount; ++i) {
      Serial.print(i + 1);
      Serial.print(": ");
      Serial.print(WiFi.SSID(i));  // Get the SSID (name) of the network
      Serial.print(" (");
      Serial.print(WiFi.RSSI(i));  // Get the signal strength in dBm
      Serial.println(")");
      if (WiFi.SSID(i) == "ssid") { // Check if the current network has the specified name
        Serial.println("WiFi network found");
        Serial.print("wifi_channel: ");
        Serial.println(WiFi.channel(i));  // Get the channel number of the network
      }
      delay(10);
    }
  }

接下来,我们检查networkCount是否为0。如果是,则表示没有可用的WiFi网络。否则,我们输出发现的WiFi网络总数,并使用一个循环遍历每个网络并输出其名称和信号强度,其中使用if语句检查当前网络的名称是否与指定的名称(“ssid”)匹配,如果是,我们向串行监视器输出一条消息表示已找到该网络,并使用WiFi.channel()方法获取其通道号并输出。
在这个例子中,我们使用了以下方法:

  • WiFi.SSID(i):获取第i个网络的名称(也称为SSID)。
  • WiFi.RSSI(i):获取第i个网络的信号强度(以dBm为单位)。

void loop() {
  // Empty loop
}

最后,在loop()函数中,我们只是留空,因为我们不需要循环执行任何操作。
在这里插入图片描述

ESP32是一款嵌入式微控制器,集成了WiFi功能,常用于物联网项目中。当涉及到WiFi扫描时,ESP32通常通过软件API如Espressif的Wi-Fi SDK来进行操作。以下是一个简单的步骤概述: 1. **初始化WiFi模块**:首先需要配置WiFi模块并连接到网络,以便后续能获取无线网络信息。 ```c #include <esp_wifi.h> esp_err_t err = esp_wifi_init(); ``` 2. **设置模式**:进入station模式(客户端模式),如果是AP模式,则需要先配置热点。 ```c esp_netif_t* sta_if = esp_netif_create_default_station(); err = esp_wifi_set_mode(WIFI_MODE_STA); ``` 3. **开启扫描**:启用WiFi扫描功能,查找周围的可用网络。 ```c esp_err_t scan_start = esp_wifi_scan_start(NULL, false); // 第二个参数表示是否深度扫描,false表示普通扫描 ``` 4. **等待结果**:程序会阻塞直到扫描完成,这时可以从`esp_event_loop_create_task`返回的数据集中获取已发现的网络列表。 ```c while (!esp_event_wait_all(ESP_EVENT_ANY_ID, -1)) { if (esp_netif_get_event(sta_if, &event) == ESP_OK) { // 检查事件类型,可能是scan_done事件 } } ``` 5. **处理扫描结果**:检查`esp_event`中的`ESP_NETIF_EVENT_SCAN_DONE`事件,并获取`esp_scan_results_t`结构体中的网络信息。 ```c const esp.ScanResult *result = esp_netif_get_scan_results(sta_if); for (size_t i = 0; i < result->num_of_entry; ++i) { printf("SSID: %s, RSSI: %d dBm\n", result->results[i].ssid, result->results[i].rssi); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值