设置静态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
- 用ufw防火墙:
- 确认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
相关产品推荐
相关产品推荐

