手把手教你入门AIoT(8)

 MQTT  IoT+AI  MQTT Web 使MQTT Broker 

1.MQTT

2.MQTT

3.MQTT Broker1

4.MQTT Broker2

5.

6.

7.QoS0QoS1

8.QoS2QoS

9.RetainedLWT

10.Keep Alive

11.IoT+AI

12.IoT+AIWeb

13.MQTT Broker

这一课我们来学习 MQTT 协议中的 Keep Alive 机制。本节课核心内容:

  • Keep Alive

  • 代码实践

  • 如何在移动端保持 MQTT 连接

Keep Alive

在上一课中,我们提到过 Broker 需要知道 Client 是否非正常地断开了和它的连接,以发送遗愿消息。实际上 Client 也需要能够很快地检测到它失去了和 Broker 的连接,以便重新连接。

MQTT 协议是基于 TCP 的一个应用层协议,理论上 TCP 协议在丢失连接时会通知上层应用,但是 TCP 有一个半打开连接的问题(half-open connection)。这里我不打算深入分析 TCP 协议,需要记住的是,在这种状态下,一端的 TCP 连接已经失效,但是另外一端并不知情,它认为连接依然是打开的,它需要很长的时间才能感知到对端连接已经断开了,这种情况在使用移动或者卫星网络的时候尤为常见。

仅仅依赖 TCP 层的连接状态监测是不够的,于是 MQTT 协议设计了一套 Keep Alive 机制。回忆一下,在建立连接的时候,我们可以传递一个 Keep Alive 参数,它的单位为秒,MQTT 协议中约定:在 1.5*Keep Alive 的时间间隔内,如果 Broker 没有收到来自 Client 的任何数据包,那么 Broker 认为它和 Client 之间的连接已经断开;同样地, 如果 Client 没有收到来自 Broker 的任何数据包,那么 Client 认为它和 Broker 之间的连接已经断开。

MQTT 还有一对 PINGREQ/PINGRESP 数据包,当 Broker 和 Client 之间没有任何数据包传输的时候,可以通过 PINGREQ/PINGRESP 来满足 Keep Alive 的约定和侦测连接状态。

「PINGREQ」

PINGREQ 数据包没有可变头(Variable header)和消息体(Payload),当 Client 在一个 Keep Alive 时间间隔内没有向 Broker 发送任何数据包,比如 PUBLISH 和 SUBSCRIBE 的时候,它应该向 Broker 发送 PINGREQ 数据包。

「PINGRESP」

PINGRESP 数据包没有可变头(Variable header)和消息体(Payload),当 Broker 收到来自 Client 的 PINGREQ 数据包,它应该回复 Client 一个 PINGRESP 数据包。

对于 Keep Alive 机制,我们还需要记住以下几点:

  • 如果在一个 Keep Alive 时间间隔内,Client 和 Broker 有过数据包传输,比如 PUBLISH,Client 就没有必要再使用 PINGREQ 了,在网络资源比较紧张的情况下这点很重要;

  • Keep Alive 值是由 Client 指定的,不同的 Client 可以指定不同的值;

  • Keep Alive 的最大值为 18 小时 12 分 15 秒;

  • Keep Alive 值如果设为 0 的话,代表不使用 Keep Alive 机制。

代码实践

我们首先来完成一个 Client 的代码, 它会把发送和收到的 PINGREQ/PINGRESP 打印出来。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章