ESP32入门Arduino开发(七)--MQTT publishing

注:对于ESP8266和ESP32开源技术感兴趣的可以加群,我们一起探索交流学习,群号:551636355。群名:ESP32开源技术交流群。

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

介绍

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

我们将假设代理将托管在CloudMQTT,可以上面创建一个MQTT的主机。由于CloudMQTT有一个免费的计划,我们可以创建一个帐户并进行测试。设置一个帐户非常简单。您可以在这里查看如何执行以及如何创建代理实例。

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


1 - CloudMQTT实例信息

对于ESP32方面,我们将使用名为PubSubClientMQTT库。这是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<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

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”主题上发布“ESP32Hello”消息。

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";

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


猜你喜欢

转载自blog.csdn.net/solar_lan/article/details/80049966