You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ESP32上通过Arduino IDE使用LWIP实现MQTT客户端 无需MCUXpresso SDK

ESP32 Arduino IDE下基于LWIP的MQTT客户端实现方案

Arduino ESP32官方开发板支持包底层网络栈默认基于LWIP实现,无需引入MCUXpresso SDK即可完成MQTT客户端开发,以下是两种可行实现方案:

前置准备

  • 在Arduino IDE中通过开发板管理器安装ESP32官方支持包
  • 确认本地Mosquitto Broker已正常启动,ESP32与运行Broker的PC处于同一局域网,PC防火墙已开放1883端口访问权限

方案1:使用PubSubClient第三方库(最简实现,推荐入门使用)

该库底层直接调用ESP32 Arduino核心封装的LWIP TCP接口实现MQTT协议,无需额外调整底层配置:

  1. 打开Arduino IDE库管理器,搜索并安装PubSubClient库
  2. 参考示例代码实现功能:
#include <WiFi.h>
#include <PubSubClient.h>

// WiFi配置
const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";
// MQTT Broker配置,填本地PC的局域网IP
const char* mqtt_server = "192.168.x.x";
const uint16_t mqtt_port = 1883;

WiFiClient espClient;
PubSubClient client(espClient);

// MQTT下行消息回调函数
void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("收到主题[");
  Serial.print(topic);
  Serial.println("]的消息:");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

void reconnect() {
  // 循环直到连接成功
  while (!client.connected()) {
    Serial.print("尝试连接MQTT Broker...");
    // 填写自定义的客户端ID,可按需添加用户名密码校验
    if (client.connect("ESP32_LWIP_MQTT_CLIENT")) {
      Serial.println("连接成功");
      // 订阅测试主题
      client.subscribe("test/recv");
    } else {
      Serial.print("连接失败,错误码=");
      Serial.print(client.state());
      Serial.println(" 5秒后重试");
      delay(5000);
    }
  }
}

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("WiFi连接成功");
  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(callback);
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
  // 每2秒上报一次测试数据
  static unsigned long last_send = 0;
  if (millis() - last_send > 2000) {
    last_send = millis();
    char msg[64];
    snprintf(msg, sizeof(msg), "ESP32上报数据:%lu", millis());
    client.publish("test/send", msg);
    Serial.printf("已发送消息:%s\n", msg);
  }
}

若需要调整MQTT最大报文长度、心跳超时等参数,直接修改PubSubClient.h头文件中的对应宏定义即可


方案2:直接调用LWIP原生MQTT API(无第三方库依赖,适合底层定制需求)

ESP32 Arduino核心已内置完整LWIP组件,包含原生MQTT应用接口,无需引入外部库即可实现功能:
核心代码片段参考:

#include <WiFi.h>
#include "lwip/apps/mqtt.h"
#include "lwip/err.h"

const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";
// 本地PC的局域网IP
ip_addr_t mqtt_server_ip;
mqtt_client_t* mqtt_client;

// MQTT连接完成回调
static void mqtt_connection_cb(mqtt_client_t *client, void *arg, mqtt_connection_status_t status) {
  if (status == MQTT_CONNECT_ACCEPTED) {
    Serial.println("LWIP MQTT连接成功");
    // 后续添加订阅、发布逻辑
  } else {
    Serial.printf("连接失败,状态码:%d\n", status);
  }
}

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("WiFi连接成功");
  // 转换Broker IP地址,填入你本地PC的IP
  ip4addr_aton("192.168.x.x", &mqtt_server_ip);
  // 初始化MQTT客户端
  mqtt_client = mqtt_client_new();
  struct mqtt_connect_client_info_t client_info = {
    .client_id = "ESP32_LWIP_NATIVE",
    .client_user = NULL,
    .client_pass = NULL,
    .keep_alive = 60,
    .will_topic = NULL,
    .will_msg = NULL,
    .will_qos = 0,
    .will_retain = 0,
    .clean_session = 1
  };
  // 发起连接
  mqtt_client_connect(mqtt_client, &mqtt_server_ip, 1883, mqtt_connection_cb, NULL, &client_info);
}

void loop() {
  // LWIP内核会自动处理网络事件,发布消息可调用mqtt_publish()接口
}

功能验证

  • 烧录代码后打开串口监视器,确认WiFi、MQTT连接正常
  • 本地PC端执行命令监听上行主题:mosquitto_sub -t "test/send" -h 127.0.0.1 -p 1883,即可查看ESP32上报的数据
  • 本地PC端执行命令发送下行消息:mosquitto_pub -t "test/recv" -h 127.0.0.1 -p 1883 -m "测试消息",可在ESP32串口查看收到的内容

常见问题排查

  • MQTT连接失败优先检查PC局域网IP是否正确、1883端口是否被防火墙拦截、ESP32与PC是否在同一网段
  • 大报文传输失败可调整LWIP TCP缓冲区大小,或增大MQTT最大报文长度配置

内容的提问来源于stack exchange,提问作者habib

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 14:48:04