女主宣言

在之前的文章中,我们介绍了MQTT如何创建客户端与服务端,接下来就是如何进行消息的传递,本篇文章将进一步介绍MQTT的发布和订阅细节。

PS:丰富的一线技术、多元化的表现形式,尽在“360云计算”,点关注哦!

1

消息发布

每个消息必须包含一个主题,通过该主题服务端将消息投递给那些对该主题感兴趣的客户端。消息的具体内容是通过二进制的形式进行传递。MQTT是对消息内容无感知的,客户端可以发送任何格式的数据,比如二进制数据,文本数据,XML数据或者Json数据等。

Publish消息的格式

主题名称

主题是通过斜杠分隔的字符串组成的分层结构,例如 "myhome/livingroom/temperature"

服务质量

服务质量决定了消息投递到目标的保证等级。服务质量分三个等级,0,1,2。0表示消息最多投递一次,如果失败了也不会进行重试。1表示消息最少投递一次,消息如果接收端没有明确收到(返回acked),则会持续重试发送。2表示消息有且投递一次,这里指的有且只有一次,指的是消息从接收者向下投递该消息只有一次。

预留标志

预留标志决定了该消息是否保留为该主题最新的消息。当一个新客户端订阅该主题时,将会收到该主题最新的预留消息。预留消息针对一个主题最多有一条,可以没有。

消息体

消息体为消息的具体内容,MQTT是不感知消息内容的,所以用户可以任意传递消息。

重复字段

当消息的服务质量大于0的时候,消息进行重试的时候设置该字段。

2

消息订阅

如果没有客户端订阅主题,向主题发送消息,将不会有任何客户端收到该消息。客户端发送订阅请求到服务端订阅相应的主题。

Subscribe消息的格式如下

报文唯一标识

消息报文的唯一标识,服务端和客户端分别设置自己的PacketId,标识不具有全局唯一性,只要会话单向唯一即可。

订阅列表

一次订阅可以订阅多个主题。每个订阅操作需要包含订阅的主题名称和一个想要的服务质量。订阅时的主题可以是包含通配符的形式。如果订阅信息有重叠的,服务端将按照最大的服务质量来投递消息。

3

消息订阅确认

客户端请求订阅主题之后,服务端将回复suback。消息包含和订阅相同的报文唯一标识符,以及一组返回码,如下所示:

报文唯一标识

该报文唯一标识,需要同相应的订阅请求保持一致。

返回码

返回码对应订阅请求中的Qos-topic的列表,一对一的确认订阅的结果。如果成功则返回相应的服务质量(0/1/2),如果失败了则返回#ff(128).

客户端发起订阅,收到订阅成功后,接下来发送到该主题的消息,这个客户端都能正常接收到。

4

取消订阅

讲完订阅,就要讲如何能够不关注某个主题。取消订阅的报文如下所示,主要包含一个唯一标识符和一组待取消的主题列表。

5

取消订阅确认

取消订阅的返回只包含一个和取消订阅的相同的唯一标识符。无论之前是否订阅了该主题,取消订阅的确认都会正常返回。

6

总结

MQTT消息传递是通过订阅相应的主题,然后发布消息到相应主题的形式实现的。

发布之前无须进行主题的创建和维护,也不需要关心是否有客户端在订阅相应的主题。

发布订阅很好的解耦了发布者和订阅者,使得更加容易进行各种业务场景的组合,比如实现分组,实现广播等。

发布订阅同样也带来了一个问题,发布者如果希望能够感知到订阅者收到消息之后的回馈,只能通过业务层来实现,比如订阅者收到之后,再通过另外一个主题发布结构给发布者。

360云计算

由360云平台团队打造的技术分享公众号,内容涉及数据库、大数据、微服务、容器、AIOps、IoT等众多技术领域,通过夯实的技术积累和丰富的一线实战经验,为你带来最有料的技术分享

