第五章: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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙大大L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值