mqtt协议理解

1. 应用场景: 低带宽,数据头尽可能小。

2. 属于应用层协议,采用TCP承载。

3. 采用 发布-> (代理)  -> 订阅模式(利用中间代理实现了异步通讯),发布方发送的相当于是个广播信息, 设置一个主题。订阅方根据主题选择自己订阅的报文。 

mqtt协议理解

不过是发布方还是订阅方都看作broker(代理)的客户端,采用mqtt协议通讯。 

4. 报文结构

mqtt协议理解

 控制头(1字节)包含了包类型和flags

 包类型:

  • CONNECT:客户端连接到MQTT代理
  • CONNACK:连接确认
  • PUBLISH:新发布消息
  • PUBACK:新发布消息确认,是QoS 1给PUBLISH消息的回复
  • PUBREC:QoS 2消息流的第一部分,表示消息发布已记录
  • PUBREL:QoS 2消息流的第二部分,表示消息发布已释放
  • PUBCOMP:QoS 2消息流的第三部分,表示消息发布完成
  • SUBSCRIBE:客户端订阅某个主题
  • SUBACK:对于SUBSCRIBE消息的确认
  • UNSUBSCRIBE:客户端终止订阅的消息
  • UNSUBACK:对于UNSUBSCRIBE消息的确认
  • PINGREQ:心跳
  • PINGRESP:确认心跳
  • DISCONNECT:客户端终止连接前优雅地通知MQTT代理

flag字段:

mqtt协议理解

 

针对消息发布, flags控制的是qos(quality of service) 分为3类

  • 级别0:尽力而为。消息发送者会想尽办法发送消息,但是遇到意外并不会重试。
  • 级别1:至少一次。消息接收者如果没有知会或者知会本身丢失,消息发送者会再次发送以保证消息接收者至少会收到一次,当然可能造成重复消息。
  • 级别2:恰好一次。保证这种语义肯待会减少并发或者增加延时,不过丢失或者重复消息是不可接受的时候,级别2是最合适的。

6. broker 服务器: mosquitto  客户端 paho-mqtt

mqtt python 客户端使用方法
Client(client_id=””, clean_session=True, userdata=None, protocol=MQTTv311, transport=”tcp”)

client_id是唯一字段,使用connect 建立连接

connect(host, port=1883, keepalive=60, bind_address="")  # 封装了请求连接报文

发布推送

publish(topic, payload=None, qos=0, retain=False)  # retain 是在报文控制头的flag中, qos是服务质量设置

订阅话题

subscribe(topic, qos=0)