ESP32-CAM 定时发送照片到服务器:WebSocket 示例及中文注释
ESP32-CAM 定时发送照片到服务器:WebSocket 示例及中文注释
以下是一个 ESP32-CAM 通过 WebSocket 定时发送照片给服务器的示例代码,附带中文注释:
#include <WiFi.h>
#include <WebSocketsClient.h>
#include <ArduinoJson.h>
#include "esp_camera.h"
#include "img_converters.h"
#include "fb_gfx.h"
#include "soc/soc.h"
#include "soc/rtc_cntl_reg.h"
// 定义 WiFi 信息
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
// 定义 WebSocket 服务器信息
const char* serverAddress = "your_SERVER_ADDRESS";
const int serverPort = 8080;
// 定义 WebSocket 客户端
WebSocketsClient webSocket;
// 定义摄像头分辨率和旋转角度
#define CAMERA_MODEL_AI_THINKER
#define PWDN_GPIO_NUM -1
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 4
#define SIOD_GPIO_NUM 18
#define SIOC_GPIO_NUM 23
#define Y9_GPIO_NUM 36
#define Y8_GPIO_NUM 37
#define Y7_GPIO_NUM 38
#define Y6_GPIO_NUM 39
#define Y5_GPIO_NUM 35
#define Y4_GPIO_NUM 14
#define Y3_GPIO_NUM 13
#define Y2_GPIO_NUM 34
#define VSYNC_GPIO_NUM 5
#define HREF_GPIO_NUM 27
#define PCLK_GPIO_NUM 25
#define D0_GPIO_NUM 32
#define D1_GPIO_NUM 33
#define D2_GPIO_NUM 15
#define D3_GPIO_NUM 2
#define D4_GPIO_NUM 0
#define D5_GPIO_NUM 4
#define D6_GPIO_NUM 16
#define D7_GPIO_NUM 17
#define CAM_RESOLUTION FRAMESIZE_VGA
#define CAM_ROTATION 0
// 初始化摄像头
void initCamera() {
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);
esp_err_t err = esp_camera_init(&camera_config);
if (err != ESP_OK) {
Serial.printf("Camera init failed with error 0x%x", err);
return;
}
sensor_t *sensor = esp_camera_sensor_get();
sensor->set_framesize(sensor, CAM_RESOLUTION);
sensor->set_vflip(sensor, 1);
sensor->set_hmirror(sensor, 1);
sensor->set_rotation(sensor, CAM_ROTATION);
}
// 定时器回调函数,用于定时发送照片给服务器
void sendPhoto() {
camera_fb_t *fb = esp_camera_fb_get();
if (!fb) {
Serial.println("Camera capture failed");
return;
}
// 将照片转换为 JPEG 格式
size_t jpegSize = 0;
uint8_t *jpegBuffer = NULL;
bool jpegConversionSuccess = frame2jpg(fb, 80, &jpegBuffer, &jpegSize);
esp_camera_fb_return(fb);
if (!jpegConversionSuccess) {
Serial.println("JPEG conversion failed");
return;
}
// 发送照片给服务器
webSocket.sendBIN(jpegBuffer, jpegSize);
free(jpegBuffer);
}
// WebSocket 事件处理函数
void webSocketEvent(WStype_t type, uint8_t *payload, size_t length) {
switch (type) {
case WStype_DISCONNECTED:
Serial.println("WebSocket disconnected");
break;
case WStype_CONNECTED:
Serial.println("WebSocket connected");
break;
case WStype_TEXT:
Serial.println("Received text message: '" + String((char*)payload) + "'");
break;
case WStype_BIN:
Serial.println("Received binary message");
break;
case WStype_ERROR:
Serial.println("WebSocket error");
break;
case WStype_FRAGMENT_TEXT_START:
Serial.println("Text fragment start");
break;
case WStype_FRAGMENT_BIN_START:
Serial.println("Binary fragment start");
break;
case WStype_FRAGMENT:
Serial.println("Fragment");
break;
case WStype_FRAGMENT_FIN:
Serial.println("Fragment end");
break;
}
}
void setup() {
Serial.begin(115200);
// 关闭串口 0,避免与摄像头通讯冲突
Serial.swap();
// 初始化 WiFi 连接
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("WiFi connected");
// 初始化摄像头
initCamera();
// 连接 WebSocket 服务器
webSocket.begin(serverAddress, serverPort, "/");
webSocket.onEvent(webSocketEvent);
// 定时器,每隔 5 秒钟发送一次照片给服务器
setInterval(5000, sendPhoto);
}
void loop() {
webSocket.loop();
}
实现步骤:
- 定义 WiFi 和 WebSocket 服务器信息。
- 初始化摄像头,并设置分辨率和旋转角度。
- 定义定时器回调函数
sendPhoto(),用于定时发送照片给服务器。 - 定义 WebSocket 事件处理函数
webSocketEvent(),用于处理 WebSocket 事件。 - 在
setup()函数中,连接 WiFi 和 WebSocket 服务器,初始化摄像头,设置定时器。 - 在
loop()函数中,调用webSocket.loop(),处理 WebSocket 事件。
注意事项:
- 由于 ESP32-CAM 的串口 0 与摄像头通讯冲突,因此在
setup()函数中需要调用Serial.swap()关闭串口 0。 - 由于 ESP32-CAM 的内存有限,需要注意内存使用情况,避免内存泄漏等问题。
希望此示例能够帮助您快速上手使用 ESP32-CAM 通过 WebSocket 定时发送照片到服务器。
原文地址: https://www.cveoy.top/t/topic/jM3O 著作权归作者所有。请勿转载和采集!