ESP8266连接MQTT返回状态码5无法发布DHT11传感器数据问题咨询
问题排查与解决方案
核心问题原因
- MQTT连接调用未传递已配置的用户名和密码:你当前使用的
client.connect(clientID)仅传入了客户端ID,当Broker开启身份认证时,缺少用户名、密码参数就会返回*未授权(状态码5)*错误 - 初始化逻辑顺序错误:你在
setup()函数开头就调用了MQTT连接,此时WiFi尚未完成连接,该调用完全无效,属于冗余错误代码
修正步骤
- 删除
setup()开头的无效连接代码:client.connect(clientID); - 修改
reconnect()函数中的MQTT连接调用,补充用户名、密码参数 - 在
loop()函数中新增连接状态判断和client.loop()调用,确保运行过程中断开后可以自动重连 - (可选优化)将温湿度读取逻辑移到
loop()中,避免每次上报的都是固定的初始值
修正后核心代码示例
修改后的reconnect函数
void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // 补充用户名、密码参数 if (client.connect(clientID, mqtt_user, mqtt_password)) { Serial.println("connected"); client.publish(humidity_topic, String(Luftfeuchtigkeit).c_str(), true); } else { Serial.print("failed, state: "); Serial.println(client.state()); Serial.println("attempting reconnection..."); delay(5000); } } }
修改后的setup函数
void setup() { Serial.begin(9600); dht.begin(); // 删掉原来的client.connect无效调用 setup_wifi(); client.setServer(mqtt_server, 1883); if (!client.connected()) { reconnect(); } client.loop(); // 温湿度读取可以保留或者移到loop中 Luftfeuchtigkeit = dht.readHumidity(); Temperatur = dht.readTemperature(); // 后续上报逻辑保持不变 }
修改后的loop函数
void loop() { // 新增连接检测和client.loop调用 if (!client.connected()) { reconnect(); } client.loop(); // 可选:每次上报前重新读取温湿度 Luftfeuchtigkeit = dht.readHumidity(); Temperatur = dht.readTemperature(); delay(2000); Serial.print("Luftfeuchtigkeit: "); Serial.print(String(Luftfeuchtigkeit).c_str()); Serial.println(" %"); client.publish(humidity_topic, String(Luftfeuchtigkeit).c_str(), true); Serial.print("Temperatur: "); Serial.print(Temperatur); Serial.println(" Grad Celsius"); client.publish(temperature_topic, String(Temperatur).c_str(), true); delay(60000); }
内容的提问来源于stack exchange,提问作者Schneggl
相关产品推荐
相关产品推荐

