使用ESP32-CAM开发板制作一个简单的聊天服务器

编辑使用Arduino IDE,较为简单

项目中用到的库为

ESPAsyncWebServer(Github)
AsyncTCP(Github)

下载.zip后使用Arduino IDE的导入库功能导入,即可使用

编译的相关选项(略过将Arduino配置为ESP32 IDE的环节)

其中主要是"ESPAsyncWebServer"这个库,这个库的创建者在github页面上写了详尽的注释

具体见github页面

#include <WiFi.h>
#include <ESPAsyncWebServer.h>
// SSID & Password
const char* ssid = "****";  // Enter your SSID here
const char* password = "********";  //Enter your Password here
String chatHist[10];
int cursorPos = 0;
String HTML1 = "\
<!DOCTYPE html>\
<html>\
<head>\
<style>\
h1{\
    text-align: center;\
    font-size: 30;\
    color: rgba(167, 53, 0, 0.767);\
\
}\
dev{\
    text-align: center;\
    font-size: 25;\
}\
</style>\
</head>\
<script src = 'https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js'></script>\
<script>\
    function sendAndRefresh()\
    {\
        textToSend = document.getElementById('input').value;\
        var myName = document.getElementById('name').value;\
        if(myName == \"\")\
        {\
          alert(\"Please enter your name before chatting!\");\
          return 0;\
        }\
        document.getElementById('name').disabled = true;\
        textToSend = myName + \": \" + textToSend;\
        console.log(textToSend);\
        $.ajax(\
            {\
                type: 'POST',\
                url: 'sendMes',\
                data: textToSend, \
                success: function(datas)\
                {\
                    console.log(datas);\
                    data = JSON.parse(datas);\
                    chatHist = data['text'];\
                    form = document.getElementById('table');\
                    while(form.rows.length != 0)\
                    {\
                        form.deleteRow(0);\
                    }\
                    if(data['length'] != 0)\
                    {\
                      for(var i = 0;i<data['length'];++i)\
                      {\
                          rowTemp = document.createElement('tr');\
                          colTemp = document.createElement('td');\
                          colTemp.innerHTML = chatHist[i];\
                          rowTemp.appendChild(colTemp);\
                          form.appendChild(rowTemp);\
                      }\
                    }\
                }\
            }\
        )\
    }\
    function refreshText()\
    {\
        var textToSend = \"Refresh\";\
        $.ajax(\
            {\
                type: 'POST',\
                url: 'refreshMes',\
                data: textToSend, \
                success: function(datas)\
                {\
                    data = JSON.parse(datas);\
                    chatHist = data['text'];\
                    form = document.getElementById(\"table\");\
                    while(form.rows.length != 0)\
                    {\
                        form.deleteRow(0);\
                    }\
                    if(data['length'] != 0)\
                    {\
                      for(var i = 0;i<data['length'];++i)\
                      {\
                          rowTemp = document.createElement('tr');\
                          colTemp = document.createElement('td');\
                          colTemp.innerHTML = chatHist[i];\
                          rowTemp.appendChild(colTemp);\
                          form.appendChild(rowTemp);\
                      }\
                    }\
                }\
            }\
        )\
    }\
    setInterval(function(){refreshText();},1000);\
</script>\
<body>\
<h1>Hello World From ESP32!</h1>\
<input placeholder = 'type in your name' id = 'name'></input>\
<input placeholder='type something to send to ESP32 server' id = 'input'></input><button onclick = 'sendAndRefresh()'>send</button>\
<table id = 'table' style='font-size: 20;color:rgb(0, 70, 140)'></table>\
<dev>\
";

String HTML2 = "</dev>\
</body>\
</html>";


String HTML404 = "\
<!DOCTYPE html>\
<html>\
<head>\
<style>\
h1{\
    text-align: center;\
    font-size: 30;\
    color: rgba(0, 150, 187, 0.767);\
}\
</style>\
</head>\
<body>\
<h1>404 Not Found!</h1>\
</body>\
</html>";

AsyncWebServer server(8080);  // Object of WebServer(HTTP port, 80 is defult)

