2

即时通讯协议之MQTT

 2 years ago
source link: https://www.biaodianfu.com/mqtt.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

术→技巧, 研发

即时通讯协议之MQTT

钱魏Way · 2021-11-09 · 0 次浏览

MQTT简介

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议。它的设计思想是轻巧、开放、简单、规范,因此易于实现。这些特点使得它对很多场景来说都是很好的选择,包括受限的环境如机器与机器的通信(M2M)以及物联网环境(IoT),这些场景要求很小的代码封装或者网络带宽非常昂贵。

MQTT协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以下主要的几项特性:

  • 使用发布(Publish)/订阅/(Subscribe)消息模式,提供一对多的消息发布,解除应用程序耦合
  • 对负载内容屏蔽的消息传输
  • 使用TCP/IP提供网络连接
  • 有三种消息发布服务质量
    • “至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
    • “至少一次”,确保消息到达,但消息重复可能会发生。
    • “只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。
  • 小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量
  • 使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制

简单的说MQTT协议是一个轻量级的即时通讯协议。因为它被运用在一些硬件和网络不太好的环境,所以它对设备的要求不会太高,以适应艰难的环境。同时要保证信息传递的质量,所以有三种发布质量模式(QoS)

它原生条件下是基于TCP/IP的的应用层协议屏蔽了消息传输的具体数据交互格式。也就是不用关心底层是怎么传输的,数据用的是什么格式来传输的在物联网领域(IoT,Internet of Things)未来会有大发展。

MQTT的发展背景

物联网中的数据传输会面临很多问题,比如在网络不稳定的情况下,如果保证数据的传输没有问题,如何保证数据不被重复发送,连接断开后如何进行重连。总体来说,物联网的接入会面临以下几个方面的挑战:

  • 设备、传感器。物联网接入对终端采集和控制设备要求高,且终端的改造以及网络费用成本也比较高。另外,其对终端的能耗要求也比较高。
  • 网络。现有的网络传输贷款参差不齐,传输网络不稳定。
  • 服务器。高并发情况下,多客户端的接入能力以及消息处理能力。

MQTT的发展历史

在物联网中,开源和开放标准是基本的要素。MQTT的发展历史大致如下:

  • 1999年,IBM和合作伙伴共同发明了MQTT协议。
  • 2004年,org开放了论坛,供大家广泛参与。
  • 2011年,IBM建立了Eclipse开源项目Paho,并贡献了代码。Eclipse Paho是MQTT的Java实现版本。
  • 2013年,OASIS MQTT技术规范委员会成立。
  • 2014年,MQTT正式成为推荐的物联网传输协议标准。

MQTT协议

目前MQTT大家都用在了手机推送,如FacebookMessenger,因为小巧,省电,协议开销小和能高效的向一和多个接收者传递信息,故适用于移动应用设备上。那么轻巧在哪里呢,协议简单,最小的头部只需2个字节。相对于XMPP,MQTT更加轻量级,并且占用用户很少的带宽。整体上协议可拆分为:固定头部+可变头部+消息体

MessageType(0和15保留,共占4个字节)

  • “MQTT_CONNECT”=>1,//请求连接
  • “MQTT_CONNACK”=>2,//请求应答
  • “MQTT_PUBLISH”=>3,//发布消息
  • “MQTT_PUBACK”=>4,//发布应答
  • “MQTT_PUBREC”=>5,//发布已接收,保证传递1
  • “MQTT_PUBREL”=>6,//发布释放,保证传递2
  • “MQTT_PUBCOMP”=>7,//发布完成,保证传递3
  • “MQTT_SUBSCRIBE”=>8,//订阅请求
  • “MQTT_SUBACK”=>9,//订阅应答
  • “MQTT_UNSUBSCRIBE”=>10,//取消订阅
  • “MQTT_UNSUBACK”=>11,//取消订阅应答
  • “MQTT_PINGREQ”=>12,//ping请求
  • “MQTT_PINGRESP”=>13,//ping响应
  • “MQTT_DISCONNECT”=>14//断开连接

DUP flag

用来在保证消息传输可靠的,如果设置为1,则在下面的变长头部里多加MessageId,并需要回复确认,保证消息传输完成,但不能用于检测消息重复发送。

Qos

主要用于PUBLISH(发布态)消息的,保证消息传递的次数。

  • 00表示最多一次 即<=1
  • 01表示至少一次 即>=1
  • 10表示一次,即==1
  • 11保留后用

Retain

主要用于PUBLISH(发布态)的消息,表示服务器要保留这次推送的信息,如果有新的订阅者出现,就把这消息推送给它。如果不设那么推送至当前订阅的就释放了。

固定头部的byte 2

是用来保存接下去的变长头部+消息体的总大小的。但可以不直接保存的,同样也是可以扩展,其机制是前7位用于保存长度,后一部用做标识。

我举个例了,即如果计算出后面的大小为0<length<=127的,正常保存;如果是127<length<16383的,则需要二个字节保存了,将第一个字节的最大的一位置1,表示未完。然后第二个字节继续存。

拿130来说,第一个字节存10000011,第二个字节存000000001,也就是0x83,0x01,把两个字节连起来看,第二个字节权重从2的8次开始。同起可以加第3个字节,最多可以加至第4个字节。故MQTT协议最多可以实现268 435 455 (0xFF, 0xFF, 0xFF, 0x7F)将近256M的数据。可谓能伸能缩。

MQTT的使用

MQTT协议的架构,用一个示例说明。比如有1个温度传感器(1个Machine),2个小的显示屏(2个Machine),显示屏要显示温度传感器的温度值。可通过MQTT V3.1 Protocol Specification查阅详细规范的细节。

显示器需要先通过MQTT协议subscribe(订阅)一个比如叫temperature的topic(主题):

当温度传感器publish(发布)温度数据,显示器就可以收到了。

协议里还有2个主要的角色:

  • client,客户端
  • broker,服务器端

它们是通过TCP/IP协议连接的。因为MQTT是协议,所以不能拿来直接用的,就好比HTTP协议一样。需要找实现这个协议的库或者服务器来运行。

参考链接:


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK