1. 简介
MQTT(Message Queuing Telemetry Transport)是一种轻量级、灵活的物联网消息交换和数据传递协议,旨在实现 IoT 开发人员在灵活性和硬件/网络资源之间的平衡。而 ESP8266 是一款高度集成的 Wi-Fi SoC 解决方案,具有低功耗、紧凑设计和高稳定性,可满足各种 IoT 应用需求。ESP8266具备完整的自包含Wi-Fi网络功能,可独立应用,也可作为从机运行于其他主机 MCU 上。
本项目旨在展示如何将 ESP8266 连接到MQTT物联网平台,并使用 Arduino IDE 进行编程。
2. 所需硬件与软件
3. 准备工作
在开始之前,请确保您已安装 Arduino IDE,并已连接 ESP8266 开发板。
4. 编写 ESP8266 代码
首先,我们将导入 ESP8266WiFi
和 PubSubClient
库。ESP8266WiFi
库用于将 ESP8266 连接到 Wi-Fi 网络,而 PubSubClient
库用于使 ESP8266 连接到 MQTT 服务器以发布消息和订阅主题。
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
接下来,设置 Wi-Fi 的名称和密码,以及 MQTT 服务器的连接地址和端口。
// WiFi
const char *ssid = "您的WiFi名称"; // 输入您的 WiFi 名称
const char *password = "您的WiFi密码"; // 输入您的 WiFi 密码
// MQTT Broker
const char *mqtt_broker = "iot.mqtt.cn";
const char *topic = "esp8266/test";
const char *mqtt_username = "emqx";
const char *mqtt_password = "public";
const int mqtt_port = 1883;
打开串行连接,以便输出程序的结果,并连接到 Wi-Fi 网络。
// 设置串行连接波特率为 115200
Serial.begin(115200);
// 连接到 Wi-Fi 网络
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("正在连接到WiFi...");
}
Serial.println("已连接到WiFi网络");
接下来,设置 MQTT 服务器,并编写回调函数。同时,将连接信息打印到串口监视器上。
client.setServer(mqtt_broker, mqtt_port);
client.setCallback(callback);
while (!client.connected()) {
String client_id = "esp8266-client-";
client_id += String(WiFi.macAddress());
Serial.printf("客户端 %s 连接到公共 MQTT 代理\n", client_id.c_str());
if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
Serial.println("已连接到公共 EMQX MQTT 代理");
} else {
Serial.print("连接失败,状态:");
Serial.print(client.state());
delay(2000);
}
}
一旦 MQTT 服务器连接成功,ESP8266 将向 MQTT 服务器发布消息并订阅主题。
// 发布和订阅
client.publish(topic, "Hello MQTT");
client.subscribe(topic);
最后,将主题名称打印到串行端口,然后打印收到的每个字节的消息。
void callback(char *topic, byte *payload, unsigned int length) {
Serial.print("收到主题消息:");
Serial.println(topic);
Serial.print("消息内容:");
for (int i = 0; i < length; i++) {
Serial.print((char) payload[i]);
}
Serial.println();
Serial.println("-----------------------");
}
5. 完整的 ESP8266 代码
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// WiFi
const char *ssid = "您的WiFi名称"; // 输入您的 WiFi 名称
const char *password = "您的WiFi密码"; // 输入您的 WiFi 密码
// MQTT Broker
const char *mqtt_broker = "iot.mqtt.cn";
const char *topic = "esp8266/test";
const char *mqtt_username = "emqx";
const char *mqtt_password = "public";
const int mqtt_port = 1883;
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
// 设置串行连接波特率为 115200
Serial.begin(115200);
// 连接到 WiFi 网络
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("正在连接到WiFi...");
}
Serial.println("已连接到WiFi网络");
// 连接到 MQTT 代理
client.setServer(mqtt_broker, mqtt_port);
client.setCallback(callback);
while (!client.connected()) {
String client_id = "esp8266-client-";
client_id += String(WiFi.macAddress());
Serial.printf("客户端 %s 连接到公共 MQTT 代理\n", client_id.c_str());
if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
Serial.println("已连接到公共 EMQX MQTT 代理");
} else {
Serial.print("连接失败,状态:");
Serial.print(client.state());
delay(2000);
}
}
// 发布和订阅
client.publish(topic, "Hello EMQX");
client.subscribe(topic);
}
void callback(char *topic, byte *payload, unsigned int length) {
Serial.print("收到主题消息:");
Serial.println(topic);
Serial.print("消息内容:");
for (int i = 0; i < length; i++) {
Serial.print((char) payload[i]);
}
Serial.println();
Serial.println("-----------------------");
}
void loop() {
client.loop();
}
6. 运行与测试
使用 Arduino IDE 将完整的代码上传到 ESP8266,并打开串口监视器。在串口监视器中,您将看到 ESP8266 连接到 Wi-Fi 和 MQTT 服务器的状态信息。
接下来,使用 MQTTX 客户端与 MQTT物联网平台建立连接,并向 ESP8266 发送消息。您可以在串口监视器中查看 ESP8266 收到的消息。