赞
踩
系列文章目录
在当今的物联网时代,设备之间的互联已经成为现实。为了实现设备之间的通信和数据传输,许多不同的通信协议被开发出来。学习MQTT协议可以帮助我们更好地理解和应用物联网技术。通过了解MQTT的基本概念和工作原理,我们可以更好地设计和开发物联网应用,提高设备间的通信效率和可靠性。
本博客将介绍MQTT协议的基本概念和特点,详细讲解MQTT的通信模型和消息格式,并提供一些实际应用案例供读者参考。同时,我们还将介绍如何使用MQTT进行设备间通信,并给出一些常见问题的解决方法。
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议
) 是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上(应用层传输协议),一种轻量级的、开放的、灵活的、易于使用的协议,被广泛应用于物联网领域。
MQTT协议最初是由IBM在1999年发布,旨在解决低带宽、不稳定网络环境下的设备间通信问题。它通过发布/订阅模式实现数据的传输,使得设备能够简单地发布消息或订阅某个主题,而不需要关心消息的具体传输细节。
优势:
特点:
MQTT 服务器是发布-订阅架构的核心。它可以非常简单地在Raspberry Pi或NAS等单板计算机上实现,当然也可以在大型机或 Internet 服务器上实现。
服务器: 分发消息,因此必须是发布者,但绝不是订阅者!
客户端: 可以发布消息(发送方)、订阅消息(接收方)或两者兼而有之。
注意:
客户端(也称为节点)是一种智能设备,如微控制器或具有 TCP/IP 堆栈和实现 MQTT 协议的软件的计算机。
服务质量是 MQTT 的一个重要特性。当我们使用 TCP/IP 时,连接已经在一定程度上受到保护。但是在无线网络中,中断和干扰很频繁,MQTT 在这里帮助避免信息丢失及其服务质量水平。这些级别在发布时使用。如果客户端发布到 MQTT 服务器,则客户端将是发送者,MQTT 服务器将是接收者。当MQTT服务器向客户端发布消息时,服务器是发送者,客户端是接收者。
这一级别会发生消息丢失或重复,消息发布依赖于底层TCP/IP网络。即:<=1
QoS 1 承诺消息将至少传送一次给订阅者。该消息已获取消息 ID。发送方存储消息,直到收到PUBACK订阅方的确认 ( )。发件人第一次将重复标志设置为0( DUP = 0)。QoS 1 告诉目标设备(接收器)需要确认要求。如果消息被正确接收,接收者会发送一个PUBACK(确认)和正确的消息 ID。但是,如果在没有确认的情况下超过特定时间,则会再次发送消息,这次将重复标志设置为1( DUP = 1)。同一目标设备可能会多次发生这种情况。此目标设备必须具有必要的逻辑来检测重复项并做出同样的反应。
使用 QoS 2,我们保证消息仅传送到目的地一次。为此,带有唯一消息 ID 的消息会存储两次,首先来自发送者,然后是接收者。QoS 级别 2 在网络中具有最高的开销,因为在发送方和接收方之间需要两个流。在第一次发送 ( DUP = 0)之后,发送方重复发送 (( DUP = 1) 直到它接收到一个PUBREC告诉,该消息已被接收方存储。在第二次交易中,发送方告诉接收方停止传输与PUBREL(release), clear用于存储的缓冲区并发送一个PUBCOMP(完成) 发送方确定已成功被目标设备接收一次后,成功传递已发布的 QoS 2 消息。
MQTT 定义了三种 QoS 等级,来分别提供不同的消息可靠性保证。每条消息都可以在发布时独立设置自己的 QoS。
- QoS 0:最多交付一次,消息可能丢失。
- QoS 1:至少交付一次,消息可以保证到达,但是可能重复到达。
- QoS 2:只交付一次,消息保证到达,并且不会重复。
MQTT保持连接的机制主要包括以下几点:
- 心跳机制:MQTT协议通过发送心跳包来保持连接。客户端会定期发送一个ping请求给服务器,如果服务器在一定时间内没有收到客户端的ping请求,就会认为客户端断开连接,并关闭连接。
- 保持会话:MQTT客户端可以选择保持会话(session),这样当客户端重新连接后,服务器可以恢复上一次的会话状态。保持会话可以避免重新订阅主题和重新发布消息的开销。
- 断线重连:如果客户端与服务器的连接断开了,MQTT客户端会尝试自动重连。客户端可以设置重连的间隔时间,以控制重连的频率。
- 清理会话和离线消息:当客户端与服务器断开连接时,服务器可以清除客户端的会话信息和保存的离线消息。这样下次客户端重新连接时,服务器会重新订阅主题和重新发送离线消息。
通过这些机制,MQTT协议能够保持可靠的连接,并确保消息的可靠传输。
在MQTT当中,消息是没有消息队列这一概念,那它是怎么隔离区分各种繁杂的消息呢,这里就涉及到 主题 概念,不同的主题可被不同的订阅者订阅,发布者可以发布不同的主题消息,从而将消息进行一个隔离区分。MQTT 协议规定主题是 UTF-8 编码的字符串。
命名规则:
- 所有的主题名必须至少包含一个字符
- 主题名是大小写敏感的。
- 主题名可以包含空格字符。
- 主题名以前置或后置斜杠 / 区分。
- 只包含斜杠 / 的主题名是合法的
- 主题名不能包含 null 字符(Unicode U+0000)
MQTT 主题通配符包含单层通配符 “+” 及多层通配符 “#”,主要用于客户端一次订阅多个主题。
如客户端订阅AAA/+/CCC主题消息,则会收到AAA/1/CCC,AAA/2/CCC,…,AAA/N/CCC主题消息
如客户端订阅AAA/#主题消息,则会收到AAA,AAA/BBB,AAA/BBB/CCC主题消息
注意:
通配符只能用于订阅,不能用于发布。
byte 1(bits3~0)
在不使用标识位的消息类型中,标识位被做为保留位。如果收到无效的标志时,接收端必须关闭网络连接:
DUP:发布消息的副本。用来在保证消息的可靠传输,如果设置为 1,则在下面的变长中增加MessageId,并且需要回复确认,以保证消息传输完成,但不能用于检测消息重复发送。
QoS发布消息的服务质量(前面已经做过介绍),即:保证消息传递的次数
RETAIN: 发布保留标识,表示服务器要保留这次推送的信息,如果有新的订阅者出现,就把这消息推送给它,如果设有那么推送至当前订阅者后释放。
MQTT数据包中包含一个可变头,它驻位于固定的头和负载之间。可变头的内容因数据包类型而不同,较常的应用是做为包的标识:
很多类型数据包中都包括一个2字节的数据包标识字段,这些类型的包有:PUBLISH (QoS > 0)、PUBACK、PUBREC、PUBREL、PUBCOMP、SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK
Payload消息体位MQTT数据包的第三部分,CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE四种类型的消息 有消息体:
Mosquitto是一款实现了消息推送协议MQTT 3.1的开源消息代理软件,提供轻量级的、支持可订阅/可发布的消息推送模式,是设备与设备之间的短消息通信变得简单,广泛应用于低功耗传感器、手机(app消息推送是场景之一)、嵌入式电脑、微型控制器等移动设备。
#安装mosquitto
sudo apt-get install mosquitto
#安装客户端
sudo apt-get install mosquitto-clients
#安装设备端
sudo apt-get install mosquitto-dev
将解压好的mosquitto.conf替换掉/etc/mosquitto/mosquitto.conf,直接强制cp替换掉就好。
sudo cp mosquitto.conf /etc/mosquitto/mosquitto.conf -f
启动mosquitto
mosquitto -c /etc/mosquitto/mosquitto.conf
qmake和构建这个src文件就生成了对应的库文件
注意:
编译器出现报警——‘perl’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
解决方法: 安装 perl编译器(windows安装后PC重启才会生效)
将编译好的库文件以及所需的头文件打包好放入到我们的工程中
QT += core gui network
...
unix:!macx|win32: LIBS += -L$$PWD/lib/ -lQt5Qmqttd
INCLUDEPATH += $$PWD/include/QtQmqtt
DEPENDPATH += $$PWD/include/QtQmqtt
然后就可以实现qt下的mqtt客户端了
测试1:
# 订阅消息
mosquitto_sub -t "test1"
# 发布消息
mosquitto_pub -t "test1" -m "hello mqtfx"
测试结果:
测试2(Linux客户端和自定义windows客户端通过mosquitto消息代理服务器通信):
测试3(自定义windows客户端和官方客户端通过MQTT公共服务器通信):
智能家居:MQTT被广泛应用于智能家居领域,用于设备之间的通信。例如,智能灯泡、智能插座、智能门锁等设备可以通过MQTT协议与智能家居中心进行通信,从而实现远程控制和自动化控制。此外,用户也可以通过手机APP或者Web应用程序通过MQTT与智能家居设备进行交互。
工业自动化:在工业自动化领域,MQTT可以用于设备之间的实时监控和数据传输。例如,在生产线上,各种传感器和设备可以通过MQTT将数据发送到监控系统,以便监测设备状态、收集数据和进行故障检测。此外,MQTT还可以用于设备之间的远程控制和配置。
物流和运输:在物流和运输领域,MQTT可以用于车辆到车辆(V2V)和车辆到基础设施(V2I)之间的通信。通过MQTT,车辆可以实时共享位置信息、交通状况和其他相关数据,从而实现实时导航、交通管理和智能交通系统。
农业和环境监测:在农业和环境监测领域,MQTT可以用于传感器网络和数据采集系统之间的通信。通过MQTT,农业设备可以实时监测土壤湿度、气温、湿度等环境参数,并将采集到的数据发送到云端进行分析和决策。
智能医疗:在智能医疗领域,MQTT可以用于医疗设备之间的通信和数据传输。例如,病房监护设备可以通过MQTT将患者的生命体征数据发送到监护中心,医生和护士可以通过监护中心实时监测患者的健康状况。
优势:
轻量级和低开销:MQTT协议的设计目标之一是在带宽有限和计算资源受限的环境中实现高效的通信。相比于其他传输协议(如HTTP),MQTT协议的开销非常低,适用于资源受限的设备,如传感器、嵌入式设备和物联网设备。
简单易用:MQTT协议设计简单,易于实现和使用。它只规定了基本的消息发布和订阅机制,使得开发者可以快速上手并实现与设备的通信。
异步通信:MQTT支持异步通信模式,可以实现设备之间的实时通信。设备可以通过发布消息将数据发送到MQTT代理(broker),其他设备可以通过订阅相关主题来接收这些消息。这种异步通信模式使得设备能够实时响应和处理数据。
可扩展性:MQTT协议支持多对多的消息传输模型,可以通过主题(topic)来实现消息的分发和订阅。这种设计使得MQTT协议非常适合在大规模物联网系统中使用,可以轻松地添加和移除设备。
适用于不稳定网络环境:MQTT协议具有断线重连机制,可以自动重连到MQTT代理,并且保持之前的会话状态。这使得它非常适合在不稳定的网络环境中使用,如移动网络或无线传感器网络。
适用性:
与其他物联网协议相比,MQTT具有以下几个优势:
轻量级:MQTT协议是基于轻量级发布/订阅模式的,相比较其他物联网协议,它的通信开销更小,传输效率更高,适用于网络带宽较低的设备。
灵活性:MQTT协议支持多种通信模式,包括发布/订阅、请求/响应等,可以根据实际需求选择合适的通信模式。
可靠性:MQTT协议支持消息持久化和保证交付,即使在网络不稳定的情况下,消息也可以得到可靠的传输。
网络友好:MQTT协议使用TCP/IP协议传输消息,与现有的网络基础设施兼容,易于集成到现有的网络环境中。
与其他物联网协议相比,MQTT也存在一些局限性:
安全性:MQTT协议本身没有提供强大的安全机制,需要依赖其他安全协议来保障通信的安全性。
复杂性:相比较其他物联网协议,MQTT的配置和部署可能会更加复杂一些,需要一定的技术知识和经验。
扩展性:MQTT协议适用于大规模的物联网部署,但在特定应用场景下可能会面临扩展性的挑战。
通过本博客的学习,我们了解了MQTT协议的基本概念、特点和工作原理。我们了解了MQTT的发布/订阅模式,以及如何使用MQTT进行设备间的通信和数据传输。
学习MQTT协议的好处是多方面的。首先,MQTT是一个轻量级的协议,适用于低带宽、不稳定网络环境下的通信。其次,MQTT具有灵活性和易用性,能够简化设备间通信的开发和管理。另外,MQTT的发布/订阅模式使得设备能够自由地发布和订阅消息,实现高效的消息传递。
在学习过程中,我们了解了MQTT的通信模型和消息格式。我们学习了如何建立MQTT连接、发布消息和订阅主题。我们还学习了如何处理消息传输中的一些常见问题,例如消息丢失、重复传输等。
在实际应用中,我们可以将MQTT协议应用于各种物联网场景。例如,我们可以将传感器设备通过MQTT协议连接到云平台,实现实时数据的采集和监控。我们还可以利用MQTT协议实现远程设备的控制和管理,实现智能家居、智能工厂等场景的自动化控制。
总之,学习MQTT协议可以帮助我们更好地应用物联网技术,提高设备间通信的效率和可靠性。通过学习MQTT,我们可以为构建智能化的未来做出贡献。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。