连接到Wi-Fi网络
要将ESP32连接到特定的Wi-Fi网络,您必须知道其SSID和密码。此外,该网络必须在ESP32 Wi-Fi范围内(要检查,可以使用前面的示例来扫描Wi-Fi网络)
下面代码是将ESP32连接到Wi-Fi网络的initWiFi():
// 初始化WiFi
void initWiFi() {
// 设置WiFi工作模式为STA模式
WiFi.mode(WIFI_STA);
// 连接WiFi网络
WiFi.begin(ssid, password);
Serial.println("正在连接WiFi...");
// 如果WiFi连接失败,则等待1秒后重试
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
}
Serial.println("WiFi连接成功!");
Serial.println("IP地址:" + WiFi.localIP().toString());
Serial.println("子网掩码:" + WiFi.subnetMask().toString());
Serial.println("网关:" + WiFi.gatewayIP().toString());
Serial.println("DNS:" + WiFi.dnsIP().toString());
Serial.println("MAC地址:" + WiFi.macAddress());
Serial.println("WiFi信号强度:" + String(WiFi.RSSI()) + " dBm");
Serial.println("WiFi工作模式:" + String(WiFi.getMode()) + " (STA模式)");
Serial.println("WiFi连接状态:" + String(WiFi.status()) + " (已连接)");
}运行效果如下:
其中ssid和password包含您要连接的网络的SSID和密码。
// WiFi网络名称和密码
const char* ssid = "BingGo";
const char* password = "baikeyang186.";只需要将initWiFi()功能在你的setup()引入即可实现WiFi的连接网络。
接下来详细看看它是如何运作的?
- 首先,设置Wi-Fi模式。如果ESP32将连接到另一个网络(接入点/热点),它必须处于站模式。
WiFi.mode(WIFI_STA);- 然后使用
WiFi.begin()连接网络。同时必须将网络SSID及其密码作为参数传递。
WiFi.begin(ssid, password);- 连接到Wi-Fi网络可能需要一段时间,因此我们通常会添加一个while循环,该循环会持续检查
WiFi.status()是否已建立。成功建立连接后,它会返回WL_CONNECTED。
while (WiFi.status() != WL_CONNECTED) {
/// do something...
}获取Wi-Fi连接状态
要获取 Wi-Fi 连接的状态,您可以使用WiFi.status()。这返回与表上常量对应的以下值之一:
| 值 | 常量 | 含义 |
|---|---|---|
| 0 | WL_IDLE_STATUS | WiFi.begin()时分配临时状态 |
| 1 | WL_NO_SSID_AVAIL | 当没有SSID可用时 |
| 2 | WL_SCAN_COMPLETED | 扫描网络已完成 |
| 3 | WL_CONNECTED | 当连接到WiFi网络时 |
| 4 | WL_CONNECT_FAILED | 当所有尝试的连接都失败时 |
| 5 | WL_CONNECTION_LOST | 当连接中断时 |
| 6 | WL_DISCONNECTED | 当与网络断开连接时 |
获取WiFi连接强度
要获得WiFi连接强度,您只需在连接成功后调用WiFi.RSSI():
Serial.println("WiFi信号强度:" + String(WiFi.RSSI()) + " dBm");值越低则意味着Wi-Fi连接最强
获取ESP32 IP地址
当ESP32设置为Wi-Fi站时,它可以连接到其他网络(例如您的路由器)。在这种情况下,路由器会为您的ESP32板分配一个唯一的IP地址。要获取您ESP板子的IP地址,您需要在与您的网络建立连接后调用WiFi.localIP():
Serial.println("IP地址:" + WiFi.localIP().toString());给ESP32设置静态IP地址
您可以为你的ESP32使用Wi-Fi.connect()将您偏好的可用IP地址设置其中,而不是随机分配的IP地址。
在setup()和loop()函数之外,使用您自己的静态IP地址和相应的网关IP地址定义以下变量。以下代码分配IP地址192.168.1.184、网关192.168.1.1:
// 设置静态IP地址
IPAddress local_IP(192, 168, 1, 184);
// 设置网关
IPAddress gateway(192, 168, 1, 1);
// 设置子网掩码
IPAddress subnet(255, 255, 0, 0);
// 设置DNS
IPAddress primaryDNS(8, 8, 8, 8);
// 设置备用DNS
IPAddress secondaryDNS(8, 8, 4, 4);在setup()中调用Wi-Fi.connect()方法将配置分配给ESP32:
void setup() {
// 初始化串口通信
Serial.begin(115200);
// 设置静态IP地址
if (!WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS)) {
Serial.println("STA Failed to configure");
}
initWiFi(); // 初始化WiFi
}primaryDNS和secondaryDNS参数是可选的,您可以删除它们。
断开 Wi-Fi 网络连接
要断开与之前连接的 Wi-Fi 网络的连接,请使用WiFi.disconnect()
WiFi.disconnect()连接丢失后重新连接到Wi-Fi网络
要在连接中断后重新连接到Wi-Fi,可以使用WiFi.reconnect()尝试重新连接到之前连接的接入点:
WiFi.reconnect()或者,可以调用WiFi.disconnect()接着是WiFi.begin(ssid,password)。
WiFi.disconnect();
WiFi.begin(ssid, password);或者,您也可以尝试在连接丢失时重新启动ESP32。
你可以在loop()中添加类似下面的代码片段,它会偶尔检查电路板是否连接,这就可以解决ESP32在网络端口后重新连接网络的问题:
...
// 当前秒数
unsigned long previousMillis = 0;
// 设置检查间隔为30秒
unsigned long interval = 30000;
void loop() {
unsigned long currentMillis = millis();
// 检查WiFi连接状态:如果WiFi连接失败,则重新连接
if ((WiFi.status() != WL_CONNECTED) && (currentMillis - previousMillis >=interval)) {
Serial.print(millis());
Serial.println("重新连接到WiFi...");
WiFi.disconnect();
WiFi.reconnect();
previousMillis = currentMillis;
}
}ESP32 Wi-Fi事件
| 值 | 常量 | 含义 |
|---|---|---|
| 0 | ARDUINO_EVENT_WIFI_READY | Wi-Fi就绪 |
| 1 | ARDUINO_EVENT_WIFI_SCAN_DONE | Wi-Fi完成扫描AP |
| 2 | ARDUINO_EVENT_WIFI_STA_START | Wi-Fi启动 |
| 3 | ARDUINO_EVENT_WIFI_STA_STOP | Wi-Fi停止 |
| 4 | ARDUINO_EVENT_WIFI_STA_CONNECTED | 连接到AP |
| 5 | ARDUINO_EVENT_WIFI_STA_DISCONNECTED | 与AP已断开连接 |
| 6 | ARDUINO_EVENT_WIFI_STA_AUTHMODE_CHANGE | 连接的AP的身份验证模式发生变化 |
| 7 | ARDUINO_EVENT_WIFI_STA_GOT_IP | 从连接的AP获得IP |
| 8 | ARDUINO_EVENT_WIFI_STA_LOST_IP | IP丢失,IP重置为0 |
| 9 | ARDUINO_EVENT_WPS_ER_SUCCESS | wps成功进入报名模式 |
| 10 | ARDUINO_EVENT_WPS_ER_FAILED | wps失败 |
| 11 | ARDUINO_EVENT_WPS_ER_TIMEOUT | wps超时 |
| 12 | ARDUINO_EVENT_WPS_ER_PIN | wps pin代码 |
| 13 | ARDUINO_EVENT_WIFI_AP_START | soft-AP启动 |
| 14 | ARDUINO_EVENT_WIFI_AP_STOP | soft-AP停止 |
| 15 | ARDUINO_EVENT_WIFI_AP_STACONNECTED | 连接到ESP32的soft-AP |
| 16 | ARDUINO_EVENT_WIFI_AP_STADISCONNECTED | 与soft-AP断开连接 |
| 17 | ARDUINO_EVENT_WIFI_AP_STAIPASSIGNED | soft-AP将IP分配给连接的设备 |
| 18 | ARDUINO_EVENT_WIFI_AP_PROBEREQRECVED | soft-AP在接口中接收探测请求数据包 |
| 19 | ARDUINO_EVENT_WIFI_AP_GOT_IP6 | 首选设备的IPv6地址接入点 |
| 19 | ARDUINO_EVENT_WIFI_STA_GOT_IP6 | 优先选择设备的IPv6地址 |
| 19 | ARDUINO_EVENT_ETH_GOT_IP6 | 首选以太网IPv6地址 |
| 20 | ARDUINO_EVENT_ETH_START | 以太网启动 |
| 21 | ARDUINO_EVENT_ETH_STOP | 以太网停止 |
| 22 | ARDUINO_EVENT_ETH_CONNECTED | 以太网phy连接 |
| 23 | ARDUINO_EVENT_ETH_DISCONNECTED | 以太网phy链路中断 |
| 24 | ARDUINO_EVENT_ETH_GOT_IP | 以太网从连接的AP获取IP |
| 25 | ARDUINO_EVENT_MAX | - |
使用Wi-Fi事件,我们不需要不断检查Wi-Fi状态。当某个事件发生时,它会自动调用相应的处理函数。
连接丢失后重新连接到Wi-Fi网络
Wi-Fi 事件可用于检测连接丢失,并在连接后立即尝试重新连接(使用SYSTEM_EVENT_AP_STADISCONNECTED事件),下面是一个简单示例:
#include <WiFi.h>
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";
void WiFiStationConnected(WiFiEvent_t event, WiFiEventInfo_t info){
Serial.println("已成功连接到AP!");
}
void WiFiGotIP(WiFiEvent_t event, WiFiEventInfo_t info){
Serial.println("WiFi已连接");
Serial.println("IP 地址: ");
Serial.println(WiFi.localIP());
}
void WiFiStationDisconnected(WiFiEvent_t event, WiFiEventInfo_t info){
Serial.println("与WiFi接入点断开连接");
Serial.print("WiFi失去连接。原因:");
Serial.println(info.wifi_sta_disconnected.reason);
Serial.println("尝试重新连接");
WiFi.begin(ssid, password);
}
void setup(){
Serial.begin(115200);
// 删除旧配置
WiFi.disconnect(true);
delay(1000);
// WiFi事件监听
WiFi.onEvent(WiFiStationConnected, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_CONNECTED);
WiFi.onEvent(WiFiGotIP, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_GOT_IP);
WiFi.onEvent(WiFiStationDisconnected, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_DISCONNECTED);
/* 删除WiFi事件监听
Serial.print("WiFi Event ID: ");
Serial.println(eventID);
WiFi.removeEvent(eventID);*/
WiFi.begin(ssid, password);
Serial.println();
Serial.println();
Serial.println("等待 WiFi... ");
}
void loop(){
delay(1000);
}在上面的示例中,添加了三个Wi-Fi事件:当ESP32连接时、当它得到一个IP地址时、当它断开连接时:ARDUINO_EVENT_WIFI_STA_CONNECTED,ARDUINO_EVENT_WIFI_STA_GOT_IP,ARDUINO_EVENT_WIFI_STA_DISCONNECTED:
当 ESP32 工作站连接到接入点(ARDUINO_EVENT_WIFI_STA_CONNECTED),这个WiFiStationConnected()函数将被调用:
WiFi.onEvent(WiFiStationConnected, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_CONNECTED);这个WiFiStationConnected()功能只是打印ESP32成功连接到接入点。在实际的应用中,我们可以在这里执行任何其他任务(例如点亮LED以表明它已成功连接到网络)。
void WiFiStationConnected(WiFiEvent_t event, WiFiEventInfo_t info){
Serial.println("已成功连接到AP!");
}当ESP32获得其IP地址时,WiFiGotIP()函数将被调用运行。
WiFi.onEvent(WiFiGotIP, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_GOT_IP);该功能只是在串行监视器上打印IP地址。
void WiFiGotIP(WiFiEvent_t event, WiFiEventInfo_t info){
Serial.println("WiFi已连接");
Serial.println("IP 地址: ");
Serial.println(WiFi.localIP());
}当ESP32失去与接入点的连接时(ARDUINO_EVENT_WIFI_STA_DISCONNECTED),那个WiFiStationDisconnected()函数被调用。
WiFi.onEvent(WiFiStationDisconnected, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_DISCONNECTED);该函数打印一条消息,表明连接已丢失,并尝试重新连接:
void WiFiStationDisconnected(WiFiEvent_t event, WiFiEventInfo_t info){
Serial.println("与WiFi接入点断开连接");
Serial.print("WiFi失去连接。原因:");
Serial.println(info.wifi_sta_disconnected.reason);
Serial.println("尝试重新连接");
WiFi.begin(ssid, password);
}
评论