Retained消息

参考:https://www.emqx.com/zh/blog/mqtt5-features-retain-message

当你为一个topic设置了Retained消息,那么这个消息会保留在Broker里面,当有新的订阅者订阅到此topic之后,就会接收到这个Retained消息(也就是payload)

保留消息虽然存储在服务端中,但它并不属于会话的一部分。也就是说,即便发布这个保留消息的会话终结,保留消息也不会被删除。

一个Topic只能有一个Retained消息,后设置的会覆盖前面设置的。

在python中对应的方法是:

matt.publish("test", payload="online", qos=0, retain=True)

删除Retained的方法是

client.publish("test", payload=None, qos=0, retain=True)

MQTT 遗嘱消息也称为Last Will and Testament

在python中设置遗嘱消息的方法是:

mqtt_client.will_set('test', "offline", qos=0, retain=True) # 即是遗嘱也是Retained

mqtt_client.will_set('test', "offline", qos=0, retain=False) # 只是遗嘱

如果设置遗嘱,retain为False的时候,新的client订阅是不会收到遗嘱消息的。

如果retain设置为True,他既是遗嘱也是Retained消息,意味着心的client连接也能收到消息。

如果设置了retain为False的遗嘱消息,清除可以使用下面的方式清除

mqtt_client.will_clear()

retain为True的时候

matt.publish("test", payload=None, qos=0, retain=True)

通过Retained报文和遗嘱消息,我们可以解决实际开发中其中一个问题,客户端上线下线状态维护显示。

第一步:设置遗嘱消息为设备下线的对应报文,并且设置retain=True来保证新的客户端也能每次订阅接收到此报文。

当然,单纯设置retain=True的遗嘱消息还不行,会导致在线都会发送遗嘱消息报文。

第二步:在客户端连接Broker成功之后,更改遗Retained消息为上线的报文

注意:遗嘱报文是连接的时候就会帮你自动发送给Broker,当下线时,由Broker自动往该主题发送。

下面是实现上线下线遗嘱+Retained实现。

import paho.mqtt.client as mqtt

# Retained消息的能够让其他订阅者在一订阅的时候收到这条消息

def on_connect(client, userdata, flags, rc):

if rc == 0:

client.publish("test", payload='{"status": "online"}', qos=0, retain=True) 清除retained报文

# client.publish("test", payload=None, qos=0, retain=True)

pass

else:

print("connection failed ", rc)

mqtt_client = mqtt.Client(client_id="demo_mqtt_pub")

# 遗嘱消息能在本客户端断开的时候,给对应的订阅了次主题的订阅者发送遗嘱消息

mqtt_client.will_set('test', payload='{"status": "offline"}', qos=0, retain=False)

mqtt_client.on_connect = on_connect

# mqtt_client.will_clear()

mqtt_client.connect("192.168.1.55", 1883)

mqtt_client.loop_forever()

下面代码retain为False,当客户端断开连接会发送遗嘱,已有的订阅者可以接收到,但是新的订阅不会收到遗嘱

import paho.mqtt.client as mqtt

# Retained消息的能够让其他订阅者在一订阅的时候收到这条消息

def on_connect(client, userdata, flags, rc):

if rc == 0:

# client.publish("test", payload='{"status": "online"}', qos=0, retain=True) 清除retained报文

# client.publish("test", payload=None, qos=0, retain=True)

pass

else:

print("connection failed ", rc)

mqtt_client = mqtt.Client(client_id="demo_mqtt_pub")

# 遗嘱消息能在本客户端断开的时候,给对应的订阅了次主题的订阅者发送遗嘱消息

mqtt_client.will_set('test', payload='{"status": "offline"}', qos=0, retain=False)

mqtt_client.on_connect = on_connect

# mqtt_client.will_clear()

mqtt_client.connect("192.168.1.55", 1883)

mqtt_client.loop_forever()

QOS

