在物联网(IoT)应用中,ESP32 是一个非常流行的微控制器,它支持 Wi-Fi 和蓝牙功能,能够轻松连接到互联网并与其他设备通信。MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息协议,非常适合资源受限的设备和低带宽、高延迟或不可靠的网络环境。本文将详细介绍如何配置 ESP32 以连接到 MQTT 服务器。
可以选择以下两种方式:
test.mosquitto.org
)工具 > 库管理
。以下是一个完整的示例代码,展示如何让 ESP32 连接到 MQTT 服务器并发布/订阅消息。
#include <WiFi.h>
#include <PubSubClient.h>
// 替换为你的 Wi-Fi 凭据
const char* ssid = "Your_SSID";
const char* password = "Your_PASSWORD";
// MQTT 服务器信息
const char* mqtt_server = "broker.hivemq.com"; // 公共测试服务器
const int mqtt_port = 1883;
// 初始化 WiFi 客户端和 MQTT 客户端
WiFiClient espClient;
PubSubClient client(espClient);
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
// 循环直到重新连接到 MQTT 服务器
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("ESP32Client")) {
Serial.println("connected");
// 订阅主题
client.subscribe("test/topic");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// 每隔 5 秒发布一次消息
unsigned long now = millis();
static unsigned long lastMsg = 0;
const unsigned long interval = 5000;
if (now - lastMsg > interval) {
lastMsg = now;
String message = "Hello from ESP32!";
Serial.print("Publishing message: ");
Serial.println(message);
client.publish("test/topic", message.c_str());
}
}
// 处理接收到的消息
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (unsigned int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
setup_wifi()
函数负责连接到指定的 Wi-Fi 网络。如果连接失败,程序会不断尝试重新连接。
reconnect()
函数确保 ESP32 始终与 MQTT 服务器保持连接。如果断开连接,程序会自动重连。
在 loop()
函数中,每 5 秒向 test/topic
主题发布一条消息。
通过 client.subscribe("test/topic")
,ESP32 可以订阅指定主题的消息。当有新消息到达时,callback()
函数会被调用。
test/topic
主题。可以通过 ArduinoJson
库将消息格式化为 JSON 格式,便于解析和传输复杂数据。
许多生产环境中的 MQTT 服务器需要用户名和密码认证。可以在 client.connect()
方法中传递这些凭据。
if (client.connect("ESP32Client", "mqtt_user", "mqtt_password")) {
...
}
为了提高安全性,可以启用 MQTT over TLS。这需要额外的证书配置。