摘要:MQTT(Message Queueing Telemetry Transport) 是一种用于消息代理的应用层协议。尽管名称中包含单词 queueing,但主要功能是作为消息传递的代理。IBM科学家于 1999 年发明了该协议,用于监控一条穿越沙漠的石油管道
有没有想过成千上万的 IoT 设备是如何相互通信的?好吧,你马上就知道了!不仅如此,在阅读本文的过程中,我们将了解如何使用 MQTT 执行简单的自动化任务。
MQTT (Message Queueing Telemetry Transport) 是一种用于消息代理的应用层协议。尽管名称中包含单词 queueing,但主要功能是作为消息传递的代理。IBM 科学家于 1999 年发明了该协议,用于监控一条穿越沙漠的石油管道。
该协议的主要目标是能够在有限的资源下以更少的计算开销进行通信。因此,该协议在 IoT 社区中广受欢迎,因为 IoT 设备与低功耗、计算能力弱和带宽受限的情况非常相似。
基本上,如果您正在寻找成百上千个小型低功率设备之间的可扩展通信,MQTT 就是该协议。该通信支持 SSL 加密,使其适用于工业/商业应用。
MQTT 在通信中有两个主要方。经纪人和客户端。通常,只有一个经纪人。客户端连接到代理并订阅主题。
例如,空调会订阅以下几个话题(谈论连接到 WiFi 的智能空调)/sensor/temperature/living-room/state
/sensor/humidity/living-room/state
这意味着空调想知道温度(以摄氏度为单位)和湿度(相对湿度)传感器的状态。
同时,可以有一个数字湿度温度传感器 (DHT) 连接到 WiFi。此传感器每 30 秒将温度和湿度值发布到上述相同主题。通信必须通过跟踪发布者和订阅者来协调。这就是 MQTT 代理的用武之地,通常打包在家庭自动化桥接设备(Home-Assistant,它是开源的、很酷的或商业的东西)中。空调将接收这些更新,因为它是订阅者。利用接收到的信息,它可以调整压缩机和风扇以调节餐厅的气候。MQTT 的主要用途是设备发现,其中桥接设备将自行订阅发现主题。IoT 设备通常带有默认的发现、发布、主题和属性模板。您可以使用新主题更新桥。以下是 Home Assistant 灯泡的示例发现有效负载,这是一个开源家庭自动化平台。
{ "~": "homeassistant/light/kitchen", "name": "Kitchen", "unique_id": "kitchen_light", "cmd_t": "~/set", "stat_t": "~/state", "schema": "json", "brightness": true }~ 显示通信主题和其他属性带有其字面含义。Home-Assistant(一个流行的开源家庭自动化平台)在收到上述消息时会添加一个新的灯泡。用户可以将其添加到应用程序下的房间并使用其功能。您可以在此处阅读更多相关信息。MQTT 还用于设备控制和数据收集。例如,传感器数据可以通过传感器将数据发布到特定主题,另一个客户端接收数据并在数据库中重新编码来收集。通过将 MQTT 代理用作消息中继服务来执行设备控制。由于 MQTT 运行在 IP 网络之上,因此可以轻松安全地控制和协调世界两端之间的设备。
制作您自己的 IoT Home Automation Device!ESP8266 是一个 MCU(微控制器单元),它与 Arduino IDE 兼容(对于大多数)。
ESP8266 (MCU) 可以编程为连接到 WiFi 和在 24x7 可用设备中运行的 MQTT 代理。现在,可以对 MCU 进行编程,以将有效负载发布到有关传感器检测到的状态的主题,如下所示。
topic: /sensor/gate/chip_id/statuspayload:{ detected: true, direction: 1}在这里,检测到的标志会发送是否有方向。方向标志可以是一个 4 位数字,表示传感器的北、东、西和南方向。因此,上述消息的方向将解码为 0001,表示检测发生在南方。当我们有多个传感器连接到 MCU 时,可以非常有创意地使用这些编码。
现在可以再有两个订阅该主题的 MCU;
/sensor/gate/chip_id/status使用通过此主题广播的消息和方向标志,可以操作门杆或花园上的灯,以便在检测到运动时激活。
自动照明可以对自动化脚本进行编程,以便在日落和日出时触发事件。此事件可用于将消息发布到主题中,如下所示。
/event/natural/sun/rise/event/natural/sun/set现在,可以根据其功能将其他几个 MCU 配置为订阅这些主题。
用于门杆或安检的光传感器可以订阅上述主题,并在日落和日出时打开和关闭灯。花园浇水系统可以订阅日出并启动洒水器为植物浇水。自动窗帘可以在房子周围自动打开和关闭。为此,可以集成其他传感器,例如光传感器、天气服务 API 等。MQTT runs 旨在轻量级运行并提供 3 个不同的 QoS(服务质量)级别。这确保了通信的可靠性可以进行微调以适应目的。
QoS — 0:即发即弃。消息发送一次,之后不检查接收情况。适用于定期传输的传感器。缺少一条消息不会造成重大伤害。QoS — 1:保证消息至少发送一次。可能会有重复的交付。当接收至关重要且多次交付不是一个大问题时,这是一个不错的选择。适用于时间序列数据等情况,其中时间戳可用,并且在给定的时间间隔内必须至少有一个数据点。QoS — 2:消息只发送一次,并保证发送一次。使用案例可能涉及停车计时器等付款,其中多条消息可能会混淆下游分析。当无法对时间做出假设时,这很合适。例如,在给定的时间戳中,可能有两辆车停在特定的停车场中。必须进行适当的计数以显示已进入的汽车数量和空闲的停车位数量。这通常比其他两个 QoS 级别涉及更多的通信开销。许多应用程序都是围绕 MQTT 发展起来的,其中 Node-RED 就是这样一种流行的工具。它可以帮助用户将任务的虚拟接线作为流程图进行。函数可以注入到流中,此工具附带 UI 插件和数据库支持,用于可视化和高级日志记录。
随着 MCU 设备的增加,带有 MCU 设备的网络很容易变得拥塞,并且由于各种原因可能非常不可靠。例如,一个人可能会打开一盏灯,但相关的控制微控制器实际上可能没有连接到代理。在这种情况下,可以使用 retain 标志。这使代理能够在客户端订阅此特定主题时立即发布最后一条消息。此外,可以设置重复间隔,以便一遍又一遍地发送消息。在大多数情况下,重复的消息可能会导致拥塞(如果您有 100 台小型 IoT 设备)并降低您家中的 WiFi 性能。因此,通常发生的情况是保留消息,并使用另一个主题更新控制器状态。
例如,要打开灯,将有效负载发送到 /light/light_id/set,灯控制器会将状态发布到 /light/light_id/state。这样,拥塞就最小了。如果用户没有立即收到返回响应(例如按钮颜色发生变化或 LED 心跳灯),则表明用户知道网络已关闭。但是,当控制器处于活动状态时,保留标志将更新控制器。该按钮会将颜色更改为 on(或 LED 指示灯亮起)。
在我见过的许多协议中,MQTT 仍然是开源社区的热门选择。这是因为它具有高度可扩展性,并且代码是开源的。这意味着不存在像 ZigBee 那样的许可问题。它适用于 IP 网络,这使得它可以在任何带有 wifi 的建筑物上运行。因此,如果您正在考虑一个 IoT 宠物项目,请尝试拥有 MQTT 组件,看看它能带来多大的回报。
来源:自由坦荡的湖泊AI