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.订阅和发布:订阅是从其他设备获取数据,发布是向其他设备发送数据。
当 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。
在树莓派上安装 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!用户终端中的消息。
现在,在我们使用 NodeMCU 和MQTT 仪表板应用程序的案例中,是时候控制和从另一台设备获取数据了。
首先,我们将通过使用 App 发送命令来控制 LED,因此在这种情况下,NodeMCU 表现为订阅者,而 App 表现为发布者。
然后 ESP12E 还连接了 DHT11 传感器,并将此温度读数发送到 Mobile MQTT 应用程序,因此在这种情况下,移动设备将成为订阅者,NodeMCU 将成为发布者。为了在各自的主题上转发这些消息,使用了 Mosquitto MQTT 代理。
电路原理图
如图所示连接电路。这里 DHT11 用于温度读数,但也可以使用LM35 温度传感器。
让我们开始编写 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 的所有库。
#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
- 关于area constraint ratio
- 新人求问:电赛控制类的电源问题
- SOJ和SOG封闭有什么不同啊
- Python练习|创建测试目录
- 真香!泰克示波器全新升级,速来解锁!不看感觉错过一个亿!
- ifs 文件隐藏驱动如何入手?
- 高压差分探头
- 降低FPGA功耗的设计技巧
- msp430 编译器
- 仿真-电路仿真中遇到的问题和经验方法
- 机器学习算法生成的设计技巧视频
- 【任性DIY】IV-11 NB-11荧光管电子时钟
- EE_FPGA,期待热情的你加入!
- 用vs2005 c#开发ppc程序是为什么汉字会变成方块
- TI低功耗无线充电方案
- 元芳,你对此电路有何看法?(5)
- stm32 can通信调试总结
- 毕业低价贱卖各种开发板、书籍、电子元器件(最后两天)
- 请问F28027接外部晶振程序里面要如何配置呢
- 【获奖名单】MPS有奖活动|绿色AI“芯” 动力,探索节能低碳的AI供电方案!
- AM1S-1212SZ 1W DC-DC转换器典型应用
- FP6276A可限流5A升压模块
- 童姿提醒器
- LT8570EDD 1MHz 反相转换器的典型应用从 12V 输入产生 -48V 输出
- 具有检测功能的 RT9073、1-Micro A IQ、250mA 低压降线性稳压器的典型应用
- 1.4、2.2W、2 通道、D 类便携式音频功率放大器
- AM3G-2412DZ ±12V 3 瓦 DC-DC 转换器的典型应用
- NCS2002SN2T1G可变占空比脉冲发生器典型应用电路
- 用于简单时钟振荡器的 NCP301LSN25T1 2.5V 电压检测器的典型应用
- 使用VIPer™Plus-VIPER06HN的3W,5V输出,隔离式反激转换器