MQTT 是一种开放且简单的客户端服务器发布/订阅消息传输协议,专为高延迟和低网络带宽环境下不同设备之间的机器对机器通信而设计。
机器对机器通信
这很容易。一个系统需要与其他系统交换信息。在物联网环境中,设备之间的通信需求急剧增加。
一切都是互联的——在智能家居中,你的冰箱可以和你的吸尘器对话。您可以使用智能手机打开灯,并通过智能扬声器通过语音订购新的狗粮。
所有这些通信都需要启用、结构化、可靠和安全。就此而言,通信标准由 HTTP、MQTT 或其他协议定义。
发布/订阅消息传输协议
MQTT 是一种具有特殊发布/订阅实现的协议。设备之间不直接对话。相反,通信被构建为主题并通过中央服务器(代理)进行处理。
设备可以将信息发布到一个或多个主题。同时,他们可以订阅一个或多个主题,以接收发布到这些主题的信息。这允许一对多的消息分发和应用程序的解耦。
→ 示例 1:看一下上面的图片。智能手机可以在Position主题上发布其当前位置。感兴趣的设备可以订阅此主题,并在发布新消息时收到通知。
如果智能手机位置位于您的公寓外,灯泡和加热设备可能会关闭,而安全摄像头和真空吸尘器可能会打开。智能手机不需要单独通知所有设备。它可以简单地将信息发布到中心主题,任何对信息感兴趣的设备都可以订阅它。
→ 示例 2:外部温度传感器可以将外部温度发布到温度主题,您的加热设备可以订阅相同的内容。每当外部温度低于规定值时,加热设备就可以打开。
同时,智能手机订阅该主题以了解当前的室内和室外温度并通知其人类。智能手机还可以向主题发布温度控制消息,以调节也充当主题订阅者的加热设备。
高延迟和低网络带宽
MQTT 协议是轻量级、高效的,并且占用空间很小。这使其非常适合经常在不稳定环境中运行并使用 WiFi、蓝牙或卫星等无线连接的物联网设备和场景。
让我们进入一个使用Mosquitto MQTT 代理和 Python MQTT 客户端库Paho-MQTT的示例实现。
此示例项目涵盖了与 HiveMQ 云交互的 MQTT 客户端的核心功能。 要安全地将 MQTT 客户端与 HiveMQ Cloud 连接,您需要启用 TLS。 使用您的用户名和密码在 HiveMQ Cloud 上验证您的 MQTT 客户端。 要连接客户端,请使用安全 MQTT 通信的标准端口 8883。
# enable TLS
client.tls_set(tls_version=mqtt.client.ssl.PROTOCOL_TLS)
# set username and password
client.username_pw_set("<your_username>", "<your_password>")
# connect to HiveMQ Cloud on port 8883
client.connect("<your_host>", 8883)
代码首先订阅主题过滤器“encyclopedia/#”。
这意味着 MQTT 客户端接收发布到此主题过滤器的所有消息。 主题过滤器中所谓的通配符(“#”)包括所有以“encyclopedia/”开头的主题。 on_subscribe 回调作为订阅工作的保证。 然后代码发布一条消息,并在收到消息时将其打印到终端。 由于 on_message 回调,它会打印消息,当消息进入时会触发该消息。
# subscribe to all topics of encyclopedia by using the wildcard "#"
client.subscribe("encyclopedia/#", qos=1)
# a single publish, this can also be done in loops, etc.
client.publish("encyclopedia/temperature", payload="hot", qos=1)
在此示例中,我使用免费的在线 MQTT 代理 Mosquitto,您可以使用 MQTT 客户端轻松连接(发布和/或订阅)。
我们将使用上图中的示例编写两个 Python 应用程序,将信息发布到温度主题。第一个应用程序将发布有关此主题的内部温度。
如果您在控制台中运行脚本,它将如下所示。
Just published 20.152963374957682 to topic TEMPERATURE
Just published 20.161864524496735 to topic TEMPERATURE
Just published 20.832600714734365 to topic TEMPERATURE
Just published 20.139163091102564 to topic TEMPERATURE
Just published 20.596117184032405 to topic TEMPERATURE
Just published 20.050333160761117 to topic TEMPERATURE
Just published 20.25035838170374 to topic TEMPERATURE
Just published 20.76368639769279 to topic TEMPERATURE