使用ai thinker esp32-cam制作一个局域网可登录服务器(网页控制esp32响应)----自动车之网页操控

代码更改WiFi账号密码后,写入ai thinker esp32-cam 板即可运行。登录调试串口输出的IP地址即可

#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>

const char* ssid     = "iamMT";
const char* password = "meet2009";

WebServer server(80);

//Check if header is present and correct 检查收割台是否存在并正确
bool is_authentified() {    //authentified 认证的
  Serial.println("Enter is_authentified");
  if (server.hasHeader("Cookie")) {
    Serial.print("Found cookie: ");
    String cookie = server.header("Cookie");
    Serial.println(cookie);
    if (cookie.indexOf("ESPSESSIONID=1") != -1) {
      Serial.println("Authentification Successful");
      return true;
    }
  }
  Serial.println("Authentification Failed");
  return false;
}

//login page, also called for disconnect 登录页面,也称为断开连接
void handleLogin() {  //第一个网页显示及事件响应函数
  String msg = " \t\t";String msg_ = " \t\t";
  if (server.hasHeader("Cookie")) {   //网页请求事件判断
    Serial.print("Found cookie: ");
    String cookie = server.header("Cookie");
    Serial.println(cookie);
  }
  if (server.hasArg("DISCONNECT")) {    //点击超链接判断值
    Serial.println("Disconnection");
    server.sendHeader("Location", "/login");//定位到登录界面
    server.sendHeader("Cache-Control", "no-cache");//清空文本框
    server.sendHeader("Set-Cookie", "ESPSESSIONID=0");
    server.send(301);//是用于在 Web 服务器上发送一个 HTTP 301 响应的代码。HTTP 301 响应表示页面已被永久移动到另一个位置,浏览器会自动跳转到新位置
    return;
  }
  if(server.hasArg("SUBMIT")){ //登录按钮事件判断
    if (server.hasArg("USERNAME") && server.hasArg("PASSWORD")) {
      if (server.arg("USERNAME") == "admin" &&  server.arg("PASSWORD") == "admin") {    //server.arg("PASSWORD")获取文本框值
        server.sendHeader("Location", "/");   //定位到主界面
        server.sendHeader("Cache-Control", "no-cache");
        server.sendHeader("Set-Cookie", "ESPSESSIONID=1");
        server.send(301);//是用于在 Web 服务器上发送一个 HTTP 301 响应的代码。HTTP 301 响应表示页面已被永久移动到另一个位置,浏览器会自动跳转到新位置
        Serial.println("Log in Successful");
        return;
      }
      msg = "Wrong username/password! try again.";
      Serial.println("Log in Failed");      //调试串口显示
    }
  }
  if(server.hasArg("SUBMIT_test")){ //异登录按钮事件判断
    if (server.hasArg("USERNAME") && server.hasArg("PASSWORD")) {
      if (server.arg("USERNAME") == "admin" &&  server.arg("PASSWORD") == "admin") {    //server.arg("PASSWORD")获取文本框值
        server.sendHeader("Location", "/test");   //定位到/test界面
        server.sendHeader("Cache-Control", "no-cache");
        server.sendHeader("Set-Cookie", "ESPSESSIONID=1");
        server.send(301);//是用于在 Web 服务器上发送一个 HTTP 301 响应的代码。HTTP 301 响应表示页面已被永久移动到另一个位置,浏览器会自动跳转到新位置
        Serial.println("Log in Successful");
        return;
      }
      msg_ = "账号/密码错误,请重新输入!";
      Serial.println("Log in Failed");      //调试串口显示
    }
  }
  String content = "<html>\n<head>\n<meta  charset='UTF-8'>\n</head>\n";
  content += "<body>\n<form action='/login' method='POST'><p style = 'font-size: 32px;'>To log in, please use : admin/admin<br>\n";//第一行文本
  content += "User:<input type='text' name='USERNAME' placeholder='user name' style='width: 200px; height: 50px;font-size: 32px;'><br>\n";//第二行输入文本框
  content += "Password:<input type='password' name='PASSWORD' placeholder='password' style='width: 200px; height: 50px;font-size: 32px;'><br>\n";//第三行文本框
  content += "<input type='submit' name='SUBMIT' value='登录' style='width: 200px; height: 50px;font-size: 32px;'>" + msg + "<br>\n";//第四行按钮+第五行文本
  content += "<input type='submit' name='SUBMIT_test' value='异登录' style='width: 200px; height: 50px;font-size: 32px;'>" + msg_+"</form><br>\n";   //<form action='/login_test' method='POST'>按钮事件
  content += "You also can go </p><a href='/inline'>here</a>\n</body>\n</html>";//第六行文本+链接
  server.send(200, "text/html", content);   //发送登录前页面配置
  
}

