ESP32上使用ArduinoMqttClient库的详细用法:
1. 安装库
在Arduino IDE中安装:
2. 基本连接示例
#include <WiFi.h>
#include <ArduinoMqttClient.h>
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
const char* broker = "broker.hivemq.com";
int port = 1883;
const char* topic = "esp32/test";
WiFiClient wifiClient;
MqttClient mqttClient(wifiClient);
void setup() {
Serial.begin(115200);
connectWiFi();
mqttClient.setId("ESP32_Client");
mqttClient.setUsernamePassword("username", "password");
connectMQTT();
mqttClient.subscribe(topic);
}
void loop() {
if (!mqttClient.connected()) {
connectMQTT();
}
int messageSize = mqttClient.parseMessage();
if (messageSize) {
handleMessage();
}
static unsigned long lastPublish = 0;
if (millis() - lastPublish > 5000) {
publishMessage();
lastPublish = millis();
}
mqttClient.poll();
}
void connectWiFi() {
Serial.print("Connecting to WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected to WiFi!");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
}
void connectMQTT() {
Serial.print("Connecting to MQTT broker...");
while (!mqttClient.connect(broker, port)) {
Serial.print(".");
delay(1000);
}
Serial.println("\nConnected to MQTT broker!");
}
void handleMessage() {
Serial.print("Received message on topic: ");
Serial.println(mqttClient.messageTopic());
Serial.print("Message: ");
while (mqttClient.available()) {
Serial.print((char)mqttClient.read());
}
Serial.println();
}
void publishMessage() {
String message = "Hello from ESP32 - " + String(millis());
mqttClient.beginMessage(topic);
mqttClient.print(message);
mqttClient.endMessage();
Serial.println("Message published: " + message);
}3. 高级功能示例
#include <WiFi.h>
#include <ArduinoMqttClient.h>
WiFiClient wifiClient;
MqttClient mqttClient(wifiClient);
void setupMQTTCallbacks() {
mqttClient.onConnect(onMqttConnect);
mqttClient.onDisconnect(onMqttDisconnect);
}
void onMqttConnect(bool sessionPresent) {
Serial.println("Connected to MQTT broker");
Serial.print("Session present: ");
Serial.println(sessionPresent);
mqttClient.subscribe("esp32/sensor/temperature");
mqttClient.subscribe("esp32/sensor/humidity");
mqttClient.subscribe("esp32/control/#");
}
void onMqttDisconnect(int reason) {
Serial.print("MQTT disconnected, reason: ");
Serial.println(reason);
}
void publishWithQoS() {
mqttClient.beginMessage("esp32/qos0", false, 0);
mqttClient.print("QoS 0 message");
mqttClient.endMessage();
mqttClient.beginMessage("esp32/qos1", false, 1);
mqttClient.print("QoS 1 message");
mqttClient.endMessage();
mqttClient.beginMessage("esp32/qos2", false, 2);
mqttClient.print("QoS 2 message");
mqttClient.endMessage();
}
void publishRetainedMessage() {
mqttClient.beginMessage("esp32/status", true, 1);
mqttClient.print("online");
mqttClient.endMessage();
}4. 完整项目示例 - 传感器数据发布
#include <WiFi.h>
#include <ArduinoMqttClient.h>
#include <DHT.h>
#define DHT_PIN 4
#define DHT_TYPE DHT11
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
const char* broker = "broker.hivemq.com";
int port = 1883;
WiFiClient wifiClient;
MqttClient mqttClient(wifiClient);
DHT dht(DHT_PIN, DHT_TYPE);
const char* tempTopic = "esp32/sensor/temperature";
const char* humidTopic = "esp32/sensor/humidity";
const char* statusTopic = "esp32/status";
void setup() {
Serial.begin(115200);
dht.begin();
connectWiFi();
setupMQTT();
mqttClient.beginMessage(statusTopic, true);
mqttClient.print("online");
mqttClient.endMessage();
}
void setupMQTT() {
mqttClient.setId("ESP32_Sensor_" + String(random(0xffff), HEX));
Serial.print("Connecting to MQTT...");
if (!mqttClient.connect(broker, port)) {
Serial.println(" failed!");
return;
}
Serial.println(" success!");
mqttClient.subscribe("esp32/control/interval");
}
void loop() {
if (!mqttClient.connected()) {
reconnectMQTT();
}
int messageSize = mqttClient.parseMessage();
if (messageSize) {
handleMQTTMessage();
}
static unsigned long lastSensorRead = 0;
if (millis() - lastSensorRead > 10000) {
publishSensorData();
lastSensorRead = millis();
}
mqttClient.poll();
delay(100);
}
void handleMQTTMessage() {
String topic = mqttClient.messageTopic();
String message = "";
while (mqttClient.available()) {
message += (char)mqttClient.read();
}
Serial.print("Message on '");
Serial.print(topic);
Serial.print("': ");
Serial.println(message);
if (topic == "esp32/control/interval") {
int interval = message.toInt();
if (interval > 0) {
Serial.println("Update interval: " + String(interval));
}
}
}
void publishSensorData() {
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
if (!isnan(temperature)) {
mqttClient.beginMessage(tempTopic);
mqttClient.print(temperature);
mqttClient.endMessage();
Serial.println("Temperature: " + String(temperature));
}
if (!isnan(humidity)) {
mqttClient.beginMessage(humidTopic);
mqttClient.print(humidity);
mqttClient.endMessage();
Serial.println("Humidity: " + String(humidity));
}
}
void reconnectMQTT() {
Serial.println("Reconnecting to MQTT...");
if (mqttClient.connect(broker, port)) {
Serial.println("Reconnected!");
mqttClient.subscribe("esp32/control/interval");
} else {
Serial.println("Reconnect failed!");
}
}5. 重要函数说明
connect(broker, port) - 连接MQTT代理
subscribe(topic) - 订阅主题
beginMessage(topic) - 开始发布消息
endMessage() - 结束发布消息
parseMessage() - 解析接收的消息
poll() - 处理MQTT通信
setId(clientId) - 设置客户端ID
setUsernamePassword(username, password) - 设置认证信息
6. 注意事项
确保WiFi连接稳定
定期检查MQTT连接状态
合理设置消息发布频率
使用合适的QoS等级
处理连接断开和重连逻辑
这个库提供了完整的MQTT客户端功能,适合在ESP32上实现物联网应用。