什么是MQTT协议?
MQTT协议介绍
MQTT协议是什么?
MQTT(Message Queuing Telemetry Transport Protocol)的全称是消息队列遥感传输协议的缩写,是一种基于轻量级代理的发布/订阅模式的消息传输协议,运行在TCP协议栈之上,为其提供有序、可靠、双向连接的网络连接保证。
MQTT协议如何工作?
MQTT采用代理的发布/订阅模式实现了发布者和订阅者的解耦(decouple),因此,在MQTT协议中有三种角色:代理服务器、发布者客户端以及订阅者客户端,其中发布者和订阅者互不干扰,也就是说发布者和订阅者互不知道对方的存在,它们只知道代理服务器,代理服务器负责将来自发布者的消息进行存储处理并将这些消息发送到正确的订阅者中去。

代理服务器(Server)
代理服务器可以是一个程序或者设备,作为发送消息的客户端和请求订阅的客户端之间的中介。其主要作用是接收发布者客户端发布的应用信息,然后将信息转发给符合条件的订阅者客户端。
百度云天工智能物联网平台为用户提供了代理服务器的功能。
客户端(Client)
客户端指使用MQTT协议的程序或设备。客户端包括发布者客户端和订阅者客户端,同一个客户端可以即是发布者也是订阅者。客户端可以发布消息给其它相关客户端,也可以订阅其它客户端发布的消息。
因为每个用户的设备和使用场景不同,通常用户需要自己开发客户端软件。MQTT官方提供了Client SDK,可以帮助客户快速开发MQTT客户端。
百度云也为用户提供了websocket,可用于模拟客户端,帮助用户进行业务测试和验证。
如何将消息正确送达?
MQTT通过“主题”实现将消息从发布者客户端送达至接收者客户端。“主题”是附加在应用消息上的一个标签,发布者客户端将“主题”和“消息”发送至代理服务器,代理服务器将该消息转发至每一个订阅了该“主题”的订阅者客户端,如下图所示:

一个主题名可以由多个主题层级组成,每一层通过“/”斜杠分隔开,如上图所示,订阅者客户端A将主题过滤器设置为“baidu/F1”;订阅者客户端B将主题过滤器设置为“baidu/F2”。发布者客户端向“baidu/F1”发布消息,因此只有订阅者客户端A可以接收到该消息。
主题过滤器指客户端在订阅时包含的一个表达式,用于表示相关的一个或多个主题。
如何使用通配符订阅多个主题?
如果用户需要一次订阅多个具有类似结构的主题,可以在主题过滤器中包含通配符。通配符只可用在主题过滤器中,在发布应用消息时的主题名不允许包含通配符,主题通配符有两种:
#:表示匹配>=0个层次,比如a/#就匹配a/b,a/b/c(不能匹配a/,后面必须有其它主题)。单独的一个#表示匹配所有,不允许a#或a/#/c等形式。
+:表示匹配一个层次,例如a/+匹配a/b,a/c,不匹配a/b/c。单独的一个+是允许的,但a+为非法形式。