void handletest(){
  String msg = " \t\t";
  if (server.hasHeader("Cookie")) {   //网页请求事件判断
    Serial.print("Found cookie: ");
    String cookie = server.header("Cookie");
    Serial.println(cookie);
  }
  if(server.hasArg("SUBMIT")){ //登录按钮事件判断
    if (server.hasArg("PASSWORD")) {
      if (server.arg("PASSWORD") == "admin") {    //server.arg("PASSWORD")获取文本框值
        server.sendHeader("Location", "/login");   //定位到主界面
        server.sendHeader("Cache-Control", "no-cache");
        server.sendHeader("Set-Cookie", "ESPSESSIONID=1");
        server.send(301);//是用于在 Web 服务器上发送一个 HTTP 301 响应的代码。HTTP 301 响应表示页面已被永久移动到另一个位置,浏览器会自动跳转到新位置
        Serial.println("Log in Successful");
        return;
      }
      msg = "密码输入错误,请重新输入!";
      Serial.println("Log in Failed");      //调试串口显示
    }
  }
  String content_test = "<html>\n<head>\n<p style'font-size: 32px;'></p>\n<meta  charset='UTF-8'>\n</head>\n";    //http-equiv='Content-Type' content='text/html'
  content_test += "<body>\n<form action='/test' method='POST'><p style = 'font-size: 32px;'>To log out, please click button退出\n";  
  content_test += "Password:<input type='password' name='PASSWORD' placeholder='password' style='width: 200px; height: 50px;font-size: 32px;'><br>\n";//第三行文本框
  content_test += "<input type='submit' name='SUBMIT' value='退出' style='width: 200px; height: 50px;font-size: 32px;'>" + msg + "<br>\n</form></p></body>\n</html>";
  server.send(200, "text/html", content_test);   //发送登录前页面配置
}

//root page can be accessed only if authentification is ok 只有在身份验证正常的情况下才能访问根页面
void handleRoot() {     //登录后网页
  Serial.println("Enter handleRoot");
  String header;
  if (!is_authentified()) {
    server.sendHeader("Location", "/login");
    server.sendHeader("Cache-Control", "no-cache");
    server.send(301);
    return;
  }
  String content = "<html>\n<body>\n\n<H2>hello, you successfully connected to esp8266!</H2><br>\n";
  if (server.hasHeader("User-Agent")) {
    content += "<p style = 'font-size: 32px;'>the user agent used is : " + server.header("User-Agent") + "<br><br>\n";    //User-Agent网页头数据
  }
  content += "You can access this page until you <a href=\"/login?DISCONNECT=YES\">disconnect</a>\n</p></body>\n</html>";// <a 地址 >代表超链接跳转地址
  server.send(200, "text/html", content);     //发送登录后页面配置
}

//no need authentification 无需身份验证
void handleNotFound() {
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i = 0; i < server.args(); i++) {
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);    //发送页面配置
}

void setup(void) {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());


  server.on("/", handleRoot);
  server.on("/login", handleLogin);
  server.on("/test", handletest);  
  server.on("/inline", []() {
    server.send(200, "text/plain", "<p style = 'font-size: 32px;'>this works without need of authentification</p>");
  });

  server.onNotFound(handleNotFound);
  //here the list of headers to be recorded 这是要录制的标题列表
  const char * headerkeys[] = {"User-Agent", "Cookie"} ;
  size_t headerkeyssize = sizeof(headerkeys) / sizeof(char*);
  //ask server to track these headers  要求服务器跟踪这些标头
  server.collectHeaders(headerkeys, headerkeyssize);  //用于收集服务器响应的请求头
  server.begin();
  Serial.println("HTTP server started");
}

void loop(void) {
  // unsigned long t = millis();
  server.handleClient();
  // unsigned long tt = millis() - t;
  // Serial.println(tt);
}

//网页事件响应机制不清楚

#include <WiFi.h>

#include <WiFiClient.h>

#include <WebServer.h>

