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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 07:04:58