当前位置: 首页 > news >正文

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

一、阿里云IoT平台接入​

1. 准备工作
  1. ​注册阿里云账号​
    访问阿里云官网,注册并完成实名认证。
  2. ​创建产品和设备​
    • 进入​​物联网平台控制台​​ → ​​公共实例​​ → ​​创建产品​​(例如产品名称“ESP32_Sensor”,节点类型为“设备”)。
    • 在​​功能定义​​中添加物模型属性(如温度、湿度)。
    • ​创建设备​​,获取设备三元组(ProductKeyDeviceNameDeviceSecret)。
2. ESP32代码实现
#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代码实现
#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传感器读取温湿度:
#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)。
// 示例:控制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. ​调试与优化​​:添加断线重连、数据校验等逻辑。

​扩展学习​​:

  • 阿里云物模型文档:https://help.aliyun.com/document_detail/73705.html
  • 腾讯云IoT开发指南:https://cloud.tencent.com/document/product/1081

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

相关文章:

  • KafkaSpark
  • 初始SpringBoot
  • Java | 深拷贝与浅拷贝工具类解析和自定义实现
  • 数据预处理:前缀和算法详解
  • Vue3 + TypeScript 实现二维码生成与展示
  • poi生成横向文档以及复杂表头
  • 驱动开发硬核特训 · Day 18:深入理解字符设备驱动与子系统的协作机制(以 i.MX8MP 为例)
  • 欧拉计划 Project Euler54(扑克手牌)题解
  • MySQL运算符
  • stack和queue的学习
  • 【实证分析】ESG发展对企业新质生产力影响的研究—来自中国A股上市企业的经验
  • ROS第十二梯:ros-noetic和Anaconda联合使用
  • Python常用的第三方模块之【pymysql库】操作数据库
  • HarmonyOS 5.0应用开发——MVVM模式的应用
  • CF2103F Maximize Nor
  • AI 人工智能模型:从理论到实践的深度解析⚡YQW · Studio ⚡【Deepseek】【Chat GPT】
  • 深度学习中的黑暗角落:梯度消失与梯度爆炸问题解析
  • springboot+vue 支付宝支付(沙箱方式,测试环境使用)
  • VUE Element-ui Message 消息提示组件自定义封装
  • 如何在编译命令中添加灰度标识
  • 五大白酒去年净利超1500亿元:贵州茅台862亿领跑,洋河营收净利齐降
  • 特朗普宣布提名迈克·沃尔兹为下一任美国驻联合国大使
  • 俄伏尔加格勒机场正式更名为斯大林格勒机场
  • “光荣之城”2025上海红色文化季启动,红色主题市集亮相
  • 东风着陆场近日气象条件满足神舟十九号安全返回要求
  • 游客曝九寨沟打网约车被出租车围堵,官方:前者违规,后者做法不对