第五章:5.3 ESP32物联网应用:阿里云IoT平台与腾讯云IoT平台的数据上传与远程控制

一、阿里云IoT平台接入​​

1. 准备工作
  1. ​注册阿里云账号​
    访问阿里云官网,注册并完成实名认证。
  2. ​创建产品和设备​
    • 进入​物联网平台控制台​ → ​公共实例​ → ​创建产品​(例如产品名称"ESP32_Sensor",节点类型为"设备")。
    • 在​功能定义​中添加物模型属性(如温度、湿度)。
    • ​创建设备​ ,获取设备三元组(ProductKey、DeviceName、DeviceSecret)。
2. ESP32代码实现
cpp 复制代码
#include <WiFi.h>  
#include <PubSubClient.h>  // MQTT客户端库  

// 阿里云IoT平台参数  
#define PRODUCT_KEY "a1wgoXxYRbs"     // 替换为你的ProductKey  
#define DEVICE_NAME "Unit01"           // 替换为你的DeviceName  
#define DEVICE_SECRET "AEU2vP..."      // 替换为你的DeviceSecret  
#define REGION_ID "cn-shanghai"        // 地域ID  

// WiFi配置  
const char* ssid = "Your_WiFi_SSID";  
const char* password = "Your_WiFi_Password";  

// MQTT客户端配置  
WiFiClient espClient;  
PubSubClient client(espClient);  
char clientId[50];    // 客户端ID  
char username[50];    // MQTT用户名  
char password_mqtt[50]; // MQTT密码  

void setup() {  
  Serial.begin(115200);  
  connectWiFi();       // 连接WiFi  
  initAliyunMQTT();    // 初始化MQTT参数  
}  

void loop() {  
  if (!client.connected()) {  
    reconnect();       // 断线重连  
  }  
  client.loop();       // 维持MQTT心跳  
  uploadSensorData();  // 上传传感器数据(示例)  
  delay(5000);  
}  

// 连接WiFi  
void connectWiFi() {  
  WiFi.begin(ssid, password);  
  while (WiFi.status() != WL_CONNECTED) {  
    delay(500);  
    Serial.print(".");  
  }  
  Serial.println("\nWiFi Connected!");  
}  

// 初始化MQTT认证参数(基于设备三元组)  
void initAliyunMQTT() {  
  // 生成MQTT连接参数  
  sprintf(clientId, "%s.%s", PRODUCT_KEY, DEVICE_NAME);  
  sprintf(username, "%s&%s", DEVICE_NAME, PRODUCT_KEY);  
  // 生成密码(需按阿里云规则签名,此处简化示例)  
  sprintf(password_mqtt, DEVICE_SECRET);  
  // 设置MQTT服务器地址和端口  
  client.setServer(PRODUCT_KEY ".iot-as-mqtt." REGION_ID ".aliyuncs.com", 1883);  
}  

// MQTT重连逻辑  
void reconnect() {  
  while (!client.connected()) {  
    if (client.connect(clientId, username, password_mqtt)) {  
      Serial.println("Connected to Aliyun IoT!");  
      client.subscribe("/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/service/property/set"); // 订阅控制Topic  
    } else {  
      delay(5000);  
    }  
  }  
}  

// 模拟传感器数据上传  
void uploadSensorData() {  
  float temperature = random(20, 30);  // 模拟温度数据  
  float humidity = random(40, 60);     // 模拟湿度数据  
  String payload = "{\"params\":{\"temperature\":" + String(temperature) + ",\"humidity\":" + String(humidity) + "}}";  
  String topic = "/sys/" + String(PRODUCT_KEY) + "/" + String(DEVICE_NAME) + "/thing/event/property/post";  
  client.publish(topic.c_str(), payload.c_str());  
  Serial.println("Data Published: " + payload);  
}  
3. 代码解析
  • ​PubSubClient库​ :用于实现MQTT协议通信。
    • client.setServer():设置MQTT服务器地址和端口。
    • client.connect():通过设备三元组认证连接阿里云。
    • client.publish():向指定Topic发布数据(如传感器数据)。
    • client.subscribe():订阅控制Topic,接收云端指令。
  • ​数据格式​:需遵循阿里云物模型定义的JSON结构。

​​二、腾讯云IoT平台接入​​

1. 准备工作
  1. ​注册腾讯云账号​
    访问腾讯云官网,开通​物联网开发平台​。
  2. ​创建项目与设备​
    • 进入​物联网开发平台​ → ​公共实例​ → ​创建项目​(例如"SmartHome")。
    • 创建产品(如"ESP32_Controller"),定义物模型(如开关、亮度)。
    • 创建设备,获取设备证书(ProductID、DeviceName、DeviceSecret)。
2. ESP32代码实现
cpp 复制代码
#include <WiFi.h>  
#include <PubSubClient.h>  

// 腾讯云IoT参数  
#define PRODUCT_ID "ABC123XYZ"         // 替换为ProductID  
#define DEVICE_NAME "Tencent_Device01" // 替换为DeviceName  
#define DEVICE_SECRET "T123..."        // 替换为DeviceSecret  

// WiFi配置同阿里云示例  

