使用ESP32-CAM通过HTTP POST将照片发送到本地或云服务器

释放双眼,带上耳机,听听看~!

在本指南中,您将学习如何使用 ESP32-CAM 板和 Arduino IDE 发出 HTTP POST 请求以将照片发送到服务器。我们将展示如何将JPG图像发布到本地服务器(Raspberry Pi LAMP服务器)或云服务器(您可以从任何地方访问)。要将图像保存在服务器中,我们将使用 PHP。

ESP32-CAM-Camera-Board-Send-HTTP-Post-Request-Images-to-Local-Cloud-Server-Arduino-IDE

要构建此项目,您需要执行以下步骤。按照LAMP Server或Hosting Server的说明进行操作,这取决于您要在本地还是从任何地方访问照片。

  1. 托管您的PHP应用程序
    1. Raspberry Pi LAMP服务器(本地访问)
    2. 托管服务器(可从任何地方访问)
  2. PHP脚本可在服务器中保存和显示照片
    1. Raspberry Pi LAMP服务器(本地访问)
    2. 托管服务器,比如阿里云腾讯云之类的都可以,可以申请免费试用(可从任何地方访问)
  3. 使用Arduino IDE对ESP32-CAM进行编程
  4. 测试和最终演示

1.托管您的PHP程序

该项目的目标是拥有一个本地或云服务器来存储和访问您的ESP32-CAM照片。

1. Raspberry Pi本地服务器:

使用Raspberry Pi LAMP服务器,您可以在本地访问图像(如下图所示),这个环节需要有在树莓派搭建LAMP服务器的基础,这部分本篇教程不详细讲,可以参考这篇文章:点击查看

ESP32-CAM-Camera-Board-Send-Photo-Image-to-Raspberry-Pi-LAMP-Server-PHP-Script-Arduino
  • 您可以在Raspberry Pi上运行LAMP(Linux,Apache,MySQL,PHP)服务器,以访问本地网络中的数据。Raspberry Pi LAMP服务器:用于在本地访问映像的本地Linux服务器。

 

2.云服务器(阿里云解决方案)

您还可以通过访问您自己的服务器+域,在世界任何地方可视化ESP32-CAM照片。以下是有关其工作原理的概述:

ESP32-CAM-Camera-Board-Send-Photo-Image-to-Cloud-Server-PHP-Script-Arduino

 

建议购买学生主机,比较便宜,然后再购买域名,可以买最便宜的,当然不买也行。这是这个项目的有趣之处:你可以访问您的域名 (http://example.com) 并查看您的 ESP32-CAM 照片。如果不知道怎么操作的,可以联系作者指导购买和部署!

 

2.1. 准备您的.php文件并上传文件夹(Raspberry Pi LAMP 服务器)

本部分为您的 Raspberry Pi LAMP 服务器准备.php文件和上传文件夹。如果您使用自己的服务器 + 域名,请跳到下一部分。

让Raspberry Pi 运行 Apache 和 PHP,在 Raspberry Pi 板终端窗口中导航到/var/www/html/目录:

pi@raspberrypi:~ $ cd /var/www/html/

创建一个名为uploads的新文件夹:

pi@raspberrypi:/var/www/html $ mkdir uploads
pi@raspberrypi:/var/www/html $ ls
uploads

目前,/var/www/html归 root 所有,使用下一个命令更改为 pi 用户并授予其所有权限,以便您稍后可以使用 PHP 脚本保存照片。

sudo chown -R pi:pi /var/www/html
chmod -R 777 /var/www/html/

最后,新建一个upload.php文件:

pi@raspberrypi:/var/www/html $ nano upload.php

这个 PHP 脚本负责从 ESP32-CAM 接收传入的图像,用时间戳重命名图像并将它们存储在上传文件夹中。编辑新创建的文件(upload.php)并复制以下代码段:

<?php
// Code Based on this example: w3schools.com/php/php_file_upload.asp

$target_dir = "uploads/";
$datum = mktime(date('H')+0, date('i'), date('s'), date('m'), date('d'), date('y'));
$target_file = $target_dir . date('Y.m.d_H:i:s_', $datum) . basename($_FILES["imageFile"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));

// Check if image file is a actual image or fake image
if(isset($_POST["submit"])) {
  $check = getimagesize($_FILES["imageFile"]["tmp_name"]);
  if($check !== false) {
    echo "File is an image - " . $check["mime"] . ".";
    $uploadOk = 1;
  }
  else {
    echo "File is not an image.";
    $uploadOk = 0;
  }
}

// Check if file already exists
if (file_exists($target_file)) {
  echo "Sorry, file already exists.";
  $uploadOk = 0;
}

// Check file size
if ($_FILES["imageFile"]["size"] > 500000) {
  echo "Sorry, your file is too large.";
  $uploadOk = 0;
}

// Allow certain file formats
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
  echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
  $uploadOk = 0;
}

