【问题标题】:MQTT/TCP TimeoutMQTT/TCP 超时
【发布时间】:2020-08-01 07:50:01
【问题描述】:

我写了一个简单的程序,用来观察MQTT连接状态。

MQTT 库选择

只做MQTT Connect,不做其他事情,比如client.loop(keep connect)、disconnect。

连接成功后,等待大约22秒后,TCP发送[FIN, ACK]和[RST, ACK]。

TCP 超时了吗? 以及如何从 Wireshark 获知 TCP 超时值和查看会话。

客户端:ESP8266 MQTT 代理:Windows

代码:

    void MQTT_Setup(){
      client.setServer(MQTT_SERVER, MQTT_PORT);
      //client.setCallback(callback);
      MQTT_Connect();
    }
    
    void MQTT_Connect(){
      bool bMQTT;
      bMQTT = client.connect("ESP");
      Serial.println("MQTT Connected");
      if(bMQTT)MQTT_Disconnect();
      //MQTT_Publish();
    }
    void setup() {
    Serial.begin(BAUDRATE);
    delay(3000);
    WIFI_Setup();
    MQTT_Setup();
    }

    void loop() {
      //client.loop();
    }

Wireshark:

【问题讨论】:

    标签: tcp mqtt


    【解决方案1】:

    PubSubClient 的默认 MQTT Keep alive 值可以在 PubSubClient.h 的第 36 行找到

    默认为 15 秒,broker 将等待 1.5 秒保持活动状态,如果没有收到来自客户端的数据包,则断开连接。

    15 * 1.5 ~= 22 seconds
    

    这就是连接被关闭的原因。如果需要,client.loop() 函数将发送所需的 ping 数据包以保持连接处于活动状态。

    【讨论】:

    • 现在,我可以理解为什么connect会关闭了,否则,关于brokers等待1.5的keep alive这个,哪里有文档解释这个?谢谢你的帮助!!
    • 参见 3.1.1 规范中的第 3.1.2.10 节 docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/…
    • 对不起,我试图从这个文档中理解 Keep Alive,它说“如果 Keep-Alive 值非零,并且服务器在一到一秒内没有收到来自客户端的控制包保持活动时间的一半”客户端默认保持活动值为“15s”,所以如果服务器等待超过7.5s(15秒的一半),那么总等待时间15s + 7.5s ~= 22.5秒,服务器将断开连接。理解有没有错误?我不知道为什么是“Keep-Alive * 1.5”,大约是“1.5”这个。为什么是“*”而不是“+”。
    • "一 (1) 半 (1/2) 倍的 keepalive" = (1 + 0.5) * 15 = 22.5 = (整数数学向下舍入) 在断开客户端之前,代理将等待数据包的 22 秒。 “次”是倍数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 2015-09-14
    • 2019-07-11
    • 2012-08-16
    • 2023-03-27
    相关资源
    最近更新 更多