const char* ssid     = "iamMT";

const char* password = "meet2009";

WebServer server(80);

//Check if header is present and correct 检查收割台是否存在并正确

bool is_authentified() {    //authentified 认证的

  Serial.println("Enter is_authentified");

  if (server.hasHeader("Cookie")) {

    Serial.print("Found cookie: ");

    String cookie = server.header("Cookie");

    Serial.println(cookie);

    if (cookie.indexOf("ESPSESSIONID=1") != -1) {

      Serial.println("Authentification Successful");

      return true;

    }

  }

  Serial.println("Authentification Failed");

  return false;

}

//login page, also called for disconnect 登录页面,也称为断开连接

void handleLogin() {  //第一个网页显示及事件响应函数

  String msg = " \t\t";String msg_ = " \t\t";

  if (server.hasHeader("Cookie")) {   //网页请求事件判断

    Serial.print("Found cookie: ");

    String cookie = server.header("Cookie");

    Serial.println(cookie);

  }

  if (server.hasArg("DISCONNECT")) {    //点击超链接判断值

    Serial.println("Disconnection");

    server.sendHeader("Location", "/login");//定位到登录界面

    server.sendHeader("Cache-Control", "no-cache");//清空文本框

    server.sendHeader("Set-Cookie", "ESPSESSIONID=0");

    server.send(301);//是用于在 Web 服务器上发送一个 HTTP 301 响应的代码。HTTP 301 响应表示页面已被永久移动到另一个位置,浏览器会自动跳转到新位置

    return;

  }

  if(server.hasArg("SUBMIT")){ //登录按钮事件判断

    if (server.hasArg("USERNAME") && server.hasArg("PASSWORD")) {

      if (server.arg("USERNAME") == "admin" &&  server.arg("PASSWORD") == "admin") {    //server.arg("PASSWORD")获取文本框值

        server.sendHeader("Location", "/");   //定位到主界面

        server.sendHeader("Cache-Control", "no-cache");

        server.sendHeader("Set-Cookie", "ESPSESSIONID=1");

        server.send(301);//是用于在 Web 服务器上发送一个 HTTP 301 响应的代码。HTTP 301 响应表示页面已被永久移动到另一个位置,浏览器会自动跳转到新位置

        Serial.println("Log in Successful");

        return;

      }

      msg = "Wrong username/password! try again.";

      Serial.println("Log in Failed");      //调试串口显示

    }

  }

  if(server.hasArg("SUBMIT_test")){ //异登录按钮事件判断

    if (server.hasArg("USERNAME") && server.hasArg("PASSWORD")) {

      if (server.arg("USERNAME") == "admin" &&  server.arg("PASSWORD") == "admin") {    //server.arg("PASSWORD")获取文本框值

        server.sendHeader("Location", "/test");   //定位到/test界面

        server.sendHeader("Cache-Control", "no-cache");

        server.sendHeader("Set-Cookie", "ESPSESSIONID=1");

        server.send(301);//是用于在 Web 服务器上发送一个 HTTP 301 响应的代码。HTTP 301 响应表示页面已被永久移动到另一个位置,浏览器会自动跳转到新位置

        Serial.println("Log in Successful");

        return;

      }

      msg_ = "账号/密码错误,请重新输入!";

      Serial.println("Log in Failed");      //调试串口显示

    }

  }

  String content = "<html>\n<head>\n<meta  charset='UTF-8'>\n</head>\n";

  content += "<body>\n<form action='/login' method='POST'><p style = 'font-size: 32px;'>To log in, please use : admin/admin<br>\n";//第一行文本

  content += "User:<input type='text' name='USERNAME' placeholder='user name' style='width: 200px; height: 50px;font-size: 32px;'><br>\n";//第二行输入文本框

  content += "Password:<input type='password' name='PASSWORD' placeholder='password' style='width: 200px; height: 50px;font-size: 32px;'><br>\n";//第三行文本框

  content += "<input type='submit' name='SUBMIT' value='登录' style='width: 200px; height: 50px;font-size: 32px;'>" + msg + "<br>\n";//第四行按钮+第五行文本

  content += "<input type='submit' name='SUBMIT_test' value='异登录' style='width: 200px; height: 50px;font-size: 32px;'>" + msg_+"</form><br>\n";   //<form action='/login_test' method='POST'>按钮事件

  content += "You also can go </p><a href='/inline'>here</a>\n</body>\n</html>";//第六行文本+链接

  server.send(200, "text/html", content);   //发送登录前页面配置

}