// Check if $uploadOk is set to 0 by an error
if ($uploadOk == 0) {
  echo "Sorry, your file was not uploaded.";
// if everything is ok, try to upload file
}
else {
  if (move_uploaded_file($_FILES["imageFile"]["tmp_name"], $target_file)) {
    echo "The file ". basename( $_FILES["imageFile"]["name"]). " has been uploaded.";
  }
  else {
    echo "Sorry, there was an error uploading your file.";
  }
}
?>

 

保存文件并退出(Ctrl+X、Y 和 Enter 键):

2.2. 准备您的.php文件和上传文件夹(云服务器)

如果您更喜欢远程运行服务器并从任何地方访问照片,您需要一个托管帐户,这里建议采用阿里云或腾讯云的学生主机,比较便宜,具体注册方法,这里就不详细讲解了,感兴趣的可以自己在百度上搜索下。

步骤如下:

  1. 注册云服务器
  2. 搭建php服务,新手推荐宝塔面板,简单方便
  3. 创建网站,没有域名的直接用ip访问也是ok的
  4. 上传php文件到网站根目录,php文件内容如下:

这个 PHP 脚本负责从 ESP32-CAM 接收传入的图像,用时间戳重命名图像并将它们存储在上传文件夹中。编辑新创建的文件 ( upload.php ) 并复制下面的代码段。保存您的文件并退出。

<?php
// Code Based on this example: w3schools.com/php/php_file_upload.asp

$target_dir = "uploads/";
$datum = mktime(date('H')+0, date('i'), date('s'), date('m'), date('d'), date('y'));
$target_file = $target_dir . date('Y.m.d_H:i:s_', $datum) . basename($_FILES["imageFile"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));

// Check if image file is a actual image or fake image
if(isset($_POST["submit"])) {
  $check = getimagesize($_FILES["imageFile"]["tmp_name"]);
  if($check !== false) {
    echo "File is an image - " . $check["mime"] . ".";
    $uploadOk = 1;
  }
  else {
    echo "File is not an image.";
    $uploadOk = 0;
  }
}

// Check if file already exists
if (file_exists($target_file)) {
  echo "Sorry, file already exists.";
  $uploadOk = 0;
}

// Check file size
if ($_FILES["imageFile"]["size"] > 500000) {
  echo "Sorry, your file is too large.";
  $uploadOk = 0;
}

// Allow certain file formats
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
  echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
  $uploadOk = 0;
}

// Check if $uploadOk is set to 0 by an error
if ($uploadOk == 0) {
  echo "Sorry, your file was not uploaded.";
// if everything is ok, try to upload file
}
else {
  if (move_uploaded_file($_FILES["imageFile"]["tmp_name"], $target_file)) {
    echo "The file ". basename( $_FILES["imageFile"]["name"]). " has been uploaded.";
  }
  else {
    echo "Sorry, there was an error uploading your file.";
  }
}
?>

 

3. ESP32-CAM HTTP 将图像/照片发布到服务器

现在您已准备好服务器(Raspberry Pi LAMP 服务器或云服务器),是时候准备带有代码的 ESP32-CAM,每 30 秒向您的服务器发布一次新图像。在继续本教程之前,请确保您完成以下先决条件。

所需零件

要遵循本教程,您需要以下组件:

  • 带OV2640的ESP32-CAM
  • FTDI编程器
  • 母对母连接线
  • ESP32-CAM 5V 电源
  • 树莓派本地服务器:
    • Raspberry Pi 板
    • MicroSD 卡 – 32GB Class10
    • 树莓派电源(5V 2.5A)
  • 云服务器(替代):阿里云或者腾讯云等云服务器

 

