在前文中ESP32利用SPIFFS存放html,css,js等文件(读取html)_你的幻境的博客-CSDN博客,我们已经建立了一个基本的WEB服务器,我们可以通过串口监视器,或者登陆路由器来确定ESP32的IP地址,再利用这个IP地址在浏览器中访问ESP32,十分不方便。而利用DNSServer这个库,就可以实现用域名,也就是用比较方便记忆的网址的形式来对ESP32进行访问。

在arduion IDE中,如果已经搭建好ESP32环境,默认是自带这个库的:

以前文中的代码为基础,我们增加这个库的引用:

#include <WiFi.h>
#include <SPIFFS.h>
#include <DNSServer.h>
#include "ESPAsyncWebServer.h"

因为DNSServer只能在AP模式下才能实现,所以需要开启AP和STA共存的方式,可以参照之前的文章:EPS32的AP模式与STA模式共存;_你的幻境的博客-CSDN博客

之后需要创建一个DNSServer实例:

DNSServer dnsserver;

实现的主要方法:

一、.start();启动DNSServer服务

bool start(const uint16_t &port, const String &domainName, const IPAddress &resolvedIP);

        参数:

        1:&port                           服务端口,DNS默认端口53

        2:&domainName           域名,如"esp32_ap.com",域名最好不要设置为互联网存在的网址

        3:&resolvedIP                解析域名所对应的IP地址

二、.processNextRequest()方法,监测客户端的DNS请求,需要放到loop循环里。

完整代码:

#include <WiFi.h>
#include <SPIFFS.h>
#include <DNSServer.h>
#include "ESPAsyncWebServer.h"


DNSServer dnsserver;
AsyncWebServer server(80);

//连接WIFI
void connect_wifi(){
  const byte DNS_PORT = 53;                     //DNS端口
  const String url = "ESPAP.com";               //域名
  IPAddress APIp(10,0,10,1);                    //AP IP
  IPAddress APGateway(10,0,10,1);               //AP网关
  IPAddress APSubnetMask(255,255,255,0);        //AP子网掩码
  const char* APSsid = "esp32_AP";              //AP SSID
  const char* APPassword = "12345678";          //AP wifi密码
  
  const char* wifi_ssid = "ESP32";
  const char* wifi_password = "12345678";
  Serial.begin(9600);
  WiFi.mode(WIFI_AP_STA);                             //打开AP和STA共存模式
  WiFi.softAPConfig(APIp, APGateway, APSubnetMask);   //设置AP的IP地址,网关和子网掩码
  WiFi.softAP(APSsid, APPassword, 6);                 //设置AP模式的登陆名和密码
  dnsserver.start(DNS_PORT, url, APIp);               //设置DNS的端口、网址、和IP
  WiFi.begin(wifi_ssid, wifi_password);               //连接WIFI
  Serial.print("Connected");
  //循环,直到连接成功
  while(WiFi.status() != WL_CONNECTED){
    Serial.print(".");
    delay(500);
  }
  Serial.println();
  IPAddress local_IP = WiFi.localIP();
  Serial.print("WIFI is connected,The local IP address is "); //连接成功提示
  Serial.println(local_IP); 
}

void web_server(){
  if(!SPIFFS.begin(true)){
    Serial.println("An Error has occurred while mounting SPIFFS");
    return;
  }
  server.serveStatic("/", SPIFFS, "/").setDefaultFile("index.html");
  server.begin();                       //初始化
}

void setup() {
  connect_wifi();
  web_server();
}

void loop() {
  dnsserver.processNextRequest();
}

更多推荐