ESP32-CAM ArduinoIDE开发系列文章目录
第一篇:ESP32-CAM高性价比WIFI图传方案快速入门教程第二篇:ESP32-CAM第一个无线点灯程序第三篇:ESP32-CAM智能网关的设计与实现第四篇:ESP32-CAM创建热点构成并发式DNS服务器
文章目录
- ESP32-CAM ArduinoIDE开发系列文章目录
- 前言
- 一、ESP32-CAM创建热点构成并发式DNS服务器是什么?
- 二、系统设计
- 1.引入库
- 2.读入客户端提交的数据
- 三、仿真与调试
- 总结
前言
daodanjishui物联网核心原创技术之ESP32 Arduino IDE开发之嵌入式网页服务器架设、http请求收发与解析、单片机IO口读写操作、AJAX技术、并发服务器技术和DNS技术整合组成:ESP32-CAM创建热点构成并发式DNS服务器
一、ESP32-CAM创建热点构成并发式DNS服务器是什么?
代码的风格发生了变化(又借鉴了另一个老外的代码和试用了新的arduino库ESPAsyncWebServer),功能维持大体不变的情况下扩展程度变高,增加了两个热门功能:
(1)构成了并发式服务器,前三篇的服务器都是只能响应一个客户端的请求的,都是原官方程序的修改,现在第四篇的服务器可以同时接收多个客户端的请求,并发响应客户端的请求,使用到的是另外一套非官方的程序。这个新的库功能很强大,支持WebSocket功能,后期我会用WebSocket做一个集群控制机器人系统出来。
(2)局域网DNS域名解析,就是说ESP32-cam作为一个AP热点共享WIFI资源并且作为一个物联网嵌入式服务器,连上WIFI的移动设备在浏览器输入:http://daodanjishui.com 就能查看服务器的主页,前三期的设计只能输入模块串口助手打印出来的网址才能连上服务器。这一期只需要输入域名即可,成功打开服务器主页之后又可以观赏到服务器的IP地址,妈妈再也不用担心我一定要用串口调试助手才能连上服务器了。要是同学们想要做无线遥控车又不想加显示屏的情况下,我强烈建议要学一下这代码!
(3)因为我不想把事情复杂化了,没有集成视频功能和STA模式的功能,因为视频功能涉及到图传,不可能简单用
新的arduino库ESPAsyncWebServer完成图传设计,包括老外也一样。一般这种嵌入式服务器的代码量是比较大的,少说也有上万行,
下面是界面展示,但是服务器的代码全部被我替换了,因为后续我有更高的需求:
下面是该系统的运行调试视频地址:https://v.youku.com/v_show/id_XNTE3OTAyNzUwNA==.html
直接观看视频
ESP32-CAM创建热点构成并发式DNS服务器
二、系统设计
1.引入库
#include <AsyncTCP.h>和#include <ESPAsyncWebServer.h>和#include <FS.h>和#include <DNSServer.h>
引入库之后就是设计服务器逻辑了,一看代码其实不复杂:
void setup()
{
Serial.begin(115200);
// WiFi.mode(WIFI_AP_STA);//设置模式为AP+STA
WiFi.mode(WIFI_AP); //设置为AP模式
WiFi.softAP("DNSServer");
Serial.println("AP设置完成");
IPAddress myIP = WiFi.softAPIP();
Serial.print("AP IP address: ");
Serial.println(myIP);
dnsserver.start(DNS_PORT, "daodanjishui.com",myIP); //启动DNS服务,daodanjishui即为注册的域名
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){//登录主页
request->send(200, "text/html", index_html(WiFi.softAPIP().toString()) );
});
就是开启了服务器之后加载一个字符串index_html作为嵌入式的主页,在浏览器输入服务器的IP地址就可以触发主页的加载:
String index_html(String WiFiAddr){
return String("")+"<html> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /"+
" <head> "+
//这里忽略一些JavaScript代码
" <body> "+
" <h1>daodanjishui ESP32点灯程序</h1><p> "+
" <form action=\"\" method=\"\" name=\"\" >"+
" 点击触发AjAX技术<br> "+
" <input type=\"text\" value=\"on\" name=\"inputcmd\" id=\"cmd\" size=\"10\" maxlength=\"20\" > "+
" <input type=\"button\" value=\"cmd\" οnclick=\"checkCmd(this.form.inputcmd.value)\" ><br> "+
" "+
" <input type=\"text\" value=\"off\" name=\"inputcmd1\" id=\"cmd1\" size=\"10\" maxlength=\"20\" > "+
" <input type=\"button\" value=\"cmd\" οnclick=\"checkCmd(this.form.inputcmd1.value)\" ><br> "+
" "+
" 反馈信息:"+
" <span id=\"result\"></span> "+
" </form> "+
" "+
" "+
" <form action=\"control\" method=\"get\">"+
" <table align=\"center\" width=\"450\">"+
" <tr>"+
" <td align=\"center\" colspan=\"2\">"+
" <h2>提交表单指令测试</h2>"+
" <hr>"+
" </td>"+
" </tr>"+
" <tr>"+
" <td align=\"right\">指令:</td>"+
" <td><input type=\"text\" name=\"var\" value=\"on\" /></td>"+
" </tr>"+
" <tr>"+
" <td align=\"right\">数值:</td>"+
" <td><input type=\"text\" name=\"val\" value=\"168\"/></td>"+
" </tr>"+
""+
" <tr>"+
" <td align=\"center\" colspan=\"2\">"+
" <input type=\"submit\" value=\"发送\">"+
" <a href=\"/control?var=on&val=888\">快捷开灯</a> "+
" <a >ESP32 Server IP:"+ WiFiAddr+"</a> "+
" </td>"+
" </tr>"+
" </table>"+
" </form>"+
" "+
" </body>"+
"</html>";
}
2.读入客户端提交的数据
读取客户端提交的get请求判断是否开灯或者是关灯。
代码如下(示例):
server.on("/control", HTTP_GET, [](AsyncWebServerRequest *request){//响应开灯的逻辑
int paramsNr = request->params();
Serial.println(paramsNr);
for(int i=0;i<paramsNr;i++){
AsyncWebParameter* p = request->getParam(i);
Serial.print("Param name: ");
Serial.println(p->name());
Serial.print("Param value: ");
Serial.println(p->value());
Serial.println("------");
int value_length=p->value().length();
char value_buf[value_length];
strcpy(value_buf,p->value().c_str());
if(!strcmp(value_buf, "on")){//如果接收的字符串是"on"
controlLamp(true);//开灯
return request->send(200, "text/plain", "on ok");
}else if(!strcmp(value_buf, "off")){
controlLamp(false);//关灯
return request->send(200, "text/plain", "off ok");
}else if(!strcmp(value_buf, "check")){//查询灯的状态
int LAMP_flag= digitalRead(LAMP_PIN);//读取引脚的状态,并返回HIGH 或LOW
if(LAMP_flag==HIGH){
return request->send(200, "text/plain", "LAMP is on");
}else if(LAMP_flag==LOW){
return request->send(200, "text/plain", "LAMP is off");
}
}
}
request->send(200, "text/plain", "message received");
});
三、仿真与调试
加载源码:
连上ESP32CAM发出的AP热点
手机登录ESP32CAM主页
手机浏览器控制点灯
总结
本文主要做了局域网域名解析(DNS),用了库函数去实现,代码量不多,但是扩展性非常高,如果读者研究了第三篇和第四篇的代码,那肯定能学习到两种风格的编码方式,绝对值得。有了这个功能,物联网设备就可以实现无线控制和访问了,而且我的还能显示服务器IP地址。代码调试了很久,也尝试过很多方案,最终采取了与前三个项目不同的方案,也可谓是从无到有,官方源码被改得面目全非了,出来的就是精华所在。下一期加入服务器无线配网功能吧,总用AP模式,没有STA模式,这个ESP32-cam还是不能做到与世界接轨。ESP32连上互联网之后就有很多玩法了,比如MQTT图传、手机app远程控制、语音播报、VR图传和体感控制等等,敬请期待。