MQTT协议之发布订阅相关推荐

  1. mysql数据给mes_PLC通讯智能网关:MES服务对接,SQL数据库双向通讯,HTTP协议GET/POST请求,MQTT协议JSON发布/订阅...

    常用的PLC型号系列:相关软件手册等资料下载 ◆ FX: 三菱FX 系列PLC ◆ QL: 三菱Q/L/R 系列PLC ◆ AS: 三菱A 系列PLC ◆ OM: 欧姆龙全系列PLC ◆ S72S:  ...

  2. mosquitto c语言编程,MQTT通讯协议(mosquitto)发布订阅例子C语言实现

    1.前言 前面对MQTT进行了简单的介绍,并了解了如何在Linux上搭建MQTT 的运行 环境,参考连接:MQTT通讯协议(mosquitto)在Linux上的环境构建与测试,那些仅仅是经过命令去测试 ...

  3. Linux编程MQTT实现主题发布订阅

    [物联网阿里云平台开发项目实战|附课件资料]智能硬件开发-数据上云,零基础入门 4G模块连接阿里云教程 MQTT通信协议(mosquitto)在Linux上的环境构建与测试 MQTT通信协议(mosq ...

  4. 基于MQTT的消息发布订阅python实现

    简介: MQTT 全称为 Message Queuing Telemetry Transport(消息队列遥测传输)是一种基于发布/订阅范式的"轻量级"消息协议.该协议构建于TCP ...

  5. mqtt session保持 订阅消息_如何使用 MQTT 报文实现发布订阅功能

    MQTT 协议通过交换预定义的MQTT控制报文来通信.下面以 Connect 连接 MQTT 协议基于 TCP/IP 协议,MQTT Broker 和 Client 都有需要有 TCP/IP 地址. ...

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

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

  7. 单片机通过MQTT协议连接OneNet实现发布/订阅理论篇

    材料: 51单片机 ESP8266-01S ESP LINK烧写器(USB-TTL也可以) 杜邦线若干 MQTT简述: MQTT是基于发布/订阅范式的消息协议.你发布了一个Topic,只要别人订阅了这 ...

  8. iot架构 mqtt netty_Netty实现高性能IOT服务器(Groza)之手撕MQTT协议篇上

    前言 诞生及优势 MQTT由Andy Stanford-Clark(IBM)和Arlen Nipper(Eurotech,现为Cirrus Link)于1999年开发,用于监测穿越沙漠的石油管道.目标 ...

  9. 一文读懂MQTT协议

    1  概述 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级 ...

最新文章

  1. -webkit-overflow-scrolling与苹果
  2. Spring Cloud构建微服务架构:服务容错保护(Hystrix断路器)
  3. 交叉线和直连线的线序,做法和使用场合
  4. 嵌入式系统 Boot Loader 技术内幕
  5. Linux中的文件搜索 locate,find,grep ,whereis和which命令的使用
  6. Java:使用终止信号确定数据导入的状态
  7. 538B. Quasi Binary
  8. qt添加菜单纯代码_Qt Creator 插件开发(3):添加菜单项
  9. 让子弹飞,是什么意思?
  10. codevs 4093 EZ的间谍网络
  11. 计算机基础——Word 2010
  12. linux history命令详解
  13. Words Accumlation - Day 4
  14. 41.clip-path 滚动特效
  15. 计算机操作系统 学习笔记(第四版 汤小丹)(上)
  16. 潜匿的怪物,你的供应链真的安全吗?
  17. OmniPeek-20180725-Error 2502/Error 2053
  18. 苏黎世联邦理工学院计算机怎么样,哪位大神知道苏黎世联邦理工学院怎么样?...
  19. 如何将wps中的表格转为图片,并设置较高的dpi
  20. 电力变电站三维可视化

热门文章

  1. 《那些年啊,那些事——一个程序员的奋斗史》——86
  2. DataGrid的多行提交
  3. Python学习笔记之While循环(二)
  4. Zookeeper单机安装(开启kerberos)
  5. org.gjt.mm.mysql.Driver和com.mysql.jdbc.Driver的概述
  6. php导出服务器表格乱码,phpExcel导出, 在本地正常,在服务器乱码解决办法
  7. python基础语法类型_Python基础入门语法和变量类型(一)
  8. 计算机电源插头有哪几种,盘点电连接器常见的使用类型
  9. enspar启动失败40_法式长棍面包,在家自己做,简单零失败,低糖无油不担心长胖...
  10. 职高有计算机专业前途怎么样,职高有哪些专业前途好有发展前景