09 - 云平台接入

ESP32 连接主流 IoT 云平台

阿里云 IoT

创建产品与设备

  1. 登录 阿里云 IoT 平台
  2. 创建产品 → 选择标准品类
  3. 添加设备 → 获取 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

准备工作

  1. 登录 腾讯云 IoT Explorer
  2. 创建项目 → 创建产品 → 添加设备
  3. 获取 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

证书配置

  1. 在 AWS IoT Core 创建事物
  2. 下载证书、私钥、CA证书
  3. 将证书烧录到 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=public

ESP32 连接

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);
}

平台对比

平台协议认证方式特点
阿里云 IoTMQTT密钥国内生态完善
腾讯云 IoTMQTT签名微信小程序集成
AWS IoTMQTT证书全球覆盖
华为 IoTMQTT密钥工业领域强
自建 EMQXMQTT用户名/密码灵活可控

安全建议

// 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. 定期更新密钥
// 在云端定期轮换设备密钥

参考资料

云平台官方文档

MQTT Broker

ESP-IDF 云 SDK

安全参考

图片参考

阿里云 IoT 架构


相关链接

反向链接

进阶学习


下一步