MQTT PUBACK网络套接字

时间:2017-03-22 13:59:45

标签: javascript websocket mqtt paho hivemq

我正在HiveMQ Websocket Client工作,我正面临message delivery的一些问题。 所以,我发现了PUBACK

这个词

让我向你解释我的理解,然后我会问我的问题。

每当我们发送带有QOS1的邮件时,hivemq服务器都会通过PUBACK回调确认发件人。

现在,我计划在我的websockets中将subcibe替换为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未触发。

如果我理解正确或者我犯了一些错误,请告诉我?

1 个答案:

答案 0 :(得分:4)

这不是HiveMQ问题。

我的假设是,您使用HiveMQ Websocket Client作为实施的起点。

在任何情况下,Paho MQTT Client都没有 <Target Name="PrepublishScript" BeforeTargets="PrepareForPublish"> <!--<Exec Command="bower install" />--> <Exec Command="dotnet bundle" /> </Target> 字段。 如果您提供有关您的用例的更多详细信息或您的邮件传递问题,我可能会指出您正确的方向。

编辑: 您所描述的内容在MQTT中称为onPubackReceived。保证收到消息至少一次。 如果没有收到Quality of Service 1,则保留此保证并因此重新发送消息是客户端实现的工作。在您的应用程序中手动干扰此行为将导致客户端持久性不一致。 为了澄清: 简单地设置PUBACK不会导致邮件被识别为重复邮件。它还必须与原始版本具有相同的duplicate=true。 我无法找到任何关于messageID保持服务质量= 1的文档。 但是,MQTT.js会这样做。

  

QoS 1:至少收到一次:只要客户端未收到服务器的确认,就会发送和存储数据包。 MQTT确保它将被接收,但可能存在重复。

总结一下:

  • 重新发送消息,没有收到PUBACK,是客户端Object的工作。这是MQTT specification
  • 的一部分
  • 使用paho.js通过Websockets工作并确保保留MQTT.js

希望这有帮助。