QoS是Sender和Receiver之间的协议,而不是Publisher和Subscriber之间的协议。换句话说,Publisher发布了一条QoS1的消息,只能保证Broker能至少收到一次这个消息;而对于Subscriber能否至少收到一次这个消息,还要取决于Subscriber在Subscibe的时候和Broker协商的QoS等级。

QoS 0:消息最多传递一次,如果当时客户端不可用,则会丢失该消息。

QoS 1:消息传递至少 1 次。

QoS 2:消息仅传送一次。

QOS实际是客户端和Broker之间的一个服务可靠等级。这个可靠等级最终计算也是取决于订阅和发布双方。

实际的client和broker的QOS是MIN(Publish QoS, Subscribe QoS)。假设现在发布方的主题是2,但是订阅方的主题是0,那么你订阅方最终和Broker之间的QOS也是0。假设发布方的主题是0,订阅方订阅了设置为了1,那最终订阅方和Broker之间也是0.

当A向主题test发送了一个QOS为1的报文,那么A客户端(sdk写好此实现)就需要保证Broker收到了这条消息之后至少一次再丢弃发送报文,如果一直没有收到Broker的成功回复,就一直发送。

下面我们通过代码说明此QOS

import paho.mqtt.client as mqtt

# Retained消息的能够让其他订阅者在一订阅的时候收到这条消息

def on_connect(client, userdata, flags, rc):

if rc == 0:

client.publish("test", payload='online', qos=0, retain=True)

pass

else:

print("connection failed ", rc)

mqtt_client = mqtt.Client(client_id="demo_mqtt_pub")

# 遗嘱消息能在本客户端断开的时候,给对应的订阅了次主题的订阅者发送遗嘱消息

# mqtt_client.will_set('test', None, qos=0, retain=True)

mqtt_client.on_connect = on_connect

mqtt_client.will_clear()

mqtt_client.connect("192.168.1.55", 1883)

mqtt_client.loop_forever()

client.publish("test", payload='online', qos=0, retain=True)发布了一个QOS等级为0的。

然后我们以QOS2的方式订阅,看收到的消息是QOS几:

image.png

如果我们改为2 client.publish("test", payload='online', qos=2, retain=True)

收到的消息就是QOS2:

image.png

publish为2, sub为1, 订阅方实际的qos得到的是1

image.png

