四、MQTT的基本概念

1.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主题消息

  • $开头的主题为系统主题

注意: 通配符只能用于订阅,不能用于发布。

2.MQTT的会话和保留消息

3.MQTT的消息格式和负载

  • 固定头(Fixed header),存在于所有MQTT数据包中,表示数据包类型及数据包的分组类标识;
  • 可变头(Variable header),存在于部分MQTT数据包中,数据包类型决定了可变头是否-存在及其具体内容;
  • 消息体(Payload),存在于部分MQTT数据包中,表示客户端收到的具体内容;
    在这里插入图片描述
3.1 MQTT固定头

在这里插入图片描述

3.1.1 MQTT消息类型 (Message type)
  • byte 1(bits7~4)
  • 相于一个4位的无符号值,类型如下:
    在这里插入图片描述
3.1.2 标识位 (DUP)
  • byte 1(bits3~0)

  • 在不使用标识位的消息类型中,标识位被做为保留位。如果收到无效的标志时,接收端必须关闭网络连接:
    在这里插入图片描述

  • DUP:发布消息的副本。用来在保证消息的可靠传输,如果设置为 1,则在下面的变长中增加MessageId,并且需要回复确认,以保证消息传输完成,但不能用于检测消息重复发送。

  • QoS发布消息的服务质量(前面已经做过介绍),即:保证消息传递的次数

    • 00:最多一次,即:<=1
    • 01:至少一次,即:>=1
    • 10:一次,即:=1
    • 11:预留
  • RETAIN: 发布保留标识,表示服务器要保留这次推送的信息,如果有新的订阅者出现,就把这消息推送给它,如果设有那么推送至当前订阅者后释放。

3.1.3 剩余长度 (Remaining Length)
  • byte 2(bits7~0)
  • 固定头的第二字节用来保存变长头部和消息体的总大小的,但不是直接保存的。这一字节是可以扩展,其保存机制,前7位用于保存长度,后一部用做标识。当最后一位为 1时,表示长度不足,需要使用二个字节继续保存。
3.2 MQTT可变头 (Variable header)

MQTT数据包中包含一个可变头,它驻位于固定的头和负载之间。可变头的内容因数据包类型而不同,较常的应用是做为包的标识:
在这里插入图片描述
很多类型数据包中都包括一个2字节的数据包标识字段,这些类型的包有:PUBLISH (QoS > 0)、PUBACK、PUBREC、PUBREL、PUBCOMP、SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK

3.3 消息体(Payload)

Payload消息体位MQTT数据包的第三部分,CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE四种类型的消息 有消息体:

  • CONNECT,消息体内容主要是:客户端的ClientID、订阅的Topic、Message以及用户名和密码
  • SUBSCRIBE,消息体内容是一系列的要订阅的主题以及QoS。
  • SUBACK,消息体内容是服务器对于SUBSCRIBE所申请的主题及QoS进行确认和回复。
  • UNSUBSCRIBE,消息体内容是要订阅的主题。

五、MQTT的使用

1.安装和配置MQTT代理服务器

1.1 mosquitto介绍

Mosquitto是一款实现了消息推送协议MQTT 3.1的开源消息代理软件,提供轻量级的、支持可订阅/可发布的消息推送模式,是设备与设备之间的短消息通信变得简单,广泛应用于低功耗传感器、手机(app消息推送是场景之一)、嵌入式电脑、微型控制器等移动设备。

1.2 下载安装
  • Linux

    #安装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

2.移植MQTT官方库

2.1 下载官方源码
  • EMQ官方开源的Qt下的MQTT源码(QMQTT)
2.2 将源码编译成库文件

在这里插入图片描述
qmake和构建这个src文件就生成了对应的库文件

注意: 编译器出现报警——‘perl’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
解决方法: 安装 perl编译器(windows安装后PC重启才会生效)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3 编译后生成的文件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.4 移植官方库文件

将编译好的库文件以及所需的头文件打包好放入到我们的工程中
在这里插入图片描述

QT       += core gui network
...
unix:!macx|win32: LIBS += -L$$PWD/lib/ -lQt5Qmqttd

INCLUDEPATH += $$PWD/include/QtQmqtt
DEPENDPATH += $$PWD/include/QtQmqtt

