mqtt發布訊息qos保證不是端到端的,是客戶端與伺服器之間的。訂閱者收到mqtt訊息的qos級別,最終取決於發布訊息的qos和主題訂閱的qos。
客戶端連線:
客戶端完成tcp三次握手之後,還需要發起connect命令
注意:如果客戶端三次握手之後,不發起mqtt的connect命令,30s之後會被伺服器斷掉。
emqttd.config檔案有定義這個時間間隔:
%% client只有qos==1,2時候,才有store(msg)之說;qos==0時沒有。%% seconds
]},
我們以第一種action為例(注意這裡第一種action儲存的是message,第二種action儲存的是message id):
1 若client沒收到來自sever的pubcomp:那麼client將重發pubrel,意思是sever將收到兩次pubrel;但是sever並不會將訊息傳送兩次,因為在第一次將訊息傳送給訂閱者之後,server將刪除這條訊息的內容(delete message),而訊息的內容是在publish中傳輸的,而不是在pubrel中傳輸的;
2 若client沒收到來自server的pubrec,那麼client將重發publish,意思是sever將收到兩次publish,但是這裡sever只是儲存了資訊,而且後面在pubrec中會有訊息的id,而client可以根據兩次id是否相同來判斷server收到了幾次同樣的訊息。
綜上所述,這就保證了server不會將訊息重發。
對於qos2,增加了乙個pubrel及pubcom的過程,這樣可以保證server端只publish一條message給他的subscriber。但是qos1是只要sever接收到message就會publish給他的subscriber,網路不好的時候sender是會重**送相同的message的,server也就會重複publish相同的message給他的。
qos2的server端處理邏輯有點特別:
如果sender沒收到server的pubrecv, sender 是會重發,但是對於頭上一條message,server有兩種處理方式:1, message存在本地,先不publish給subscriber;2,存下message id,把message publish 給他的subscriber。
對於第一種處理方式,如果sender繼續重發,且被收到(id相同),那在server端只算一條message,繼續等sender發pubrel,這樣server就保證只publish了一條message,而不是多條。
對於第二種處理方式,如果sender繼續重發,且被收到,sever會檢查它的message id,如果重發過來的message id是之前存過的,server就不會publish給他的subscriber,因為之前已經publish了。直接刪除。
總之,qos==1,2時候,有store(msg)和唯一的messageid來保證訊息不會重複接收和傳送!
EMQ 學習 MQTT訊息QoS
mqtt發布訊息qos保證不是端到端的,是客戶端與伺服器之間的。訂閱者收到mqtt訊息的qos級別,最終取決於發布訊息的qos和主題訂閱的qos。客戶端連線 客戶端完成tcp三次握手之後,還需要發起connect命令 注意 如果客戶端三次握手之後,不發起mqtt的connect命令,30s之後會被伺...
Ubuntu 安裝 MQTT伺服器 EMQ
安裝的具體步驟如下 使用工具傳送到伺服器,然後伺服器cd到該目錄 進入到解壓的資料夾裡面 cd emqx 配置 執行 bin emqx console 如果遇到停頓按 control c 守護模式啟動 bin emqttd start 檢視執行狀態 bin emqttd ctl status 顯示如...
MQTT伺服器(EMQ)安裝部署
作業系統 centos7 64 bit 我們此處選擇了開原版。版本號為 v2.3.0 系統和軟體 linux centos7 zip 具體命令如下 unzip emqttd centos7 v2.3.0.zip 解壓後目錄結構如下圖所示 emqttd目錄結構如下圖所示 bin目錄結構如下圖所示 具體...