ESP8266连接AP时能否请求指定IP或设置可被发现的主机名?
ESP8266固定IP/自定义域名访问解决方案
1. 实现固定IP分配
你可以通过两种客户端侧代码修改的方式实现,不需要繁琐的路由器静态绑定操作:
1.1 完全静态IP配置
直接在代码中写死IP参数,跳过DHCP自动分配流程,只要所选IP未被局域网内其他设备占用即可正常使用:
- 需提前确认你路由器的网关、子网掩码参数,通常家用路由器网关为
192.168.1.1,子网掩码为255.255.255.0 - 建议选择的固定IP在路由器DHCP自动分配地址池之外,避免IP冲突,比如大部分路由器DHCP池默认是192.168.1.100~192.168.1.200,你可以选
192.168.1.10这类池外地址 - 修改代码,在
WiFi.begin()前添加静态IP配置:
#include <ESP8266WiFi.h> const char* ssid = "SSID"; const char* password = "PASSWORD"; // 配置固定IP参数 IPAddress staticIP(192, 168, 1, 10); // 你要设置的固定IP IPAddress gateway(192, 168, 1, 1); // 路由器网关地址 IPAddress subnet(255, 255, 255, 0); // 子网掩码 IPAddress dns(192, 168, 1, 1); // DNS服务器,通常和网关一致 void setup() { Serial.begin(115200); delay(10); Serial.println('\n'); // 应用静态IP配置 WiFi.config(staticIP, gateway, subnet, dns); WiFi.begin(ssid, password); Serial.print("Connecting to "); Serial.print(ssid); Serial.println(" ..."); int i = 0; while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print(++i); Serial.print(' '); } Serial.println('\n'); Serial.println("Connection established!"); Serial.print("IP address:\t"); Serial.println(WiFi.localIP()); } void loop() {}
1.2 DHCP主动请求指定IP
如果不想完全写死IP,可让ESP8266在DHCP请求阶段主动向路由器申请指定IP,只要该IP未被占用,绝大多数家用路由器都会同意分配,若IP已被占用会自动 fallback 到普通DHCP分配,不会断网。该方式和上述静态IP配置代码一致,只需保证路由器DHCP功能开启即可。
2. 实现自定义域名访问(无需记IP)
可以通过mDNS协议实现用自定义名称访问ESP8266服务,不需要修改路由器任何配置,仅需添加少量代码:
- mDNS是局域网设备发现协议,支持该协议的设备可以通过
[自定义名称].local的格式直接访问 - Windows系统默认需要安装Bonjour服务支持mDNS,Mac、Linux、iOS、绝大多数安卓系统自带该功能
- 整合mDNS功能的完整代码如下:
#include <ESP8266WiFi.h> #include <ESP8266mDNS.h> // 引入mDNS库 const char* ssid = "SSID"; const char* password = "PASSWORD"; const char* hostName = "myserver1"; // 自定义访问名称,访问时用http://myserver1.local // 可选:搭配上述固定IP配置使用 IPAddress staticIP(192, 168, 1, 10); IPAddress gateway(192, 168, 1, 1); IPAddress subnet(255, 255, 255, 0); IPAddress dns(192, 168, 1, 1); void setup() { Serial.begin(115200); delay(10); Serial.println('\n'); WiFi.config(staticIP, gateway, subnet, dns); WiFi.begin(ssid, password); Serial.print("Connecting to "); Serial.print(ssid); Serial.println(" ..."); int i = 0; while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print(++i); Serial.print(' '); } Serial.println('\n'); Serial.println("Connection established!"); Serial.print("IP address:\t"); Serial.println(WiFi.localIP()); // 启动mDNS服务 if (!MDNS.begin(hostName)) { Serial.println("mDNS服务启动失败"); } else { Serial.print("可通过以下地址访问:http://"); Serial.print(hostName); Serial.println(".local"); } } void loop() { MDNS.update(); // 循环中需添加mDNS更新,保证服务正常运行 }
内容的提问来源于stack exchange,提问作者Damn Vegetables
相关产品推荐
相关产品推荐

