MQTT一种物联网数据传输协议,构建在TCP之上,采用发布与订阅的模式进行数据交互,发布与订阅是两个独立的连接通道

协议格式

MQTT协议控制报文的格式包含以下三个部分:固定报头,可变报头和有效载荷

固定报头

springboot mqtt订阅多个消息 mqtt订阅报文_客户端


第一个字节的二进制位7-4无符号整数表示控制报文的类型,具体类型对应的值为

springboot mqtt订阅多个消息 mqtt订阅报文_客户端_02


第一个字节的二进制位3-0包含每个MQTT控制报文类型特定的标志, 控制报文中的标志为必须按照如下表格进行设置,如果设置有问题,则接收者必须断开连接

springboot mqtt订阅多个消息 mqtt订阅报文_java_03


第二个字节表示当前报文剩余部分的字节数,包括可变报头和有效载荷。

可变报头

可变报头介于固定报头和有效载荷中间。不同的控制报文有着不同的可变报头,其中PacketId是一个在多个控制报文中存在一个报文。
PacketId包含两个字节,现在包含该字段的控制报文有,PUBLISH(Qos>0), PUBACK, PUBREC, PUBREL,PUBCOMP,SUBSCRIBE,SUBACK, UNSUBSCRIBE, UNSUBACK。

有效载荷

有效载荷即为应用消息。

实现方式

MQTT系统由与服务器通信的客户端组成,通常称服务器为“代理Broker”。客户可以是信息发布者Publish或订阅者Subscribe。每个客户端都可以连接到代理。

信息按主题层次结构组织。当发布者具有要分发的新数据时,它会将包含数据的控制消息发送到连接的代理。然后,代理将信息分发给已订阅该主题的任何客户端。发布者不需要有关于订阅者数量或位置的任何数据,而订阅者又不必配置有关发布者的任何数据。

MQTT传输的消息分为:主题(Topic)和负载(payload)两部分: (1)Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload); (2)payload,可以理解为消息的内容,是指订阅者具体要使用的内容。

消息服务质量

Qos=0

至多发一次

Qos=1

至少发一次

Qos=2

刚好发一次
在一些要求比较严格的计费系统中,可以使用此级别。在计费系统中,消息重复或丢失会导致不正确的结果。这种最高质量的消息发布服务还可以用于即时通讯类的APP的推送,确保用户收到且只会收到一次。

JAVA实现

消息broker

EMQ,mosquitto等,我用的是ActiveMQ

发布

1.定义URI
2.定义自身的client id
3.用户名密码
4.New一个MqttClient
传入URI和自身id以及内存存储client id
5.连接服务器
New一个MqttConnectOptions,设置用户名密码等信息
6.客户端回调
7.设置topic(可能是多个topic)
8.发布

订阅

1.定义URI
2.定义自身的client id
3.用户名密码
4.New一个MqttClient
传入URI和自身id以及内存存储client id
5.连接服务器
New一个MqttConnectOptions,设置用户名密码等信息
6.订阅消息
设置Qos和topic