开启新对话
黄文飞
ESP32 ArduinoMqttClient使用指南
esp32 ArduinoMqttClient用法

ESP32上使用ArduinoMqttClient库的详细用法:

1. 安装库

在Arduino IDE中安装:

  • 工具 → 管理库 → 搜索 "ArduinoMqttClient"

2. 基本连接示例

cpp
#include <WiFi.h>
#include <ArduinoMqttClient.h>

// WiFi配置
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";

// MQTT配置
const char* broker = "broker.hivemq.com";
int port = 1883;
const char* topic = "esp32/test";

WiFiClient wifiClient;
MqttClient mqttClient(wifiClient);

void setup() {
  Serial.begin(115200);
  
  // 连接WiFi
  connectWiFi();
  
  // 设置MQTT
  mqttClient.setId("ESP32_Client");
  mqttClient.setUsernamePassword("username", "password"); // 如果需要
  
  // 连接MQTT代理
  connectMQTT();
  
  // 订阅主题
  mqttClient.subscribe(topic);
}

void loop() {
  // 保持MQTT连接
  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. 高级功能示例

cpp
#include <WiFi.h>
#include <ArduinoMqttClient.h>

WiFiClient wifiClient;
MqttClient mqttClient(wifiClient);

// 回调函数设置
void setupMQTTCallbacks() {
  // 设置消息回调(需要重写 onMessage 方法)
  // 或者使用以下方式处理消息
  
  // 设置连接状态回调
  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);
}

// QoS设置示例
void publishWithQoS() {
  // QoS 0 - 最多一次
  mqttClient.beginMessage("esp32/qos0", false, 0);
  mqttClient.print("QoS 0 message");
  mqttClient.endMessage();
  
  // QoS 1 - 至少一次
  mqttClient.beginMessage("esp32/qos1", false, 1);
  mqttClient.print("QoS 1 message");
  mqttClient.endMessage();
  
  // QoS 2 - 恰好一次
  mqttClient.beginMessage("esp32/qos2", false, 2);
  mqttClient.print("QoS 2 message");
  mqttClient.endMessage();
}

// 保留消息示例
void publishRetainedMessage() {
  mqttClient.beginMessage("esp32/status", true, 1); // true表示保留消息
  mqttClient.print("online");
  mqttClient.endMessage();
}

4. 完整项目示例 - 传感器数据发布

cpp
#include <WiFi.h>
#include <ArduinoMqttClient.h>
#include <DHT.h>

#define DHT_PIN 4
#define DHT_TYPE DHT11

// WiFi配置
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";

// MQTT配置
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();
  }
  
  // 每10秒发布传感器数据
  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. 注意事项

  1. 确保WiFi连接稳定

  2. 定期检查MQTT连接状态

  3. 合理设置消息发布频率

  4. 使用合适的QoS等级

  5. 处理连接断开和重连逻辑

这个库提供了完整的MQTT客户端功能,适合在ESP32上实现物联网应用。

内容由 AI 生成,请仔细甄别