MQTT是用于通过Internet发送和接收消息的协议。我们之前在Iot电表和Raspberry Pi Alexa中使用了此协议,以在互联网上发布数据。在本教程中,我们将更多地了解MQTT及其相关术语。在这里,我们将使用Raspberry Pi作为本地MQTT代理,并控制通过MQTT应用程序仪表板连接到NodeMCU ESP12E的LED。DHT11传感器也连接到NodeMCU,因此我们再次使用Raspberry Pi作为本地MQTT代理,从而在MQTT仪表板上获得温度和湿度的读数。
因此,让我们开始低估MQTT及其相关术语。
什么是MQTT?
MQTT代表由IBM设计的Message Queue Telemetry Transport。该协议简单,轻巧,用于通过Internet发送和接收消息,它是为带宽使用率较低的设备设计的。如今,该协议已在IoT设备中频繁使用,以发送和接收传感器数据。此外,在基于IoT的家庭自动化系统中,无需使用大量Internet数据即可轻松使用此协议。
MQTT中很少使用一些术语:
- 订阅和发布
- 信息
- 话题
- 经纪人
1.订阅和发布:订阅是指从其他设备获取数据,发布是指将数据发送到其他设备。
当device1将数据发送到device2时,它称为发布者,另一个称为订户,反之亦然。
2.消息:消息是我们正在发送和接收的信息。它可以是数据或任何类型的命令。例如,如果我们将温度数据发布到云中,则此温度数据称为消息。
3.主题:这是您注册对传入消息感兴趣的方法,或者指定您要在何处发布消息的方式。主题以用正斜杠分隔的字符串表示。使用MQTT在主题上发布数据,然后MQTT设备订阅该主题以获取数据。
4. MQTT Broker:这件事负责接收来自发布者的所有消息,过滤消息,然后将消息发布给对它们感兴趣的订阅者。
当此代理托管在云上时,它称为MQTT云。有许多基于云的MQTT服务,例如Adafruit IO,MQTT.IO,IBM bluemix,Microsoft Azure等。MQTT也可以与流行的Amazon AWS云一起使用,我们已经在Amazon AWS入门教程中对此进行了说明。
我们可以使用Raspberry Pi制作自己的MQTT代理。这将是本地MQTT代理,即您只能在本地网络上发送和接收数据,而不能在任何地方进行。因此,这里我们将在Raspberry Pi中安装Mosquitto MQTT代理,使其成为本地MQTT代理,并将温度数据从NodeMCU发送到MQTT仪表板应用程序。另外,我们将使用代理控制连接到NodeMCU的LED。
在Raspberry Pi上安装Mosquitto MQTT Broker
在Raspberry pi中打开终端,然后键入以下命令以安装代理
sudo apt更新 sudo apt install -y mosquitto mosquitto-clients
等待安装完成。现在,要在启动树莓派时启动代理,请键入以下命令
sudo systemctl启用mosquitto.service
就是这样,我们都准备启动我们的MQTT经纪人。要检查它是否正确安装,请输入以下命令
蚊子
该命令将为您提供MQTT代理的版本。它应该是1.4.x或更高版本。
测试Raspberry Pi Mosquitto Broker
1.使用以下命令在后台运行Mosquitto代理
蚊子
2.现在,我们将使用以下命令在exampleTopic中订阅主题
mosquitto_sub -d -t示例主题
3.现在,我们将发布一些消息到exampleTopic
mosquitto_pub -d -t exampleTopic -m“世界您好!”
您将收到Hello World!用户终端中的消息。
现在,在我们使用NodeMCU和MQTT仪表板应用程序的情况下,是时候控制并从另一台设备获取数据了。
- 首先,我们将通过使用App发送命令来控制LED,因此在这种情况下,NodeMCU表现为订阅者,App表现为发布者。
- 然后ESP12E还连接了DHT11传感器,并将此温度读数发送到Mobile MQTT应用程序,因此在这种情况下,mobile将成为订户,而NodeMCU将成为发布者。为了转发有关相应主题的这些消息,使用了Mosquitto MQTT代理。
电路原理图
如图所示连接电路。这里,DHT11用于温度读数,但也可以使用LM35温度传感器。我们已经在包括NodeMCU在内的许多项目中使用了DHT11传感器来构建气象站。
让我们开始为NodeMCU编写代码以订阅和发布数据。
代码和解释
在这里,我们将使用Adafruit MQTT库模板,并将在代码中更改所需的内容。只需更改几件事,即可使用相同的代码将数据发布和订阅到Adafruit IO云。为此,从 Sketch-> Include Library- > Manage Libraries 下载Adafruit MQTT库 。 搜索并安装Adafruit MQTT。安装库之后。转到 示例-> Adafruit mqtt库-> mqtt_esp8266
然后根据我们的Raspberry Pi IP地址和Wi-Fi凭据编辑此代码。
包括 ESP8266WIFI和Adafruit MQTT的 所有 库 。
#包括
然后定义您要从中连接ESP-12e的Wi-Fi的SSID和密码。确保您的RPi和NodeMCU连接到同一网络。
#define WLAN_SSID“ xxxxxxxx” #define WLAN_PASS“ xxxxxxxxxxx”
本节定义了Adafruit服务器,在这种情况下,就是您的Raspberry Pi的IP地址和服务器端口。
#define AIO_SERVER“ Pi的IP地址” #define AIO_SERVERPORT 1883
由于我们未使用Adafruit云,因此以下字段将保持空白。
#define AIO_USERNAME“” #define AIO_KEY“”
然后创建一个ESP8266 WiFiClient类以连接到MQTT服务器。
WiFiClient客户端;
通过传入WiFi客户端和MQTT服务器以及登录详细信息来设置MQTT客户端类。
Adafruit_MQTT_Client mqtt(&client,AIO_SERVER,AIO_SERVERPORT,AIO_USERNAME,AIO_KEY);
设置一个称为“温度”的供稿以发布温度。
Adafruit_MQTT_Publish Temperature = Adafruit_MQTT_Publish(&mqtt,AIO_USERNAME“ / feeds / temperature”);
设置一个名为“ led1”的提要来订阅更改。
Adafruit_MQTT_Subscribe led1 = Adafruit_MQTT_Subscribe(&mqtt,AIO_USERNAME“ / feeds / led”);
在 设置 功能中,我们声明要在其上输出的NodeMCU的PIN。然后,将NodeMCU连接到Wi-fi接入点。
void setup(){ Serial.begin(115200); 延迟(10); pinMode(LED,输出); Serial.println(F(“ Adafruit MQTT demo”));; //连接到WiFi接入点。 Serial.println(); Serial.println(); Serial.print(“正在连接”); Serial.println(WLAN_SSID); WiFi.begin(WLAN_SSID,WLAN_PASS); 而(WiFi.status()!= WL_CONNECTED){ …。 …。 … 为led feed设置MQTT订阅。 mqtt.subscribe(&led1); }
在 循环 功能中,我们将使用MQTT_connect()确保与MQTT服务器的连接处于活动状态。功能。
无效循环(){ MQTT_connect();
现在,订阅“ led”提要并从MQTT代理获取字符串,并使用 atoi() 将该字符串转换为数字 ; 函数并使用 digitalWrite() 将此数字写入LED引脚 ; 功能。
Adafruit_MQTT_Subscribe *订阅; while((subscription = mqtt.readSubscription(20000))){ if(subscription ==&led1){ Serial.print(F(“ Got:”)); Serial.println((char *)led1.lastread); int led1_State = atoi((char *)led1.lastread); digitalWrite(LED,led1_State); }
现在,获取变量中的温度,然后使用 Temperature.publish(t) 函数发布该值。
浮点数t = dht.readTemperature(); … .. if(!Temperature.publish(t)){ Serial.println(F(“ Failed”))); } else { Serial.println(F(“ OK!”))); }
本教程末尾提供了完整的代码和演示视频。将代码上传到NodeMCU板上,然后打开您在Smartphone中下载的MQTT仪表板应用程序。
您还可以使用MQTT云(例如Adafruit IO,MQTT.IO等)在世界任何地方控制Raspberry Pi GPIO,我们将在下一个教程中学习。