0°

(四)ESP32:将消息发布到MQTT服务器

本文的目的是解释如何使用ESP32和Arduino IDE库将消息发布到MQTT服务器。

本文的目的是解释如何使用ESP32和Arduino IDE库将消息发布到MQTT主题。

介绍

本文的目的是解释如何使用ESP32和Arduino IDE库将消息发布到MQTT主题。

我们假设代理将托管在CloudMQTT上。由于CloudMQTT有免费的计划,我们可以创建一个帐户并对其进行测试。设置帐户非常简单。您可以在此处查看如何执行此操作以及如何创建代理实例。(英文的文档可以使用翻译软件翻译查看使用)

完成此过程后,请检查实例信息页面,该页面应类似于图1中所示的页面。我们将在ESP32代码上使用的重要凭据是服务器用户密码端口

ESP32:将消息发布到MQTT 主题

图1 – CloudMQTT实例信息。

对于ESP32方面,我们将使用名为PubSubClient的MQTT库。虽然在撰写本文时没有提到ESP32的支持,但在这里可以看到该库工作正常。

像以前一样,安装库的最简单方法是通过Arduino IDE库管理器,如图2所示。

ESP32:将消息发布到MQTT 主题

图2 – 通过Arduino IDE库管理器安装PubSub库。

代码

我们需要在代码中包含一些库。我们需要WiFi库,以便能够将ESP32连接到WiFi网络,以及PubSubClient库,它将允许我们连接到MQTT代理。有关如何将ESP32连接到WiFi网络的更详细说明,请在此处查看

为了具有易于修改和可读的代码,我们将声明在全局变量中连接到WiFi网络和MQTT代理所需的凭证和信息。对于与MQTT代理的连接,我们需要服务器地址,端口,用户名和密码,可以在实例信息页面中获取,如介绍部分的图1所示。

#include <WiFi.h>
#include <PubSubClient.h>
 
const char* ssid = "yourNetworkName";
const char* password = "yourNetworkPassword";
const char* mqttServer = "m11.cloudmqtt.com";
const int mqttPort = 12948;
const char* mqttUser = "yourMQTTuser";
const char* mqttPassword = "yourMQTTpassword";

之后,我们将声明一个WiFiClient类的对象,它允许建立与已定义的IP和端口的连接。然而,我们不会明确地使用这个对象,因为它将由MQTT库使用。

我们还将声明类PubSubClient的对象 ,并将构造函数的输入作为先前定义的WiFiClient传递。

WiFiClient espClient;
PubSubClient client(espClient);

像以前一样,在setup函数中,我们打开一个串行连接,因为这是输出程序结果的最简单方法。我们还将连接到WiFi网络,因此我们可以访问MQTT代理并向主题发布消息。

Serial.begin(115200);
WiFi.begin(ssid, password);
 
while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("Connecting to WiFi..");
}
 
Serial.println("Connected to the WiFi network");

接下来,我们需要指定MQTT服务器的地址和端口,这些地址和端口先前已在我们的全局变量中声明。为此,我们 在PubSubClient对象上调用setServer方法,该对象接收地址和端口作为参数。

之后,我们将连接到MQTT服务器。要进行实际连接,我们调用connect方法,将输入参数作为客户端的唯一标识符,身份验证用户名和密码。我们将使用标识符“ESP32Client”。

此方法调用将在连接成功时返回true,否则返回false。

client.setServer(mqttServer, mqttPort);
 
while (!client.connected()) {
    Serial.println("Connecting to MQTT...");
 
    if (client.connect("ESP32Client", mqttUser, mqttPassword )) {
 
      Serial.println("connected");  
 
    } else {
 
      Serial.print("failed with state ");
      Serial.print(client.state());
      delay(2000);
 
    }
}

请注意,在前面的代码中我们使用了两种辅助方法。该 连接,如果连接建立否则为false方法返回true。该 州方法将返回一个代码,为什么连接失败的信息。在这里查看可能的返回值。

最后,我们将向主题发布消息。为此,我们调用publish方法,将主题名称和要发布的消息作为输入参数传递。我们将在“esp / test”主题上发布“来自ESP32的Hello”消息。

client.publish("esp/test", "Hello from ESP32");

请查看完整源代码,其中已包含主循环功能。在那里,我们将调用PubSubClient 的循环方法。需要定期调用此方法,以便允许接收消息并维护与代理的连接。当然,在我们的例子中,由于我们只想向主题发布消息而我们不会做更多的事情,因此我们仅将其作为示例包含在内。

#include <WiFi.h>
#include <PubSubClient.h>
 
const char* ssid = "yourNetworkName";
const char* password =  "yourNetworkPassword";
const char* mqttServer = "m11.cloudmqtt.com";
const int mqttPort = 12948;
const char* mqttUser = "yourMQTTuser";
const char* mqttPassword = "yourMQTTpassword";
 
WiFiClient espClient;
PubSubClient client(espClient);
 
void setup() {
 
  Serial.begin(115200);
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("Connecting to WiFi..");
  }
 
  Serial.println("Connected to the WiFi network");
 
  client.setServer(mqttServer, mqttPort);
 
  while (!client.connected()) {
    Serial.println("Connecting to MQTT...");
 
    if (client.connect("ESP32Client", mqttUser, mqttPassword )) {
 
      Serial.println("connected");
 
    } else {
 
      Serial.print("failed with state ");
      Serial.print(client.state());
      delay(2000);
 
    }
  }
 
  client.publish("esp/test", "Hello from ESP32");
 
}
 
void loop() {
  client.loop();
}

测试代码

为了测试代码,我们将使用一个名为MQTTLens的应用程序,它允许我们订阅MQTT主题并接收已发布的消息。因此,打开应用程序并订阅“esp / test”主题,这是我们在ESP32代码中指定的主题。

之后,只需上传并运行ESP32上的代码即可。在Arduino IDE串行监视器上,您应该得到类似于图3的结果。

ESP32:将消息发布到MQTT&nbsp;主题

图3 – 连接到ESP32上的MQTT代理。

在MQTTLens端,您应该收到关于该主题发布的消息,如图4所示。

ESP32:将消息发布到MQTT&nbsp;主题

图4 – 在MQTTLens上接收消息。

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论