发布于 2026-01-06 0 阅读
0

ESP32 连接到免费的公共 MQTT 服务器

ESP32 连接到免费的公共 MQTT 服务器

MQTT是一种轻量级、灵活的物联网消息交换和数据传输协议,致力于为物联网开发人员实现灵活性与硬件/网络资源之间的平衡。

ESP32是 ESP8266 的升级版。除了 Wi-Fi 模块外,该模块还集成了蓝牙 4.0 模块。其双核 CPU 的工作频率为 80 至 240 MHz。它包含两个 Wi-Fi 和蓝牙模块以及各种输入输出引脚。ESP32 是物联网项目的理想选择。

在这个项目中,我们将把 ESP32 连接到由 EMQX MQTT Cloud 运营和维护的免费公共 MQTT 代理,并使用 Arduino IDE 对 ESP32 进行编程。EMQX Cloud 是一个安全的 MQTT 物联网云服务平台,提供MQTT 5.0接入服务,具有一站式运维管理和独特的隔离环境。

所需的物联网组件

Arduino配置

安装 ESP32 开发板

点击“工具”->“开发板”->“开发板管理”->搜索“ESP32”->“安装”。

安装 ESP32 开发板

安装 PubSub 客户端

项目 -> 加载库 -> 库管理器... -> 搜索 PubSubClient -> 安装 Nick O'Leary 的 PubSubClient

安装 PubSub 客户端

ESP32 发布/订阅电路图

ESP32 发布/订阅电路图

使用 Arduino IDE 对 ESP32 开发板进行编程

逐步连接到 MQTT

首先,我们将导入WiFiPubSubClient库。ESP8266WiFi 库可以将 ESP32 连接到 Wi-Fi 网络,而 PubSubClient 库可以将 ESP32 连接到 MQTT 服务器,以发布消息和订阅主题。

   #include <WiFi.h>
   #include <PubSubClient.h>
Enter fullscreen mode Exit fullscreen mode

2.设置 Wi-Fi 名称和密码,以及 MQTT 服务器连接地址和端口,并将主题设置为“esp32/test”。

   // WiFi
   const char *ssid = "mousse"; // Enter your WiFi name
   const char *password = "qweqweqwe";  // Enter WiFi password

   // MQTT Broker
   const char *mqtt_broker = "broker.emqx.io";
   const char *topic = "esp32/test";
   const char *mqtt_username = "emqx";
   const char *mqtt_password = "public";
   const int mqtt_port = 1883;
Enter fullscreen mode Exit fullscreen mode

3.打开串口连接以输出程序结果,并连接到Wi-Fi网络。

   // Set software serial baud to 115200;
   Serial.begin(115200);
   // connecting to a WiFi network
   WiFi.begin(ssid, password);
   while (WiFi.status() != WL_CONNECTED) {
       delay(500);
       Serial.println("Connecting to WiFi..");
   }
Enter fullscreen mode Exit fullscreen mode

4.使用 PubSubClient 连接到公共 MQTT 代理

   client.setServer(mqtt_broker, mqtt_port);
   client.setCallback(callback);
   while (!client.connected()) {
       String client_id = "esp32-client-";
       client_id += String(WiFi.macAddress());
       Serial.printf("The client %s connects to the public mqtt broker\n", client_id.c_str());
       if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
           Serial.println("Public emqx mqtt broker connected");
       } else {
           Serial.print("failed with state ");
           Serial.print(client.state());
           delay(2000);
       }
   }
Enter fullscreen mode Exit fullscreen mode

5. MQTT 服务器连接成功后,ESP32 将向 MQTT 服务器发布消息,esp/test并订阅主题 messages esp/test

   // publish and subscribe
   client.publish(topic, "Hi EMQX I'm ESP32 ^^");
   client.subscribe(topic);
Enter fullscreen mode Exit fullscreen mode

6.设置回调函数,将主题名称打印到串口,并打印从该esp32/test主题收到的消息。

   void callback(char *topic, byte *payload, unsigned int length) {
       Serial.print("Message arrived in topic: ");
       Serial.println(topic);
       Serial.print("Message:");
       for (int i = 0; i < length; i++) {
           Serial.print((char) payload[i]);
       }
       Serial.println();
       Serial.println("-----------------------");
   }
Enter fullscreen mode Exit fullscreen mode

完整代码

#include <WiFi.h>
#include <PubSubClient.h>

// WiFi
const char *ssid = "mousse"; // Enter your WiFi name
const char *password = "qweqweqwe";  // Enter WiFi password

// MQTT Broker
const char *mqtt_broker = "broker.emqx.io";
const char *topic = "esp32/test";
const char *mqtt_username = "emqx";
const char *mqtt_password = "public";
const int mqtt_port = 1883;

WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
 // Set software serial baud to 115200;
 Serial.begin(115200);
 // connecting to a WiFi network
 WiFi.begin(ssid, password);
 while (WiFi.status() != WL_CONNECTED) {
     delay(500);
     Serial.println("Connecting to WiFi..");
 }
 Serial.println("Connected to the WiFi network");
 //connecting to a mqtt broker
 client.setServer(mqtt_broker, mqtt_port);
 client.setCallback(callback);
 while (!client.connected()) {
     String client_id = "esp32-client-";
     client_id += String(WiFi.macAddress());
     Serial.printf("The client %s connects to the public mqtt broker\n", client_id.c_str());
     if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
         Serial.println("Public emqx mqtt broker connected");
     } else {
         Serial.print("failed with state ");
         Serial.print(client.state());
         delay(2000);
     }
 }
 // publish and subscribe
 client.publish(topic, "Hi EMQX I'm ESP32 ^^");
 client.subscribe(topic);
}

void callback(char *topic, byte *payload, unsigned int length) {
 Serial.print("Message arrived in topic: ");
 Serial.println(topic);
 Serial.print("Message:");
 for (int i = 0; i < length; i++) {
     Serial.print((char) payload[i]);
 }
 Serial.println();
 Serial.println("-----------------------");
}

void loop() {
 client.loop();
}
Enter fullscreen mode Exit fullscreen mode

运行和测试

1.使用 Arduino 上传完整代码并给 esp32 上电。

2.打开串口监视器,选择115200波特率,检查ESP32连接状态。

检查 ESP32 连接状态

3.使用MQTT X客户端连接到公共MQTT服务器,并向ESP32发布消息。

MQTT X 客户端

概括

目前,我们已经成功将ESP32连接到MQTT服务器。这只是ESP32的基本功能之一。实际上,ESP32还可以连接到各种物联网传感器,并将传感器数据报告给MQTT服务器。

原文发表于https://www.emqx.com

文章来源:https://dev.to/emqx/esp32-connects-to-the-free-public-mqtt-broker-386k