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()
函数中,我们只是留空,因为我们不需要循环执行任何操作。