2017-03-22 305 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