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标志位的作用相关推荐

  1. TCP标志位 RST作用、原理、攻击

    TCP报头的标志位 TCP报头中一共有六个标志位:URG/ACK/PSH/RST/SYN/FIN.  SYN TCP三次握手中,如果A是发起端,则A就对服务器发一个SYN报文.表示建立连接. ACK ...

  2. 标志位的作用c语言,标志位作用及操作(转)

    一.运算结果标志位 1.进位标志CF(Carry Flag) 进位标志CF主要用来反映运算是否产生进位或借位.如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0. 使用该标志位的情 ...

  3. TCP 协议标志位PSH的作用

    1. PSH 标志位 PSH 标志位TCP6个标志位中重要的一个标志.它的英文单词是 PUSH,表示"推"的意思. 了解它的作用需要首先了解缓冲区. 1.1 接收缓冲区和发送缓冲区 ...

  4. 关于OF CF 标志位对于判定两整数大小关系(无符号数及有符号数情况)作用的讨论

    在x-86 64 IA32 体系下,处理器通过对两数求差(保存或不保存结果)然后读取被改变的条件码来判定结果的正负,进而得知两整数大小关系.其背后的逻辑关系设计非常精妙,然而大部分书籍资料中都只是一笔 ...

  5. 调整标志位方法oracle,面试题(二)(示例代码)

    1.查找/us/oc al/nginx/ogs下更改时间在7天前以log 后极的文件井移动到sr/oca/nginx/log/backup下(至少两种方法) 2. Centos 查看某个进程的环境安量 ...

  6. 汇编常见寄存器以及标志位

    汇编常见寄存器以及标志位 通用寄存器 简写 英文全称 中文 作用 AX accumulator 累加器 存放操作数,与外部设备 BX base 通用寄存器 基址寄存器(计算存储器地址时用) CX co ...

  7. Win32汇编:数组与标志位测试总结

    整理复习汇编语言的知识点,以前在学习<Intel汇编语言程序设计 - 第五版>时没有很认真的整理笔记,主要因为当时是以学习理解为目的没有整理的很详细,这次是我第三次阅读此书,每一次阅读都会 ...

  8. 弄清USART串口的使能位(UE、TCIE、RXNEIE)和标志位(TC、RXNE)

    下面通过485半双工的通信过程,记录USART串口的几个使能位.标志位.   说明:USART_IT_TC 和 USART_IT_RXNE是一个常量,并不代表(TC.RXNE)这两位. #define ...

  9. 标志寄存器——标志位

    标志位简介: 标志寄存器,又称程序状态寄存器(它的内容是Program Status Word,PSW).这是一个存放条件码标志,控制标志和系统标志的寄存器. 6个状态标志位 CF-进位标志,加法时的 ...

最新文章

  1. RSA加密解密在jsencrypt+c#的实现-博客园加密登录
  2. coreldraw绘制兔子视频_53个CAD市政工程设计视频教程+62个图纸,3天学会制图!
  3. 简单理解kafka---入门
  4. 手动绑定数据到GridView并实现编辑,删除,取消···
  5. Egret之JSZip高级应用:压缩JS
  6. 2021最新报告:一文洞察智慧金融发展现状
  7. jQuery框架学习第七天:jQuery动画–jQuery让页面动起来!
  8. docker es持久化_docker如何保持数据持久化?其实可以考虑通过数据卷挂载的方式~...
  9. 12.Memcached 与 Redis 区别
  10. 417.太平洋大西洋水流问题
  11. Base64 - 维基百科,自由的百科全书
  12. 什么是视频监控平台的平台对接
  13. android 根据宽度调整字体大小,android 字体大小 根据分辨率 自动调整
  14. Docker中成功安装修罗Xiunobbs论坛步骤
  15. 一路两输入正与门SN74AHC1G08学习
  16. 情境领导者-第一章、人员管理
  17. 贮藏工作 git stash
  18. 【git tag使用】
  19. 下雨天的十月末还不冷
  20. dell台式机进入安全模式_戴尔电脑如何进入安全模式

热门文章

  1. 零知识证明的潜在价值
  2. 中职学前专业钢琴集体课教学改革探讨
  3. 【数据结构】平衡二叉树的调整(RR LL LR RL)旋转详解讲解
  4. Win32控制台程序界面类
  5. bfd和nqa以及rip展示
  6. 论文阅读(一):Hierarchical LSTM for Sign Language Translation
  7. 贵金属买卖有运气吗?
  8. 程序员的算法趣题Q42: 将牌洗为逆序
  9. 第三代搜索引擎和p2p【转】
  10. js滚动条事件监听addEventListener、removeEventListener不生效