如何让两台独立ESP32在WiFi AP模式下避免IP地址冲突?
解决方案:ESP32 AP模式下动态分配静态IP
核心结论:完全可以实现,无需依赖PainlessMesh这类复杂框架,通过临时切换到Station模式扫描同名AP+静态IP配置就能满足需求。
实现思路
- 上电后临时切换到Station模式,扫描预设的AP SSID(两台设备软件相同,SSID一致)。
- 如果扫描到目标SSID,说明已有设备占用
192.168.4.1,则自身使用192.168.4.2启动AP。 - 如果未扫描到,自身使用
192.168.4.1启动AP。 - 启动AP后配置对应静态IP,再启动Web服务器。
简化代码示例(Arduino框架)
#include <WiFi.h> #include <WebServer.h> // 两台设备共用的配置参数 #define AP_SSID "BotAP" #define AP_PASS "botpass123" #define BASE_IP IPAddress(192, 168, 4, 1) #define BACKUP_IP IPAddress(192, 168, 4, 2) #define SUBNET_MASK IPAddress(255, 255, 255, 0) WebServer server(80); void setup() { Serial.begin(115200); // 临时切换到Station模式扫描AP WiFi.mode(WIFI_STA); WiFi.disconnect(); delay(100); bool baseAPExists = false; int scanResultCount = WiFi.scanNetworks(); if (scanResultCount > 0) { for (int i = 0; i < scanResultCount; i++) { if (WiFi.SSID(i) == AP_SSID) { baseAPExists = true; break; } } } // 切换回AP模式,分配对应IP WiFi.mode(WIFI_AP); IPAddress targetIP = baseAPExists ? BACKUP_IP : BASE_IP; // 配置AP静态IP(网关与自身IP一致) if (!WiFi.softAPConfig(targetIP, targetIP, SUBNET_MASK)) { Serial.println("AP IP配置失败"); return; } // 启动AP if (WiFi.softAP(AP_SSID, AP_PASS)) { Serial.print("AP启动成功,IP: "); Serial.println(WiFi.softAPIP()); // 初始化Web服务器 initWebServer(); } else { Serial.println("AP启动失败"); } } void initWebServer() { server.on("/", []() { server.send(200, "text/plain", "Bot在线,IP: " + WiFi.softAPIP().toString()); }); server.begin(); } void loop() { server.handleClient(); }
关键注意事项
- 同时上电冲突处理:如果两台设备几乎同时上电,可能出现双方都未扫描到对方、同时占用
192.168.4.1的情况。解决方法是在扫描前添加1-3秒的随机延迟,或者启动AP后定期发送ARP请求检查网段内IP占用,发现冲突则自动切换到备用IP。 - 扫描可靠性:可以增加扫描次数(比如连续扫描2次),避免单次扫描遗漏目标AP。
- 无外部网络干扰:你的场景中无外部网络,无需担心扫描到其他同名SSID,逻辑可以保持简单。
内容的提问来源于stack exchange,提问作者Sylvain Plante
相关产品推荐
相关产品推荐

