服务器怎么设置mqtt遗嘱消息,MQTT 遗嘱消息、Retained消息、QOS上线下线实现
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上线下线实现相关推荐
- Mqtt Will Message(遗嘱消息)
LWT 全称为 Last Will and Testament,也就是我们在连接到 Broker 时提到的遗嘱,包括遗嘱Topic.遗嘱 QoS.遗嘱消息等. 顾名思义,当 Broker 检测到 Cl ...
- 如何订阅MQTT服务器历史消息,mqtt集群订阅如何只消费一个(一次)消息?
共享订阅 在实践中我们的业务系统集成是集群存在,对于mqtt消息,如果没有做特殊处理,那么集群中每个服务只要订阅了mqtt中的一个主题,那么每台服务器都会进行消费.不仅浪费资源,还限制了服务的处理上限 ...
- 如何订阅MQTT服务器历史消息,MQTT协议之消息订阅
序 在MQTT协议中,最重要的就是发布/订阅,下面重点分析下消息订阅. SUBSCRIBE 一般来讲,客户端在成功建立TCP连接之后,发送CONNECT消息,在得到服务器端授权允许建立彼此连接的CON ...
- 推送消息mqtt协议服务器域名云喇,推送消息mqtt协议服务器域名云喇
推送消息mqtt协议服务器域名云喇 内容精选 换一换 上传证书相关问题,请根据您的情况选择具体解决方法:目前SSL证书管理平台只支持上传PEM格式的证书.其他格式的证书需要转化成PEM格式后才能上传, ...
- 微信小程序 阿里云服务器 非物联网平台自建MQTT代理服务器控制树莓派LED
微信小程序 阿里云服务器 非物联网平台自建MQTT代理服务器控制树莓派LED 本人大三,临近毕业季,日后希望从事物联网和嵌入式相关工作,所以自己构想了一个项目来练手,之前做大创的时候学了一点微信小程序 ...
- post报文给mqtt服务器没有响应,post请求转为mqtt的方法
上一篇我们简单讲了下mqtt服务的优点以及如何通过html5技术连接以及接受mqtt推送的. 首先,请大家明确一点,mqtt服务所使用的服务器软件,通常是mosquitto与apollo active ...
- MQTT 客户端收发 MQTT 消息
本文主要介绍如何使用 MQTT 客户端收发 MQTT 消息,并给出示例代码供前期开发测试参考,包括资源创建.环境准备.示例代码.注意事项等. 注意: 本文给出的实例均基于 Eclipse Paho J ...
- 消息队列MQ与微消息队列MQTT
文章目录 参考文章 什么是消息队列,什么是RPC 为什么要使用MQ消息队列 1. 解耦(可用性) 2. 流量削峰 3. 数据分发 消息队列的缺点 多种主流传统消息队列MQ对比 传统消息队列Rocket ...
- 保留消息 - MQTT 核心:第八章
保留消息 - MQTT 核心:第八章 欢迎来到MQTT核心系列的第八章.这个系列一共有十章,用来介绍MQTT的核心特性和概念.在这章,我们将介绍保留消息. 在MQTT中,客户端是无法保障订阅方能确切收 ...
- mqtt服务器搭建与qt下的mqtt客户端实现
一.mqtt介绍 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一个基于客户端-服务器的消息发布/订阅传输协议.MQTT协议是轻量.简单. ...
最新文章
- Odoo10 启动选项
- ctimespan 获取毫秒_VC++中通过CTime类获取日期差
- java 开发环境的搭建
- c++矩阵连乘的动态规划算法并输出_算法面试必修课,动态规划基础题型归纳(三)
- 序列二次规划_最优控制与规划
- mysql 5.6 利用gtid 同步数据遇到的问题记录
- 词形变换和词干提取工具(英文)
- SQL Server 2008中文版关系数据库基础与实践教程pdf
- 设计模式之美:Builder(生成器)
- uc通讯不成功php版本过高,UC通信失败怎么办
- 华为手机SD卡升级指导
- 超级计算机能力,再夺世界第一 中国天河2号超级计算机运算能力达30PF
- Wi-Fi MAC 地址随机化与人群监控
- 云队友丨跳槽?还是跳坑??
- Chrome访问剪切板实现右键复制粘贴
- Unity 使用 GPU 計算,使用 ComputeShader + ComputeBuffer
- RESTful接口架构是什么
- A7139 无线通信驱动(STM32) 添加FIFO扩展模式,能够发送超大数据包
- 出现域名争议是怎么解决的
- mac 桌面分屏软件_Spectacle for mac (V 1.2) 苹果电脑(分屏软件)