• 方案介绍
  • 附件下载
  • 相关推荐
申请入驻 产业图谱

【嵌入式外设】ESP32-CAM通过 MQTT 远程发送图片(Bate64)数据

09/11 08:48
2118
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

联系方式.docx

共1个文件

前言

本文介绍了如何使用ESP32-CAM通过MQTT协议实现远程图像传输。内容包括环境配置(Arduino IDE)、资料获取、MQTT服务搭建、实现效果(串口输出Base64数据、数据校验、远程传输和图片拼接)以及示例代码。代码实现了每10秒自动拍摄并分段发送图像数据到指定MQTT主题的功能,适用于需要远程监控的场景。

关键词:ESP32-CAM, MQTT, 图像传输, Base64, Arduino IDE

一、环境配置

这个都是老生常谈了,就不过多叙述,还是附上链接 我们开发的每款芯片都离不开环境的配置,工欲善其事,必先利其器啦,这里我介绍使用两种方式去开发我们的ESP32系列

1.Arduino IDE

Arduino的环境我之前有提到和配置过,这里我就直接附上连接,安装教程配置即可
Arduino IDE 使用安装以及ESP32库的导入(离线)https://blog.csdn.net/herui_2/article/details/135296814?spm=1001.2014.3001.5501https://blog.csdn.net/herui_2/article/details/135296814?spm=1001.2014.3001.5501

二、资料获取

1.关注微信公众号--星之援工作室 发送关键字(ESP32-CAM)

????

2.资料说明

因为这边是基于之前项目代码来改动的,所以按照之前项目的代码,然后自行把文章代码进行覆盖上去,然后因为这里因为使用了 MQTT服务部分 所以还需要在线添加一些资源库 可以参考下面这边文章

3.MQTT服务搭建参考

