如何在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协议,无需额外调整底层配置:
- 打开Arduino IDE库管理器,搜索并安装
PubSubClient库 - 参考示例代码实现功能:
#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
相关产品推荐
相关产品推荐

