风筝
发表于: 2021-2-9 10:30:29 | 显示全部楼层

在过去的几年中,物联网(IoT)设备已成为我们日常生活中不可分割的一部分。从智能家居、智能灯泡到智能电器,创客和开发人员正在将这项技术结合起来,以创建一个连接设备的网络,这使我们的日常生活更加令人向往。由于易于沟通,所有这些都成为可能。设备之间有许多的通信方式,但是在商业和爱好产品中,通常使用的单个协议是消息队列遥测传输(MQTT)。


在本篇文章中,我们将使用免费且流行的Eclipse MQTT代理,并学习如何将IoT设备连接到MQTT代理,以及如何在MQTT代理和NodeMCU之间传输数据。


什么是MQTT协议?

MQTT-Working.png


在继续进行之前,最好对MQTT(消息队列遥测传输)协议有一个清晰的了解。它是一种轻量级消息传递协议,它使用发布/订阅方法并在多个设备之间转换消息。使用MQTT协议,我们还可以发送/接收数据并控制各种输出设备,例如读取传感器数据等。它是在TCP之上开发的,因此它比类似协议(例如HTTP)要快。除此之外,与其他协议相比,它还具有许多其他优点,例如,它非常轻便,因此它不会消耗过多的内存,它可以以非常小的网络带宽工作,此外,它还内置了强大的安全协议。这些功能使其适用于许多应用。


MQTT如何工作?

为了了解MQTT协议的工作原理,我们只需要了解三件事。上图显示了这一点。另外,我们在本文对此进行了说明。


MQTT客户端:

MQTT客户端是任何运行MQTT功能并与中央服务器(称为“代理”)进行通信的设备(可以是微控制器或服务器)。代理处理连接的客户端之间的数据通信。


MQTT发布者(Publisher):

当客户想要发送任何信息时,该客户被称为“发布者”。发布者将发布有关特定主题的信息。 “主题”是我们可以发布/订阅消息的路径。然后,代理将用户发布的信息发送给已订阅该特定主题的客户端(也称为订户)。


MQTT订户(Subscriber):

MQTT订户订阅MQTT代理上的主题,以读取代理发送的消息。


Eclipse Mosquitto代理

Eclipse Mosquitto是一个开源MQTT代理,该代理轻巧并且适合在IoT设备上进行通信。 MQTT协议提供了一种使用发布/订阅模型传输信息的轻型方法。如果您想了解更多有关该主题的信息,可以访问Mosquitto官方网站。


设置Eclipse Mosquitto代理

为了与broker代理建立联系,我们需要先进行设置。在此项目中,Android应用程序用于通过Broker发布和订阅信息。以下步骤将使您更好地了解设置过程。


第1步:

首先,下载Google Play商店/ App Store中提供的所有“ MQTT客户端”应用程序并进行安装。在该项目中,使用了名为“MQTT client”的应用程序,其外观类似于下图所示。

MQTT-Client.png


第2步:

单击“ +”号以列出应用程序中的其他选项,我们将在其中添加新的代理。单击该按钮后,将出现如下所示的新界面。

Eclipse-Mosquitto-Broker.png


第3步:

此后,代理的详细信息需要填写在必填字段中。首先,单击应用程序中显示的“已启用”选项。在该项目中,使用了Eclipse MQTT代理,下面给出了要填充的详细信息:

Nick Name:提供您的名称

主机名:mqtt.eclipse.org

端口:1883

客户ID:提供您的ID


以上细节需要填写在各自的字段中。所有其他字段不是必需的,可以保留为空白。成功完成后,单击保存按钮以保存代理详细信息。

Eclipse-Mosquitto-Broker-Setup.png


完成后,Android应用程序设置过程结束,现在我们可以继续进行硬件方面的介绍。


所需的组件

●   NodeMCU开发板

●   LED指示灯

●   面包板

●   连接线


Eclipse MQTT测试电路的连接示意图

基本MQTT项目的电路图如下所示:

Eclipse-MQTT-Test-Circuit-Schematics.png



设置Arduino IDE并上传代码

如果是第一次将代码上传到NodeMCU,则需要先设置Arduino IDE。为此,只需按照以下简单说明即可。


首先,打开Arduino IDE,然后转到 File–> Preferences–> Settings

Setting-up-Arduino-IDE.jpg


接下来,复制下面的URL,并将其粘贴到“Additional Board Manager URL”字段中,然后单击“确定”。链接:https://arduino.esp8266.com/stable/package_esp8266com_index.json

Board-Manager-URL.jpg


接下来,转到Tools > Board > Boards Manager。在Board's Manager窗口中,在搜索框中键入ESP8266,然后按Enter。然后从下拉列表中选择最新版本,然后单击安装。

Arduino-IDE-Board-Manager.png


最后,安装完成后,转到Tools ->Board,然后选择NodeMCU 1.0(ESP-12E模块)。现在,您可以使用Arduino IDE编程NodeMCU。完成设置Arduino IDE后,我们现在可以上传完整的代码。


跳转到指定楼层
风筝
发表于: 2021-2-9 10:51:57 | 显示全部楼层

代码说明

首先,我们在代码中包含用于ESP8266的“ ESP8266WiFi.h”和用于MQTT的“ PubSubClient.h”。


您可以在Arduino库中找到预构建的ESP8266库,但需要从GitHub存储库中下载PubSubClient库

  1. #include <ESP8266WiFi.h>
  2. #include <PubSubClient.h>
