mqtt协议理解
1. 应用场景: 低带宽,数据头尽可能小。
2. 属于应用层协议,采用TCP承载。
3. 采用 发布-> (代理) -> 订阅模式(利用中间代理实现了异步通讯),发布方发送的相当于是个广播信息, 设置一个主题。订阅方根据主题选择自己订阅的报文。
不过是发布方还是订阅方都看作broker(代理)的客户端,采用mqtt协议通讯。
4. 报文结构
控制头(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字段:
针对消息发布, 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)