Bootstrap

物联网MQTT协议及本地化部署测试

一、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 协议以其轻量级、高效、灵活等特点,在物联网、工业自动化、移动应用等多个领域发挥着重要作用,为设备之间的通信和数据交互提供了一种可靠、便捷的解决方案。

二、环境准备

  1. 硬件:ARM 网关做为MQTT客户端的安装部署环境,确保网关硬件设备正常运行,具备稳定的网络连接,可通过以太网或 Wi-Fi 接入网络。同时,检查网关硬件资源(如内存、存储等)是否满足 MQTT 服务运行需求。PC机端做为MQTT服务器的安装部署环境。

  1. 软件

  • 操作系统:网关需安装支持 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 客户端配置与连接

  1. 选择编程语言和 MQTT 库:根据项目需求选择合适的编程语言和 MQTT 客户端库。例如,若使用 Python 开发,可安装paho-mqtt库:

pip install paho-mqtt

 

  1. 编写客户端代码:以下是一个简单的 Python MQTT 客户端示例代码,用于连接到 MQTT 服务器并订阅和发布消息:

import paho.mqtt.client as mqtt
import time

def 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_message
# client.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()
  1. 运行客户端代码:保存上述代码为mqtt_client.py,并在终端中运行:

$python mqtt_client.py

确保代码中填写的 MQTT 服务器地址、端口、用户名和密码等信息与实际配置一致。若一切正常,客户端将连接到 MQTT 服务器,订阅指定主题并定期发布消息。

 

;