目的
前面几篇文章中都是通过IP地址访问ESP8266,但如果我们不想记IP地址,想要通过网址访问ESP8266就需要用到DNS服务了。
Arduino for esp8266中有两个DNS服务器相关的库:
- DNSServer:https://github.com/esp8266/Arduino/tree/master/libraries/DNSServer
这个库就是本文将用到的建立DNS服务的方式,使用该库时ESP8266必须工作在AP
模式下; - ESP8266mDNS:https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266mDNS
这个库是mDNS库,使用这个库的时候ESP8266可以在AP
模式或是以STA
模式接入局域网。局域网中的其他开启mDNS服务的设备就可以通过网址访问ESP8266了;
使用介绍
DNSServer
库使用步骤如下:
- 引入相应的库
#include <DNSServer.h>
; - 建立全局的DNS服务器
DNSServer dnsServer;
; - 在
setup()
中初始化DNSServerdnsServer.start(PORT, URL, IP);
; - 在loop()中监听客户请求并处理
dnsServer.processNextRequest();
;
最基本的应用可以参考官方示例DNSServer
。
在keywords.txt
中可以看到更多方法,具体的使用可以参考源码或是官方例程。
使用示例
本文中各种例程测试中出现中文可能在有些浏览器中会出现乱码(我这里用的是傲游浏览器ao),这是由于编码格式引起的。正式使用如果是在浏览器中访问text/html类型的网页文件,可以在网页文件的head标签中加入<meta charset=“utf-8”>字段,可以保证在浏览器端中文正常显示。
DNSServer库使用就如上文描述,下面直接上代码:
#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
IPAddress local_IP(192,168,4,1); //IP地址
IPAddress gateway(192,168,4,1); //网关地址
IPAddress subnet(255,255,255,0); //子网掩码
const byte DNS_PORT = 53; //DNS服务端口号,一般为53
DNSServer dnsServer;
ESP8266WebServer webServer(80);
void handleRoot() {
webServer.send(200, "text/plain", "这是主页");
}
void handleNext() {
webServer.send(200, "text/plain", "这是另一个页面");
}
void setup() {
//初始化网络
WiFi.mode(WIFI_AP);
WiFi.softAPConfig(local_IP, gateway, subnet);
WiFi.softAP("DNSServer example");
//初始化DNSServer
dnsServer.start(DNS_PORT, "www.example.com", local_IP);
//初始化WebServer
webServer.on("/", handleRoot);
webServer.on("/next", handleNext);
webServer.begin();
}
void loop() {
//监听客户请求并处理
dnsServer.processNextRequest();
webServer.handleClient();
}
总结
DNSServer
的基本使用就是这样了,比较简单,但可以在一定程度上提升用户的使用体验。