在物联网(IoT)领域,ESP32是一款功能强大且性价比高的微控制器,支持Wi-Fi和蓝牙功能。阿里云物联网平台提供了丰富的功能,可以帮助开发者快速构建物联网应用。本文将详细介绍如何使用ESP32连接到阿里云物联网平台的全流程。
文件 -> 偏好设置
,在“附加开发板管理器网址”中添加以下地址:
https://dl.espressif.com/dl/package_esp32_index.json
工具 -> 开发板 -> 开发板管理器
,搜索“esp32”,安装对应开发板支持包。PubSubClient
:用于MQTT通信。ArduinoJson
:用于解析JSON数据。工具 -> 管理库
,搜索并安装上述库。在阿里云物联网平台中,每个设备都有唯一的三元组信息:
这些信息将在后续代码中使用。
阿里云物联网平台支持自定义Topic,用于设备与云端之间的消息传递。常见的Topic包括:
/sys/${ProductKey}/${DeviceName}/thing/event/property/post
/sys/${ProductKey}/${DeviceName}/thing/service/property/set
以下是一个完整的ESP32连接阿里云物联网平台的示例代码:
#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
// 阿里云三元组信息
const char* productKey = "your_product_key";
const char* deviceName = "your_device_name";
const char* deviceSecret = "your_device_secret";
// WiFi配置
const char* ssid = "your_wifi_ssid";
const char* password = "your_wifi_password";
// MQTT服务器配置
const char* mqttServer = "your_mqtt_server"; // 如 iot-as-mqtt.cn-shanghai.aliyuncs.com
const int mqttPort = 1883;
// MQTT客户端ID
String clientId = "";
String timestamp = "";
// WiFi客户端
WiFiClient espClient;
// MQTT客户端
PubSubClient client(espClient);
// 生成签名函数
String generateSignature(String data, String secret) {
return ""; // 此处需实现HMAC-SHA1签名逻辑
}
// 初始化MQTT客户端
void setupMqtt() {
clientId = "paho." + String(random(0xffff), HEX);
timestamp = String(millis());
String signData = deviceName + "\n" + timestamp;
String signature = generateSignature(signData, deviceSecret);
String username = deviceName + "&" + productKey;
String passwordStr = "clientId" + clientId + "deviceName" + deviceName + "productKey" + productKey + "timestamp" + timestamp + "signMethod=hmacsha1&sign=" + signature;
client.setServer(mqttServer, mqttPort);
client.setCallback(callback);
if (client.connect(clientId.c_str(), username.c_str(), passwordStr.c_str())) {
Serial.println("Connected to MQTT server");
} else {
Serial.println("Failed to connect to MQTT server");
}
}
// 回调函数
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
// 发布数据
void publishData() {
StaticJsonDocument<200> doc;
doc["id"] = 1;
doc["params"]["temperature"] = 25.5;
doc["method"] = "thing.event.property.post";
String payload;
serializeJson(doc, payload);
String topic = "/sys/" + String(productKey) + "/" + String(deviceName) + "/thing/event/property/post";
if (client.publish(topic.c_str(), payload.c_str())) {
Serial.println("Published data successfully");
} else {
Serial.println("Failed to publish data");
}
}
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
setupMqtt();
}
void loop() {
if (!client.connected()) {
setupMqtt();
}
client.loop();
// 每隔10秒发布一次数据
static unsigned long lastPublishTime = 0;
if (millis() - lastPublishTime > 10000) {
lastPublishTime = millis();
publishData();
}
}
在上述代码中,generateSignature
函数需要实现HMAC-SHA1签名算法。可以使用第三方库(如SHA1
库)来完成。
flowchart LR A[ESP32] --> B{WiFi连接} B -->|成功| C[MQTT连接] C --> D{身份认证} D -->|通过| E[数据上报] E --> F[阿里云平台]