ESP32/ESP8622 -- 使用MQTT协议连接云平台(带图文说明https://herui.blog.csdn.net/article/details/135317019?spm=1001.2014.3001.5502

三、实现效果

1.通过串口输出 Base64 数据

这个是程序转化的图片 base64数据

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

2.检验输出的 Base64数据是否正确

这个方法的话很简单,只需要打开一个网页 在浏览器地址栏输入 data:image/png;base64,+生成的base64码

data:image/png;base64,

就可以得到你转化后的图片然后程序到网页中

3.通过 MQTT 服务 发送到远程订阅的设备

这个就需要两个设备 通过订阅设备发送的mqtt主题 实现base64 数据的发送,应为数据过长,所以采用了分段发送,每段最长数据我规定的512

4.拼接 MQTT 数据 转化成图片

这样我们远程设备就可以收到数据,通过把接收数据拼接起来,就可以得到我们的图片数据,这个就需要我们根据实现需要实现的设备进行一个修改了,这里我就暂时不添加解析软件,下次会发使用Android 解析然后转化成图片的一个例程

四、示例代码

这个代码实现的效果是 每10s 拍摄一次 然后自动发送给需要发布的主题,当然 这个因为需要使用到服务器 所以肯定需要联网

#include <WiFi.h>
#include <PubSubClient.h>
#include "esp_camera.h"
#include <base64.h>
// 在文件开头添加必要的头文件
#include <algorithm> // 用于std::min函数
// 选择相机模型
#define CAMERA_MODEL_AI_THINKER
 
// 相机引脚配置
#include "camera_pins.h"
 
// 设置wifi接入信息
const char* ssid = "NET";
const char* password = "12345678";
const char* mqttServer = "8.133.197.10";
 
// MQTT认证信息
const char* mqttUserName = "147-1-device";
const char* mqttPassword = "147-1-device";
const char* clientId = "147-1-device";
const char* subTopic = "/broadcast/1471/test1";
const char* pubTopic = "/broadcast/1471/test2";
const char* imgTopic = "/broadcast/1471/cam/image"; // 图像发布主题
 
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
 
// 图像相关变量
bool captureAndSend = false;
unsigned long lastCaptureTime = 0;
const unsigned long captureInterval = 10000; // 10秒捕获一次
 
void setup() {
  Serial.begin(115200);
  Serial.setDebugOutput(true);
  
  // 初始化相机
  cameraBegin();
  
  // 设置ESP32工作模式为无线终端模式
  WiFi.mode(WIFI_STA);
  
  // 连接WiFi
  connectWifi();
  
  // 设置MQTT服务器和端口号
  mqttClient.setServer(mqttServer, 1883);
  mqttClient.setCallback(receiveCallback);
  
  // 连接MQTT服务器
  connectMQTTserver();
  
  // 设置闪光灯引脚
  pinMode(4, OUTPUT);
  digitalWrite(4, LOW);
}
 
void loop() {
  // 如果开发板未能成功连接服务器,则尝试连接服务器
  if (!mqttClient.connected()) {
    connectMQTTserver();
  }
  
  // 处理MQTT消息
  mqttClient.loop();
  
  // 定期捕获并发送图像
  if (millis() - lastCaptureTime > captureInterval || captureAndSend) {
    if (captureAndSend) {
      captureAndSend = false;
    }
    
    captureAndSendImage();
    lastCaptureTime = millis();
  }
  
  delay(100);
}
 
// 连接MQTT服务器并订阅信息
void connectMQTTserver() {
  if (mqttClient.connect(clientId, mqttUserName, mqttPassword, 0, 0, 0, 0, 1)) {
    Serial.println("MQTT Server Connected.");
    subscribeTopic();  // 订阅指定主题
  } else {
    Serial.print("MQTT Server Connect Failed. Client State:");
    Serial.println(mqttClient.state());
    delay(5000);
  }
}
 
// 收到信息后的回调函数
void receiveCallback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message Received [");
  Serial.print(topic);
  Serial.print("] ");
  
  String message;
  for (int i = 0; i < length; i++) {
    message += (char)payload[i];
  }
  Serial.println(message);
  
  // 如果收到捕获图像的指令
  if (message == "capture") {
    captureAndSend = true;
  }
}
 
// 订阅指定主题
void subscribeTopic() {
  if (mqttClient.subscribe(subTopic, 1)) {
    Serial.println("Subscribed to: " + String(subTopic));
  } else {
    Serial.print("Subscribe Fail...");
  }
}
 
// ESP8266连接wifi
void connectWifi() {
  WiFi.begin(ssid, password);
  
  //等待WiFi连接,成功连接后输出成功信息
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi Connected!");
  Serial.print("IP Address: ");
  Serial.println(WiFi.localIP());
}
 
// 捕获并发送图像
void captureAndSendImage() {
  Serial.println("Capturing image...");
  
  // 打开闪光灯
  digitalWrite(4, HIGH);
  delay(200);
  
  // 捕获图像
  camera_fb_t *fb = esp_camera_fb_get();
  if (!fb) {
    Serial.println("Camera capture failed");
    digitalWrite(4, LOW);
    return;
  }
  
  // 关闭闪光灯
  digitalWrite(4, LOW);
  
  Serial.printf("Image captured! Size: %d bytesn", fb->len);
  
  // 将图像数据转换为Base64编码
  String imageData = base64::encode((uint8_t *)fb->buf, fb->len);
  
  // 释放图像缓冲区
  esp_camera_fb_return(fb);
  
  // 计算需要分多少块发送
  int chunkSize = 512; // MQTT消息最大长度限制
  int totalChunks = (imageData.length() + chunkSize - 1) / chunkSize;
  String chunkMsg;
  Serial.printf("Image encoded to Base64. Length: %d, Chunks: %dn", imageData.length(), totalChunks);
 
  // 发送图像信息(总块数)
  String infoMsg = "{"chunks":" + String(totalChunks) + "}";
  //mqttClient.publish(imgTopic, infoMsg.c_str());
 
  // 分块发送图像数据
  for (int i = 0; i < totalChunks; i++) {
    int start = i * chunkSize;
    int end = std::min((i + 1) * chunkSize, (int)imageData.length()); // 修复的行
    
    String chunk = imageData.substring(start, end);
    
    // 创建包含块索引和数据的消息
    chunkMsg = "{"index":" + String(i) + ","data":"" + chunk + ""}";
    
    // 发布块数据
    mqttClient.publish(imgTopic, chunkMsg.c_str());
    Serial.printf("%s", chunk.c_str()); // 使用格式字符串和 c_str() 方法
    //Serial.printf("Sent chunk %d/%dn", i + 1, totalChunks);
    chunkMsg = "";
    delay(500); // 短暂延迟以确保MQTT客户端处理消息
  }
  Serial.println("n");
  Serial.println("Image sent completely");
}
// 相机初始化
void cameraBegin() {
  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;
  
  // 使用较低的分辨率和更高的压缩比来减少图像大小
  config.frame_size = FRAMESIZE_QVGA; // 320x240 分辨率
  config.jpeg_quality = 15; // 更高的压缩比(数值越大,质量越低,文件越小)
  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;
  }
 
  sensor_t *s = esp_camera_sensor_get();
  // 初始设置
  if (s->id.PID == OV3660_PID) {
    s->set_vflip(s, 1); // 翻转
    s->set_brightness(s, 0); // 降低亮度
    s->set_saturation(s, -2); // 降低饱和度
    s->set_contrast(s, 0); // 降低对比度
  }
  
  // 确保使用较低的分辨率
  s->set_framesize(s, FRAMESIZE_QVGA);
  s->set_quality(s, 15); // 设置图像质量(更高的压缩)
}

五、参考

ESP32/ESP8622 -- 使用MQTT协议连接云平台(带图文说明)

嵌入式外设】 ESP32-CAM(局域图传+STM32通信

ESP32CAM摄像头图像实时传输

联系方式 微信号:13648103287

  • 联系方式.docx
    下载

相关推荐