Mqtt概念

作者: kason_zhang | 来源:发表于2017-03-30 16:02 被阅读229次

    1,Qos
    Qos有三个值,0,1,2
    Qos=0, 消息只发送一次,提交 message 一次,不执行‘确认’操作,有可能客户端收不到,但是不重发
    Qos=1,消息至少发送一次,提交 message 至少一次,含有‘确认’请求,会执行'确认'操作。
    Qos=2,消息精确发送一次,使用'4步握手'保证精确的提交一次 message.
    当Qos等于1或者2时,此时的消息是持久消息。如果客户机采用 QoS 1 或者 QoS 2 来发布消息,那么此消息为持久消息。此消息存储在本地,并且仅在不再需要它来确保“至少一次”QoS=1 或“刚好一次”QoS=2 传递时才从客户机中除去。

    当 publish message 使用的 QoS 不同于 subscribe message 使用的 QoS 时, message 发送到 subscribed client 时,使用较低级别的 QoS,即取值为两者较小值。
    e.g.:
    (a) published message 使用 QoS 2, 一个 client0 订阅时使用 QoS 0, 那么
    message 提交给这个 client0 时使用 QoS 0.
    (b) 另一个 client1 订阅到这个 Topic 使用 QoS 2, 那么 message 提交给这个
    client 时使用 QoS 2.
    (c) 如果一个 client2 订阅时使用 QoS 2, 另一个 client3 publish message
    使用 QoS 0, message 提交给 client2 时使用 QoS 0.

    2,Retained Messages.
    Retained 这个字段:适用于设定是否要将消息保留在server上,此特性只有PUBLISH才會用到

    1. 所有的 message 都可以设置为保留的。broker 保留 message 直到所有的订阅者接收 message(这之后会删除此消息).
    2. 而且当一个新的 client 订阅这个 topic,这个条 message 也会提交到这个 client.
    3. 可以用 retained message 来实现"last known good"机制。

    3, Clean session / Durable connections
    clean session flag:
    0: 代表当Client1由于网络原因断线时,broker必须把该client1订阅了哪个主题给记录下来。由于一个主题可能有多个client,因此在这个Client1断线的期间,如果有其他的Client而且Qos为1或者2的消息发布到该主题上,则broker必须把消息存储下来,等到Client1网络恢复再次连接上broker时,确保它能够收到它断线没收到的消息。
    1:代表当Client断线时,broker必须要清除该Client所有的状态,等此Client网络恢复时,重新连上线时,它必须重新订阅它感兴趣的主题topic。

    1. client 连接到 broker 时设置 clean session flag 为 false, client 与 broker
      间建立了一个长连接(Durable connnecton); 当 client 断开与 broker 的连接时,
      任何 subscriptions 还有剩余的 QoS 为 1 或 2 的 messages,
      那么会保存这些 subscriptions/messages 直到再次连接。

    2. 如果 clean session flag 为 true,就相当于 'session start', 当 disconnect 时,
      会移除这个 client 所有的 subscriptions

    4, will
    will类似于现实中的遗嘱,有4个值需要注意
    will flag, will Qos,will Retain flag ,will topic
    遗嘱这个机制很多人可能搞不清,它是这样的,client一开始发送CONNECT消息给broker要求建立连接时,就要把要对哪个主题说什么遗言一起传给broker,当它在不正常的情况下断线时(比如断网,装置故障等),则这些消息就会被broker主动发布到该主题上。但是如果是client主动调用disconnect发送给broker要求断开连接时,就不会触发遗嘱机制。
    如何启动此机制:
    首先将will flag置为1,代表启用will机制,之后你设定的QOS为何,broker就会依照你设定的QOS 等级来帮你传送这个遗嘱消息,最后设置此遗言是否要保留在broker上。如果设定了will flag, 则在payload内会需要定义will topic will message,也就是对哪个主题topic发送什么样的遗言will messsage。
    will 是一种 message, 无异于其他 mqtt message。
    在 client 与 broker 建立连接时,client 告知 broker 一个 will message,用来
    在 client 与 broker 不正常断开连接时发送 will message 到一个特殊的 topic。
    这个特殊的 topic 是一个 system topic; system topic 有特殊命名,有特殊的访问权限,用于管理。
    will message 同样可以设置 QoS.

    相关文章

      网友评论

        本文标题:Mqtt概念

        本文链接:https://www.haomeiwen.com/subject/kfkpottx.html