zoukankan      html  css  js  c++  java
  • EMQ学习笔记---Clean Session和Retained Message

    MQTT会话(Clean Session)
    MQTT客户端向服务器发起CONNECT请求时,可以通过’Clean Session’标志设置会话。
    ‘Clean Session’设置为0,表示创建一个持久会话,在客户端断开连接时,会话仍然保持并保存离线消息,直到会话超时注销。
    ‘Clean Session’设置为1,表示创建一个新的临时会话,在客户端断开时,会话自动销毁。

    当clean session的值为false,即保留会话,那么
    该客户端上线,并订阅了主题"r",那么该主题会一直存在,即使客户端离线,该主题也仍然会记忆在EMQ服务器内存。
    当客户端离线又上线时,仍然会接收到离线期间别人发来的publish消息(QoS=0,1,2)。类似即时通讯软件,终端可以接收离线消息。
    除非客户端主动取消订阅主题,否则主题一直存在。另外,Mnesia本地不会持久化session,subscription和topic,服务器重启则丢失。

    Mnesia是一个分布式数据库管理系统(DBMS),适合于电信和其它需要持续运行和具备软实时特性的Erlang应用,是构建电信应用的控制系统平台开放式电信平台(OTP)的一部分。

    当clean session的值为true,即不保留会话,那么
    该客户端上线,并订阅了主题"r",那么该主题会随着客户端离线而删除。
    当客户端离线又上线时,接收不到离线期间别人发来的publish消息。

    不管clean session的值是什么,当终端设备离线时,QoS=0,1,2的消息一律接收不到。
    当clean session的值为true,当终端设备离线再上线时,离线期间发来QoS=0,1,2的消息一律接收不到。
    当clean session的值为false,当终端设备离线再上线时,离线期间发来QoS=0,1,2的消息仍然可以接收到。如果同个主题发了多条就接收多条,一条不差,照单全收。

    emqttd服务器程序,客户端每发起一个tcp连接就会新建一个client connection和一次会话,后台会新建一个相应的connection进程和一个session进程。同一topic下,当设备A离线时,设备B在publish消息时,仍然可以匹配topic,进而找到这个session A进程,把消息发给设备A,缓存在消息队列里。设备A上线就可以收到离线消息。

    QTT保留消息(Retained Message)

    MQTT客户端向服务器发布(PUBLISH)消息时,可以设置保留消息(Retained Message)标志。保留消息(Retained Message)会驻留在消息服务器,后来的订阅者订阅主题时仍可以接收该消息。

    关于retain的说明
    Mnesia:retained_message
    终端设备publish消息时,如果retain值是true,则服务器会一直记忆,哪怕是服务器重启。因为Mnesia会本地持久化。
    如果服务器接收到终端publish某主题的消息,payload为空且retain值是true,则会删除这条持久化的消息。

    如果服务器接收到终端publish某主题的消息,payload为空且retain值是false,则不会删除这条持久化的消息。

    emqttd v1.1.3
    -module(emqttd_retainer).
    %% RETAIN flag set to 1 and payload containing zero bytes
    retain(#mqtt_message{retain = true, topic = Topic, payload = <<>>}) ->
        emqttd_backend:delete_message(Topic);
    

      

  • 相关阅读:
    python笔记-2
    python笔记-1
    生成列表
    内置函数
    装饰器、包的导入
    python3 编码
    python3 初识函数
    python3 文件读写
    python3 流程控制
    python3 数据类型
  • 原文地址:https://www.cnblogs.com/saryli/p/9782168.html
Copyright © 2011-2022 走看看