在本指南中,您将学习如何使用 ESP32-CAM 板和 Arduino IDE 发出 HTTP POST 请求以将照片发送到服务器。我们将展示如何将JPG图像发布到本地服务器(Raspberry Pi LAMP服务器)或云服务器(您可以从任何地方访问)。要将图像保存在服务器中,我们将使用 PHP。
要构建此项目,您需要执行以下步骤。按照LAMP Server或Hosting Server的说明进行操作,这取决于您要在本地还是从任何地方访问照片。
- 托管您的PHP应用程序
- Raspberry Pi LAMP服务器(本地访问)
- 托管服务器(可从任何地方访问)
- PHP脚本可在服务器中保存和显示照片
- Raspberry Pi LAMP服务器(本地访问)
- 托管服务器,比如阿里云腾讯云之类的都可以,可以申请免费试用(可从任何地方访问)
- 使用Arduino IDE对ESP32-CAM进行编程
- 测试和最终演示
目录
1.托管您的PHP程序
该项目的目标是拥有一个本地或云服务器来存储和访问您的ESP32-CAM照片。
1. Raspberry Pi本地服务器:
使用Raspberry Pi LAMP服务器,您可以在本地访问图像(如下图所示),这个环节需要有在树莓派搭建LAMP服务器的基础,这部分本篇教程不详细讲,可以参考这篇文章:点击查看
- 您可以在Raspberry Pi上运行LAMP(Linux,Apache,MySQL,PHP)服务器,以访问本地网络中的数据。Raspberry Pi LAMP服务器:用于在本地访问映像的本地Linux服务器。
2.云服务器(阿里云解决方案)
您还可以通过访问您自己的服务器+域,在世界任何地方可视化ESP32-CAM照片。以下是有关其工作原理的概述:
建议购买学生主机,比较便宜,然后再购买域名,可以买最便宜的,当然不买也行。这是这个项目的有趣之处:你可以访问您的域名 (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文件和上传文件夹(云服务器)
如果您更喜欢远程运行服务器并从任何地方访问照片,您需要一个托管帐户,这里建议采用阿里云或腾讯云的学生主机,比较便宜,具体注册方法,这里就不详细讲解了,感兴趣的可以自己在百度上搜索下。
步骤如下:
- 注册云服务器
- 搭建php服务,新手推荐宝塔面板,简单方便
- 创建网站,没有域名的直接用ip访问也是ok的
- 上传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环境组件。
检查 PHP 网址
您应该尝试打开 Raspberry Pi 本地 IP 地址或您的外部 example.com 域名,然后是/upload.php应该返回:
Sorry, only JPG, JPEG, PNG & GIF files are allowed.Sorry, your file was not uploaded.
如果您看到该消息保存了您的 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 板连接到您的计算机。
按照下一个示意图:
许多FTDI编程器都有一个连接线,可让您选择3.3V或5V。确保连接线在正确的位置以选择5V。
重要的: 通用输入输出口 0 需要连接到 GND 这样您就可以上传代码。
ESP32-CAM | FTDI编程器 |
GND | GND |
5伏 | VCC(5V) |
U0R | TX |
U0T | 接收 |
通用输入输出口 0 | GND |
要上传代码,请按照以下步骤操作:
- 转到工具> 开发板并选择AI-Thinker ESP32-CAM。
- 转到工具>端口并选择 ESP32 连接的 COM 端口。
- 然后,单击上传按钮上传代码。
- 如下图所示,当您开始在调试窗口中看到这些点时,请按ESP32-CAM板载RST按钮。
几秒钟后,该代码应成功上传到您的电路板上。
代码的工作原理
这是有关代码如何工作的快速解释:
- 导入所有库;
- 定义所需的变量;
- 定义相机引脚;
- 在 setup() 里面 您建立 Wi-Fi 连接并初始化 ESP32 相机。
- loop() 有一个定时器调用sendPhoto()每 30 秒运行一次。
这 sendPhoto()功能是实际拍摄照片并将其发送到您的服务器的部分。您可以在需要拍摄照片并将其发布到服务器的其它项目中使用该功能。
4. 测试和最终演示
将代码上传到您的开发板后,打开 Arduino IDE 串行监视器,您应该会看到每 30 秒打印一次类似的消息:
The file esp32-cam.jpg has been uploaded.
如果您访问本地服务器 URL http://IP-Address/uploads或云服务器 URL http://example.com/uploads,您应该有一个包含所有存储照片的文件夹。
您可以单击每个链接以打开带有完整图像的新页面:
esp32-cam的程序如果一直报错怎么办啊 编译不通过 楼主求解答
C:UserslimitDesktopimageFileimageFile.ino: In function ‘String sendPhoto()’:
imageFile:117:86: error: unable to find string literal operator ‘operator””esp32’ with ‘const char [72]’, ‘unsigned int’ arguments
String head = “–RandomNerdTutorialsrnContent-Disposition: form-data; name=”esp32″; filename=”esp32-cam.jpg”rnContent-Type: image/jpegrnrn”;
^
imageFile:117:105: error: ‘cam’ was not declared in this scope
String head = “–RandomNerdTutorialsrnContent-Disposition: form-data; name=”esp32″; filename=”esp32-cam.jpg”rnContent-Type: image/jpegrnrn”;
^
exit status 1
unable to find string literal operator ‘operator””esp32’ with ‘const char [72]’, ‘unsigned int’ arguments
你用的如果是最新版本的库,有可能一些规范升级了,用旧版本的库试试
为什么我串口监视器一直…图片穿不上呢?
首先要联网,你看看设备连上网了没
我也报这个错,能具体说说是哪个旧版本的吗😭
你解决了吗??求教
大佬你解决了嘛?求教
遇到什么问题了?
作者我还是遇到这个报错,我在网上搜到这个是个C语言到C++的一个编译问题,可是我按照C++的方式改了以后任然不能正常运行。
私信你微信加我,我看看具体问题
私信你了,站长
环境问题建议用云端arduino编译器,客户端已经做好了适配,可以正常编译和上传程序了:https://notes.qutaojiao.com
可是即使用了云端调试的这个编译器报的错误也和我在本地的报错一样,这次完完全全照搬你的代码后按前面的大神改的。
我把可运行的程序放在这里面了,你看看
有个作者针对这篇教程写了补充版本的文章,代码有个地方网站把转义字符给去掉了,加不上去,要自己手动加一下
我购买了腾讯云的宝塔面板,但不知道如何搭建php服务。也没有买域名,现在卡这了。跪求教程
后面我再出个宝塔的教程吧!
搬运国外的代码还需要下载积分,直接搜国外的就好了
本网站是追求高质量的创客教程网站,每一篇文章都尽量保证有效,如果你喜欢看自己搜索的零零散散的文章,喜欢其他网站的文章,不妨出门右拐。网站维护需要成本,域名,服务器的续费,都是靠大家捐赠或者打赏建立起来的,这个网站并不挣钱,只是为了方便创客朋友们少走一些弯路,我才一直维护下去的,你积分不够,可以通过发表文章的形式获取,写文章和维护这个网站也不容易,劳动换劳动,这是最基本的原则。
好
我搞出来了,(首先保证服务器配了阿帕奇、mysql、php,有uploads文件夹等),esp32代码有错,很多rn都缺少转义字符,head里的双引号也要加,这些修改了之后,串口监视器返回”Sorry, there was an error uploading your file.”,修改文件夹权限为777之后就成功了sudo chmod -R 777 uploads
强,一看就是大神,可以写个教程分享一下?
我简单写了下,可以看下我发布的,还是要谢谢你的文章?
大神关于本篇文章补充的内容,感谢楼上 @浅蓝 的分享 https://www.qutaojiao.com/108463.html
?找了这么久,谢谢
?请问这个会是怎么回事
没遇到过这错误呀,你看看是不是啥文件路径不对。
网页是通过宝塔建的,然后出现了403的报错,80口开了,不知道是不是宝塔本身的www文件,755权限导致的?
你这php服务开了没有啊
开着的
你得先保证直接浏览器可以访问,或者用在线的post/get工具看看数据通不通
里面的php文件访问得了,但是uploads就是爆403,我检查了80口开着,php,apache也是都在服务的,请问域名的地方直接填的ip地址可以吗,就是没有域名注册,没有备案那些?
你有没有开防火墙呀看看
没有,请问需要开ftp或者mysql吗
不需要,php服务就行
站长,可以有偿咨询吗,?我是主集成电路的,对这方面确实不太熟
过段时间我出个宝塔的教程吧
试一下测试接口:
gp.qutaojiao.com/test/upload.php
gp.qutaojiao.com/test/uploads/
嗯,浏览器打开这两个一切正常
先看看用测试接口行不行,也不行的话那就是硬件上的程序的问题,还得看看arduino程序
就是我试了一下,在uploads里放1.txt,然后访问iP/uploads/1.txt是可以看的,就是没办法看文件夹的内容
你先用这个测试接口弄gp.qutaojiao.com/test/upload.php,要是你图片成功上传了,访问gp.qutaojiao.com/test/uploads/就可以看到你上传的图片。在程序里把这两条代码换成:
String serverName = “gp.qutaojiao.com”; // REPLACE WITH YOUR Raspberry Pi IP ADDRESS
String serverPath = “/test/upload.php”;
嗯,这样应该算正常吧,但是测试端口看不见我的图片
正常的,现在打开gp.qutaojiao.com/test/uploads/可以正常看到你自己上传的照片了,每次上传完要刷新一下下网页,比较简陋现在,测试够用了
测试:
我看到你图片上传成功了,我网页显示程序写的不大对,我改改,你待会应该能看到自己的照片
看到了,看来还是网站的问题??
我现在自己的云服务器文件夹可以收到自己的图片了,现在就只有网页上没办法呈现文件夹内容了?
看这篇文章:https://www.qutaojiao.com/108519.html
?太强了,谢谢大佬?
知道为啥403了,宝塔里的,浏览器直接访问文件夹是不行的,你直接上去看看照片传到uploads的目录没有,有的话,那就表示照片可以正常上传,后面解决网页显示的问题就可以了
为啥到了esp32这就没有代码了呢,UDP图片数据传输与解码就没有了
可以实现吗?
[…] […]
站长,请问esp32-cam是不是会自动进入Modem-sleep状态,如果不能,我应该代码应该怎么加让他能够更低功耗的工作?
你参考一下这篇文章https://blog.51cto.com/u_15284384/3051452
都差不多
好的,谢谢?
博主你好,请问我想从云服务器发送消息回来该怎么实现啊?
服务器端做好接口,单片机通过http接口post方式可以发送消息
post传输需要怎么设置
程序烧录后运行,一直重启,什么原因?
这个文件太大好像不得行,测试了一下大概超过500kb就不行了,谁能指点指点
大佬厉害,关键还不明白POST是啥意思
另外请教楼主一个问题,post方法是不是最时候图片传输的?esp可以做视频流传输吗?
好文章,学习了,写的很详细
没有这个:The file esp32-cam.jpg has been uploaded.