转战物联网·基础篇06-深入理解MQTT协议之基本术语
通过上一节我们对MQTT协议已经有了初步的印象,这一节我们开始深入的理解一下MQTT协议,介绍常用的MQTT 3.1.1版本,5.0版本后面指介绍新增部分即可。这一节我们先介绍MQTT里常用的术语(非官方文档直接复制)。
网络连接(Network Connection):
MQTT 是一种连接协议,底层使用 TCP/IP (传输层协议)提供网络连接,提供有序、可靠的、双向字节流传输。这个连接需要互联网通信的基础设施支撑,客户端使用它连接到服务端(MQTT代理服务的服务器或服务器集群)。
会话(Session):
客户端与服务端通过网络连接后的信息通道,服务端会有一个唯一的标志识别,也是状态交互的反映。通常一个会话就是一个网络连接,有些网络环境也可能将一个会话会扩展几个网络连接为之服务。
应用消息(Application Message):
使用MQTT协议通过网络连接传输的应用数据,也就是客户端与服务端之间交互的应用数据。应用消息通过MQTT传输时, 会有携带服务质量(QoS)和主题(Topic)等信息内容的。
服务端(Server) / 代理(Broker):
一个服务程序或设备,为消息发送方和消息订阅方提供中介服务,为发送方和订阅方提供中转分配处理,这个服务程序也称之为代理(Broker)。要处理来自客户端的网络连接、发布的应用消息,处理保存客户端的订阅和取消订阅,将应用消息转发给符合订阅条件的客户端,关闭客户端发出断开连接请求的网络连接等。
客户端(Client):
是与服务端对应的,使用MQTT为客户提供本地服务的程序或设备。客户端总是先发起连接请求通过网络连接到服务端。它可以:打开连接到服务端的网络连接、通过服务端发布应用消息给其他相关的客户端、订阅并接收相关的应用消息、取消订阅并不再接收相应消息、关闭与服务端的网络连接等。
主题(Topic):
标注应用程序消息的标签,订阅者用它来确定接收到所关心的消息,服务端代理服务会将消息转发给订阅者所匹配标签的每个客户端。主题名是一个分层的结构,可以有多个级别,级别之间用斜杠分隔。例:area-a/building-6/floor-8 代表A区6栋5层的设备发出的主题。
订阅者的主题名支持通配符#和+,可以通过通配符进行匹配过滤:
+为只匹配主题一个层级的通配符,例:area-a/+/floor-8 代表A区任何一个楼的8层的设备。
#为匹配主题该层级向后任意级别的通配符,例:area-a/# 代表A区的所用设备。
发布(Publish):
从MQTT客户端向MQTT服务端主动发送主题消息,或MQTT服务端向MQTT客户端主动发送主题消息(这种情况很少)。主题消息中包含着服务质量(QoS)等级。
订阅(Subscription):
订阅的过程与我们生活中向邮局订阅杂志类似,只不过是客户端向服务端订阅,订阅的是主题消息而不是杂志。当服务端的代理服务发现有客户端发布了某客户端订阅的主题消息时,就会把该主题消息转发给订阅了该主题消息的那个客户端。订阅的主题会与某个单一会话(Session)关联,一个会话可以关联多个订阅。每个订阅都包含一个主题过滤器(Topic Filter)和一个最大的服务质量(QoS)等级。
主题过滤器(Topic Filter):
是一个针对主题名过滤的筛选器,在订阅表达式中使用,表示订阅所匹配到的一个或多个主题。
服务质量(QoS):
表示发布者发布的主题到达代理和目标客户端的可靠性要求,MQTT服务质量分三个等级:
QoS =0,至多一次,有可能会丢包,一般用在对实时性要求不高并且会有新的数据覆盖旧的数据的场景。例如,某个温度传感器的数据上报,间隔一定时间上报一次,每次都更新服务端数据库中的记录。这样对于是否丢失某次上报的数据并不太重要,因为稍候还会上报新的数据上来更新到最新。
QoS =1,至少一次,确保到达目的地,但是有可能出现数据重复发送的现象,订阅者可能会收到重复的数据包。
QoS =2, 刚好一次,确保到达目的地,并且不会出现数据重复发送的现象。
遗嘱消息(Will Message):
遗嘱消息一般是在客户端 发起连接的时候指定的。是客户端预先定义好的一个主题消息,代表在自己异常断开的情况下,所留下的最后遗愿(Last Will),也称之为遗嘱。在客户端连接出现异常的情况下,由服务端代理服务主动发布此消息,订阅此消息的其他客户端就收到了这个客户端离线的遗嘱消息了。也就是你希望一个客户端离线后,用什么信息内容通知关心这个客户端离线的其他客户端。
控制报文 (MQTT Control Packet):
在MQTT协议框架下通过网络连接发送的信息数据包。MQTT规范定义了十四种不同类型的控制报文,其中PUBLISH报文是用于传输发布应用消息的。控制报文中最多包含三部分,依次分别是固定报头、可变报头、有效载荷。
固定报头(Fixed header):
是控制报文的最开始部分,代表着这个报文的具体作用和其他一些控制配置信息等。固定报头长度固定为2个字节起,后面会有详解。
可变报头(Variable header):
一个控制报文需要携带的控制信息量较多,就在固定报头后面增加了可变报头,一般也是2个字节长度,后面会有详解。
有效载荷(Payload):
是控制报文的最后一部分,包含主题名和我们需要携带的自定义的应用消息。例如我们要通过MQTT协议发送一个字符串“hello”,那这个“hello”字符串就是在有效载荷部分。
心跳(PINGREQ):
是为了保证服务端知道客户端的连接还在正常保持着,在没有必要的应用消息发出的时候,会在一定时间间隔发出一个很短的特定数据包,用于通知服务端,这个客户端连接正常。在没有业务逻辑需要主动发布消息的时候,网络连接就是靠这个有着固定时间间隔规律的数据包发送来维持连接正常的,这就像心脏跳动一样,有心跳知道这个人还活着,因此而得名!
本节完,待续......
转战物联网·基础篇06-深入理解MQTT协议之基本术语的更多相关文章
- 转战物联网·基础篇05-通俗理解MQTT协议的实现原理和异步方式
网络上搜索MQTT协议,会出现太多的解释,这里就不做官方标准释义的复制了.这一节我们从实战理解角度,通俗的将MQTT协议的作用及实现原理说一下,旨在可以快速理解MQTT协议.所以可能会出现很多看似 ...
- 转战物联网·基础篇07-深入理解MQTT协议之控制报文(数据包)格式
在MQTT协议中,一个控制报文(数据包)的结构按照前后顺序分如下三部分: 结构名 中文名 解释说明 Fixed header 固定报头 报文的最开始部分,所有报文都包含这个部分 Variable ...
- 转战物联网·基础篇08-例说MQTT协议各控制报文
前面讨论了MQTT协议的控制报文的格式,下面分别举例探讨各个控制报文的详细内容. 01.CONNECT – 连接服务端 客户端到服务端的网络连接建立后,客户端发送给服务端的第一个报文必须是CO ...
- 转战物联网·基础篇09-选择MQTT协议还是CoAP协议
前面章节介绍过,MQTT协议和CoAP协议都是物联网中比较流行的协议,都对传输量做了很大的精简,传输开销小,以适应物理网的网络环境. XMPP协议也有人说是适合物联网通信的,但它是基于XML, ...
- 转战物联网·基础篇03-从JSON数据到短指令谈思维的转变
了解了物联网项目的大体结构之后,我们先从物联网的联网相关部分说起,这也是物联网项目中的关键环节.在联网环节中,不仅要考虑如何连接上,还要考虑连接后如何传输数据.换句话说数据是以什么格式进行传输,对 ...
- iOS系列 基础篇 06 标签和按钮 (Label & Button)
iOS系列 基础篇 06 标签和按钮 (Label & Button) 目录: 标签控件 按钮控件 小结 标签和按钮是两个常用的控件,下面咱们逐一学习. 1. 标签控件 使用Single Vi ...
- 物联网防火墙himqtt源码之MQTT协议分析
物联网防火墙himqtt源码之MQTT协议分析 himqtt是首款完整源码的高性能MQTT物联网防火墙 - MQTT Application FireWall,C语言编写,采用epoll模式支持数十万 ...
- Java多线程系列--“基础篇”06之 线程让步
概要 本章,会对Thread中的线程让步方法yield()进行介绍.涉及到的内容包括:1. yield()介绍2. yield()示例3. yield() 与 wait()的比较 转载请注明出处:ht ...
- 【物联网云端对接-3】通过MQTT协议与微软Azure IoT Hub进行云端通信
在上一篇文章<通过MQTT协议与阿里云物联网套件进行云端通信>中,我们介绍了通过MQTT对接阿里云的物联网套件.其实同样的代码,稍加调整也可以对接到微软Azure IoT hub上,不过需 ...
随机推荐
- iOS开发-APP图标、启动页、名字的设置
APP图标.启动页.名字的设置:(较全面,但是APP启动页讲述的有漏洞) 参考链接:https://www.jianshu.com/p/2c7e181276ff APP启动页:(弥补上一文的漏洞) 参 ...
- 微信小程序之启动页的重要性
启动页在APP中是个很常见的需求,为什么对于小程序来说也非常重要呢?首先我描述一下我在开发过程中遇到的一些问题以及解决的步骤,到最后为什么要加启动页,看完你就明白了. 小程序的首页需要展示用户关注的小 ...
- 提升代码幸福度,五个技巧减少js开发中的if else语句
壹 ❀ 引 在JavaScript开发中,条件判断语句的使用频率是极高的,而对于条件判断简单易读的if else应该都是大家的首选.可是代码写的久了,我们总是希望自己的代码看着能更为简洁规范(逼格更 ...
- java map在JSTL EL中的小应用--<c:forEach>遍历Map<>泛型
准 备 数 据 :(自己准备吧少年,考验你时候到了!!) /** 结构示意图: 类型: List集合 map对象 LIst集合 Person类对象 String name : int age mLis ...
- LinuxProbe小结
1.修改主机名: /etc/hostname 2.配置 yum 软件仓库: (1)进入到 /etc/yum.repos.d/目录下,创建一个linuxprobe.repo的新文件(文件名称任意,结尾必 ...
- 一个有意思的自我介绍PPT快闪
模版来源:http://ppt.dede58.com/peixunyanjiang/27066.html
- 设计安全的API-JWT与OAuthor2
最近新开发一个需要给App使用的API项目.开发API肯定会想到JASON Web Token(JWT)和OAuthor2(之前一篇随笔记录过OAuthor2). JWT和OAuthor2的比较 要像 ...
- iOS正则表达式解决实际问题
问题:上海市徐汇区桂林路158号1202室 字符串长度不固定,数字长度也不固定.截取第二组数字. 方法一:[正则表达式] NSString * str = @"上海市徐汇区桂林路158号12 ...
- Windows下Kafka 2.3.0的下载和安装
Kafka是由Apache软件基金会开发的一个开源流处理平台,是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据. 特性:(1)通过O(1)的磁盘数据结构提供消息的持久化 ...
- VS2017创建的单元测试不支持顺序测试
问题:使用IDE创建的单元测试项目,标准引用是,导致不能添加顺序测试,复制其它项目的顺序测试文件进行编辑时,也会提示基于MSTest V2的测试不能用于顺序测试 解决办法: 移除自带的NU ...