写在前面
在此期间,系统通过摆弄IoT相关的东西学习了MQTT协议,在此共享。
本文首先对MQTT协议进行了简要介绍; 其次对MQTT协议的内容进行了较全面的解读; 最后,使用Python语言实现简单的MQTT客户端和服务器。
个人资料
MQTT的全名是消息队列遥测传输,翻译成中文意味着“遥测传输协议”。 这是IBM最初提出的TCP协议,具有简单、轻量等优点,特别适用于在有限的环境(低带宽、高网络延迟、不稳定的网络通信)中传递消息。 MQTT协议有3.x、5.x等多个版本,目前最常用的版本是v3.1.1,本文也是对该版本协议的解读。 MQTT协议内置于ISO标准(ISO/IEC PRF 20922 )中,受当前主流IoT平台的支持。
快速启动
MQTT是发布-订阅协议,这意味着:
客户端(客户端)可以向服务端(中介)订阅自己感兴趣的主题(Topic )
客户端还可以向服务器发布(Publish )有关某个主题的信息。 (不需要预先创建主题,只要在发布消息时指定即可。)。
当服务器收到客户端发布的消息时,它会将该消息转发给订阅主题的其他客户端。
我们可以在自己的电脑上运行MQTT的服务端和多个MQTT的客户端来体验这个过程。
MQTT服务端有很多选择。 这里使用Mosquitto按照其官方文档的说明进行安装即可,但这里不太介绍。
Mac用户可以通过以下命令安装和启动Mosquitto :
brew install mosquitto
brew services start mosquitto
Mosquitto提供了命令行工具mosquitto_sub和mosquitto_pub,您可以在服务端订阅主题和发布消息。
在命令行窗口中,运行以下命令订阅主题" foo " :
mosquitto _ su B- h 127.0.0.1-p 1883-tfoo-Q2
在单独的命令行窗口中,通过运行以下命令向foo主题发出消息“Hello,MQTT”:
mosquitto _ pu B- h 127.0.0.1-p 1883-tfoo-Q2-m ' hello,MQTT '
最终,您会看到第一个命令行窗口中打印了消息“Hello,MQTT”。 也就是说,第一个客户端是主题“foo”,它从第二个客户端接收到消息。
协商的详细情况
数据包总体格式
从总体上看,数据包分为三个部分。 一个是固定标头,它一定存在。 另一个是可变头部,它不一定存在; 剩下的一个是载荷,那个也不一定存在。 数据以大序方式保存。
-------------请参阅
| |
|固定头部(必填) |
| |
-------------请参阅
| |
|可变头部(非必需) |
| |
-------------请参阅
| |
|载荷(非必需) |
| |
-------------请参阅
固定头部(固定头部) ) ) )。
固定头格式如下:
------------- -请参阅
|位|7|6|5|4|3|2|1|0|
------------- -请参阅
byte 1分组类型
------------- -请参阅
| byte2.| Remaining Length |
------------- -请参阅
封装类型(Packet type ) )
名字
值
流向导向
描述
保留的
0
福里比德登
保留的
连接
1
客户端到服务器
客户端请求到连接到服务器
CONNACK
2
Server to Client
Connect acknowledgment
PUBLISH
3
Client to Server or Server to Client
Publish message
PUBACK
4
Client to Server or Server to Client
Publish acknowledgment
PUBREC
5
Client to Server or Server to Client
Publish received (assured delivery part 1)
PUBREL
6
Client to Server or Server to Client
Publish release (assured delivery part 2)
PUBCOMP
7
Client to Server or Server to Client
Publish complete (assured delivery part 3)
SUBSCRIBE
8
Client to Server
Client subscribe request
SUBACK
9
Server to Client
Subscribe acknowledgment
UNSUBSCRIBE
10
Client to Server
Unsubscribe request
UNSUBACK
11
Server to Client
Unsubscribe acknowledgment
PINGREQ
12
Client to Server
PING request
PINGRESP
13
Server to Client
PING response
DISCONNECT
14
Client to Server
Client is disconnecting
Reserved
15
Forbidden
Reserved
标记(Flags)
不同包类型标记位含义不尽相同,具体情况如下表所示:
Control Packet
Fixed header flags
Bit 3
Bit 2
Bit 1
Bit 0
CONNECT
Reserved
0
0
0
0
CONNACK
Reserved
0
0
0
0
PUBLISH
Used in MQTT 3.1.1
DUP1
QoS2
QoS2
RETAIN3
PUBACK
Reserved
0
0
0
0
PUBREC
Reserved
0
0
0
0
PUBREL
Reserved
0
0
1
0
PUBCOMP
Reserved
0
0
0
0
SUBSCRIBE
Reserved
0
0
1
0
SUBACK
Reserved
0
0
0
0
UNSUBSCRIBE
Reserved
0
0
1
0
UNSUBACK
Reserved
0
0
0
0
PINGREQ
Reserved
0
0
0
0
PINGRESP
Reserved
0
0
0
0
DISCONNECT
Reserved
0
0
0
0
剩余长度(Remaining Length)
Remaining Length 表示的是本数据包剩余部分的字节数,即可变头部和载荷的字节数之和。为了节省传输时的字节数,Remaining Length 采用的是一种变长编码方式。这就是说 Remaining Length 字段的字节数不是固定的,它可能使用1~4个字节。既然 Remaining Length 的字节数是可变的,那么问题来了,我们在解码包数据的时候,怎么知道 Remaining Length 究竟是使用几个字节编码的呢?解决这个问题的办法是,将每个字节的最高位(MSB)作为标志位。若该位的值是1,则意味着下一个字节属于参与 Remaining Length 编码的字节;若该位的值是0,则意味着本字节已经是最后一个参与 Remaining Length 编码的字节了。
举几个
分类:
技术点:
By © 2017 likecs 版权所有.
粤ICP备12038626号-2
Powered By WordPress . Theme by Luju