要在ESP32-C3上实现MQTT通信,核心是通过WiFi连接MQTT服务器(如公共服务器、自建服务器),实现消息的发布(Publish)和订阅(Subscribe)。以下是基于Arduino IDE的详细实现步骤(入门友好),包含环境搭建、代码示例和测试方法。

一、准备工作

1. 硬件
  • ESP32-C3开发板(如ESP32-C3-DevKitM-1)
  • USB数据线(用于烧录和供电)
2. 软件环境
  • Arduino IDE(推荐1.8.x或2.x版本)
  • ESP32-C3开发板支持(需在Arduino中安装)
  • MQTT客户端库(PubSubClient,轻量且常用)
  • MQTT服务器(可选公共服务器,如broker.emqx.io;或自建服务器,如Mosquitto)

二、环境搭建

1. 安装ESP32-C3开发板支持
  • 打开Arduino IDE,依次点击「文件」→「首选项」,在「附加开发板管理器网址」中添加:
    https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
    (若国内访问困难,可替换为镜像地址,如https://dl.espressif.com/dl/package_esp32_index.json
  • 点击「工具」→「开发板」→「开发板管理器」,搜索「esp32」,安装「ESP32 by Espressif Systems」(版本推荐2.0.0以上)。
  • 安装完成后,在「工具」→「开发板」中选择「ESP32C3 Dev Module」(或对应型号)。
2. 安装MQTT库
  • 点击「项目」→「加载库」→「管理库」,搜索「PubSubClient」,安装由「Nick O’Leary」开发的库(版本推荐2.8.0以上)。

三、代码实现(发布+订阅)

以下代码实现:连接WiFi → 连接MQTT服务器 → 定期发布消息 → 订阅指定主题并接收消息。

代码示例
#include <WiFi.h>
#include <PubSubClient.h>

// WiFi配置
const char* ssid = "你的WiFi名称";       // 替换为你的WiFi SSID
const char* password = "你的WiFi密码";   // 替换为你的WiFi密码

// MQTT服务器配置(以公共服务器broker.emqx.io为例)
const char* mqtt_server = "broker.emqx.io";  // MQTT服务器地址
const uint16_t mqtt_port = 1883;             // MQTT端口(非加密默认1883)
const char* mqtt_client_id = "esp32c3_mqtt_test";  // 客户端ID(需唯一,避免冲突)
const char* mqtt_sub_topic = "esp32c3/sub";  // 订阅的主题
const char* mqtt_pub_topic = "esp32c3/pub";  // 发布的主题

// 定义WiFi客户端和MQTT客户端
WiFiClient espClient;
PubSubClient client(espClient);

// MQTT消息回调函数(收到订阅的消息时触发)
void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("收到消息,主题: ");
  Serial.println(topic);
  Serial.print("消息内容: ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);  // 打印消息内容
  }
  Serial.println("\n-------------------");
}

// 连接WiFi函数
void connectWiFi() {
  Serial.print("连接WiFi: ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi连接成功!IP地址: ");
  Serial.println(WiFi.localIP());
}

// 重连MQTT服务器函数(若断开则自动重连)
void reconnectMQTT() {
  while (!client.connected()) {  // 若未连接,则循环重试
    Serial.print("连接MQTT服务器: ");
    Serial.println(mqtt_server);

    // 尝试连接MQTT服务器(无用户名密码,公共服务器通常无需认证)
    if (client.connect(mqtt_client_id)) {
      Serial.println("MQTT连接成功!");
      // 连接成功后,订阅主题
      client.subscribe(mqtt_sub_topic);
      Serial.print("已订阅主题: ");
      Serial.println(mqtt_sub_topic);
    } else {
      Serial.print("连接失败,错误代码: ");
      Serial.println(client.state());  // 打印错误码(参考PubSubClient文档)
      Serial.println("5秒后重试...");
      delay(5000);  // 5秒后重试
    }
  }
}

void setup() {
  Serial.begin(115200);  // 初始化串口(波特率115200)
  connectWiFi();         // 连接WiFi
  client.setServer(mqtt_server, mqtt_port);  // 设置MQTT服务器
  client.setCallback(callback);              // 设置消息回调函数
}

void loop() {
  if (!client.connected()) {  // 若MQTT断开,重连
    reconnectMQTT();
  }
  client.loop();  // 维持MQTT连接,处理消息

  // 每5秒发布一条消息
  static unsigned long lastPublishTime = 0;
  if (millis() - lastPublishTime > 5000) {
    lastPublishTime = millis();
    
    // 发布的消息内容(示例:当前时间戳)
    String message = "ESP32-C3发布消息,时间: " + String(millis());
    boolean publishSuccess = client.publish(mqtt_pub_topic, message.c_str());
    
    if (publishSuccess) {
      Serial.print("发布成功,主题: ");
      Serial.print(mqtt_pub_topic);
      Serial.print(",消息: ");
      Serial.println(message);
    } else {
      Serial.println("发布失败!");
    }
  }
}

四、代码说明

  1. WiFi连接:通过WiFi.begin()连接指定WiFi,需替换ssidpassword为实际信息。
  2. MQTT配置:使用公共服务器broker.emqx.io(无需注册,方便测试),端口1883(非加密)。
  3. 回调函数callback()在收到订阅主题的消息时触发,用于处理接收的消息(此处打印到串口)。
  4. 重连机制reconnectMQTT()确保MQTT断开后自动重连,并重新订阅主题。
  5. 发布消息:每5秒向esp32c3/pub主题发布一条包含时间戳的消息。

五、测试方法

1. 上传代码
  • 连接ESP32-C3到电脑,在Arduino IDE中选择正确的端口(「工具」→「端口」),点击上传按钮。
  • 打开串口监视器(波特率115200),观察是否成功连接WiFi和MQTT服务器。
2. 验证MQTT通信

使用MQTT客户端工具(如MQTTX、MQTT.fx)验证:

  • 工具配置:连接到broker.emqx.io:1883,客户端ID任意(如test_client)。
  • 接收ESP32发布的消息:在工具中订阅esp32c3/pub主题,应能收到ESP32每5秒发送的消息。
  • 向ESP32发送消息:在工具中向esp32c3/sub主题发布消息,ESP32的串口监视器会打印收到的内容。

六、常见问题解决

  1. WiFi连接失败:检查SSID、密码是否正确,或WiFi信号是否稳定。
  2. MQTT连接失败
    • 确认服务器地址和端口是否正确(公共服务器可能临时维护,可更换为test.mosquitto.org)。
    • 客户端ID是否重复(建议用MAC地址生成唯一ID,如String clientId = "esp32c3-" + WiFi.macAddress();)。
  3. 消息发布/接收失败:检查主题是否正确,或服务器是否限制权限(公共服务器通常无限制)。

七、进阶扩展

  • 若需加密通信,可使用MQTTs(端口8883),需配置SSL证书(参考PubSubClient的SSL示例)。
  • 自建MQTT服务器(如Mosquitto),可实现更灵活的权限管理和本地化通信。
  • 结合传感器(如温湿度),发布传感器数据到MQTT服务器,实现物联网数据采集。

通过以上步骤,ESP32-C3可快速实现MQTT通信,满足物联网设备的消息交互需求。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