一、MQTT协议简介
MQTT(Message Queuing Telemetry Transport)协议是一种轻量级的发布 / 订阅模式的消息传输协议,以下是对它的详细介绍:
-
MQTT 协议最初是由 IBM 在 1999 年开发的,旨在为连接远程设备提供一种简单、高效的方式,以便在低带宽、不稳定的网络环境下进行通信。
-
后来,MQTT 成为了物联网(IoT)领域中广泛使用的通信协议之一,被许多设备和平台所采用。
特点
-
轻量级:协议开销小,数据包结构简单,对硬件资源和网络带宽的要求较低,适用于资源受限的设备,如传感器、嵌入式设备等。
-
发布 / 订阅模式:基于发布 / 订阅的消息传递模型,解耦了消息的发送者(发布者)和接收者(订阅者),发布者不需要知道哪些订阅者会接收消息,反之亦然,提高了系统的灵活性和可扩展性。
-
低功耗:支持持久会话和遗嘱消息等功能,能够在设备连接不稳定或意外断开的情况下,确保消息的可靠传输,同时也有助于降低设备的功耗。
-
支持多种平台:可以在不同的操作系统和硬件平台上运行,包括嵌入式系统、移动设备和服务器等,具有很强的跨平台性。
工作原理
-
组件
-
发布者(Publisher):负责向 MQTT 服务器发送消息,发布者可以是任何能够产生数据的设备或应用程序,如传感器、智能设备等。
-
订阅者(Subscriber):订阅特定主题的消息,当有新消息发布到所订阅的主题时,订阅者会收到通知并接收消息。
-
代理服务器(Broker):作为消息的中转站,负责接收发布者发送的消息,并将消息路由到订阅了相应主题的订阅者。
-
-
主题(Topic)
- 是 MQTT 协议中消息的标识符,用于区分不同类型的消息。发布者在发送消息时需要指定主题,订阅者通过订阅感兴趣的主题来接收相关消息。主题可以是简单的字符串,也可以是具有层次结构的字符串,例如 "home/light/state"。
-
消息
- 由发布者发送,包含有效载荷(Payload)和主题等信息。有效载荷是实际要传输的数据,可以是任何格式,如 JSON、XML 等。
消息质量等级(QoS)
-
QoS 0:最多发送一次。消息发布者只发送一次消息,不进行任何确认或重传操作。适用于对消息丢失不敏感的场景,如实时性要求高但允许少量数据丢失的传感器数据传输。
-
QoS 1:至少发送一次。消息发布者会确保消息至少被发送一次,代理服务器在收到消息后会向发布者发送确认消息,如果发布者没有收到确认,则会重新发送消息,直到收到确认。可能会出现消息重复的情况,适用于大多数物联网场景,如设备状态更新、简单的控制指令传输等。
-
QoS 2:恰好发送一次。这是最高级别的 QoS,确保消息在发布者和订阅者之间只传递一次,不会丢失也不会重复。通过复杂的握手和确认机制来保证消息的可靠传输,适用于对数据准确性和完整性要求极高的场景,如金融交易、医疗数据传输等。
应用场景
-
物联网领域:广泛应用于各种物联网设备之间的通信,如智能家居系统中,智能灯具、门锁、温湿度传感器等设备可以通过 MQTT 协议与中央控制器进行通信,实现设备的远程控制和数据采集。
-
工业自动化:在工业生产中,用于连接各种工业设备、传感器和控制系统,实现生产过程的监控、数据采集和远程控制,提高生产效率和自动化水平。
-
移动应用:在移动应用开发中,用于实现服务器与移动设备之间的消息推送功能,如实时新闻推送、订单提醒、社交消息通知等。
MQTT 协议以其轻量级、高效、灵活等特点,在物联网、工业自动化、移动应用等多个领域发挥着重要作用,为设备之间的通信和数据交互提供了一种可靠、便捷的解决方案。
二、环境准备
- 硬件:ARM 网关做为MQTT客户端的安装部署环境,确保网关硬件设备正常运行,具备稳定的网络连接,可通过以太网或 Wi-Fi 接入网络。同时,检查网关硬件资源(如内存、存储等)是否满足 MQTT 服务运行需求。PC机端做为MQTT服务器的安装部署环境。
- 软件:
- 操作系统:网关需安装支持 MQTT 协议的操作系统,常见的如 Linux 系统。若网关已预装操作系统,需确保系统更新至最新版本,以获取安全补丁和性能优化。
- 安装 MQTT 客户端或服务器软件包。常用的 MQTT 客户端库有 Paho MQTT,它支持多种编程语言,如 Python、C/C++ 等。
二、PC机端MQTT 服务器安装与配置
1.安装MQTT 服务器
-
若要搭建 MQTT 服务器,可选择 Mosquitto 等开源软件。在Linux系统上安装 Mosquitto 为例,可通过以下命令进行安装:
$sudo apt update
$sudo apt install mosquitto
$sudo apt install mosquitto-clients
2.配置文件编辑
Mosquitto 的配置文件通常位于/etc/mosquitto/mosquitto.conf。使用文本编辑器(如nano或vim)打开该文件,可进行如下配置:
- 设置监听端口:默认情况下,Mosquitto 监听 1883 端口(非加密连接)和 8883 端口(SSL/TLS 加密连接)。若需更改监听端口,可在配置文件中添加或修改port选项。例如,将监听端口改为 1884:port 1884。
-
配置用户名和密码认证(可选但推荐):为增强安全性,可启用用户名和密码认证。首先创建一个用于存储用户名和密码的文件,例如/etc/mosquitto/passwd。使用mosquitto -passwd命令生成加密密码并添加用户,如:
sudo mosquitto -passwd -c /etc/mosquitto/passwd your_username
然后在配置文件中添加如下内容启用认证:
password_file /etc/mosquitto/passwd
allow_anonymous false
-
配置 SSL/TLS 加密(可选):若要实现数据传输加密,需配置 SSL/TLS。首先获取 SSL 证书和私钥文件(如cert.pem和key.pem),并将其放置在合适的目录(如/etc/mosquitto/certs)。然后在配置文件中添加以下内容:
listener 8883
cafile /etc/mosquitto/certs/ca.crt
certfile /etc/mosquitto/certs/cert.pem
keyfile /etc/mosquitto/certs/key.pem
3.启动和测试 MQTT 服务器
完成配置后,启动 Mosquitto 服务:
$sudo systemctl start mosquitto
使用mosquitto_pub和mosquitto_sub命令进行简单测试。例如,在一个终端中订阅主题test_topic:
mosquitto_sub -t test_topic -v
在另一个终端中向该主题发布消息:
mosquitto_pub -t test_topic -m "Hello, MQTT!"
若能在订阅终端看到发布的消息,则说明 MQTT 服务器运行正常。
三、开发板MQTT 客户端配置与连接
-
选择编程语言和 MQTT 库:根据项目需求选择合适的编程语言和 MQTT 客户端库。例如,若使用 Python 开发,可安装paho-mqtt库:
pip install paho-mqtt
-
编写客户端代码:以下是一个简单的 Python MQTT 客户端示例代码,用于连接到 MQTT 服务器并订阅和发布消息:
import paho.mqtt.client as mqtt
import timedef on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected to MQTT Broker!")
client.subscribe("test_topic")
else:
print(f"Failed to connect, return code {rc}")def on_message(client, userdata, msg):
print(f"Received {msg.payload.decode()} on topic {msg.topic}")创建 MQTT 客户端
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_messageclient.username_pw_set("your_username", "your_password")
连接到 MQTT 代理服务器
client.connect("192.168.31.26", 1883, 60)
client.loop_start()try:
# 循环发布消息
while True:
client.publish("test_topic", "Hello from ARM gateway!")
time.sleep(5)
except KeyboardInterrupt:
print("Exiting...")停止客户端循环
client.loop_stop()
-
运行客户端代码 :保存上述代码为mqtt_client.py,并在终端中运行:
$python mqtt_client.py
确保代码中填写的 MQTT 服务器地址、端口、用户名和密码等信息与实际配置一致。若一切正常,客户端将连接到 MQTT 服务器,订阅指定主题并定期发布消息。