然后就可以实现qt下的mqtt客户端了

3.建立MQTT连接

  • 免费的公共服务器IP地址:54.244.173.190
    在这里插入图片描述
  • 通过代理服务器通信
    • 部署代理服务器主机IP
    • 端口号:1883

4.发布和订阅MQTT消息

测试1:

# 订阅消息
mosquitto_sub -t "test1"
# 发布消息
mosquitto_pub -t "test1" -m "hello mqtfx"

测试结果:
在这里插入图片描述
测试2(Linux客户端和自定义windows客户端通过mosquitto消息代理服务器通信):
在这里插入图片描述
测试3(自定义windows客户端和官方客户端通过MQTT公共服务器通信):
在这里插入图片描述

5.一些常见的MQTT客户端和库的使用示例

5.1 官方客户端

在这里插入图片描述

六、MQTT在物联网中的应用

1.MQTT在各种物联网场景中的应用案例

  • 智能家居:MQTT被广泛应用于智能家居领域,用于设备之间的通信。例如,智能灯泡、智能插座、智能门锁等设备可以通过MQTT协议与智能家居中心进行通信,从而实现远程控制和自动化控制。此外,用户也可以通过手机APP或者Web应用程序通过MQTT与智能家居设备进行交互。
  • 工业自动化:在工业自动化领域,MQTT可以用于设备之间的实时监控和数据传输。例如,在生产线上,各种传感器和设备可以通过MQTT将数据发送到监控系统,以便监测设备状态、收集数据和进行故障检测。此外,MQTT还可以用于设备之间的远程控制和配置。
  • 物流和运输:在物流和运输领域,MQTT可以用于车辆到车辆(V2V)和车辆到基础设施(V2I)之间的通信。通过MQTT,车辆可以实时共享位置信息、交通状况和其他相关数据,从而实现实时导航、交通管理和智能交通系统。
  • 农业和环境监测:在农业和环境监测领域,MQTT可以用于传感器网络和数据采集系统之间的通信。通过MQTT,农业设备可以实时监测土壤湿度、气温、湿度等环境参数,并将采集到的数据发送到云端进行分析和决策。
  • 智能医疗:在智能医疗领域,MQTT可以用于医疗设备之间的通信和数据传输。例如,病房监护设备可以通过MQTT将患者的生命体征数据发送到监护中心,医生和护士可以通过监护中心实时监测患者的健康状况。

2.MQTT在物联网中的优势和适用性

优势:

  • 轻量级和低开销:MQTT协议的设计目标之一是在带宽有限和计算资源受限的环境中实现高效的通信。相比于其他传输协议(如HTTP),MQTT协议的开销非常低,适用于资源受限的设备,如传感器、嵌入式设备和物联网设备。
  • 简单易用:MQTT协议设计简单,易于实现和使用。它只规定了基本的消息发布和订阅机制,使得开发者可以快速上手并实现与设备的通信。
  • 异步通信:MQTT支持异步通信模式,可以实现设备之间的实时通信。设备可以通过发布消息将数据发送到MQTT代理(broker),其他设备可以通过订阅相关主题来接收这些消息。这种异步通信模式使得设备能够实时响应和处理数据。
  • 可扩展性:MQTT协议支持多对多的消息传输模型,可以通过主题(topic)来实现消息的分发和订阅。这种设计使得MQTT协议非常适合在大规模物联网系统中使用,可以轻松地添加和移除设备。
  • 适用于不稳定网络环境:MQTT协议具有断线重连机制,可以自动重连到MQTT代理,并且保持之前的会话状态。这使得它非常适合在不稳定的网络环境中使用,如移动网络或无线传感器网络。

适用性:

  • MQTT协议适用于物联网中需要实时、可靠和高效通信的场景,特别是对于资源受限的设备。它在物联网应用中得到广泛应用,包括智能家居、智能城市、工业自动化、智能农业等领域。

3.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,我们可以为构建智能化的未来做出贡献。

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

491883)]

[外链图片转存中…(img-7ySjJd0M-1715629491884)]

[外链图片转存中…(img-6CRAEKMi-1715629491884)]

[外链图片转存中…(img-DNYk1WMl-1715629491885)]

[外链图片转存中…(img-6tddNnhJ-1715629491886)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

更多推荐