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)