注:对于ESP32开源技术感兴趣的可以加群,我们一起探索交流学习,群号:782473783。群名:ESP32开源技术交流群。
本文的目的是解释如何使用ESP32和Arduino IDE库将消息发布到MQTT主题。
介绍
本文的目的是解释如何使用ESP32和Arduino IDE库将消息发布到MQTT主题。
我们将假设代理将托管在CloudMQTT上,可以上面创建一个MQTT的主机。由于CloudMQTT有一个免费的计划,我们可以创建一个帐户并进行测试。设置一个帐户非常简单。您可以在这里查看如何执行以及如何创建代理实例。
完成程序后,检查实例信息页面,应该类似于图1所示的页面。我们将在ESP32代码上使用的重要凭证是服务器,用户,密码和端口。
图1 - CloudMQTT实例信息
对于ESP32方面,我们将使用名为PubSubClient的MQTT库。这是ESP8266连接到MQTT代理的相同库。虽然在撰写本文时没有提到ESP32的支持,但在这里可以看到lib工作正常。
像往常一样,安装库的最简单的方法是通过Arduino IDE库管理器,如图2所示。
图2 - 通过Arduino IDE库管理器安装PubSub库。
代码
我们连接到MQTT代理并发布消息到主题所需的代码将与ESP8266的帖子非常相似。这些都是好消息,因为代码可以重复用于ESP32,从而使移植应用程序变得更加轻松。
像往常一样,我们需要在我们的代码中包含一些库。我们需要WiFi库,以便能够将ESP32连接到WiFi网络,以及PubSubClient库,这将允许我们连接到MQTT代理。有关如何将ESP32连接到WiFi网络的更详细说明,前面文章已经介绍了。
为了有一个易于修改和易读的代码,我们将声明在全局变量中连接到WiFi网络和MQTT代理所需的凭证和信息。对于连接到MQTT代理,我们将需要服务器地址,端口,用户名和密码,可以在实例信息页面中获得,如介绍部分的图1所示。
#include
#include
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。
WiFiClientespClient;
PubSubClient client(espClient);
像往常一样,在设置功能,我们打开一个串口连接,因为这是输出我们的程序的结果最简单的方法。我们还将连接到WiFi网络,以便我们可以访问MQTT代理并将消息发布到主题。
Serial.begin(115200);
WiFi.begin(ssid,password);
while (WiFi.status()!= WL_CONNECTED) {
delay(500);
Serial.println("Connectingto WiFi..");
}
Serial.println("Connected to the WiFinetwork");
接下来,我们需要指定之前在全局变量中声明的MQTT服务器的地址和端口。为此,我们调用 PubSubClient对象上的setServer方法,该对象接收地址和端口作为参数。
之后,我们将连接到MQTT服务器。为了进行实际的连接,我们调用connect方法,将作为输入参数的客户端唯一标识符,认证用户名和密码作为参数传递。我们将使用标识符“ESP32Client”。
此方法调用将在连接成功时返回true,否则返回false。
client.setServer(mqttServer,mqttPort);
while (!client.connected()){
Serial.println("Connectingto MQTT...");
if (client.connect("ESP32Client",mqttUser, mqttPassword )) {
Serial.println("connected");
}else {
Serial.print("failedwith state ");
Serial.print(client.state());
delay(2000);
}
}
请注意,在前面的代码中,我们使用了两个辅助方法。该 连接方法,如果连接建立返回true否则为false。该方法将返回一个代码,为什么连接失败的信息。在这里检查可能的返回值。
最后,我们将发布一个消息给一个话题。为此,我们调用publish方法,将输入参数作为主题名称和要发布的消息。我们将在“esp / test”主题上发布“ESP32的Hello”消息。
client.publish("esp/test","Hello from ESP32");
检查完整的源代码,其中已包含主循环功能。在那里,我们将调用PubSubClient 的循环方法。这种方法需要定期调用,以允许接收消息和维护与代理的连接。当然,在我们这个案例中,既然我们只想发表一个信息给这个话题,我们什么都不会做,我们只是把它作为一个例子。
#include
#include
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";
WiFiClientespClient;
PubSubClientclient(espClient);
void setup() {
Serial.begin(115200);
WiFi.begin(ssid,password);
while (WiFi.status()!= WL_CONNECTED) {
delay(500);
Serial.println("Connectingto WiFi..");
}
Serial.println("Connectedto the WiFi network");
client.setServer(mqttServer,mqttPort);
while (!client.connected()){
Serial.println("Connectingto MQTT...");
if (client.connect("ESP32Client",mqttUser, mqttPassword )) {
Serial.println("connected");
}else {
Serial.print("failedwith 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上接收消息。
相关内容
§ MQTT库
§ MQTTLens下载页面
§ CloudMQTT
技术细节
§ PubSubClient库: v2.6.0