ESP8266连接MQTT Broker失败(rc=-2)技术求助
ESP8266 MQTT连接失败(rc=-2)问题解决
问题描述
开发基于ESP8266、MQTT和Node-RED的监控项目时,串口监视器显示无法连接MQTT Broker,报错信息:Failed to connect to MQTT broker, rc=-2。已通过CMD测试MQTT订阅/发布功能正常,但代码连接始终失败。
原代码
#include <Wire.h> #include <Adafruit_MLX90614.h> #include <Wire.h> #include "MAX30100_PulseOximeter.h" #include <ESP8266WiFi.h> #include <PubSubClient.h> // Replace with your Wi-Fi credentials const char* ssid = "mywifi"; const char* password = "password"; // Replace with your MQTT broker IP address const char* mqttServer = "127.0.0.1"; const int mqttPort = 1883; // Replace with your MQTT topics const char* mqttTopicTemp = "sensors/temperature"; const char* mqttTopicOxygen = "sensors/oxygen"; WiFiClient espClient; PubSubClient client(espClient); Adafruit_MLX90614 mlx = Adafruit_MLX90614(); PulseOximeter pox; void onHeartRateBeatDetected() { float hr = pox.getHeartRate(); Serial.print("Heart rate:"); Serial.println(hr); } void setup() { Serial.begin(115200); // Connect to Wi-Fi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("Connected to WiFi"); // Connect to MQTT broker client.setServer(mqttServer, mqttPort); while (!client.connected()) { if (client.connect("ESP8266Client")) { Serial.println("Connected to MQTT broker"); } else { Serial.print("Failed to connect to MQTT broker, rc="); Serial.println(client.state()); delay(2000); } } // Initialize sensors mlx.begin(); pox.begin(); // Set up a callback for pulse detection pox.setOnBeatDetectedCallback(onHeartRateBeatDetected); } void loop() { // Read temperature from MLX90614 sensor float temperature = mlx.readObjectTempC(); // Convert temperature to string String tempPayload = String(temperature); // Publish temperature to MQTT topic client.publish(mqttTopicTemp, tempPayload.c_str()); // Update pulse oximeter pox.update(); // Read oxygen level from MAX30100 sensor if (pox.begin()) { float oxygen = pox.getSpO2(); // Convert oxygen level to string String oxygenPayload = String(oxygen); // Publish oxygen level to MQTT topic client.publish(mqttTopicOxygen, oxygenPayload.c_str()); } delay(1000); // Adjust the delay based on your needs }
问题分析与解决方案
1. 核心问题:MQTT服务器地址错误
报错rc=-2表示ESP8266无法解析或连接到指定的MQTT服务器地址。代码中mqttServer设为127.0.0.1(本地回环地址),这对ESP8266来说指向自身,而非实际运行MQTT Broker的设备。
解决:
将mqttServer修改为MQTT Broker所在设备的局域网IP地址(比如192.168.1.100),确保ESP8266和Broker处于同一WiFi网络。
2. 其他潜在问题修复
- 重复初始化传感器:原代码
loop()中重复调用pox.begin(),会导致传感器反复初始化,影响数据读取。需移除loop()中的pox.begin()调用,仅保留setup()中的初始化。 - MQTT连接稳定性:添加
client.loop()在loop()中,维持MQTT连接心跳(PubSubClient需要定期调用此函数处理消息和连接状态)。 - 无效数据过滤:读取血氧数据时,判断数值有效性后再发布,避免无效数据上传。
修改后的代码示例
#include <Wire.h> #include <Adafruit_MLX90614.h> #include "MAX30100_PulseOximeter.h" #include <ESP8266WiFi.h> #include <PubSubClient.h> // Wi-Fi credentials const char* ssid = "mywifi"; const char* password = "password"; // MQTT broker info - 修改为实际局域网IP const char* mqttServer = "192.168.1.100"; const int mqttPort = 1883; // MQTT topics const char* mqttTopicTemp = "sensors/temperature"; const char* mqttTopicOxygen = "sensors/oxygen"; const char* mqttTopicHeartRate = "sensors/heartrate"; WiFiClient espClient; PubSubClient client(espClient); Adafruit_MLX90614 mlx = Adafruit_MLX90614(); PulseOximeter pox; float lastHeartRate = 0.0; void onHeartRateBeatDetected() { lastHeartRate = pox.getHeartRate(); Serial.print("Heart rate:"); Serial.println(lastHeartRate); // 发布心率数据 client.publish(mqttTopicHeartRate, String(lastHeartRate).c_str()); } void setup() { Serial.begin(115200); // Connect to Wi-Fi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("Connected to WiFi"); // Set MQTT server client.setServer(mqttServer, mqttPort); // Connect to MQTT broker while (!client.connected()) { if (client.connect("ESP8266Client")) { Serial.println("Connected to MQTT broker"); } else { Serial.print("Failed to connect, rc="); Serial.println(client.state()); delay(2000); } } // Initialize sensors mlx.begin(); if (!pox.begin()) { Serial.println("MAX30100 initialization failed"); while (1); } pox.setOnBeatDetectedCallback(onHeartRateBeatDetected); } void loop() { // 维持MQTT连接,断开自动重连 if (!client.connected()) { while (!client.connected()) { if (client.connect("ESP8266Client")) { Serial.println("Reconnected to MQTT broker"); } else { Serial.print("Reconnect failed, rc="); Serial.println(client.state()); delay(2000); } } } client.loop(); // 读取并发布温度数据 float temperature = mlx.readObjectTempC(); client.publish(mqttTopicTemp, String(temperature).c_str()); Serial.print("Temperature: "); Serial.println(temperature); // 更新血氧仪数据,读取有效血氧值并发布 pox.update(); float oxygen = pox.getSpO2(); if (oxygen != -1) { client.publish(mqttTopicOxygen, String(oxygen).c_str()); Serial.print("SpO2: "); Serial.println(oxygen); } delay(1000); }
内容的提问来源于stack exchange,提问作者AHMAD AUFA A A
相关产品推荐
相关产品推荐