服务器怎么设置mqtt遗嘱消息,MQTT 遗嘱消息、Retained消息、QOS上线下线实现相关推荐

  1. Mqtt Will Message(遗嘱消息)

    LWT 全称为 Last Will and Testament,也就是我们在连接到 Broker 时提到的遗嘱,包括遗嘱Topic.遗嘱 QoS.遗嘱消息等. 顾名思义,当 Broker 检测到 Cl ...

  2. 如何订阅MQTT服务器历史消息,mqtt集群订阅如何只消费一个(一次)消息?

    共享订阅 在实践中我们的业务系统集成是集群存在,对于mqtt消息,如果没有做特殊处理,那么集群中每个服务只要订阅了mqtt中的一个主题,那么每台服务器都会进行消费.不仅浪费资源,还限制了服务的处理上限 ...

  3. 如何订阅MQTT服务器历史消息,MQTT协议之消息订阅

    序 在MQTT协议中,最重要的就是发布/订阅,下面重点分析下消息订阅. SUBSCRIBE 一般来讲,客户端在成功建立TCP连接之后,发送CONNECT消息,在得到服务器端授权允许建立彼此连接的CON ...

  4. 推送消息mqtt协议服务器域名云喇,推送消息mqtt协议服务器域名云喇

    推送消息mqtt协议服务器域名云喇 内容精选 换一换 上传证书相关问题,请根据您的情况选择具体解决方法:目前SSL证书管理平台只支持上传PEM格式的证书.其他格式的证书需要转化成PEM格式后才能上传, ...

  5. 微信小程序 阿里云服务器 非物联网平台自建MQTT代理服务器控制树莓派LED

    微信小程序 阿里云服务器 非物联网平台自建MQTT代理服务器控制树莓派LED 本人大三,临近毕业季,日后希望从事物联网和嵌入式相关工作,所以自己构想了一个项目来练手,之前做大创的时候学了一点微信小程序 ...

  6. post报文给mqtt服务器没有响应,post请求转为mqtt的方法

    上一篇我们简单讲了下mqtt服务的优点以及如何通过html5技术连接以及接受mqtt推送的. 首先,请大家明确一点,mqtt服务所使用的服务器软件,通常是mosquitto与apollo active ...

  7. MQTT 客户端收发 MQTT 消息

    本文主要介绍如何使用 MQTT 客户端收发 MQTT 消息,并给出示例代码供前期开发测试参考,包括资源创建.环境准备.示例代码.注意事项等. 注意: 本文给出的实例均基于 Eclipse Paho J ...

  8. 消息队列MQ与微消息队列MQTT

    文章目录 参考文章 什么是消息队列,什么是RPC 为什么要使用MQ消息队列 1. 解耦(可用性) 2. 流量削峰 3. 数据分发 消息队列的缺点 多种主流传统消息队列MQ对比 传统消息队列Rocket ...

  9. 保留消息 - MQTT 核心:第八章

    保留消息 - MQTT 核心:第八章 欢迎来到MQTT核心系列的第八章.这个系列一共有十章,用来介绍MQTT的核心特性和概念.在这章,我们将介绍保留消息. 在MQTT中,客户端是无法保障订阅方能确切收 ...

  10. mqtt服务器搭建与qt下的mqtt客户端实现

    一.mqtt介绍 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一个基于客户端-服务器的消息发布/订阅传输协议.MQTT协议是轻量.简单. ...

最新文章

  1. Odoo10 启动选项
  2. ctimespan 获取毫秒_VC++中通过CTime类获取日期差
  3. java 开发环境的搭建
  4. c++矩阵连乘的动态规划算法并输出_算法面试必修课,动态规划基础题型归纳(三)
  5. 序列二次规划_最优控制与规划
  6. mysql 5.6 利用gtid 同步数据遇到的问题记录
  7. 词形变换和词干提取工具(英文)
  8. SQL Server 2008中文版关系数据库基础与实践教程pdf
  9. 设计模式之美:Builder(生成器)
  10. uc通讯不成功php版本过高,UC通信失败怎么办
  11. 华为手机SD卡升级指导
  12. 超级计算机能力,再夺世界第一 中国天河2号超级计算机运算能力达30PF
  13. Wi-Fi MAC 地址随机化与人群监控
  14. 云队友丨跳槽?还是跳坑??
  15. Chrome访问剪切板实现右键复制粘贴
  16. Unity 使用 GPU 計算,使用 ComputeShader + ComputeBuffer
  17. RESTful接口架构是什么
  18. A7139 无线通信驱动(STM32) 添加FIFO扩展模式,能够发送超大数据包
  19. 出现域名争议是怎么解决的
  20. mac 桌面分屏软件_Spectacle for mac (V 1.2) 苹果电脑(分屏软件)

热门文章

  1. 大咖访谈丨金星分享2020年直播数据,助农产品如何走上产销快车道
  2. 住宅IP,家庭宽带IP,数据中心IP,机房IP是什么,他们有什么区别及应用?
  3. MPEG压缩中的 I、B、P帧
  4. Apple Watch怎么设置蜂窝网络
  5. 2022-2027年中国喷涂机器人行业市场调研及未来发展趋势预测报告
  6. springboot二手交易平台 毕业设计-附源码290915
  7. 利用ptrace设计一个简单的debugger调试器
  8. 冰狐智能辅助入门教程
  9. 如何发个 微信九宫格 朋友圈?
  10. vue遇到ie兼容问题如何处理_Vue 2.0 解决IE浏览器的兼容性