首页 > 微机单片机 >综合电路 > 在Raspberry Pi上安装和测试MQTT进行IoT通信

在Raspberry Pi上安装和测试MQTT进行IoT通信

来源:互联网发布者:拳制龙 关键词: led IOT NODEMCU MQTT 更新时间: 2024/05/17

MQTT是一种用于通过 Internet 发送和接收消息的协议。我们之前在物联网电表和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。该协议简单轻量,用于通过互联网发送和接收消息,专为低带宽使用的设备而设计。如今,该协议经常在物联网设备中用于发送和接收传感器数据。此外,在基于物联网的家庭自动化系统中,无需使用大量互联网数据即可轻松使用此协议。

在 MQTT 中经常使用的术语很少:

订阅和发布

信息

话题

经纪人

1.订阅和发布:订阅是从其他设备获取数据,发布是向其他设备发送数据。

poYBAGMW8l2AFmWBAAAbtxc53HA219.png

当 device1 将数据发送到 device2 时,它称为发布者,另一个称为订阅者,反之亦然。

2. 消息:消息是我们发送和接收的信息。它可以是数据或任何类型的命令。例如,如果我们将温度数据发布到云端,则此温度数据称为消息。

3. 主题:这是您注册对传入消息感兴趣的方式或您如何指定要发布消息的位置。主题用正斜杠分隔的字符串表示。使用 MQTT 在主题上发布数据,然后 MQTT 设备订阅主题以获取数据。

4. MQTT Broker:这个东西负责接收所有发布者的消息,过滤消息,然后将消息发布给感兴趣的订阅者。

pYYBAGMW8lmALKHEAACSOffJaKU455.png

当这个代理托管在云上时,它被称为 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。

树莓派上安装 Mosquitto MQTT 代理

在您的 Raspberry pi 中打开终端并键入以下命令以安装代理

sudo apt update 
sudo apt install -y mosquitto mosquitto-clients

等待安装完成。现在,要在启动树莓派时启动代理,请键入以下命令

sudo systemctl 启用 mosquitto.serv

就是这样,我们都准备好启动我们的 MQTT 代理了。要检查它是否安装正确,请输入以下命令

蚊子-v

此命令将为您提供 MQTT 代理的版本。它应该是 1.4.x 或更高版本。

测试 Raspberry Pi Mosquitto Broker

1. 使用以下命令在后台运行 Mosquitto 代理

蚊子-d

2. 现在,我们将使用以下命令在 exampleTopic 中订阅一个主题

mosquitto_

3. 现在,我们将发布一些消息到 exampleTopic

mosquitto_pub -d -t exampleTopic -m "Hello world!"

您将收到 Hello World!用户终端中的消息。

pYYBAGMW8lOAL1UkAAPrhFV1P-A527.png

现在,在我们使用 NodeMCU 和MQTT 仪表板应用程序的案例中,是时候控制和从另一台设备获取数据了。

首先,我们将通过使用 App 发送命令来控制 LED,因此在这种情况下,NodeMCU 表现为订阅者,而 App 表现为发布者。

然后 ESP12E 还连接了 DHT11 传感器,并将此温度读数发送到 Mobile MQTT 应用程序,因此在这种情况下,移动设备将成为订阅者,NodeMCU 将成为发布者。为了在各自的主题上转发这些消息,使用了 Mosquitto MQTT 代理。

电路原理图

pYYBAGMW8k-AXkE7AADSfc0AfOo702.png

如图所示连接电路。这里 DHT11 用于温度读数,但也可以使用LM35 温度传感器。

让我们开始编写 NodeMCU 的代码来订阅和发布数据。

pYYBAGMW8kuABPEAAAG15-OAC18767.png

代码和解释

在这里,我们将使用 Adafruit MQTT 库模板,并将更改代码中所需的内容。只需更改一些内容,即可使用相同的代码将数据发布和订阅到 Adafruit IO 云。

为此,从Sketch -》 Include Library -》 Manage Libraries 下载 Adafruit MQTT 库。搜索 Adafruit MQTT 并安装它。安装库后。转到 示例-》 Adafruit mqtt 库-》 mqtt_esp8266

poYBAGMW8keAFBlYAAN1gotwK3g701.png

然后根据我们的 Raspberry Pi IP 地址和 Wi-Fi 凭据编辑此代码。

包括 ESP8266WIFI 和 Adafruit MQTT 的所有库。

#include

