MQTT Protocol(Message Queuing Telemetry Transport):消息队列遥测传输协议,是一种轻量级的、开源的、设计简单便于实现的、基于发布/订阅模式的“M2M/Internet of Things”连接协议。

  MQTT协议原理

  MQTT协议学习笔记

  Server/Broker:中转站,负责分发消息

  Client:订阅方、发布方

  Topic:消息类型

  Payload:消息内容

  注意:客户端只会接收到所订阅主题相关的消息。

  MQTT协议格式在这里不作解释,具体参考MQTT官方文档的描述:MQTT Document

  MQTT连接参数(只列举需要注意的几个)

  1. ClientId:MQTT服务端识别客户端的标识符,每个客户端连接到服务端时必须有一个唯一的ClientId。

  2. Keepalive:MQTT发送心跳包的最大时间间隔,单位是秒。在Keepalive时间间隔内,客户端必须向服务端发送PINGREQ包,来表明自己是“存活的”,如果服务端在1.5倍Keepalive时间内未收到PINGREQ包,则认为客户端已经失效,主动断开连接;服务端在收到PINGREQ包后,需要发送PINGRESP包进行回应,如果客户端在合理的时间内未收到PINGRESP包,则主动与服务器断开连接。如果Keepalive设置为0,则不使用PINGREQ/PINGRESP心跳机制。

  3. clean session:MQTT CONNECT Packet的连接标志,占一个bit,用来指定客户端与服务端对话状态的处理方式。当clean session被设置为1的时候,则客户端和服务端丢弃之前的任何会话状态;当clean session被设置为0的时候,则服务端会存储当前的会话状态。(例如,当你clean session设置为0时,客户端发送DISCONNECT Packet之后,服务端保存当前客户端订阅的主题,再次请求连接到服务端时,无须再次订阅相同的主题即可收到响应的消息)

  MQTT消息服务质量

  QoS 0:通信双方没有应答机制的过程,即不考虑消息的重复、丢失等因素。(例如环境传感器,当前数据采集点丢失并不影响最终的分析,因为很快又有下一个数据采集点产生)

  MQTT协议学习笔记

  QoS 1:通信双方有一次握手,确保消息至少成功发送一次,但消息有可能重复发送。

  MQTT协议学习笔记

  QoS 2:通信双方有两次握手,确保消息只发送一次,该服务质量开销比较大。(例如收费系统,如果消息重复发送或者丢失,可能会导致计费错误)

  MQTT协议学习笔记

  当消息的服务质量为QoS1和QoS时,发送方在适当的时间内(一般为20s)未接收到接收方端相应的应答,则可做重发处理。

  MQTT主题

  主题名:使用分隔符“/”对主题进行分级,通配符不可在主题名中使用。(大小写敏感,可以包含空格符)

  主题过滤器:使用通配符对主题进行筛选。

    1. 多层级匹配

      使用“#”通配符,匹配后面所有子层级,该通配符只能处于主题过滤器中最后一级的位置,例如:

        1. “#”:匹配所有的主题(不包括以$开头的主题)

        2. “level1/#”:匹配父层级为level1的所有主题,如:“level1”,“level1/level2”,“level1/level2/level3”

        3. “level1/#/level3”:非法主题过滤器

        4. “level1/level2#”:非法主题过滤器

    2. 单层级匹配

      使用“+”通配符,匹配单一层级,例如:

        1. “+”: 匹配所有的单层级主题(不包括以$开头的主题)

        2. “+/level2”:匹配所有格式为“%s/level2”主题(不包括以$开头的主题),如:“level1/level2”

        2. “level1/+/level3”:匹配所有格式为“level1/%s/level3”主题,如:“level1/level2/level3”

        3. "level1+":非法主题过滤器


本文只是简单的记录刚开始使用MQTT协议时比较需要注意的地方,其他详细的介绍请参考官方文档。

如果上文有不正确的地方,请多多指教,谢谢!

相关文章: