MQTT 协议简介、与Websocket的区别
- MQTT
- 2020-07-27
- 18热度
- 0评论
MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。
MQTT协议原理:
简单来说就是客户端与服务端通过心跳包来保持连接,客户接收端向服务端订阅消息,客户发布端向服务端发布消息,服务端再将消息分发给订阅了该消息的客户接收端。


由于物联网的环境是非常特别的,所以MQTT遵循以下设计原则:
1、精简,不添加可有可无的功能;
2、发布/订阅(Pub/Sub)模式,方便消息在传感器之间传递;
3、允许用户动态创建主题,零运维成本;
4、把传输量降到最低以提高传输效率;
5、把低带宽、高延迟、不稳定的网络等因素考虑在内;
6、支持连续的会话控制;
7、理解客户端计算能力可能很低;
8、提供服务质量管理;
9、假设数据不可知,不强求传输数据的类型与格式,保持灵活性。
MQTT协议工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以下主要的几项特性:
1、使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。这一点很类似于XMPP,但是MQTT的信息冗余远小于XMPP,,因为XMPP使用XML格式文本来传递数据。
2、对负载内容屏蔽的消息传输。
3、使用TCP/IP提供网络连接。主流的MQTT是基于TCP连接进行数据推送的,但是同样有基于UDP的版本,叫做MQTT-SN。这两种版本由于基于不同的连接方式,优缺点自然也就各有不同了。
4、有三种消息发布服务质量:
a、"至多一次",消息发布完全依赖底层TCP/IP网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。这一种方式主要普通APP的推送,倘若你的智能设备在消息推送时未联网,推送过去没收到,再次联网也就收不到了。
b、"至少一次",确保消息到达,但消息重复可能会发生。
c、"只有一次",确保消息到达一次。在一些要求比较严格的计费系统中,可以使用此级别。在计费系统中,消息重复或丢失会导致不正确的结果。这种最高质量的消息发布服务还可以用于即时通讯类的APP的推送,确保用户收到且只会收到一次。
5、小型传输,开销很小(固定长度的头部是2字节),协议交换最小化,以降低网络流量。这就是为什么说它非常适合"在物联网领域,传感器与服务器的通信,信息的收集",要知道嵌入式设备的运算能力和带宽都相对薄弱,使用这种协议来传递消息再适合不过了。
6、使用Last Will和Testament特性通知有关各方客户端异常中断的机制。
Last Will:遗言机制,用于通知同一主题下的其他设备发送遗言的设备已经断开了连接。
Testament:遗嘱机制,功能类似于Last Will。
关于遗愿的作用:
当连接MQTT服务器时设置了遗愿的客户端异常退出,心跳超时后MQTT服务器会将该客户的遗愿消息发布出去,订阅了该遗愿消息的客户端会收到通知。总的来说,就是当客户异常退出(比如:断网) 后通知应用服务器的作用 (这个通知会有延迟,延迟时间和心跳有关)。
遗愿实际项目场景:
应用app服务器 监听了 主题/logout 的消息, 客户端app 连接MQTT服务器时设置了遗愿 主题:/logout ,消息内容 {当前app用户的id} ,当用户app网络断开,过了一段时间后,MQTT服务器发现这个连接的APP客户端心跳停止很久了(和超时时间有关),认为app客户端已经异常退出了,然后将其连接时设置的遗愿消息发布出来主题:/logout。服务器由于已经订阅了主题/logout的消息,所以能收到这条消息,消息内容中是app用户的id,然后服务器就可以做一些下线处理了。
mqtt与socket的区别主要有:
1、mqtt 协议是为计算能力有限,并且在低带宽、不可靠网络下工作的远程传感器、控制设备通讯而设计,而WebSocket则是为了浏览器与服务器全双工通信而设计;
2、mqtt 是IBM开发的即时通讯协议,而Socket是基于TCP的一种应用层网络协议。
WebSocket则使用一个TCP连接进行双向通讯的机制,包括网络协议和API,以取代网页和服务器采用HTTP轮询进行双向通讯的机制。本质上来说,WebSocket是不限于HTTP协议的,但是由于现存大量的HTTP基础设施,代理,过滤,身份认证等等,WebSocket借用HTTP和HTTPS的端口。由于使用HTTP的端口,因此TCP连接建立后的握手消息是基于HTTP的,由服务器判断这是一个HTTP协议,还是WebSocket协议。WebSocket连接除了建立和关闭时的握手,数据传输和HTTP没丁点关系了。
由此可知两者的应用场景不一样:
1、MQTT是为了物联网场景设计的基于TCP的Pub/Sub协议,有许多为物联网优化的特性,比如适应不同网络的QoS、层级主题、遗言等等。
2、WebSocket是为了HTML5应用方便与服务器双向通讯而设计的协议,HTTP握手然后转TCP协议,用于取代之前的Server Push、Comet、长轮询等老旧实现。
两者之所以有交集,是因为一个应用场景:如何通过HTML5应用来作为MQTT的客户端,以便接受设备消息或者向设备发送信息,那么MQTT over WebSocket自然成了最合理的途径了。
kafka和mqtt的区别是什么?
两者虽然都是从传统的Pub/Sub消息系统演化出来的,但是演化的方向不一样,以下是几个比较突出的点:
1、Kafka是为了数据集成的场景,与以往Pub/Sub消息总线不一样,通过分布式架构提供了海量消息处理、高容错的方式存储海量数据流、保证数据流的顺序等特性。
2、MQTT是为了物联网场景而优化,不但提供多个QoS选项(exact once、at least once、at most once),而且还有层级主题、遗嘱等等特性。
说白了都是传统消息系统(老爸)的子嗣,只是与不同的场景(老妈)结合的产物。不过,两者却可以结合起来使用。比如可以用MQTT接受物联网设备上传的数据,然后接入Kafka,最后可以同时分发到HDFS归档、数据仓库做OLAP分析、Elasticsearch做全文检索,这样的架构非常适合大型物联网项目,不但能够处理海量数据同时也具有很好的扩展性。

鲁ICP备19063141号
鲁公网安备 37010302000824号