ESP32无线传输(二)

连接到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()) + " (已连接)");
}

运行效果如下:
截屏2025-10-16 22.13.09.png
其中ssidpassword包含您要连接的网络的SSID和密码。

// WiFi网络名称和密码
const char* ssid = "BingGo";
const char* password = "baikeyang186.";

只需要将initWiFi()功能在你的setup()引入即可实现WiFi的连接网络。

接下来详细看看它是如何运作的?

  1. 首先,设置Wi-Fi模式。如果ESP32将连接到另一个网络(接入点/热点),它必须处于站模式。
WiFi.mode(WIFI_STA);
  1. 然后使用WiFi.begin()连接网络。同时必须将网络SSID及其密码作为参数传递。
WiFi.begin(ssid, password);
  1. 连接到Wi-Fi网络可能需要一段时间,因此我们通常会添加一个while循环,该循环会持续检查WiFi.status()是否已建立。成功建立连接后,它会返回WL_CONNECTED
while (WiFi.status() != WL_CONNECTED) {
   /// do something...
}

获取Wi-Fi连接状态

要获取 Wi-Fi 连接的状态,您可以使用WiFi.status()。这返回与表上常量对应的以下值之一:

常量含义
0WL_IDLE_STATUS WiFi.begin()时分配临时状态
1WL_NO_SSID_AVAIL 当没有SSID可用时
2WL_SCAN_COMPLETED 扫描网络已完成
3WL_CONNECTED 当连接到WiFi网络时
4WL_CONNECT_FAILED 当所有尝试的连接都失败时
5WL_CONNECTION_LOST 当连接中断时
6WL_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事件

常量含义
0ARDUINO_EVENT_WIFI_READYWi-Fi就绪
1ARDUINO_EVENT_WIFI_SCAN_DONEWi-Fi完成扫描AP
2ARDUINO_EVENT_WIFI_STA_STARTWi-Fi启动
3ARDUINO_EVENT_WIFI_STA_STOPWi-Fi停止
4ARDUINO_EVENT_WIFI_STA_CONNECTED连接到AP
5ARDUINO_EVENT_WIFI_STA_DISCONNECTED与AP已断开连接
6ARDUINO_EVENT_WIFI_STA_AUTHMODE_CHANGE连接的AP的身份验证模式发生变化
7ARDUINO_EVENT_WIFI_STA_GOT_IP从连接的AP获得IP
8ARDUINO_EVENT_WIFI_STA_LOST_IPIP丢失,IP重置为0
9ARDUINO_EVENT_WPS_ER_SUCCESSwps成功进入报名模式
10ARDUINO_EVENT_WPS_ER_FAILEDwps失败
11ARDUINO_EVENT_WPS_ER_TIMEOUTwps超时
12ARDUINO_EVENT_WPS_ER_PINwps pin代码
13ARDUINO_EVENT_WIFI_AP_STARTsoft-AP启动
14ARDUINO_EVENT_WIFI_AP_STOPsoft-AP停止
15ARDUINO_EVENT_WIFI_AP_STACONNECTED连接到ESP32的soft-AP
16ARDUINO_EVENT_WIFI_AP_STADISCONNECTED与soft-AP断开连接
17ARDUINO_EVENT_WIFI_AP_STAIPASSIGNEDsoft-AP将IP分配给连接的设备
18ARDUINO_EVENT_WIFI_AP_PROBEREQRECVEDsoft-AP在接口中接收探测请求数据包
19ARDUINO_EVENT_WIFI_AP_GOT_IP6首选设备的IPv6地址接入点
19ARDUINO_EVENT_WIFI_STA_GOT_IP6优先选择设备的IPv6地址
19ARDUINO_EVENT_ETH_GOT_IP6首选以太网IPv6地址
20ARDUINO_EVENT_ETH_START以太网启动
21ARDUINO_EVENT_ETH_STOP以太网停止
22ARDUINO_EVENT_ETH_CONNECTED以太网phy连接
23ARDUINO_EVENT_ETH_DISCONNECTED以太网phy链路中断
24ARDUINO_EVENT_ETH_GOT_IP以太网从连接的AP获取IP
25ARDUINO_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_CONNECTEDARDUINO_EVENT_WIFI_STA_GOT_IPARDUINO_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);
}

评论

等风等雨等你来