一、阿里云平台准备工作
1. 创建产品和设备
-
登录阿里云物联网平台
-
进入 阿里云IoT控制台,选择 公共实例。
-
-
创建产品
-
点击 创建产品 → 输入产品名称(如
ESP32-CAM
)→ 节点类型 直连设备 → 联网方式 Wi-Fi → 数据格式 透传/自定义 → 完成。
-
-
添加设备
-
在产品详情页点击 设备 → 添加设备 → 输入DeviceName(如
cam_01
)→ 记录 三元组信息(ProductKey、DeviceName、DeviceSecret)。
-
2. 配置Topic和规则引擎
-
定义Topic
-
进入产品详情 → Topic类列表 → 添加以下Topic:
-
上行(设备→云端):
/${YourProductKey}/${YourDeviceName}/user/image
-
下行(云端→设备):
/${YourProductKey}/${YourDeviceName}/user/command
-
-
-
设置数据解析脚本(透传模式)
-
进入产品详情 → 数据解析 → 选择 透传/自定义 → 编写解析脚本(将二进制数据转为JSON)。
-
二、ESP32-CAM端代码实现
1. 开发环境配置
-
安装库
-
Arduino IDE 中安装以下库:
-
PubSubClient(MQTT通信)
-
ArduinoJson(JSON数据处理)
-
WiFiClientSecure(SSL加密)
-
-
安装阿里云物联网平台 SDK(可选):AliyunIoTSDK
-
-
硬件连接
-
确保ESP32-CAM已连接Wi-Fi天线和摄像头模块。
-
2. 核心代码(透传模式)
#include <WiFi.h>
#include <PubSubClient.h>
#include "esp_camera.h"// Wi-Fi配置
const char* ssid = "YourWiFiSSID";
const char* password = "YourWiFiPassword";// 阿里云三元组
#define PRODUCT_KEY "YourProductKey"
#define DEVICE_NAME "YourDeviceName"
#define DEVICE_SECRET "YourDeviceSecret"// MQTT配置
#define MQTT_SERVER "${YourProductKey}.iot-as-mqtt.cn-shanghai.aliyuncs.com"
#define MQTT_PORT 1883
#define CLIENT_ID "ESP32-CAM"
#define USERNAME "ESP32-CAM&${YourProductKey}"
#define PASSWORD "" // 需通过计算生成(见下文)WiFiClient espClient;
PubSubClient client(espClient);// 计算MQTT密码(动态生成)
String calculatePassword() {String timestamp = String(millis());String content = "clientId" + String(CLIENT_ID) + "deviceName" + String(DEVICE_NAME) + "productKey" + String(PRODUCT_KEY) + "timestamp" + timestamp;// 使用HMAC-SHA1加密(需引入加密库)// 此处为简化示例,实际需替换为正确算法return "your_hashed_password";
}// 初始化摄像头
void setupCamera() {camera_config_t config;// ...(参考OV2640摄像头初始化代码)esp_err_t err = esp_camera_init(&config);if (err != ESP_OK) Serial.println("摄像头初始化失败");
}void setup() {Serial.begin(115200);setupCamera();// 连接Wi-FiWiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) delay(500);Serial.println("Wi-Fi已连接");// 配置MQTTclient.setServer(MQTT_SERVER, MQTT_PORT);client.setCallback(mqttCallback);
}void mqttCallback(char* topic, byte* payload, unsigned int length) {// 处理云端下发指令Serial.print("收到消息:");for (int i=0; i<length; i++) Serial.print((char)payload[i]);
}void reconnect() {while (!client.connected()) {if (client.connect(CLIENT_ID, USERNAME, calculatePassword().c_str())) {client.subscribe("${YourProductKey}/${YourDeviceName}/user/command");Serial.println("MQTT已连接");} else {delay(5000);}}
}void loop() {if (!client.connected()) reconnect();client.loop();// 拍摄照片并上传camera_fb_t *fb = esp_camera_fb_get();if (fb) {client.publish("${YourProductKey}/${YourDeviceName}/user/image", (const char*)fb->buf, fb->len);esp_camera_fb_return(fb);}delay(10000); // 每10秒上传一次
}
三、关键配置说明
1. MQTT密码生成
阿里云要求动态生成MQTT连接密码,需通过 HMAC-SHA1 加密算法计算。
完整实现需依赖加密库(如 TinyHMAC),示例代码如下:
#include <TinyHMAC.h>String calculatePassword() {String timestamp = String(millis());String content = "clientId" + String(CLIENT_ID) + "deviceName" + String(DEVICE_NAME) + "productKey" + String(PRODUCT_KEY) + "timestamp" + timestamp;// 使用DeviceSecret作为密钥TinyHMAC hmac(DEVICE_SECRET, strlen(DEVICE_SECRET));hmac.update(content.c_str(), content.length());uint8_t* hash = hmac.digest();// 转换为十六进制字符串String password;for (int i=0; i<20; i++) {char buf[3];sprintf(buf, "%02x", hash[i]);password += buf;}return password;
}
2. 图像传输优化
-
压缩图像:设置
config.jpeg_quality = 20;
(降低JPEG质量)。 -
分片传输:若单帧图像超过MQTT消息限制(默认256KB),需分片发送:
int chunkSize = 1024;
for (int i=0; i<fb->len; i+=chunkSize) {int len = min(chunkSize, fb->len - i);client.publish("topic", fb->buf + i, len);
}
四、阿里云平台数据查看
-
实时日志
-
进入设备详情 → 日志服务 → 查看设备上下线及消息记录。
-
-
数据可视化
-
使用 IoT Studio 创建Web应用,绑定设备数据Topic。
-
-
规则引擎
-
配置规则将数据转发至其他服务(如OSS存储图片)。
-
五、常见问题解决
1. MQTT连接失败
-
原因:三元组错误或时间戳不同步。
-
解决:检查三元组,确保设备时间通过NTP同步:
configTime(8 * 3600, 0, "ntp.aliyun.com");
2. 图像传输中断
-
原因:Wi-Fi信号弱或MQTT缓冲区不足。
-
解决:
-
优化Wi-Fi天线位置。
-
增加PubSubClient缓冲区大小:
-
client.setBufferSize(1024 * 5); // 5KB
3. 内存不足
-
原因:高分辨率图像占用过多内存。
-
解决:降低摄像头分辨率(如
FRAMESIZE_QVGA
)。
六、推荐开发资源
-
阿里云官方文档:设备接入指南
-
ESP32-CAM示例库:Github ESP32-CAM
-
MQTT调试工具:MQTTX(测试Topic消息)
通过以上步骤,ESP32-CAM可稳定对接阿里云平台,实现图像数据透传。建议先从低分辨率图像测试,逐步优化传输逻辑和稳定性。
猜你喜欢
工地视频考勤打卡(电子工牌)数据结构
跑团小程序带来的意外收益...
我是怎样让校车运营收入翻倍的
记录开发蓝牙充电宝小程序的历程
网约巴士旅游专线平台搭建历程