- [SUBSCRIBE – 订阅主题](#SUBSCRIBE___161)
- [SUBACK – 订阅确认](#SUBACK___167)
- [UNSUBSCRIBE – 取消订阅](#UNSUBSCRIBE___182)
MQTT是什么
MQTT是可以让两个设备之间实现网络通讯的一种传输协议。可以实现像智能家居——从手机上可以实时查看家里各设备(冰箱,空调,电饭煲,扫地机器人等等)的状态,并且可以进行远程控制。
接下来将会以网上购物【发送、接收】快递进行举例说明
MQTT是一客户端服务端架构的发布/订阅模式的消息传输协议。它的设计思想是轻巧、开放、简单、规范,易于实现。这些特点使得它对很多场景来说都是很好的选择,特别是对于受限的环境如机器与机器的通信(M2M)以及物联网环境(IOT)
MQTT工作原理
MQTT主要由MQTT服务端、 MQTT客户端、MQTT主题组成
MQTT服务端
专门接收客户端发送过来的消息,并针对客户端发送的信息必要性进行保存(不是所有消息都要保存)以提升mqtt传输的稳定性
相当于快递柜专门用来存放快递
MOTT服务端通常是一台服务器。它是MOTT信息传输的枢纽,负责将MOTT客户端发送来的信息传递给MQTT客户端。MQTT服务端还负责管理MQTT客户端。确保客户端之间的通讯顺畅,保证MQTT消息得以正确接收和准确投递。
MQTT客户端
通过服务端建立通信的双方,可以向服务端发送信息,也可以从服务端接受信息
相当于用户和快递小哥。快递小哥把我们的快递放在快递柜里,我们去快递柜里取出我们的快递;我们也可以将我们要寄的快递放在快递柜里,然后快递小哥给我们寄出去
MOTT客户端可以向服务端发布信息,也可以从服务端收取信息。我们把客户端发送信息的行为成为
“发布”
信息。而客户端要想从服务端收取信息,则首先要向服务端“订阅”
信息。“订阅”信息这一操作很像我们在视频网站订阅某一部电视剧。当这部电视剧上新后,视频网站会向订阅了该剧的用户发送信息,告诉他们有新剧上线了。
MQTT主题
客户端在向服务端发送信息的时候会携带一个主题字段,用以辨别信息种类。当其他客户端在订阅的时候就可以根据主题进行区分,从而准确的订阅自己需要的信息。
相当于我们取快递时候的取件码一样
刚刚我们在讲解MQTT客户端订阅信息时,使用了用户在视频网站订阅电视剧这个例子。在MQTT通讯中,客户端所订阅的肯定不是一部部电视剧,而是一个个“主题”。MOTT服务端在管理MQTT信息通讯时,就是使用“主题”来控制的。
MQTT使用案例
信息查看
- 汽车将其速度信息发布到服务器上,服务器将该汽车的速度信息转发到订阅了该汽车速度主题的客户端上。从而实现我们在手机和电脑上实时监控汽车速度的需求。
控制操作
- 我们使用手机或者电脑将降低空调温度这一指令的消息发送到服务器上,服务器根据主题订阅将信息发送给汽车客户端。从而实现了远程控制的需求
MQTT 发布/订阅 特性
MQTT通讯的核心枢纽是MQTT服务端。有了服务端对MQTT信息的接收、储存、处理和发送,客户端在发布和订阅信息时,可以相互独立,且在空间上可以分时间上可以异步。
- 相互独立
发送者客户端和订阅者客户端是相互独立互不相干的,发送者客户端向服务器发送信息是不会受订阅者客户端干扰的,不管该主题的消息有多少订阅者订阅或者是没有订阅者订阅发送者都不会受其影响。相反,订阅者客户端不管有没有发送者发送该主题也不会受其影响
- 空间分离
客户端和客户端之间是不受空间限制的,拿上述汽车的例子来说明。即使汽车在东北,手机在上海,电脑在深圳,也可以实现上述信息查看、控制操作的需求,只要网路畅通。
- 时间异步
客户端和客户端之间的发布订阅不一定要在同一时刻完成。比如,手机像汽车发送命令的时候,汽车正好驶入山洞里,山洞里没有网络,等汽车驶出山洞网络恢复,再接收到手机的命令并进行操作。这样也是可以的
连接MQTT 服务端
CONNECT – 连接服务端
首先MQTT客户端将会向服务端发送连接请求。该请求实际上是一个包含有连接请求信息的数据包。这个数据包的官方名称为CONNECT。
MQTT客户端要想连接服务端,首先要向服务端发送CONNECT报文。如果此CONNECT报文的格式或内容不符合MQTT规范,则服务器会拒绝客户端的连接请求。
名称 | 解释 |
---|---|
clientId | 客户端ID |
cleanSession | 清除会话 |
keepAlive | 心跳时间间隔 |
- clientId (客户端ID)
ClientId是MQTT客户端的标识。MQTT服务端用该标识来识别客户端。因此ClientId必须是独立的。如果两个MQTT客户端使用相同ClientId标识,服务端会把它们当成同一个客户端来处理。通常ClientId是由一串字符所构成的,如上图所示,此示例中的clientID是“client-1”。
- cleanSession(清除会话)
如果cleanSession 被设置为“true”。那么服务端不需要客户端确认收到报文,也不会保存任何报文。
如果我们将cleanSession 设置为”false”。那么服务端就知道,后续通讯中,客户端可能会要求我保存没有收到的报文。
- keepAlive (心跳时间间隔)
MQTT服务端运行过程中,当有客户端因为某种原因断开了与服务端的连接,服务端需要实时了解这一情况。KeepAlive(心跳时间间隔)正是用于服务端了解客户端连接情况的。
CONNACK – 确认连接请求
MQTT服务端收到客户端连接请求后,会向客户端发送连接确认。同样的,该确认也是一个数据包。这个数据包官方名称为CONNACK
名称 | 解释 |
---|---|
returnCode | 连接返回码 |
sessionPresent | 当前会话 |
- returnCode(连接返回码)
当服务端收到了客户端的连接请求后,会向客户端发送returnCode(连接返回码),用以说明连接情况。如果客户端与服务端成功连接,则返回数字“0”。如果未能成功连接,连接返回码将会是一个非零的数值,具体这个数值的含义,请见下表:
返回码 | 返回码描述 |
---|---|
0 | 成功连接 |
1 | 连接被服务端拒绝,原因是不支持客户端的MQTT协议版本 |
2 | 连接被服务端拒绝,原因是不支持客户端标识符的编码。可能造成此原因的是客户端标识符编码是UTF-8,但是服务端不允许使用此编码。 |
3 | 连接被服务端拒绝,原因是服务端不可用。即,网络连接已经建立,但MQTT服务不可用。 |
4 | 连接被服务端拒绝,原因是用户名或密码无效。 |
5 | 连接被服务端拒绝,原因是客户端未被授权连接到此服务端。 |
- sessionPresent (当前会话)
首先,当客户端发送的CONNECT报文中的cleanSession设置为true。在这种情况下,客户端是不需要服务端保存任何报文的。那么服务端发送的确认连接CONNACK报文中,sessionPresent肯定是false,也就是说,服务端没有保存任何报文。
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!
.(img-9Am7FDFn-1715591426604)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!