MQTT的RETAIN标志位的作用
1 MQTT介绍
MQTT是一种基于客户端/服务器架构(CS架构)的发布/订阅模式的消息传输协议。它最初由IBM开发,并被设计成为轻量、开放、简单以及易于实现的消息传输协议。MQTT很适合应用于环境受限(窄带、高延迟、不可靠的网络环境)的机器与机器(M2M)、物联网(IoT)设备之间的消息通信。
2 MQTT的RETAIN标志位
当我们使用MQTT客户端发布消息(PUBLISH
)时,如果将RETAIN标志位设置为true
,那么MQTT服务器会将最近收到的一条RETAIN标志位为true
的消息保存在服务器端(内存或文件)。
特别注意:MQTT服务器只会为每一个Topic保存最近收到的一条RETAIN标志位为true
的消息!也就是说,如果MQTT服务器上已经为某个Topic保存了一条Retained消息,当客户端再次发布一条新的Retained消息,那么服务器上原来的那条消息会被覆盖!
每当MQTT客户端连接到MQTT服务器并订阅了某个topic,如果该topic下有Retained消息,那么MQTT服务器会立即向客户端推送该条Retained消息。
2.1 发布RETAIN消息
如果想让MQTT服务器为某个Topic保留消息,只需要在发布消息的时候指定RETAIN标志位为true
即可。例如:
1 2 3 4 5 |
String topic = "retained/test"; byte[] payload = new byte[] {0x00, 0x01, 0x12}; int qos = 0; boolen retained = true; client.publish(topic, payload, qos, retained); |
特别注意:消息的RETAIN标志位与消息的QoS无关,即无论使用哪种级别的QoS,只要设置了RETAIN标志位为true
,那么MQTT服务器就会保存该条消息!
2.2 删除RETAIN消息
如果客户端想让MQTT服务器删除某个Topic下保存的Retained消息,唯一的方法是向MQTT服务器发布一条RETAIN标志位为true
的空消息。
空消息即为发布消息(PUBLISH
)的时候,Payload中设置0个字节的内容。
删除了某个Topic下保存的Retained消息,如果客户端没有再发布Retained消息,则MQTT服务器上对于该Topic就没有了Retained消息。
下面为删除某个Topic下保存的Retained消息的例子:
1 2 3 4 5 |
String topic = "retained/test"; byte[] payload = new byte[0]; int qos = 0; boolen retained = true; client.publish(topic, payload, qos, retained); |
2.3 RETAIN消息的应用场景举例
在实际应用中,我们可以利用RETAIN标志位来完成一些特定的需求。例如物联网应用中,通常我们会有硬件设备和移动APP的交互:
用户想通过APP来控制硬件设备,在打开APP的时候,APP需要及时知道设备的在线状态,只有设备在线用户才能通过APP去控制设备。
如果每个设备都对应有一个Topic,例如online/status/{devId}
,每当设备上线或者离线,服务器都会往该Topic发布一条设备连接状态的消息,并指定RETAIN为true
;每个APP对应地订阅online/status/{devId}
,那么每当APP启动并成功订阅online/status/{devId}
主题的时候,就会自动收到MQTT服务器推送的设备在线状态消息。这样一来用户就能及时知道该设备是否在线,能不能控制。
注明: 以上提到的{devId}
为每个设备相应的设备ID
MQTT的RETAIN标志位的作用相关推荐
- TCP标志位 RST作用、原理、攻击
TCP报头的标志位 TCP报头中一共有六个标志位:URG/ACK/PSH/RST/SYN/FIN. SYN TCP三次握手中,如果A是发起端,则A就对服务器发一个SYN报文.表示建立连接. ACK ...
- 标志位的作用c语言,标志位作用及操作(转)
一.运算结果标志位 1.进位标志CF(Carry Flag) 进位标志CF主要用来反映运算是否产生进位或借位.如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0. 使用该标志位的情 ...
- TCP 协议标志位PSH的作用
1. PSH 标志位 PSH 标志位TCP6个标志位中重要的一个标志.它的英文单词是 PUSH,表示"推"的意思. 了解它的作用需要首先了解缓冲区. 1.1 接收缓冲区和发送缓冲区 ...
- 关于OF CF 标志位对于判定两整数大小关系(无符号数及有符号数情况)作用的讨论
在x-86 64 IA32 体系下,处理器通过对两数求差(保存或不保存结果)然后读取被改变的条件码来判定结果的正负,进而得知两整数大小关系.其背后的逻辑关系设计非常精妙,然而大部分书籍资料中都只是一笔 ...
- 调整标志位方法oracle,面试题(二)(示例代码)
1.查找/us/oc al/nginx/ogs下更改时间在7天前以log 后极的文件井移动到sr/oca/nginx/log/backup下(至少两种方法) 2. Centos 查看某个进程的环境安量 ...
- 汇编常见寄存器以及标志位
汇编常见寄存器以及标志位 通用寄存器 简写 英文全称 中文 作用 AX accumulator 累加器 存放操作数,与外部设备 BX base 通用寄存器 基址寄存器(计算存储器地址时用) CX co ...
- Win32汇编:数组与标志位测试总结
整理复习汇编语言的知识点,以前在学习<Intel汇编语言程序设计 - 第五版>时没有很认真的整理笔记,主要因为当时是以学习理解为目的没有整理的很详细,这次是我第三次阅读此书,每一次阅读都会 ...
- 弄清USART串口的使能位(UE、TCIE、RXNEIE)和标志位(TC、RXNE)
下面通过485半双工的通信过程,记录USART串口的几个使能位.标志位. 说明:USART_IT_TC 和 USART_IT_RXNE是一个常量,并不代表(TC.RXNE)这两位. #define ...
- 标志寄存器——标志位
标志位简介: 标志寄存器,又称程序状态寄存器(它的内容是Program Status Word,PSW).这是一个存放条件码标志,控制标志和系统标志的寄存器. 6个状态标志位 CF-进位标志,加法时的 ...
最新文章
- RSA加密解密在jsencrypt+c#的实现-博客园加密登录
- coreldraw绘制兔子视频_53个CAD市政工程设计视频教程+62个图纸,3天学会制图!
- 简单理解kafka---入门
- 手动绑定数据到GridView并实现编辑,删除,取消···
- Egret之JSZip高级应用:压缩JS
- 2021最新报告:一文洞察智慧金融发展现状
- jQuery框架学习第七天:jQuery动画–jQuery让页面动起来!
- docker es持久化_docker如何保持数据持久化?其实可以考虑通过数据卷挂载的方式~...
- 12.Memcached 与 Redis 区别
- 417.太平洋大西洋水流问题
- Base64 - 维基百科,自由的百科全书
- 什么是视频监控平台的平台对接
- android 根据宽度调整字体大小,android 字体大小 根据分辨率 自动调整
- Docker中成功安装修罗Xiunobbs论坛步骤
- 一路两输入正与门SN74AHC1G08学习
- 情境领导者-第一章、人员管理
- 贮藏工作 git stash
- 【git tag使用】
- 下雨天的十月末还不冷
- dell台式机进入安全模式_戴尔电脑如何进入安全模式