void setup() {
  Serial.begin(115200);
  Serial.println("Try Connecting to ");
  Serial.println(ssid);

  // Connect to your wi-fi modem
  WiFi.begin(ssid, password);

  // Check wi-fi is connected to wi-fi network
  while (WiFi.status() != WL_CONNECTED) {
  delay(1000);
  Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected successfully");
  Serial.print("Got IP: ");
  Serial.println(WiFi.localIP());  //Show ESP32 IP on serial

  server.on("/", handle_root);
  server.on("/sendMes", handle_send);
  server.on("/refreshMes",handle_refresh);
  server.onNotFound(handleNotFound);
  server.begin();
  Serial.println("HTTP server started");
  delay(100);
}

void loop() {
}

void handle_root(AsyncWebServerRequest * request) 
{
  request -> send(200, "text/html", HTML1 + HTML2);
}

void handle_send(AsyncWebServerRequest * request)
{
  String message;
  if(request->params())message = request->getParam(0)->value().c_str();
  if(message!="")
  {
    //最多存储10条消息
    //Serial.print(message);
    //delay(1);
    if(cursorPos < 10)
    {
      chatHist[cursorPos] = message;
      cursorPos++;
    }
    else
    {
      for (int i = 0;i<9;i++)
      {
        chatHist[i] = chatHist[i+1];
      }
      chatHist[9] = message;
      cursorPos = 10;
    }
    
  }
  String mesBack = (String)("{") + "\"" + "length" + "\"" + ": ";
  mesBack = mesBack + cursorPos;
  mesBack = mesBack + ", " + "\"" + "text" + "\"" + ": [";
  
  if(cursorPos != 0)
  {
    for(int i = 0;i<cursorPos;i++)
    {
      mesBack = mesBack + "\"" + chatHist[i] + "\"" + ", ";
    }
    mesBack = mesBack.substring(0, mesBack.length() - 2);
  }
  mesBack = mesBack + "]}";
  //Serial.print(mesBack);
  //delay(1);
  request->send(200, "text/plain", mesBack);
}

void handle_refresh(AsyncWebServerRequest * request)
{
  String mesBack = (String)("{") + "\"" + "length" + "\"" + ": ";
  mesBack = mesBack + cursorPos;
  mesBack = mesBack + ", " + "\"" + "text" + "\"" + ": [";
  
  if(cursorPos != 0)
  {
    for(int i = 0;i<cursorPos;i++)
    {
      mesBack = mesBack + "\"" + chatHist[i] + "\"" + ", ";
    }
    mesBack = mesBack.substring(0, mesBack.length() - 2);
  }
  mesBack = mesBack + "]}";
  //Serial.print(mesBack);
  //delay(1);
  request->send(200, "text/plain", mesBack);
}

void handleNotFound(AsyncWebServerRequest * request)
{
  request->send(404, "text/html", HTML404);
}

几个注意事项

1、在手动拼接JSON字符串的时候记得键的引号使用双引号,不能使用单引号否则parse的时候报错

2、JSON串假如值包含数组(列表)的话,不要有多余的逗号,多余的逗号(假如是String的末两位的话使用以下代码去掉)

mesBack = mesBack.substring(0, mesBack.length() - 2);

其中的mesBack是String类型

3、在C++中插入长文本(比如上传到ESP32上的网页)的时候换行使用" \"

4、假如在String 串中需要出现双引号的话,使用  \"  代替 " 插入字符串

5、拼接String串之前可以先用一个String类型的对象做开头,使得后面拼接上的字符串自动转换为正确的类型

比如

String mesBack = (String)("{") + "\"" + "length" + "\"" + ": ";

服务器代码中的

  server.on("/", handle_root);
  server.on("/sendMes", handle_send);
  server.on("/refreshMes",handle_refresh);

分别针对不同的route

  server.onNotFound(handleNotFound);

则针对未注册的route的情况(比如404),同样可以自行指定返回的response类型和内容(比如以网页形式返回)

网页写的比较简陋,实现效果如图

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!对于基于 ESP32-CAM 和 OV2640 摄像头的监控开发,你可以按照以下步骤进行: 1. 硬件准备: - ESP32-CAM 开发板:它是一款集成了 ESP32 和 OV2640 摄像头的开发板,具备 Wi-Fi 和蓝牙功能。 - OV2640 摄像头模块:这是一款具有 200 万像素的摄像头模块,可连接到 ESP32-CAM 开发板。 2. 软件设置: - 安装 Arduino IDE:用于编译和上传代码到 ESP32-CAM 开发板。 - 安装 ESP32 开发环境:在 Arduino IDE 中添加 ESP32 开发板支持。 - 安装 ESP32-CAM 库:下载并安装 ESP32-CAM 库,使其与 Arduino IDE 兼容。 3. 连接硬件: - 将 OV2640 摄像头模块插入 ESP32-CAM 开发板上的摄像头接口。 - 将 ESP32-CAM 开发板连接到电脑上,使用 Micro USB 数据线进行供电和数据传输。 4. 编写代码: - 打开 Arduino IDE,并创建一个新的项目。 - 导入 ESP32-CAM 库,并选择正确的开发板和端口。 - 编写代码以初始化摄像头,并设置 Wi-Fi 连接。 - 编写代码以拍摄照片或录制视频,并将其保存到 SD 卡或通过 Wi-Fi 传输到远程服务器。 5. 上传和运行代码: - 编译代码并上传到 ESP32-CAM 开发板。 - 打开串口监视器以查看调试信息。 - 检查摄像头是否成功初始化,并根据代码逻辑执行相应的操作。 这是一个基本的开发流程,你可以根据自己的需求进行更多的功能扩展和优化。希望对你有所帮助!如果你还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值