ESP32 WiFi扫描、WiFi通道查询

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

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()函数中,我们只是留空,因为我们不需要循环执行任何操作。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值