void handletest(){

  String msg = " \t\t";

  if (server.hasHeader("Cookie")) {   //网页请求事件判断

    Serial.print("Found cookie: ");

    String cookie = server.header("Cookie");

    Serial.println(cookie);

  }

  if(server.hasArg("SUBMIT")){ //登录按钮事件判断

    if (server.hasArg("PASSWORD")) {

      if (server.arg("PASSWORD") == "admin") {    //server.arg("PASSWORD")获取文本框值

        server.sendHeader("Location", "/login");   //定位到主界面

        server.sendHeader("Cache-Control", "no-cache");

        server.sendHeader("Set-Cookie", "ESPSESSIONID=1");

        server.send(301);//是用于在 Web 服务器上发送一个 HTTP 301 响应的代码。HTTP 301 响应表示页面已被永久移动到另一个位置,浏览器会自动跳转到新位置

        Serial.println("Log in Successful");

        return;

      }

      msg = "密码输入错误,请重新输入!";

      Serial.println("Log in Failed");      //调试串口显示

    }

  }

  String content_test = "<html>\n<head>\n<p style'font-size: 32px;'></p>\n<meta  charset='UTF-8'>\n</head>\n";    //http-equiv='Content-Type' content='text/html'

  content_test += "<body>\n<form action='/test' method='POST'><p style = 'font-size: 32px;'>To log out, please click button退出\n";  

  content_test += "Password:<input type='password' name='PASSWORD' placeholder='password' style='width: 200px; height: 50px;font-size: 32px;'><br>\n";//第三行文本框

  content_test += "<input type='submit' name='SUBMIT' value='退出' style='width: 200px; height: 50px;font-size: 32px;'>" + msg + "<br>\n</form></p></body>\n</html>";

  server.send(200, "text/html", content_test);   //发送登录前页面配置

}

//root page can be accessed only if authentification is ok 只有在身份验证正常的情况下才能访问根页面

void handleRoot() {     //登录后网页

  Serial.println("Enter handleRoot");

  String header;

  if (!is_authentified()) {

    server.sendHeader("Location", "/login");

    server.sendHeader("Cache-Control", "no-cache");

    server.send(301);

    return;

  }

  String content = "<html>\n<body>\n\n<H2>hello, you successfully connected to esp8266!</H2><br>\n";

  if (server.hasHeader("User-Agent")) {

    content += "<p style = 'font-size: 32px;'>the user agent used is : " + server.header("User-Agent") + "<br><br>\n";    //User-Agent网页头数据

  }

  content += "You can access this page until you <a href=\"/login?DISCONNECT=YES\">disconnect</a>\n</p></body>\n</html>";// <a 地址 >代表超链接跳转地址

  server.send(200, "text/html", content);     //发送登录后页面配置

}

//no need authentification 无需身份验证

void handleNotFound() {

  String message = "File Not Found\n\n";

  message += "URI: ";

  message += server.uri();

  message += "\nMethod: ";

  message += (server.method() == HTTP_GET) ? "GET" : "POST";

  message += "\nArguments: ";

  message += server.args();

  message += "\n";

  for (uint8_t i = 0; i < server.args(); i++) {

    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";

  }

  server.send(404, "text/plain", message);    //发送页面配置

}

void setup(void) {

  Serial.begin(115200);

  WiFi.mode(WIFI_STA);

  WiFi.begin(ssid, password);

  Serial.println("");

  // Wait for connection

  while (WiFi.status() != WL_CONNECTED) {

    delay(500);

    Serial.print(".");

  }

  Serial.println("");

  Serial.print("Connected to ");

  Serial.println(ssid);

  Serial.print("IP address: ");

  Serial.println(WiFi.localIP());


 

  server.on("/", handleRoot);

  server.on("/login", handleLogin);

  server.on("/test", handletest);  

  server.on("/inline", []() {

    server.send(200, "text/plain", "<p style = 'font-size: 32px;'>this works without need of authentification</p>");

  });

  server.onNotFound(handleNotFound);

  //here the list of headers to be recorded 这是要录制的标题列表

  const char * headerkeys[] = {"User-Agent", "Cookie"} ;

  size_t headerkeyssize = sizeof(headerkeys) / sizeof(char*);

  //ask server to track these headers  要求服务器跟踪这些标头

  server.collectHeaders(headerkeys, headerkeyssize);  //用于收集服务器响应的请求头

  server.begin();

  Serial.println("HTTP server started");

}

