注:对于ESP32开源技术感兴趣的可以加群,我们一起探索交流学习,群号:782473783。群名:ESP32开源技术交流群。
这篇文章的目的是解释如何连接到一个MQTT代理,并订阅一个主题,使用ESP32和Arduino IDE库。
介绍
这篇文章的目的是解释如何连接到一个MQTT代理,并订阅一个主题,使用ESP32和Arduino IDE库。
我们假设代理将在CloudMQTT上托管。我们还将使用名为PubSubClient的MQTT库,该库将公开连接到代理并订阅主题所需的功能。
既然我们已经覆盖了大多数连接到经纪人所需要的编码这个以前的文章中,我们将在这里做一个较短的解释。
代码
首先,我们首先包含所有功能所需的库。我们需要WiFi库,以便能够将ESP32连接到WiFi网络,以及PubSubClient库,这将提供与MQTT相关的功能。
之后,我们声明一些全局变量来保存连接的凭证。我们需要WiFi凭证才能连接到WiFi网络。我们还需要MQTT服务器的信息和证书。我们将需要在CloudMQTT的实例信息页面中获取的服务器地址,端口,用户名和密码。
然后,我们将声明一个WiFiClient类的对象,这将允许我们创建与某个IP和端口的连接。我们还将声明一个类PubSubClient的对象,该对象接收之前定义的WiFiClient对象作为构造函数的输入。
#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";
WiFiClientespClient;
PubSubClient client(espClient);
现在,在设置功能中,我们将打开一个串行连接,输出程序的结果。我们还将建立与WiFi网络的连接。
接下来,我们需要指定MQTT服务器的地址和端口。要做到这一点,我们所说的setServer 的PubSubClient对象的方法。这个方法将接收第一个参数作为第二个端口,这两个参数都是在全局变量中定义的。
然后,我们在同一个对象上使用setCallback方法来指定一个处理函数。当在订阅的主题上接收到MQTT消息时,将执行此处理函数。我们将为后者留下该功能的代码。
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);
client.setCallback(callback);
接下来,我们将连接到MQTT服务器。我们会一直这样做,直到我们取得成功。您可以检查此之前的职位所采用的方法更详细的解释。
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);
}
}
最后,我们将订阅我们想要的主题。这样,我们将收到来自其他客户的关于该主题发布的消息。为此,我们调用订阅方法,它接收我们要订阅的主题的名称作为输入。本教程的主题将是“esp / test”。
client.subscribe("esp/test");
回调函数
如前所述,我们仍然需要指定回调函数,以在接收到订阅主题的消息时执行。此回调函数的参数是主题的名称,有效负载(以字节为单位)以及收到的消息的长度。该消息也应该返回void。
从下面的代码中可以看出,我们将首先打印主题名称,然后打印收到的每个字节。最后,我们还将打印一些分隔符字符,以区分收到的消息。
void callback(char*topic, byte* payload, unsigned int length) {
Serial.print("Messagearrived in topic: ");
Serial.println(topic);
Serial.print("Message:");
for (int i = 0; i< length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
Serial.println("-----------------------");
}
主循环
在主循环函数中,我们需要调用PubSubClient 的循环方法。如库的文档中所述,应定期调用该函数,以便允许客户端处理传入的消息并保持与MQTT服务器的连接。
void loop() {
client.loop();
}
检查完整的代码。
#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";
WiFiClientespClient;
PubSubClientclient(espClient);
void callback(char*topic, byte* payload, unsigned int length) {
Serial.print("Messagearrived 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 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);
client.setCallback(callback);
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.subscribe("esp/test");
}
void loop() {
client.loop();
}
测试代码
要测试代码,只需将其上传到ESP32并打开Arduino IDE串口监视器即可。
像往常一样,我们也将使用MQTTLens进行测试。所以,我们只需要打开它,并发布消息到ESP32订阅的帖子,如图1所示。
图1 - 从MQTTLens向MQTT主题发送消息。
在Arduino IDE串行监视器中,我们应该得到类似于图2的结果,在这里先前发送给主题的消息被打印出来。在这种情况下,我发送了几个。
图2 - 从订阅的MQTT主题获取消息。
相关内容
§ MQTT库