ESP32-CAM、ESP8266、WIFI、蓝牙、单片机、热点创建嵌入式DNS服务器

ESP32-CAM ArduinoIDE开发系列文章目录


第一篇:ESP32-CAM高性价比WIFI图传方案快速入门教程
第二篇:ESP32-CAM第一个无线点灯程序
第三篇:ESP32-CAM智能网关的设计与实现
第四篇:ESP32-CAM创建热点构成并发式DNS服务器



前言

    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图传和体感控制等等,敬请期待。

代码和资料下载地址:https://gf.bilibili.com/item/detail/1107717114
点我直接跳转

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
要通过ESP32-CAM控制ESP8266,你需要先建立它们之间的WiFi连接,然后在ESP32-CAM上运行服务器程序,接收来自ESP8266的命令,并执行相应的操作。 以下是一个示例代码,展示如何通过ESP32-CAM控制ESP8266ESP8266代码: ```c++ #include <ESP8266WiFi.h> #include <WiFiClient.h> const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; IPAddress serverIP(192, 168, 1, 100); // ESP32-CAM的IP地址 WiFiClient client; void setup() { Serial.begin(115200); delay(1000); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void loop() { if (!client.connect(serverIP, 80)) { Serial.println("Connection failed"); delay(1000); return; } client.println("GET /?command=on HTTP/1.1"); client.println("Host: 192.168.1.100"); // ESP32-CAM的IP地址 client.println("Connection: close"); client.println(); while (client.connected()) { if (client.available()) { String line = client.readStringUntil('\n'); Serial.println(line); } } client.stop(); delay(1000); } ``` ESP32-CAM代码: ```c++ #include <WiFi.h> #include <WebServer.h> const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; IPAddress localIP(192, 168, 1, 100); // ESP32-CAM的IP地址 WebServer server(80); void handleCommand() { String command = server.arg("command"); if (command == "on") { // 执行打开操作 Serial.println("Turning on..."); } else if (command == "off") { // 执行关闭操作 Serial.println("Turning off..."); } else { // 无效的命令 Serial.println("Invalid command"); } server.send(200, "text/plain", "OK"); } void setup() { Serial.begin(115200); delay(1000); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); server.on("/command", handleCommand); server.begin(); } void loop() { server.handleClient(); } ``` 在ESP8266的代码中,我们首先定义了ESP32-CAM的IP地址,并在loop()函数中,使用WiFiClient库连接到ESP32-CAM的IP地址,并向其发送一个HTTP GET请求,请求的URL中包含了一个命令参数command,值为on,表示打开操作。在ESP32-CAM的代码中,我们首先定义了一个WebServer对象,并在setup()函数中,注册了一个handleCommand()函数来处理来自ESP8266的命令。在handleCommand()函数中,我们根据命令参数的值来执行相应的操作,并返回一个OK响应。 你可以根据需要修改命令的参数和相应的操作,以实现ESP32-CAM对ESP8266的控制。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

daodanjishui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值