void loop(void) {

  // unsigned long t = millis();

  server.handleClient();

  // unsigned long tt = millis() - t;

  // Serial.println(tt);

}

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是ESP32-cam触发拍照并将照片上传到FTP服务器的例子代码: ```c++ #include "WiFi.h" #include "esp_camera.h" #include <WiFiClient.h> #include <WiFiClientSecure.h> #include <ESP_FTPClient.h> // Replace with your network credentials const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; // FTP server credentials const char* ftp_server = "your_FTP_SERVER"; const char* ftp_user = "your_FTP_USERNAME"; const char* ftp_password = "your_FTP_PASSWORD"; // Pin definition for CAMERA_MODEL_AI_THINKER #define PWDN_GPIO_NUM 32 #define RESET_GPIO_NUM -1 #define XCLK_GPIO_NUM 0 #define SIOD_GPIO_NUM 26 #define SIOC_GPIO_NUM 27 #define Y9_GPIO_NUM 35 #define Y8_GPIO_NUM 34 #define Y7_GPIO_NUM 39 #define Y6_GPIO_NUM 36 #define Y5_GPIO_NUM 21 #define Y4_GPIO_NUM 19 #define Y3_GPIO_NUM 18 #define Y2_GPIO_NUM 5 #define VSYNC_GPIO_NUM 25 #define HREF_GPIO_NUM 23 #define PCLK_GPIO_NUM 22 void setup() { Serial.begin(115200); // Connect to Wi-Fi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } // Initialize camera camera_config_t config; config.ledc_channel = LEDC_CHANNEL_0; config.ledc_timer = LEDC_TIMER_0; config.pin_d0 = Y2_GPIO_NUM; config.pin_d1 = Y3_GPIO_NUM; config.pin_d2 = Y4_GPIO_NUM; config.pin_d3 = Y5_GPIO_NUM; config.pin_d4 = Y6_GPIO_NUM; config.pin_d5 = Y7_GPIO_NUM; config.pin_d6 = Y8_GPIO_NUM; config.pin_d7 = Y9_GPIO_NUM; config.pin_xclk = XCLK_GPIO_NUM; config.pin_pclk = PCLK_GPIO_NUM; config.pin_vsync = VSYNC_GPIO_NUM; config.pin_href = HREF_GPIO_NUM; config.pin_sscb_sda = SIOD_GPIO_NUM; config.pin_sscb_scl = SIOC_GPIO_NUM; config.pin_pwdn = PWDN_GPIO_NUM; config.pin_reset = RESET_GPIO_NUM; config.xclk_freq_hz = 20000000; config.pixel_format = PIXFORMAT_JPEG; if (psramFound()) { config.frame_size = FRAMESIZE_UXGA; config.jpeg_quality = 10; config.fb_count = 2; } else { config.frame_size = FRAMESIZE_SVGA; config.jpeg_quality = 12; config.fb_count = 1; } esp_err_t err = esp_camera_init(&config); if (err != ESP_OK) { Serial.printf("Camera init failed with error 0x%x", err); return; } // Take picture and upload to FTP server camera_fb_t * fb = NULL; fb = esp_camera_fb_get(); if (!fb) { Serial.println("Failed to capture image"); return; } FTPClient ftp; if (ftp.connect(ftp_server, ftp_user, ftp_password)) { Serial.println("Connected to FTP server"); if (ftp.put(fb->buf, fb->len, "picture.jpg", "pictures")) { Serial.println("Picture uploaded successfully"); } else { Serial.println("Failed to upload picture"); } ftp.quit(); } else { Serial.println("Failed to connect to FTP server"); } esp_camera_fb_return(fb); } void loop() { } ``` 这个例子中,我们首先连接到Wi-Fi网络,然后初始化ESP32-cam相机。接着,我们采集一张图片,并将其上传到FTP服务器上。你需要将其中的`your_SSID`、`your_PASSWORD`、`your_FTP_SERVER`、`your_FTP_USERNAME`和`your_FTP_PASSWORD`替换为你自己的网络和FTP服务器凭据。同时,你还需要安装ESP_FTPClient库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值