// MQTT配置  
const char* mqttServer = PRODUCT_ID ".iotcloud.tencentdevices.com";  
WiFiClient tencentClient;  
PubSubClient mqttClient(tencentClient);  

void setup() {  
  Serial.begin(115200);  
  connectWiFi();  
  initTencentMQTT();  
}  

void loop() {  
  if (!mqttClient.connected()) {  
    reconnectTencent();  
  }  
  mqttClient.loop();  
}  

// 初始化腾讯云MQTT参数  
void initTencentMQTT() {  
  mqttClient.setServer(mqttServer, 1883);  
  mqttClient.setCallback(callback); // 设置消息回调函数  
}  

// MQTT重连逻辑  
void reconnectTencent() {  
  while (!mqttClient.connected()) {  
    String clientId = PRODUCT_ID + String(DEVICE_NAME);  
    if (mqttClient.connect(clientId.c_str(), "username", DEVICE_SECRET)) {  
      Serial.println("Connected to Tencent IoT!");  
      mqttClient.subscribe("$thing/down/property/" PRODUCT_ID "/" DEVICE_NAME); // 订阅控制Topic  
    } else {  
      delay(5000);  
    }  
  }  
}  

// 接收云端指令的回调函数  
void callback(char* topic, byte* payload, unsigned int length) {  
  String message;  
  for (int i=0; i<length; i++) {  
    message += (char)payload[i];  
  }  
  Serial.println("Received: " + message);  
  // 解析指令(例如控制LED)  
  if (message.indexOf("\"switch\":1") != -1) {  
    digitalWrite(2, HIGH); // 假设GPIO2接LED  
  } else if (message.indexOf("\"switch\":0") != -1) {  
    digitalWrite(2, LOW);  
  }  
}  
3. 代码解析
  • ​Topic格式​ :腾讯云Topic以$thing开头,如$thing/down/property/{ProductID}/{DeviceName}。
  • ​动态注册​ :需通过DeviceSecret生成连接参数,部分场景需使用动态注册获取DeviceSecret

​​三、数据上传与远程控制​​

1. 数据上传流程
  1. ​传感器数据采集​
    使用DHT11传感器读取温湿度:
cpp 复制代码
#include <DHT.h>  
#define DHTPIN 4  
#define DHTTYPE DHT11  
DHT dht(DHTPIN, DHTTYPE);  

void setup() {  
  dht.begin();  
}  

void loop() {  
  float temperature = dht.readTemperature();  
  float humidity = dht.readHumidity();  
  // 将数据上传至云平台(参考前述阿里云/腾讯云代码)  
}  
2. 远程控制实现
  • ​云端下发指令​:通过MQTT订阅Topic接收指令(如开关命令)。
  • ​本地执行动作​:在回调函数中解析指令并控制GPIO(如点亮LED)。
cpp 复制代码
// 示例:控制GPIO2的LED  
void callback(char* topic, byte* payload, unsigned int length) {  
  String message = parsePayload(payload, length);  
  if (message == "LED_ON") {  
    digitalWrite(2, HIGH);  
  } else if (message == "LED_OFF") {  
    digitalWrite(2, LOW);  
  }  
}  

​​总结​​

通过阿里云和腾讯云IoT平台,ESP32可以实现传感器数据上传与远程控制。核心步骤包括:

  1. ​平台配置​:创建产品、设备,获取认证信息。
  2. ​代码实现​:使用MQTT协议连接云端,实现数据发布与指令订阅。
  3. ​调试与优化​:添加断线重连、数据校验等逻辑。

​​扩展学习​​:

完整代码示例和更多细节可参考阿里云IoT SDK和腾讯云IoT Explorer SDK。

相关推荐
波加曼大王2 分钟前
# vLLM不要迷信PagedAttention神话,聊聊线上藏着的内部碎片陷阱
java·架构
乐橙开放平台3 分钟前
智慧连锁客流检测和离岗检测怎么对接
大数据·人工智能·笔记·物联网·自动化·音视频·智能家居
SL_staff7 分钟前
目标健康度自检清单:开发者视角下的目标-计划-任务链路断点诊断
java·开源·github
for_ever_love__10 分钟前
MySQL 高频面试题 30 问:索引、事务、锁、日志、主从与分库分表(MySQL 8.0 版)
java·数据库·spring boot·mysql·spring cloud·面试·总结
神仙别闹12 分钟前
基于C++实现的贪吃蛇游戏平台
java·c++·游戏
布吉岛的石头21 分钟前
Java 程序员第 49 阶段11:Java 接 BERT:用 ONNX Runtime 做句向量推理
java·人工智能·python·深度学习·bert·transformer
niucloud-admin30 分钟前
JAVA V6 多商户商城 开发文档——JAVA服务端
java·开发语言
SL_staff40 分钟前
设备越多系统越崩?根源在三层抽象失效
spring boot·物联网·github
alexlifexyz44 分钟前
写了个 Claude Code 插件:AI 写的 Java 违反阿里规约,就写不进文件
java
LiuYanG1 小时前
设备断电了平台还显示在线?MQTT 遗嘱消息(LWT)与离线判定踩坑实录
物联网