【MQTT基础篇(十二)】保留消息

保留消息

“保留消息”是十分重要的MQTT概念。通过“保留消息”这一名称不难判断,“保留消息”是一种被保留下来的消息。

1 保留消息的作用

要讲明“保留消息”这一概念,我们先看一个场景。假设我们正在利用MQTT协议开发一套智能家居物联网系统。在该系统中有一台专门用于检测和发布室温信息的MQTT客户端,它每到整点时就会测量当前室温并且向MQTT服务端发布室温测量结果。

假设在该智能家具物联网系统中,还有一台环境信息显示客户端。这台客户端的作用就是把当前的室温显示在屏幕上以便我们实时了解室内温度。换句话说,这台环境信息显示客户端一启动就会订阅室温主题,这样室温检测客户端一发布消息,显示客户端就能获取到最新的温度消息并显示在屏幕上了。

假设某天上午7:00,我们的室温检测客户端将最新的室温消息发布到了服务端,那么订阅了室温消息的显示客户端也就马上获取到室温消息并且显示在屏幕上。

然而在7:10的时候,家里的小狗不小心把显示客户端的电源碰掉了,显示客户端没有电也就自动关机了。我们发现这一问题后,马上把显示客户端重新通电,客户端通电启动后会立刻订阅室温主题。

但这时候问题出现了,室温测量客户端每到整点才发布一次温度信息。上一次发布时间是7:00,下一次发布时间是8:00。所以,尽管显示客户端订阅了室温主题,它还要等到8:00钟才能收到最新室温消息。在8:00前的几十分钟里,显示客户端无法获知当前室温信息,也就无法将室温信息显示在屏幕上供我们查阅。

为了避免以上情况出现,我们可以让室温测量客户端在每次向室温主题发布消息时都使用“保留消息”这一模式将温度信息发布到服务端。这样无论显示客户端在任何时间订阅室温主题,都会马上收到该主题中的“保留消息”,也就是温度测量客户端发布的最新室温消息。


2 发布保留消息的方法

在这里插入图片描述
MQTT设备发布的保留消息的流程与发布普通消息的流程十分类似。唯一区别是,在发布保留消息时,MQTT设备需要将PUBLISH报文中retainFlag设置为rue(如上图所示)。

当然,如果要发布非保留消息,那么PUBLISH报文中retainFlag设置为false


3 修改保留消息的方法

每一个主题只能有一个保留消息”,如果客户端想要更新“保留消息”,就需要向该主题发送一条新的“保留消息”,这样服务端会将新的“保留消息”覆盖旧的“保留消息”。当有客户端订阅该主题时,服务端就会将最新的“保留消息”发送给订阅客户端了。


4 删除保留消息的方法

如果要删除主题的“保留消息”,可以通过向该主题发布一条空的保留消息”,也就是发送一条0字节payload的“保留消息”


内容来自 -----> 太极创客
详情可见太极创客官网,内有Arduino、ESP32等详细教程

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用 MQTT 协议进行单对单消息传递,需要在 MQTT 客户端连接到 MQTT 服务器,并且订阅接收消息的主题(topic)。然后,客户端可以通过发布消息到特定主题来向其他客户端发送消息。以下是实现 MQTT 单对单消息传递的示例代码: 1. 连接到 MQTT 服务器 ``` String clientId = "client_id"; // 客户端标识符,可以自己定义 MqttClient mqttClient = new MqttClient("tcp://mqtt_server_ip:1883", clientId); mqttClient.connect(); ``` 2. 订阅接收消息的主题 ``` String topic = "my/topic"; // 订阅的主题名称 mqttClient.subscribe(topic); ``` 3. 发布消息到指定主题 ``` String message = "hello, world"; // 待发送的消息内容 MqttMessage mqttMessage = new MqttMessage(message.getBytes()); mqttClient.publish(topic, mqttMessage); ``` 4. 处理接收到的消息 ``` mqttClient.setCallback(new MqttCallback() { @Override public void connectionLost(Throwable cause) { // 连接丢失处理 } @Override public void messageArrived(String topic, MqttMessage message) throws Exception { // 处理接收到的消息 String content = new String(message.getPayload()); System.out.println("Received message: " + content); } @Override public void deliveryComplete(IMqttDeliveryToken token) { // 消息传递完成处理 } }); ``` 注意:在实际应用中,需要根据具体需求进行适当的调整,例如,设置 QoS 等级来确保消息传递的可靠性,同时还需要考虑消息的格式和内容等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eiker_3169

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值