09 - 云平台接入
ESP32 连接主流 IoT 云平台
阿里云 IoT
创建产品与设备
- 登录 阿里云 IoT 平台
- 创建产品 → 选择标准品类
- 添加设备 → 获取
ProductKey、DeviceName、DeviceSecret
连接代码
#include "aliyun_iot.h"
#define PRODUCT_KEY "your_product_key"
#define DEVICE_NAME "your_device_name"
#define DEVICE_SECRET "your_device_secret"
#define REGION "cn-shanghai"
void aliyun_init(void)
{
aliyun_config_t config = {
.product_key = PRODUCT_KEY,
.device_name = DEVICE_NAME,
.device_secret = DEVICE_SECRET,
.region = REGION
};
aliyun_mqtt_connect(&config);
}
// 上报属性
void aliyun_report_property(float temperature, float humidity)
{
char payload[256];
snprintf(payload, sizeof(payload),
"{\"params\":{\"temperature\":%.1f,\"humidity\":%.1f}}",
temperature, humidity);
aliyun_mqtt_publish("/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post",
payload, 0);
}物模型 JSON
{
"properties": [
{
"identifier": "temperature",
"name": "温度",
"dataType": "float",
"range": {"min": -40, "max": 80},
"unit": "℃"
},
{
"identifier": "humidity",
"name": "湿度",
"dataType": "float",
"range": {"min": 0, "max": 100},
"unit": "%"
}
]
}腾讯云 IoT
准备工作
- 登录 腾讯云 IoT Explorer
- 创建项目 → 创建产品 → 添加设备
- 获取
ProductID、DeviceName、DeviceSecret
MQTT 连接
#include "tencent_iot.h"
#define TX_PRODUCT_ID "your_product_id"
#define TX_DEVICE_NAME "your_device_name"
#define TX_DEVICE_SECRET "your_device_secret"
void tencent_iot_init(void)
{
char client_id[64];
char username[64];
char password[128];
// 生成 MQTT 鉴权参数
snprintf(client_id, sizeof(client_id), "%s%s", TX_DEVICE_NAME, TX_PRODUCT_ID);
snprintf(username, sizeof(username), "%s;%s;%s",
TX_DEVICE_NAME, TX_PRODUCT_ID, "20210101");
// 实际使用需要 HMAC SHA256 签名
tencent_iot_mqtt_connect(TX_PRODUCT_ID, TX_DEVICE_NAME,
client_id, username, password);
}
// 上报数据
void tencent_iot_report(float temp, float humi)
{
char payload[256];
snprintf(payload, sizeof(payload),
"{\"method\":\"report\",\"clientToken\":\"token123\","
"\"params\":{\"temperature\":%.1f,\"humidity\":%.1f}}",
temp, humi);
char topic[128];
snprintf(topic, sizeof(topic),
"$thing/down/property/%s/%s", TX_PRODUCT_ID, TX_DEVICE_NAME);
tencent_iot_publish(topic, payload);
}AWS IoT Core
证书配置
- 在 AWS IoT Core 创建事物
- 下载证书、私钥、CA证书
- 将证书烧录到 ESP32 Flash
连接代码
#include "aws_iot.h"
#define AWS_ENDPOINT "your-iot-endpoint.iot.us-east-1.amazonaws.com"
void aws_iot_init(void)
{
aws_iot_config_t config = {
.endpoint = AWS_ENDPOINT,
.port = 8883,
.cert_file = "/spiffs/cert.der",
.key_file = "/spiffs/private.der",
.root_ca_file = "/spiffs/rootca.der"
};
aws_iot_mqtt_connect(&config);
}
// 发送数据到 Shadow
void aws_iot_shadow_update(float temperature)
{
char payload[256];
snprintf(payload, sizeof(payload),
"{\"state\":{\"reported\":{\"temperature\":%.1f}}}", temperature);
aws_iot_shadow_update_async("$aws/things/esp32/shadow/update",
payload, NULL, NULL, 0);
}自建 MQTT 服务器
使用 EMQX
# docker-compose.yml
version: '3'
services:
emqx:
image: emqx/emqx:latest
ports:
- "1883:1883"
- "8083:8083"
- "18083:18083"
environment:
- EMQX_NAME=emqx
- EMQX_HOST=127.0.0.1
- EMQX_DASHBOARD__DEFAULT_USERNAME=admin
- EMQX_DASHBOARD__DEFAULT_PASSWORD=publicESP32 连接
void mqtt_custom_broker(void)
{
esp_mqtt_client_config_t mqtt_cfg = {
.broker.address.uri = "mqtt://192.168.1.100:1883",
.credentials.username = "user",
.credentials.authentication.password = "password"
};
mqtt_client = esp_mqtt_client_init(&mqtt_cfg);
esp_mqtt_client_start(mqtt_client);
}HTTP 轮询上传
简单数据上报
#include "esp_http_client.h"
esp_err_t http_upload_handler(esp_http_client_event_t *evt)
{
if (evt->event_id == HTTP_EVENT_ON_DATA) {
printf("%.*s", evt->data_len, (char *)evt->data);
}
return ESP_OK;
}
void http_upload_data(float temperature, float humidity)
{
char post_data[128];
snprintf(post_data, sizeof(post_data),
"temp=%.1f&humi=%.1f", temperature, humidity);
esp_http_client_config_t config = {
.url = "http://your-server.com/api/data",
.method = HTTP_METHOD_POST,
.post_data = post_data,
.event_handler = http_upload_handler
};
esp_http_client_handle_t client = esp_http_client_init(&config);
esp_http_client_perform(client);
esp_http_client_cleanup(client);
}平台对比
| 平台 | 协议 | 认证方式 | 特点 |
|---|---|---|---|
| 阿里云 IoT | MQTT | 密钥 | 国内生态完善 |
| 腾讯云 IoT | MQTT | 签名 | 微信小程序集成 |
| AWS IoT | MQTT | 证书 | 全球覆盖 |
| 华为 IoT | MQTT | 密钥 | 工业领域强 |
| 自建 EMQX | MQTT | 用户名/密码 | 灵活可控 |
安全建议
// 1. 敏感信息存储到 NVS 加密分区
nvs_sec_cfg_t cfg;
nvs_flash_init_secure(&cfg);
nvs_handle_t handle;
nvs_open_from_secure_partition("storage", NVS_READWRITE, &cfg);
// 2. 使用 TLS/SSL
.mqtt.cfg.broker.verification.use_secure_element = true;
// 3. 定期更新密钥
// 在云端定期轮换设备密钥参考资料
云平台官方文档
- 阿里云 IoT 平台 - 阿里云 IoT 物联网平台控制台
- 阿里云 IoT 文档 - 设备接入指南
- 腾讯云 IoT Explorer - 腾讯云 IoT 开发平台
- 腾讯云 IoT 文档 - 设备开发指南
- AWS IoT Core - AWS 物联网服务
- AWS IoT 文档 - AWS IoT 开发文档
MQTT Broker
- EMQX 官方文档 - EMQX MQTT broker 文档
- EMQX Docker 部署 - Docker 部署 EMQX
- Mosquitto - 开源 MQTT broker
- HiveMQ - 企业级 MQTT broker
ESP-IDF 云 SDK
- esp-alibaba-iotkit - 阿里云 IoT ESP-IDF 组件
- esp-aws-iot - AWS IoT ESP-IDF 组件
- ESP-MQTT 客户端 - ESP-IDF MQTT 库
安全参考
- TLS/SSL 配置 - ESP-IDF TLS 配置
- NVS 加密 - NVS 分区加密
图片参考