Arduino IDE

我们将 使用 Arduino IDE对 ESP32-CAM进行编程,因此请确保您已安装 ESP32环境组件。

一、ESP32开发环境搭建(arduino)

检查 PHP 网址

您应该尝试打开 Raspberry Pi 本地 IP 地址或您的外部 example.com 域名,然后是/upload.php应该返回:

Sorry, only JPG, JPEG, PNG & GIF files are allowed.Sorry, your file was not uploaded.
ESP32-CAM-Camera-Board-Upload-Files-Image

如果您看到该消息保存了您的 URL/域名和路径,则您的服务器应该已准备就绪,您可以继续阅读本指南。

ESP32-CAM代码

下一个程序使用 HTTP POST 将图像发布到服务器。将以下代码复制到您的Arduino IDE:

在上传代码之前,您需要在以下变量中插入您的网络凭据:

const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

确保选择正确的相机模块。在这种情况下,我们使用 AI-THINKER 模型。

添加您的 Raspberry Pi IP 地址或使用服务器域名:

String serverName = "192.168.1.XXX";   // REPLACE WITH YOUR Raspberry Pi IP ADDRESS
//String serverName = "example.com";   // OR REPLACE WITH YOUR DOMAIN NAME
String serverPath = "/upload.php";     // The default serverPath should be upload.php

上传代码到 ESP32-CAM

现在您可以将代码上传到您的 ESP32-CAM 板。使用FTDI 编程器将 ESP32-CAM 板连接到您的计算机。

按照下一个示意图:

ESP32-CAM-FTDI-programmer-5V-supply

许多FTDI编程器都有一个连接线,可让您选择3.3V或5V。确保连接线在正确的位置以选择5V。

重要的: 通用输入输出口 0 需要连接到 GND 这样您就可以上传代码。

ESP32-CAM FTDI编程器
GND GND
5伏 VCC(5V)
U0R TX
U0T 接收
通用输入输出口 0 GND

要上传代码,请按照以下步骤操作:

  1. 转到工具> 开发板并选择AI-Thinker ESP32-CAM。
  2. 转到工具>端口并选择 ESP32 连接的 COM 端口。
  3. 然后,单击上传按钮上传代码。
  4. 如下图所示,当您开始在调试窗口中看到这些点时,请按ESP32-CAM板载RST按钮。
dots-uploading-code

几秒钟后,该代码应成功上传到您的电路板上。

 

代码的工作原理

这是有关代码如何工作的快速解释:

  • 导入所有库;
  • 定义所需的变量;
  • 定义相机引脚;
  • 在 setup()  里面 您建立 Wi-Fi 连接并初始化 ESP32 相机。
  •  loop() 有一个定时器调用sendPhoto()每 30 秒运行一次。

这 sendPhoto()功能是实际拍摄照片并将其发送到您的服务器的部分。您可以在需要拍摄照片并将其发布到服务器的其它项目中使用该功能。

4. 测试和最终演示

将代码上传到您的开发板后,打开 Arduino IDE 串行监视器,您应该会看到每 30 秒打印一次类似的消息:

The file esp32-cam.jpg has been uploaded.
ESP32-CAM-esp32-cam-jpg-file-Arduino-IDE-Serial-Monitor

如果您访问本地服务器 URL http://IP-Address/uploads或云服务器 URL http://example.com/uploads,您应该有一个包含所有存储照片的文件夹。

ESP32-CAM-Camera-Board-Uploads-Folder-Images-stored-server

您可以单击每个链接以打开带有完整图像的新页面:

ESP32-CAM-Upload-Photo-to-Server-PHP-Arduino-IDE

给TA买糖
共{{data.count}}人
人已赞赏
ESP32-CAM免费项目动态

如何将程序上传到ESP32-CAM AI-Thinker(Arduino IDE)

2021-5-28 10:22:47

ESP32-CAM免费项目

使用ESP32-CAM将图像发布到本地或云服务器-PHP(Photo Manager)

2021-5-31 12:58:14

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索