一、阿里云IoT平台接入
1. 准备工作
- 注册阿里云账号
访问阿里云官网,注册并完成实名认证。 - 创建产品和设备
- 进入物联网平台控制台 → 公共实例 → 创建产品(例如产品名称“ESP32_Sensor”,节点类型为“设备”)。
- 在功能定义中添加物模型属性(如温度、湿度)。
- 创建设备,获取设备三元组(
ProductKey
、DeviceName
、DeviceSecret
)。
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. 准备工作
- 注册腾讯云账号
访问腾讯云官网,开通物联网开发平台。 - 创建项目与设备
- 进入物联网开发平台 → 公共实例 → 创建项目(例如“SmartHome”)。
- 创建产品(如“ESP32_Controller”),定义物模型(如开关、亮度)。
- 创建设备,获取设备证书(
ProductID
、DeviceName
、DeviceSecret
)。
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. 数据上传流程
- 传感器数据采集
使用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可以实现传感器数据上传与远程控制。核心步骤包括:
- 平台配置:创建产品、设备,获取认证信息。
- 代码实现:使用MQTT协议连接云端,实现数据发布与指令订阅。
- 调试与优化:添加断线重连、数据校验等逻辑。
扩展学习:
- 阿里云物模型文档:https://help.aliyun.com/document_detail/73705.html
- 腾讯云IoT开发指南:https://cloud.tencent.com/document/product/1081
完整代码示例和更多细节可参考阿里云IoT SDK和腾讯云IoT Explorer SDK。