然后为您想要连接 ESP-12e 的 Wi-Fi 定义 SSID 和密码。确保您的 RPi 和 NodeMCU 连接到同一个网络。

#define WLAN_SSID "xxxxxxxx" 
#define WLAN_PASS "xxxxxxxxxxx"

本节定义 Adafruit 服务器,在本例中是您的 Raspberry Pi 的 IP 地址和服务器端口。

#define

下面的字段将保持空白,因为我们没有使用 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 温度 = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/temperature");

设置一个名为“led1”的提要来订阅更改。

Adafruit_MQTT_Subscribe led1 = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/led");

在setup函数中,我们声明了要在其上获得输出的 NodeMCU 的 PIN。然后,将 NodeMCU 连接到 Wi-fi 接入点。

无效设置() { 
  Serial.begin(115200);
  延迟(10);
  pinMode(LED,输出);
  Serial.println(F("Adafruit MQTT demo")); 
  // 连接到 WiFi 接入点。
  序列号.println(); 序列号.println(); 
  Serial.print("正在连接"); 
  Serial.println(WLAN_SSID); 
  WiFi.开始(WLAN_SSID,WLAN_PASS);
  而 (WiFi.status() != WL_CONNECTED) { 
.... 
…… 
…
为 led 提要设置 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); 
      数字写入(LED,led1_State);
    }

现在,获取变量中的温度并使用Temperature.publish(t)函数发布该值。

浮动 t = dht.readTemperature(); 
… 
..

  if (!Temperature.publish(t)) { 
    Serial.println(F("Failed")); 
  } else { 
    Serial.println(F("OK!")); 
  }


#include

提问/讨论

这里还没有内容,您有什么问题吗?

我要提问/讨论

推荐帖子 最新更新时间:2024-11-13 09:04

20点 40点等最高达到120点PLC
功能介绍: ○ 编程软件兼容日本三菱FXGP_WIN-C梯形图软件,在应用中相当于三菱的FX1N; ○ 工作电源AC18V或DC24V,带有防雷击保护电路; ○ 主板有20路I/0输入输出,其中输入12路,输出8路(有继电器输出和晶体管输出两种型号); ○ 本机采用高性能进口工业
 jingmindmPCB设计
LC滤波电路中的电感以及电容如何取值?
设计一块模数转换的板子,控制器用stm32,加上一块ADC芯片,想要将LDO芯片输出的3.3V既给stm32供电,又给ADC供电,stm32属于数字部分,ADC属于模拟部分,所以打算将LDO输出的3.3V先供给ADC,而后VCC部分加上LC滤波电路同时GND加上0欧电阻再供给s
 shijizai模拟与混合信号
怎样对USB设备的其中一个pipe进行读写操作?谢谢!(VB)
我需要与蓝牙设备通信,通过SetupDiGetClassDevs (Guid由注册表找到),SetupDiEnumDeviceInterfaces ,SetupDiGetDeviceInterfaceDetail 函数查找到DevicePath。但是createfile失败。 我
 lg159027嵌入式系统
FPGA和专用DSP的原理及应用
  FIR滤波器(图1)存储n数据单元系列,每个数据单元延迟一个附加周期。通常,这些数据单元称之为分支。每个分支与系数相乘,其结果求和产生输出。某些方法并行执行所有的乘法。更一般的方法是分为N级,用累加器从一级到下一级传递结果。这些实现方法用功能资源换取速度,取N个计算级并需要n
 AguileraDSP 与 ARM 处理器
MSP430编程器仿真器以及JTAG、SBW、BSL接口的区别
对于51系统来说,很容易理解编程器和仿真器。 通俗的说,仿真器是用来调试仿真的,编程器是用来批量生产时对MCU进行烧写目标代码的。 对于MSP430来说,无论仿真还是烧写程序一般可以通过:JTAG、SBW、BSL接口进行。JTAG、SBW接口可以用于仿真接口,BSL接口不
 fish001微控制器 MCU
大家能想像50K的ATmega16拆机板放在一起是如何的情景吗?
1。重点提供 ATmega 系列的QFP封装的拆机芯片。 2。为了保证质量,并且证明我们提供的芯片是原装没有损坏的,所有芯片均直接在PCB上切割下来。 3。我们使用精密温度控制的方法,将芯片拆下来,熔丝位恢复到出厂状态,并且进行较严格的质量检测。 4。保证所
 wangzujin38Microchip MCU

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版 版权声明

EEWORLD 电路图 站点相关: 下载中心 Datasheet 参考设计

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved