本文的目的是解释如何使用ESP32和Arduino IDE库将消息发布到MQTT主题。
目录
介绍
本文的目的是解释如何使用ESP32和Arduino IDE库将消息发布到MQTT主题。
我们假设代理将托管在CloudMQTT上。由于CloudMQTT有免费的计划,我们可以创建一个帐户并对其进行测试。设置帐户非常简单。您可以在此处查看如何执行此操作以及如何创建代理实例。(英文的文档可以使用翻译软件翻译查看使用)
完成此过程后,请检查实例信息页面,该页面应类似于图1中所示的页面。我们将在ESP32代码上使用的重要凭据是服务器,用户,密码和端口。
图1 – CloudMQTT实例信息。
对于ESP32方面,我们将使用名为PubSubClient的MQTT库。虽然在撰写本文时没有提到ESP32的支持,但在这里可以看到该库工作正常。
像以前一样,安装库的最简单方法是通过Arduino IDE库管理器,如图2所示。
图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的结果。
图3 – 连接到ESP32上的MQTT代理。
在MQTTLens端,您应该收到关于该主题发布的消息,如图4所示。
图4 – 在MQTTLens上接收消息。
学习到了,谢谢博主