- 什么是MQTT协议?
- MQTT如何工作?
- Eclipse Mosquitto经纪人
- 所需组件
- Eclipse MQTT测试电路-示意图
- 对ESP8266进行编程以与代理建立通信
- 使用Arduino使用ESP8266测试MQTT
在过去的几年中,物联网(IoT)设备已成为我们日常生活中不可分割的一部分。从智能家居,智能灯泡到智能电器;创作者和开发人员正在将这项技术结合起来,以创建一个连接设备的网络,这使我们的日常生活更加令人兴奋。由于易于沟通,所有这些都成为可能。设备之间有许多可能的通信方式,但是在商业和爱好产品中,通常使用的单个协议是消息队列遥测传输(MQTT)。我们之前使用Arduino和Google Assistant构建了语音控制FM收音机,该收音机利用MQTT与NodeMCU板进行通信。请检查一下是否听起来很有趣。
在此项目中,我们将使用免费且流行的Eclipse MQTT代理,并学习如何将IoT设备(在我们的示例中是NodeMCU模块)连接到MQTT代理,以及如何在MQTT代理和NodeMCU之间传输数据。
什么是MQTT协议?
在继续进行之前,最好对MQTT(消息队列遥测传输) 协议有一个清晰的了解。它是一种轻量级消息传递协议,它使用发布/订阅方法并在多个设备之间转换消息。使用MQTT协议,我们还可以发送/接收数据并控制各种输出设备,例如读取传感器数据等。它是在TCP之上开发的,因此它比类似协议(例如HTTP)要快。除此之外,与其他协议相比,它还具有许多其他优点,例如,它非常轻便,因此它不会消耗过多的内存,它可以以非常小的网络带宽工作,此外,它还内置了强大的安全协议。这些功能使其适用于许多应用。
MQTT如何工作?
为了了解MQTT协议的工作原理,我们只需要了解三件事。上图显示了这一点。另外,我们在文章下面对此进行了解释。
MQTT客户端:
一个MQTT客户端是任何设备(它可以是微控制器或服务器)运行MQTT功能和连通与中央服务器,其被称为“代理”。代理处理连接的客户端之间的数据通信。
MQTT发布者:
当客户想要发送任何信息时,该客户被称为“发布者”。发布者将发布有关特定主题的信息。“主题”是我们可以发布/订阅消息的路径。然后,代理将用户发布的信息发送给已订阅该特定主题的客户端(也称为Subscriber)。
MQTT订户:
该 MQTT订户 订阅的主题上的 MQTT 经纪人读取由经纪人发来的消息。
Eclipse Mosquitto经纪人
Eclipse Mosquitto是一个开源MQTT代理,它轻量级,适合在IoT设备上进行通信。的MQTT协议提供了一种使用发布/订阅模型传送信息的轻量方法。如果您想了解更多有关该主题的信息,可以访问蚊子官方网站。
设置Eclipse Mosquitto代理:
为了与经纪人建立联系,我们需要先进行设置。在此项目中,Android应用程序用于通过Broker发布和订阅信息。以下步骤将使您更好地了解设置过程。
第1步:
首先,下载Google Play商店/ App Store中提供的所有“ MQTT客户端”应用程序并进行安装。在该项目中,使用了名为“ MQTT客户端”的应用程序,其外观类似于下图所示。
第2步:
单击“ +”号以列出应用程序中的其他选项,我们将在其中添加新的代理。单击该按钮后,将出现如下所示的新屏幕。
步骤3:
此后,经纪人的详细信息需要填写在必填字段中。首先,单击应用程序中显示的“已启用”选项。在该项目中,使用了 Eclipse MQTT代理,下面给出了要填充的详细信息:
昵称:提供您的偏好名称
主持人: mqtt.eclipse.org
港口: 1883年
客户ID:提供您的偏好ID
以上细节需要填写在各自的字段中。所有其他字段不是必需的,可以保留为空白。成功完成后,单击保存按钮以保存代理详细信息。
完成后,Android应用程序设置过程结束,现在我们可以继续进行硬件方面的介绍。
所需组件
所需部件的完整列表如下所述。由于此电路很简单,因此您可以在当地的业余爱好商店中找到所有必要的零件。
- NodeMCU
- LED
- 面包板
- 连接线
- 编程电缆
Eclipse MQTT测试电路-示意图
基本MQTT项目的电路图如下所示:
对ESP8266进行编程以与代理建立通信
一个简单的Arduino代码可以处理MQTT代理与NodeMCU之间的所有必要通信。在本节中,我们将详细了解此功能的工作方式。
设置Arduino IDE并上传代码:
如果是第一次将代码上传到NodeMCU,则需要先设置Arduino IDE。为此,只需遵循以下简单说明即可。
首先,打开Arduino IDE,然后转到 File-> Preferences-> Settings 。
接下来,复制下面的URL,并将其粘贴到 “ Additional Board Manager URL ”字段中,然后单击“确定”。您可以查看下面的图片以了解我们是如何做到的。
链接:https://arduino.esp8266.com/stable/package_esp8266com_index.json
接下来,转到 工具>董事会>董事会经理 。在董事会的Manager窗口中,在搜索框中输入 ESP 8266,然后按Enter。然后从下拉列表中选择最新版本,然后单击安装。下图将给您一个清晰的主意。
最后,安装完成后,转到 工具->板->并选择NodeMCU 1.0(ESP-12E模块)。 现在,您可以使用Arduino IDE编程NodeMCU。完成设置Arduino IDE后,我们现在可以上传完整的代码。但是首先,请阅读整个代码的快速说明。
首先,我们已包括 “ESP8266WiFi.h” 使用ESP8266和 “PubSubClient.h” 为MQTT。
您可以在Arduino库中找到预构建的ESP8266库,但需要从与其关联的GitHub存储库中下载PubSubClient库。
#包括
然后,定义网络凭据,例如您的Wi-Fi用户名和密码。分别替换“ admin”和“ 12345678”的凭据。
const char * ssid =“ admin”; const char * password =“ 12345678”;
接下来,我们需要配置MQTT服务器。我们已在该项目中使用了Eclipse MQTT服务器,这就是为什么服务器地址指定为 “ mqtt.eclipse.org”的原因。 但是,如果您打算使用其他任何服务器,例如Mosquitto,Adafruit,则可以将其替换为您的特定服务器地址和端口号。
const char * mqtt_server =“ mqtt.eclipse.org”; const int mqtt_port = 1883;
接下来,为类 WiFiClient 和 PubSubClient 创建实例,这些实例将在整个程序中使用。
WiFiClient espClient; PubSubClient客户端(espClient);
在 setup() 部分中,我们首先调用 WiFi.begin() ,调用此方法会将ESP连接到您的首选HotSpot。
WiFi.begin(ssid,密码);
接下来,我们使用 WiFi.status() 方法 检查网络连接是否成功 。 成功连接之后,将在串行监视器上以连接的网络的SSID打印一条消息。
而(WiFi.status()!= WL_CONNECTED){delay(500); Serial.println(“正在连接到WiFi..”); } Serial.print(“已连接到WiFi:”); Serial.println(WiFi.SSID());
现在,我们需要创建一个经纪人。为此,我们使用了 setServer 方法。此方法采用两个我们先前已预定义的参数。现在,如果要从服务器接收消息,则需要创建一个回调函数。为此,我们使用 setCallback(callback) 方法。
client.setServer(mqtt_server,mqtt_port); client.setCallback(MQTTcallback);
现在,我们使用了 connect(clientID) 函数来连接ESP8266 client。这里的clientID是客户端的名称,并且必须是唯一的。如果已连接,则可以在串行监视器内显示成功消息。
如果(client.connect(“ ESP8266”)){Serial.println(“ connected”); }其他{Serial.print(“状态失败”)Serial.println(client.state()); delay(2000); }
接下来,我们调用 client.subscribe() ,它是内置的MQTT函数,用于订阅特定主题。对于此项目,我们使用“ esp / test ”作为订户名称。
client.subscribe(“ esp / test”);
现在,调用 MQTTcallback 函数以检查是否有任何更新的信息。如果有新数据可用,此功能将处理接收到的数据,并在串行监视器中显示一条消息,其中包含原始消息和接收消息的主题名称。
接下来,我们将消息转换为字符串,以便可以对其进行比较和检查是否有任何触发动作。在此项目中,使用MQTT命令打开/关闭LED,如下代码所示。
for(int i = 0; i <length; i ++){消息=消息+(字符)有效载荷; } Serial.print(message); if(message ==“ on”){digitalWrite(LED,HIGH); }
最后,发布有关该主题的信息。使用 client.publish() 函数。在此项目中,将检查按钮状态,如果按下按钮,则会将消息发布到主题“ esp / test1 ”,如下所示。
if(digitalRead(D1)== 0)){client.publish(“ esp / test1”,“ ESP8266的Hello”); } else; client.loop();
使用Arduino使用ESP8266测试MQTT
对于最终测试,我们将使用我们先前设置的Android应用程序。
打开MQTT客户端应用程序,并确保您的手机具有有效的Internet连接。另外,NodeMCU连接到的热点应具有活动的Internet连接。一切都连接到互联网后,我们将从ESP模块发送“ Hello from ESP8266”字符串,该字符串将反映在Android应用程序中,并会收到通知。接下来,我们将从Android应用程序发送一个字符串,这将打开连接到ESP8266 Node MCU板的LED。
步骤1 :(订阅主题):
单击我们先前配置的App上的Saved MQTT选项。它将弹出一个屏幕,提示您“订阅主题”。我们之前已将主题配置为“ esp / test1 ”。因此,在Android应用中,我们将编写“ esp / test1 ”。单击“订阅”,这样做将为您显示如下屏幕,该屏幕的内容将类似于特定主题的“未收到消息”。
现在,单击已连接到nodeMCU的“已连接”按钮。现在按照我们的代码,消息“ Hello from ESP8266 ”将发布到主题,屏幕上将显示一条通知,其中包含收到的消息,如下所示。
步骤2:发布到主题:
现在要发布在主题中,单击应用程序的向上箭头按钮,它将打开一个屏幕,如下所示。
现在,在“主题”字段中,写“ esp / test ”,在消息字段中,写“ on ”或“ off ”分别打开和关闭LED。例如,如果将“ on”发布到主题,则LED将打开,如果将“ off”发布到主题,则LED将关闭。
希望您喜欢这篇文章并学到新知识。如果您对本文有任何疑问,请在下面发表评论,也可以使用我们的论坛。