复制代码

然后,定义网络凭据,例如您的Wi-Fi用户名和密码。分别替换“ admin”和“ 12345678”。

  1. const char* ssid = "admin";
  2. const char* password =  "12345678";   
复制代码

接下来,我们需要配置MQTT服务器。我们在该项目中使用了Eclipse MQTT服务器,这就是为什么服务器地址指定为“ mqtt.eclipse.org”的原因。但是,如果您打算使用任何其他服务器,例如Mosquitto、Adafruit,则可以将其替换为您的特定服务器地址和端口号。

  1. const char* mqtt_server = "mqtt.eclipse.org";
  2. const int mqtt_port = 1883;
复制代码

接下来,为类WiFiClient和PubSubClient创建实例,这些实例将在整个程序中使用。

  1. WiFiClient espClient;
  2. PubSubClient client(espClient);
复制代码

在setup()函数中,我们首先调用WiFi.begin(),调用此函数会将ESP连接到您的首选HotSpot。

  1. WiFi.begin(ssid, password);
复制代码

接下来,我们使用WiFi.status()方法检查网络连接是否成功。成功连接之后,将在串口监视器上打印一条消息显示连接的网络的SSID。

  1.   while (WiFi.status() != WL_CONNECTED) {
  2.     delay(500);
  3.     Serial.println("Connecting to WiFi..");
  4.   }
  5.   Serial.print("Connected to WiFi :");
  6.   Serial.println(WiFi.SSID());
复制代码

现在,我们需要创建一个代理。为此,我们使用了setServer函数。此函数采用两个我们先前已预定义的参数。现在,如果要从服务器接收消息,则需要创建一个回调函数。为此,我们使用setCallback(callback)函数。

  1. client.setServer(mqtt_server, mqtt_port);
  2. client.setCallback(MQTTcallback);
复制代码

现在,我们使用connect(clientID)函数来连接到ESP8266 client。这里的clientID是客户端的名称,并且必须是唯一的。如果已连接,则可以在串口监视器内显示成功消息。

  1. if (client.connect("ESP8266"))
  2.     {
  3.       Serial.println("connected");
  4.     }
  5.     else
  6.     {
  7.       Serial.print("failed with state ")
  8.       Serial.println(client.state());
  9.       delay(2000);
  10.     }
复制代码

接下来,我们调用client.subscribe(),它是内置的MQTT函数,用于订阅特定主题。对于此项目,我们使用“ esp / test”作为订户名称。

  1. client.subscribe("esp/test");
复制代码

现在,调用MQTTcallback函数以检查是否有任何更新的信息。如果有新数据可用,此函数将处理接收到的数据并在串口监视器中显示一条消息,其中包含原始消息和接收消息的主题名称。

接下来,我们将消息转换为字符串,以便可以对其进行比较和检查是否有任何触发动作。在此项目中,使用MQTT命令打开/关闭LED,如下代码所示。

  1. for (int i = 0; i < length; i++)
  2.   {
  3.     message = message + (char)payload[i];
  4.   }
  5.   Serial.print(message);
  6.   if (message == "on")
  7.   {
  8.     digitalWrite(LED, HIGH);
  9.   }
复制代码

最后,发布有关该主题的信息。使用client.publish()函数。在本文中,将检查按钮状态,如果按下按钮,则会将消息发布到主题“ esp / test1”,如下所示。

  1. if(digitalRead(D1)==0))
  2.   {
  3.   client.publish("esp/test1", "Hello from ESP8266");
  4.   }
  5.   else;
  6. client.loop();
复制代码

使用Arduino使用ESP8266测试MQTT

MQTT-with-ESP8266-using-Arduino.jpg


我们将使用我们先前设置的Android应用程序d进行测试。


打开MQTT客户端应用程序,并确保您的手机具有有效的Internet连接。另外,NodeMCU连接到的热点应具有活动的Internet连接。一切都连接到互联网后,我们将从ESP模块发送“ Hello from ESP8266”字符串,该字符串将反映在Android应用程序内部,并且会收到通知。接下来,我们将从Android应用程序发送一个字符串,这将打开连接到ESP8266 Node MCU板的LED。


第1步 :(订阅主题):

单击我们先前配置的App上的Saved MQTT选项。它将弹出一个界面,提示您“订阅主题”。我们之前已将主题配置为“ esp / test1”。因此,在Android应用中,我们将编写“ esp / test1”。单击“订阅”,这样做将为您显示如下界面,内容将类似于特定主题的“未收到消息”。

MQTT-Communication-using-Arduino-IDE.png


现在,单击已连接到nodeMCU的“已连接”按钮。现在,按照我们的代码,消息“ Hello from ESP8266”将发布到主题,屏幕上将显示一条通知,其中包含收到的消息,如下所示。


第2步:发布到主题:

现在要发布在主题中,单击应用程序的向上箭头按钮,它将打开一个屏幕,如下所示。

MQTT-Communication-With-Esp8266.png


现在,在“主题”字段中,写入“ esp / test”,在消息字段中,写入“ on”或“ off”以分别打开和关闭LED。例如,如果将“ on”发布到主题,则LED将打开,如果将“ off”发布到主题,则LED将关闭。


希望您喜欢这篇文章,如果您对本文有任何疑问,请在下面发表回复。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 714 | 回复: 1501



手机版|

GMT+8, 2024-12-22 10:58 , Processed in 0.069501 second(s), 11 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表