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

设置静态IP后ESP32无法连接树莓派MQTT代理求助

问题描述

我正在帮儿子完成项目,已在旧路由器上为运行MQTT代理(端口1883,带用户名密码)的RPI3设置静态IP。同网络下笔记本可通过终端发送消息,但ESP32连接被拒绝,错误码2。设置静态IP前一切正常,且未修改树莓派上的任何设置。我对Linux和网络不太熟悉,有人遇到过类似问题吗?以下是儿子的代码,是否需要针对静态IP修改?

#include <WiFi.h>
#include <PubSubClient.h>
#define b1 13 
#define b2 12 

const char* ssid = "iotwifi";
const char* password = "ABC2013#";
const char* mqtt_server = "192.168.1.199";
const char* mqtt_user = "korisnik";
const char* mqtt_password = "12345678";
WiFiClient espClient;
PubSubClient client(espClient);
void setup_wifi() {
  delay(10);

  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}
void reconnect(){
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");

    // Connect to the MQTT broker with username and password
    if (client.connect("ESP32Client", mqtt_user, mqtt_password)) {
      Serial.println("connected");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      delay(5000);
    }
  }
}

void setup(){
  Serial.begin(115200);
  pinMode(b1, INPUT);
  pinMode(b2, INPUT);
  setup_wifi();
  
}

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

  if (digitalRead(b1) == 1){
    Serial.println("1 PRESSED");
    client.publish("testTopic", String("1 presssed").c_str());
  }
  if (digitalRead(b2) == 1){
    Serial.println("2 PRESSED");
    client.publish("testTopic", String("2 presssed").c_str());
  }

}

排查与解决方案

1. 代码小调整

代码里的mqtt_server已经正确指向新静态IP,不需要针对静态IP修改核心配置,但有个关键遗漏:未初始化MQTT客户端的服务器端口。虽然PubSubClient默认用1883,但显式指定能避免潜在的端口配置问题,在setup()函数里添加一行:

client.setServer(mqtt_server, 1883);

放在setup_wifi();之后即可。

2. 网络层面重点排查

既然笔记本能正常连接,问题大概率出在静态IP设置带来的网络异常:

  • 检查树莓派静态IP参数:确认子网掩码、网关和路由器动态IP段一致(比如路由器网关是192.168.1.1,子网掩码255.255.255.0),网关错误会导致ESP32无法路由到树莓派。
  • 树莓派防火墙限制:静态IP设置后可能触发了防火墙规则,登录树莓派终端运行sudo iptables -L查看是否有拒绝1883端口的规则,也可以临时关闭防火墙测试:
    • 用ufw防火墙:sudo ufw disable
    • 用firewalld:sudo systemctl stop firewalld
  • 确认ESP32与树莓派同网段:查看ESP32串口输出的IP address,确保和192.168.1.199在同一个子网(比如都是192.168.1.x)。
  • 清除ARP缓存:路由器或ESP32可能缓存了树莓派旧IP的映射,重启路由器和ESP32试试。

3. MQTT代理监听验证

在树莓派终端运行netstat -tulpn | grep 1883,确认MQTT代理正在监听新的静态IP(显示0.0.0.0:1883或192.168.1.199:1883都正常,如果只显示旧IP,说明代理绑定了旧IP,需要重启MQTT服务)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 03:40:04