本教程旨在帮助初学者(小白)实现 ESP8266 连接百度智能云物联网平台,并通过 MQTT 协议进行通信。整个过程分为"云端配置"和"设备端代码实现"两大部分。
一、 百度智能云云端配置
在编写 ESP8266 代码之前,必须先在百度智能云上创建对应的物联网实例、设备及主题,并获取连接所需的认证信息。
- 创建 IoT Core 实例
首先需要登录百度智能云控制台,进入"物联网服务"板块,选择并创建一个 IoT Core 实例。这个实例将作为后续设备和消息的管理中心 。
- 创建设备与获取密钥
在创建好的 IoT Core 实例中,你需要添加一个新的 IoT 设备。
- 操作步骤 :点击"创建设备",填写设备名称(如
ESP8266_Client)。 - 关键信息 :创建成功后,系统会分配一个 设备密钥。请务必下载或保存此 Key,它是设备身份认证的唯一凭证 。
- 配置策略与主题
MQTT 协议基于"发布/订阅"模型,需要定义主题来管理消息路由。
- 创建策略:在 IoT Core 中创建一个策略,定义设备可以发布或订阅的主题。
- 绑定主题 :例如创建一个名为
led_off_or_on的主题,用于控制 LED 灯的开关。将此策略绑定到刚才创建的设备上 。
- 生成连接参数
百度云 MQTT 连接需要特定的用户名和密码,这通常通过官方提供的签名工具生成。
- 工具地址 :使用百度云提供的 MQTT 签名工具(如
mqtt-sign生成器)。 - 输入参数 :填入刚才获取的 设备密钥 、设备 ID 以及设置一个过期时间。
- 输出结果 :工具会生成连接所需的 Username 、Password 以及 Broker Address(服务器地址)。
下表汇总了云端配置的关键产出物:
| 配置项 | 说明 | 获取方式 |
|---|---|---|
| Broker Address | MQTT 服务器地址 | IoT Core 实例详情或签名工具生成 |
| Device ID (Key Name) | 设备唯一标识 | 创建设备时生成 |
| Device Secret (Key) | 设备密钥 | 创建设备时生成(需妥善保存) |
| Username | 连接用户名 | 使用签名工具基于 Key 生成 |
| Password | 连接密码 | 使用签名工具基于 Key 生成 |
| Topic | 通信主题 | 在策略中自定义(如 led_off_or_on) |
二、 ESP8266 代码实现(Arduino 环境)
以下代码基于 Arduino IDE 开发环境,使用 PubSubClient 库实现 MQTT 连接。请确保已安装 ESP8266 开发板支持包及 PubSubClient 库。
- 代码示例
cpp
#include <ESP8266WiFi.h>
#include <PubSubClient.h> // 引入MQTT客户端库
// ================= 1. WiFi 配置 =================
const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";
// ================= 2. 百度云 MQTT 配置 =================
// 从云端配置步骤中获取的信息
const char* mqtt_server = "你的Broker地址"; // 例如: "iot.gz.baidubce.com"
const int mqtt_port = 1883; // MQTT端口,非SSL通常为1883
const char* mqtt_user = "生成的Username";
const char* mqtt_pass = "生成的Password";
const char* mqtt_topic = "led_off_or_on"; // 需与云端策略主题一致
// ================= 3. 对象初始化 =================
WiFiClient espClient;
PubSubClient client(espClient);
// ================= 4. 回调函数 =================
// 当收到订阅主题的消息时,执行此函数
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();
// 逻辑控制:如果收到 "on",点亮LED(假设LED接在GPIO 2)
if ((char)payload[0] == 'o' && (char)payload[1] == 'n') {
digitalWrite(2, LOW; // ESP8266 LED通常低电平点亮
} else {
digitalWrite(2, HIGH);
}
}
// ================= 5. 重连函数 =================
void reconnect() {
// 循环直到连接成功
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// 尝试连接
// ClientID 建议使用设备名或MAC地址,确保唯一
if (client.connect("ESP8266_Client_ID", mqtt_user, mqtt_pass)) {
Serial.println("connected");
// 连接成功后订阅主题
client.subscribe(mqtt_topic);
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// 失败后等待5秒重试
delay(5000);
}
}
}
void setup() {
pinMode(2, OUTPUT); // 初始化LED引脚
Serial.begin(115200);
// ================= 6. 连接 WiFi =================
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
// ================= 7. 配置 MQTT 服务器 =================
client.setServer(mqtt_server, mqtt_port); // 设置服务器地址和端口
client.setCallback(callback); // 设置回调函数
}
void loop() {
// ================= 8. 主循环维护连接 =================
if (!client.connected()) {
reconnect(); // 如果断开,尝试重连
}
client.loop(); // 保持客户端心跳
}
-
代码详细解释
-
库引用:
ESP8266WiFi.h:用于处理 ESP8266 的网络连接。PubSubClient.h:这是最常用的 Arduino MQTT 库,用于封装 MQTT 协议细节 。
-
WiFi 连接:
- 在
setup()中,使用WiFi.begin()连接到本地路由器。代码通过while循环等待,直到获取到 IP 地址,确保网络通畅后再进行后续操作。
- 在
-
MQTT 服务器配置:
client.setServer(mqtt_server, mqtt_port):告诉 ESP8266 百度云物联网平台的地址和端口(通常为 1883)。client.setCallback(callback):注册回调函数。当 ESP8266 订阅的主题(如led_off_or_on)有新消息时,会自动跳转到callback函数执行逻辑。
-
MQTT 连接与认证:
- 在
reconnect()函数中,client.connect()是核心步骤。它传入三个参数:客户端 ID(建议唯一)、用户名和密码。这三个参数必须严格对应云端配置步骤 4 中生成的结果,否则连接会被拒绝 。
- 在
-
消息订阅:
client.subscribe(mqtt_topic):连接成功后,设备必须订阅主题才能接收云端下发的指令。这里的主题字符串必须与百度云后台创建的策略主题完全一致 。
-
主循环:
client.loop()是 MQTT 客户端的心跳函数,必须在loop()中不断调用,以维持与服务器的连接并处理 incoming(传入)和 outgoing(传出)的数据流。
三、 调试与验证
代码烧录完成后,可以使用 MQTT.fx 这类调试工具进行辅助验证,确保链路通畅 。
- 配置 MQTT.fx:将云端生成的 Username、Password 和 Broker Address 填入 MQTT.fx 的设置中。
- 订阅测试 :在 MQTT.fx 中订阅
led_off_or_on主题。 - 发送指令 :使用 MQTT.fx 向该主题发送消息
on。 - 观察现象 :
- 你应该能在 MQTT.fx 的消息日志中看到发送的数据。
- ESP8266 的串口监视器应打印出接收到的消息内容。
- 如果硬件连接正确,ESP8266 板载的 LED 应会根据指令点亮或熄灭。
通过以上步骤,小白用户也可以完成从云端环境搭建到硬件端代码实现的完整 MQTT 物联网开发流程。若需了解 AT 指令方式的实现,可参考相关文档 。