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

一、阿里云IoT平台接入​

1. 准备工作
  1. ​注册阿里云账号​
    访问阿里云官网,注册并完成实名认证。
  2. ​创建产品和设备​
    • 进入​物联网平台控制台​​公共实例​​创建产品​(例如产品名称"ESP32_Sensor",节点类型为"设备")。
    • ​功能定义​中添加物模型属性(如温度、湿度)。
    • ​创建设备​ ,获取设备三元组(ProductKeyDeviceNameDeviceSecret)。
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"),定义物模型(如开关、亮度)。
    • 创建设备,获取设备证书(ProductIDDeviceNameDeviceSecret)。
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。

相关推荐
OxYGC1 小时前
[AI工程] Spring AI 第十四篇:Agent 五种模式在 2.0 里怎么写
java·spring·ai·ai编程
code2cat1 小时前
【随笔】从聊天到调用工具:理解MCP在AI应用中的位置
java·人工智能
2501_933923251 小时前
Spring Bean作用域揭秘:单例、原型、请求与会话的区别
java·后端·spring·java-ee
wuyk5552 小时前
【Socket 进阶之路】第 7 章 IO 多路复用 select & poll 完整实战|多 fd 监听、超时等待、优缺点横向对比
服务器·开发语言·网络·数据库·物联网
学编程就要猛2 小时前
基于Spring AI 的智能聊天机器人
java·spring ai·chat robot
修炼室2 小时前
Java开发工程师笔试经验贴【高频知识】
java
YCOSA20252 小时前
迎双节 雨晨 Windows 11 IoT 企业版 LTSC 26H1 轻装 28000.2956
windows·物联网
木井巳2 小时前
【记忆化搜索】最长递增子序列
java·算法·leetcode·深度优先·剪枝·推荐算法
杨杨杨大侠2 小时前
知识库已经有了,Java 程序员还要做什么?Spring AI RAG 实战
java·openai·ai编程
伊信2 小时前
Spring AI 基础学习与应用
java·后端