ESP32连接MQTT服务器的完整配置教程

2025-06发布5次浏览

在物联网(IoT)应用中,ESP32 是一个非常流行的微控制器,它支持 Wi-Fi 和蓝牙功能,能够轻松连接到互联网并与其他设备通信。MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息协议,非常适合资源受限的设备和低带宽、高延迟或不可靠的网络环境。本文将详细介绍如何配置 ESP32 以连接到 MQTT 服务器。


第一步:准备工作

1. 硬件需求

  • ESP32 开发板
  • USB 数据线(用于供电和编程)
  • 计算机(用于开发环境)

2. 软件需求

  • Arduino IDE(版本 1.8.13 或更高)
  • 安装 ESP32 的 Arduino 支持库
  • PubSubClient 库(用于 MQTT 协议)
  • WiFiManager 库(可选,用于简化 Wi-Fi 配置)

3. MQTT 服务器

可以选择以下两种方式:

  • 使用公共 MQTT 测试服务器(如 test.mosquitto.org
  • 搭建自己的 MQTT 服务器(如使用 Mosquitto)

第二步:安装必要的库

  1. 打开 Arduino IDE。
  2. 进入 工具 > 库管理
  3. 搜索并安装以下库:
    • PubSubClient:用于处理 MQTT 通信。
    • WiFi:ESP32 内置库,用于 Wi-Fi 连接。
    • (可选)WiFiManager:用于通过 Web 页面配置 Wi-Fi。

第三步:编写代码

以下是一个完整的示例代码,展示如何让 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();
}

第四步:代码解析

1. WiFi 连接

setup_wifi() 函数负责连接到指定的 Wi-Fi 网络。如果连接失败,程序会不断尝试重新连接。

2. MQTT 连接

reconnect() 函数确保 ESP32 始终与 MQTT 服务器保持连接。如果断开连接,程序会自动重连。

3. 发布消息

loop() 函数中,每 5 秒向 test/topic 主题发布一条消息。

4. 订阅消息

通过 client.subscribe("test/topic"),ESP32 可以订阅指定主题的消息。当有新消息到达时,callback() 函数会被调用。


第五步:测试与调试

  1. 将代码上传到 ESP32。
  2. 打开串口监视器,观察日志输出。
  3. 使用 MQTT 客户端工具(如 MQTT X 或 MQTT.fx)连接到相同的 MQTT 服务器,并订阅 test/topic 主题。
  4. 观察 ESP32 发布的消息是否成功显示在客户端上。

第六步:扩展功能

1. 使用 JSON 格式化消息

可以通过 ArduinoJson 库将消息格式化为 JSON 格式,便于解析和传输复杂数据。

2. 添加认证机制

许多生产环境中的 MQTT 服务器需要用户名和密码认证。可以在 client.connect() 方法中传递这些凭据。

if (client.connect("ESP32Client", "mqtt_user", "mqtt_password")) {
  ...
}

3. 使用 TLS 加密

为了提高安全性,可以启用 MQTT over TLS。这需要额外的证书配置。