转战物联网·基础篇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上,不过需 ...
随机推荐
- 在Linux 中搭建 Mysql
在本次搭建,出现了各种问题,一直解决不掉,建议各位小伙伴不要像我一样,像一个无头的苍蝇一样,这有问题就解决这个问题,没有意识本质实在的问题. 主要问题(加星,标重点):一定要看自己的linux 版本, ...
- linux常用命令补充
linux补充 apt 是在我们Linux系统安装软件 pip 用来安装python3的模块(第三方库) ps # 查看运行进程(pid) ps aux # 查看全部任务进程 top # 也可以查看 ...
- ReactNative: 使用AsyncStorage异步存储类
一.简介 AsyncStorage是一个简单的具有异步特性可持久化的键值对key-value的存储系统.它对整个APP而言,是一个全局的存储空间,可以用来替代H5中提供的window属性LocalSt ...
- ELK 安装部署小计
ELK的安装部署已经是第N次了! 其实也很简单,这里记下来,以免忘记. #elasticsearch安装部署 wget https://artifacts.elastic.co/downloads/e ...
- MFC程序出现uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)解决办法
在同一个地方摔倒两次之后,决定记录下来这个东西. 问题 1>uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl opera ...
- 解决bcp导出CSV文件没有表头
思路: 1.输出表头文件到指定目录 2.bcp导出csv文件到temp目录 3.将以上导出文件与表头文件合并 4.删除temp目录下的文件 实现: create proc exportCSV ( @i ...
- SSM框架之SpringMVC(5)文件上传
SpringMVC(5)文件上传 1.实现文件上传的前期准备 1.1.文件上传的必要前提 A form 表单的 enctype 取值必须是: multipart/form-data(默认值是:appl ...
- 一、VUE项目BaseCms系列文章:项目介绍与环境配置
一.项目效果图预览: 二.项目介绍 基于 elementui 写一个自己的管理后台.这个系列文章的目的就是记录自己搭建整个管理后台的过程,希望能帮助到那些入门 vue + elementui 开发的小 ...
- 数据库死锁的问题,Deadlock found when trying to get lock; try restarting transaction at Query.formatError
场景: 应用刚上线排除大批量请求的问题 线上多次出现的Deadlock found when trying to get lock错误 代码: async batchUpdate(skus, { tr ...
- 多对多表结构的设计ManyToManyField(不会生成某一列、生成一张表):
示例: 脚本: from django.db import models# Create your models here. class Publisher(models.Model): name = ...