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

如何配置ESP8266通过RabbitMQ MQTT向Spring Boot发送消息

配置全流程说明

1. RabbitMQ 服务端前置配置

首先确保服务端已经启用MQTT适配插件,执行命令:
rabbitmq-plugins enable rabbitmq_mqtt
默认MQTT协议监听端口为1883,和你现有代码中的端口配置一致,无需额外修改。同时确认你使用的mqtt_user账号,已经配置了对应虚拟主机的访问权限(默认虚拟主机为/)。

2. clientId 配置说明

你当前的写法位置完全正确:PubSubClient库的client.connect()方法第一个入参就是MQTT协议要求的clientId,针对RabbitMQ MQTT的适配要求,只需要补充两个注意点:

  • clientId必须全局唯一,不能有其他连接到同一RabbitMQ实例的客户端使用相同clientId。如果有多台ESP8266设备,可以拼接芯片唯一标识生成动态clientId,示例:"ESP8266_" + String(ESP.getChipId())
  • 如果需要接收设备离线期间的消息,需固定clientId、同时将clean session参数设置为false,否则每次重连会生成新的会话,丢失离线消息。

3. 完整ESP8266端可用代码示例

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

// 自定义配置项
const char* wifi_ssid = "你的WiFi名称";
const char* wifi_pwd = "你的WiFi密码";
const char* mqtt_host = "RabbitMQ服务端IP地址";
const int mqtt_port = 1883;
const char* mqtt_username = "你的RabbitMQ账号";
const char* mqtt_password = "你的RabbitMQ密码";
const char* publish_topic = "自定义发布主题,例如:esp/sensor/data";

WiFiClient espClient;
PubSubClient client(espClient);

// MQTT下行消息回调,不需要接收服务端消息可留空
void mqttCallback(char* topic, byte* payload, unsigned int length) {
  Serial.print("收到主题: ");
  Serial.println(topic);
  Serial.print("消息内容:");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

void mqttReconnect() {
  while (!client.connected()) {
    Serial.print("正在尝试连接MQTT服务端...");
    // 生成唯一clientId
    String clientId = "ESP8266_" + String(ESP.getChipId());
    // 连接参数顺序:clientId、用户名、密码、遗嘱主题、遗嘱QoS、遗嘱保留标识、遗嘱内容、clean session标识
    if (client.connect(clientId.c_str(), mqtt_username, mqtt_password, NULL, 0, false, NULL, true)) {
      Serial.println("连接成功");
      // 如需订阅服务端消息,可在此处调用subscribe方法
      // client.subscribe("你要订阅的主题");
    } else {
      Serial.print("连接失败,错误码:");
      Serial.print(client.state());
      Serial.println(",5秒后重试");
      delay(5000);
    }
  }
}

void setup() {
  Serial.begin(115200);
  // 连接WiFi
  WiFi.begin(wifi_ssid, wifi_pwd);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("WiFi连接成功");
  // 配置MQTT参数
  client.setServer(mqtt_host, mqtt_port);
  client.setCallback(mqttCallback);
}

void loop() {
  if (!client.connected()) {
    mqttReconnect();
  }
  client.loop();

  // 示例:发布测试消息
  String testPayload = "Hello from ESP8266, chipId: " + String(ESP.getChipId());
  client.publish(publish_topic, testPayload.c_str());
  delay(2000);
}

4. Spring Boot端接收配置提示

Spring Boot服务端可通过引入spring-integration-mqtt依赖实现MQTT消息订阅,配置时使用和ESP8266端一致的RabbitMQ地址、用户名密码,订阅ESP8266对应的发布主题即可正常接收消息。

5. 常见问题排查

  • 连接错误码-2:网络不通,检查RabbitMQ服务端IP、端口是否正确,1883端口是否被防火墙拦截
  • 连接错误码-4:用户名或密码错误,确认RabbitMQ账号密码配置正确
  • 连接错误码-5:clientId重复,或账号没有对应虚拟主机的访问权限

内容的提问来源于stack exchange,提问作者rimi reza duity

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 11:24:05