如何确保消息已被送达?
发布者客户端通过设置PUBLISH报文中的QoS标志位,对于客户端发布的消息提供三种服务质量等级,如下:
QoS=0,协议对此等级应用信息不要求回应确认,也没有重发机制,这类信息可能会发生消息丢失或重复,取决于TCP/IP提供的尽最大努力交互的数据包服务。
最少一次(At least once delivery):QoS=1,确保信息到达,但消息重复可能发生,发送者如果在指定时间内没有收到PUBACK控制报文,应用信息会被重新发送。
仅仅一次(Exactlyonce delivery):QoS=2,最高级别的服务质量,消息丢失和重复都是不可接受的。
什么是临终遗嘱?
MQTT协议利用KeepAlive机制在客户端异常断开时发现问题。当客户端断开时(例如:电量耗尽、系统崩溃或者网络断开),代理服务器会采取相应措施。
客户端设置“临终遗嘱”(LWT)信息后,当代理服务器检测到客户端离线后,就会发送保存在特定主题上的 LWT 信息,让其它订阅该主题的客户端知道该节点已经意外离线。
什么是MQTT协议?的更多相关文章
- 海鑫智圣:物联网漫谈之MQTT协议
什么是MQTT协议 MQTT(消息队列遥测传输协议)是IBM在1999年专门针对物联网等应用场景来制订的轻量级双向消息传输协议,它主要是为了解决物联网上使用到的设备的互相通信的问题,以及这些设备与后端 ...
- 基于MQTT协议进行应用开发
官方协议有句如下的话来形容MQTT的设计思想: "It is designed for connections with remote locations where a "sma ...
- 云巴:基于MQTT协议的实时通信编程模型
概要 有人常问,云巴实时通信系统到底提供了一种怎样的服务,与其他提供推送或 IM 服务的厂商有何本质区别.其实,从技术角度分析,云巴与其它同类厂商都是面向开发者的通信服务,宏观的编程模型都是大同小异, ...
- MQTT协议(一)
MQTT(Message Queue Telemetry Transport),遥测传输协议,提供订阅/发布模式,更为简约.轻量,易于使用,针对受限环境(带宽低.网络延迟高.网络通信不稳定),可以简单 ...
- MQTT协议的简单介绍和服务器的安装
最近公司做的项目中有用到消息推送,经过多方面的筛选之后确定了使用MQTT协议,相对于XMPP,MQTT更加轻量级,并且占用用户很少的带宽. MQTT是IBM推出的一种针对移动终端设备的基于TCP/IP ...
- MQTT协议学习笔记
1.前沿 万物联网的时代即将到来,物联网也由当初的概念开始进一步落实.随着无线网络技术飞速发展,各种设备都可以连接网络,实现远程控制.例如智能家居最近非常火爆,智能插座.智能LED灯.智能摄像头等.在 ...
- 【转载】MQTT学习笔记——MQTT协议体验 Mosquitto安装和使用
http://blog.csdn.net/xukai871105/article/details/39252653 0 前言 MQTT是IBM开发的一个即时通讯协议.MQTT是面向M2M和物联 ...
- 转:XMPP协议、MQTT协议、HTTP协议、CoAP协议的基本比较
一.先看下相关国外的专业数据对四大协议的比较: Protocol CoAP XMP ...
- 物联网MQTT协议分析和开源Mosquitto部署验证
在<物联网核心协议—消息推送技术演进>一文中已向读者介绍了多种消息推送技术的情况,包括HTTP单向通信.Ajax轮询.Websocket.MQTT.CoAP等,其中MQTT协议为IBM制定 ...
- MQTT协议详解一
首先给出MQTT协议的查看地址:http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html 当然也有PDF版的,百 ...
随机推荐
- DataX通过纯Java代码启动
DataX是阿里巴巴团队开发的一个很好开源项目,但是他们对如何使用只提供了python命令启动方式,这种方式对于只是想简单的用下DataX的人来说很是友好,仅仅需要几行代码就可以运行,但是如果你需要在 ...
- Windows下python2.7安装64位mysqlclient
在使用python调用mysql数据库的时候,需要引入对应的数据包 import MySQLdb 如果提示找不到对应的包,说明还需要安装对应的mysql数据库客户端操作的python包.在python ...
- 为你的WordPress博客添加CSS3炫酷读者墙
为你的WordPress博客添加CSS3炫酷读者墙,也就是把你文章的评论最活跃的读者显示在单独的一个页面,先看看效果吧: 1.复制主题的page.php,另存为readerwall.php,然后在其顶 ...
- 深度揭秘腾讯云TSF日调用量超万亿次背后技术架构
腾讯云TSF是整合外部开源框架和腾讯内部历经多年锤炼的PaaS平台打造而成的企业级分布式应用服务开发与托管平台,本文重点对TSF中负责服务托管的PaaS平台进行揭秘,从技术角度解析TSF 平台是如何每 ...
- 代码重构--switch的惊恐现身
switch作为条件判断(分支结构)中的一种方式,以至于我们对于它使用的频率处于较高水平的水平线上,为此我们应该使用Extra method来对这类判断条件进行抽取,另外从我自身而言,我发现我以前常常 ...
- 元组tuple基本操作
创建一个元组 tuple1=(1,2,3,4,5,6,7,8) tuple的标志仿佛是(),但是,有()不一定是元组,没有()不一定不是元组 tuple2=(1)#tuple2是一个整型 tuple3 ...
- MyBatis动态SQL小结
6:用于实现动态sql的元素及其用法 if+set--完成更新操作 if+where --完成多条件查询 if+完成多条件查询(替代where)或完成更新操作(替代set) choose(when,o ...
- 【BootStrap】 概述 & CSS
BootStrap BootStrap由Twitter开发,基于HTML,CSS,JS,是一套前端框架.它的特点是对浏览器良好的支持(目前市面上所有流行浏览器都可以),兼容移动设备,以及响应式设计(响 ...
- c++ --> union介绍
union介绍 共用体,也叫联合体,在一个“联合”内可以定义多种不同的数据类型, 一个被说明为该“联合”类型的变量中,允许装入该“联合”所定义的任何一种数据,这些数据共享同一段内存,以达到节省空间的目 ...
- PO BO VO DTO POJO DAO DO
PO BO DTO VO 归在一起叫是POJO,简单java对象:DAO 是进行数据库增删改查的类,DO不确定有没有. 重点说下POJO PO 持久对象,数据: BO 业务对象,封装对象.复杂对象 , ...