MQTT协议的初浅认识之推送订阅

背景

了解MQTT怎么建立连接之后,现在重点来了解MQTT怎么推送,订阅两个方面。

概念

先见一张图:

pub-sub-mqttt

这张图是依旧借鉴HiveMQ的图,来讲述MQTT协议的推送和订阅的过程。推送和订阅,我们很容易理解。这里里面的推送客户端和订阅客户端,在上篇文章MQTT协议的初浅认识之连接建立中也都提到过,都是属于MQTT的客户端。这里面有一个比较陌生的概念是Topic,即话题这个概念。

话题

这个东西在MQTT里面很灵活,客户端订阅的对象其实也就是话题。话题主要有话题主题+正斜杠组成。如下:

topic_basics

话题其实就是由话题主题+正斜杆,组成的一个字符串,客户端订阅了这个话题字符串之后,就可以接收这个MQTT推送过来关于这个话题的消息。中间件也是根据话题,来分发从推送客户端推送到中间件的消息。

话题通配符

单级:+

表示不接收间隔多个话题级别,如下图:

topic_wildcard_plus

匹配的消息结果,如下:

topic_wildcard_plus_example

多级:#

表示接收多级间隔话题,如下:

topic_wildcard_hash

匹配消息,如下:

topic_wildcard_hash_example

开头:$

表示以什么开头的消息,这个不常用。

推送消息

publish_packet

MQTT客户端可以在连接到中间件后立即发布消息。MQTT中间件利用基于话题的消息进行过滤。每条消息必须包含一个话题,中间件可以使用该话题将消息转发给感兴趣的客户端。通常,每条消息都有包含一个的MQTT载荷与数据有关。客户端决定了有效负载的结构。发送客户端(发布者)决定是否要发送二进制数据,文本数据,甚至是完整的数据。XML或JSON。

参考说明:

  • packetId:消息id
  • topicName:话题标识
  • qos:通讯质量级别,分为三个级别,对应着三种不同的通讯方式,这个很重要的。
  • retainFlag:此标志定义中间件是否将消息保存为指定话题的最后一个默认消息值。当新客户端订阅某个话题时,他们会收到该主题上保留的最后一条消息。
  • payload:载荷,业务内容就在这里。
  • dupFlag:是否已经重复发送消息标识。

当客户端向MQTT中间件发送消息以进行发布时,中间件会读取该消息,确认消息(根据QoS级别)并处理该消息。中间件处理消息包括确定哪些客户已订阅该话题并将消息发送给他们。

publish_flow

最初发布消息的客户端只关心向中间件发送PUBLISH消息。一旦中间件收到PUBLISH消息,中间件就有责任将消息传递给所有订阅客户端。发布客户端不会获得有关是否有人对发布的消息感兴趣或有多少订阅客户端从中间件接收消息的任何反馈。

订阅消息

subscribe_packet

客户端订阅消息,相对于推送消息结构要简单的多,主要包括两个部分:

  • packetId:消息id;
  • qos+topic:通讯质量级别和话题数组

中间件收到客户端端的订阅SUBSCRIBE消息后,中间件会回答SUBACK消息。

SUBACK消息

suback_packet

参数说明:

  • packetId:消息id
  • returnCode:返回代码

返回代码说明:

Return Code

Return Code Response

0

Success – Maximum QoS 0

1

Success – Maximum QoS 1

2

Success – Maximum QoS 2

128

Failure

整个订阅过程,如图:

subscribe_flow

参考

MQTT Essentials Part 5: MQTT Topics & Best Practices

MQTT Essentials Part 4: MQTT Publish, Subscribe & Unsubscribe

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

Java日期时间API系列36

  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0