ESP32开发:从Wi-Fi连接到MQTT通信
ESP32的Wi-Fi连接配置
在Arduino IDE中,使用WiFi库可以轻松连接Wi-Fi网络。需要包含WiFi.h
头文件,并调用WiFi.begin()
函数,传入SSID和密码作为参数。连接状态可以通过WiFi.status()
检查,返回WL_CONNECTED
表示成功。
#include <WiFi.h>const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";void setup() {Serial.begin(115200);WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}Serial.println("WiFi connected");Serial.println("IP address: " + WiFi.localIP());
}
MQTT客户端库安装与配置
PubSubClient库是常用的MQTT客户端库,可通过Arduino库管理器安装。初始化时需要指定MQTT服务器地址和端口,通常使用setServer()
方法。回调函数用于处理接收到的消息。
#include <PubSubClient.h>WiFiClient espClient;
PubSubClient client(espClient);
const char* mqtt_server = "broker.hivemq.com";
const int mqtt_port = 1883;void callback(char* topic, byte* payload, unsigned int length) {Serial.print("Message arrived [");Serial.print(topic);Serial.print("] ");for (int i = 0; i < length; i++) {Serial.print((char)payload[i]);}Serial.println();
}void setup() {client.setServer(mqtt_server, mqtt_port);client.setCallback(callback);
}
MQTT连接与消息发布
使用connect()
方法连接MQTT服务器,需要提供客户端ID。如果服务器需要认证,还需传入用户名和密码。连接成功后,可通过publish()
发布消息到指定主题。
void reconnect() {while (!client.connected()) {Serial.print("Attempting MQTT connection...");if (client.connect("ESP32Client")) {Serial.println("connected");client.subscribe("example/topic");} else {Serial.print("failed, rc=");Serial.print(client.state());Serial.println(" try again in 5 seconds");delay(5000);}}
}void loop() {if (!client.connected()) {reconnect();}client.loop();client.publish("example/topic", "hello from ESP32");delay(2000);
}
错误处理与重连机制
网络连接可能不稳定,需要实现自动重连逻辑。检查WiFi.status()
和client.connected()
状态,在断开时尝试重新连接。建议添加延时避免频繁重试消耗资源。
void checkConnections() {if (WiFi.status() != WL_CONNECTED) {WiFi.begin(ssid, password);Serial.println("WiFi reconnecting...");}if (!client.connected()) {reconnect();}
}
低功耗优化技巧
对于电池供电场景,可启用ESP32的深度睡眠模式。在发送数据后调用esp_deep_sleep_start()
,并通过定时器或外部中断唤醒。注意Wi-Fi和MQTT连接每次唤醒后需重新初始化。
www.dyjzyl.com6686||
www.aqtchb.com6686||
www.junyueqi.com6686||
m.yitongjszp.com6686||
m.kyzs88.com6686||
m.bjhdsdkj.com6686||
m.bgxfruit.com6686||
m.shjinfumen.com6686||
m.hncdjcc.com6686||
m.wjzcbz.com6686||
m.szsskjs.com6686||
m.dzyffm.com6686||
m.jinyuangy.com6686||
m.dyjzyl.com6686||
m.aqtchb.com6686||
m.junyueqi.com6686||
cosconit.com6686||
staid.cn6686||
cdlzq.com6686||
www.tzyongli.com6686||
#include <esp_sleep.h>void setup() {// 常规初始化代码esp_sleep_enable_timer_wakeup(30 * 1000000); // 30秒后唤醒
}void loop() {// 发送数据代码esp_deep_sleep_start();
}