2017-03-22 191 views
1

我正在致力於HiveMQ Websocket Client,我正面臨與message delivery有關的一些問題。 所以,我碰到過這個詞PUBACKMQTT PUBACK網絡套接字

讓我解釋你對我的理解,然後我會問我的問題。

無論何時我們發送消息QOS1,hivemq服務器都會通過回調PUBACK來確認發件人。

現在,我打算在我的websockets中對onPubackReceived事件進行子類化,但事件在發送消息後未觸發。

我的代碼:

var clientId = ClientIdentifier; 


    mqtt = new Messaging.Client(
        host, 
        port, 
        clientId); 
    var options = { 
     timeout: 3, 
     keepAliveInterval: 60, 
     useSSL: useTLS, 
     cleanSession: cleansession, 
     onSuccess: onConnect, 
     onFailure: function (message) { 
      connected = false;    
      setTimeout(MQTTconnect, reconnectTimeout); 
     } 
    }; 

    mqtt.onConnectionLost = onConnectionLost; 
    mqtt.onMessageArrived = onMessageArrived; 
    mqtt.onPubackReceived = OnPubackReceived; 

無論是onConnectionLostonMessageArrived發火正常,當連接丟失消息到達,但onPubackReceived不點火。

請讓我知道,如果我正確地理解了它,或者如果我犯了一些錯誤?

+0

你在使用什麼經紀人和版本? –

回答

4

這不是HiveMQ問題。

我的假設是,您使用HiveMQ Websocket Client作爲實施的起點。

在任何情況下,Paho MQTT Client沒有onPubackReceived字段。 如果您提供有關您的用例的更多詳細信息或您的郵件傳遞問題,我可能會指出您正確的方向。

編輯: 你所描述的在MQTT中被稱爲Quality of Service 1。這是一個保證,即收到一條消息至少一次。 客戶端實現的工作是保持這種保證並因此重新發送消息,如果PUBACK不被接收。在應用程序中手動干擾此行爲會導致客戶端持久性不一致。 澄清: 只需設置duplicate=true不會導致消息被識別爲重複。它也必須具有與原始相同的messageID。 我實際上找不到任何有關paho.js保持服務質量= 1的文檔。 但是,MQTT.js的確如此。

QoS 1:至少收到一次:只要客戶端沒有收到服務器的確認信息,就會發送和存儲該數據包。 MQTT確保它將被接收,但可能有重複。

總結的事情了:

  • 重新發送的消息,沒有PUBACK收到上,爲客戶對象的工作。這是MQTT specification的一部分。
  • 使用MQTT.js工作過的WebSockets,並確保保持QoS levels

希望這有助於。

+0

就我而言,當我們連接到mqtt時,我們推送一條消息,並將該消息的'status'作爲'sent'發送,但有些時候,它甚至'沒有到達MQTT Server的tcp。 因此,我們考慮實施'PUBACK',如果我們沒有收到puback,我們將'dup flag'重新發送那個消息。 – RealSteel

+0

你可以建議我一些其他庫,我可以在網絡套接字上收到PUBACK響應嗎? – RealSteel

+0

請參閱我原始答案中的修改 – fraschbi