MQTT协议入门介绍

目录

MQTT概览

MQTT特点

MQTT协议的主要特性

MQTT主要应用

MQTT基于主题(Topic)消息路由

MQTT V3.1.1协议报文

MQTT消息QoS

MQTT会话(Clean Session)

MQTT连接保活心跳

MQTT遗愿消息(Last Will)

MQTT保留消息(Retained Message)

MQTT WebSocket连接

MQTT协议客户端库

MQTT与XMPP协议对比

MQTT 在线测试工具

参考资料


MQTT概览

MQTT是一个轻量的发布订阅模式消息传输协议,专门针对低带宽和不稳定网络环境的物联网应用设计。MQTT 是 Message Queuing Telemetry Transport(消息队列遥测传输)的缩写,是 IBM 开发的一个即时通讯协议,它比较适合于在低带宽、不可靠的网络的进行远程传感器和控制设备通讯等,正在日益成为物联网通信协议的重要组成部分。

MQTT官网: http://mqtt.org

MQTT V3.1.1协议规范: http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html

MQTT特点

  1. 开放消息协议,简单易实现
  2. 发布订阅模式,一对多消息发布
  3. 基于TCP/IP网络连接
  4. 1字节固定报头,2字节心跳报文,报文结构紧凑
  5. 消息QoS支持,可靠传输保证

MQTT协议的主要特性

  • MQTT 协议使用发布 / 订阅消息范式来做到一对多的消息分发以及应用程序的解耦
  • MQTT 协议提供了 3 种(QoS)服务质量用于消息传输,适应不同的物联网数据传输场景
    • QoS 0:最多一次传送 (只负责传送,发送过后就不管数据的传送情况)
    • QoS 1:至少一次传送 (确认数据交付)
    • QoS 2:正好一次传送 (保证数据交付成功)
  • 通过很小的传输开销,以及最小化的协议交换来减少网络流量
  • 发生异常断线时通知各方的机制

MQTT主要应用

MQTT协议广泛应用于物联网、移动互联网、智能硬件、车联网、电力能源等领域。

  1. 物联网M2M通信,物联网大数据采集
  2. Android消息推送,WEB消息推送
  3. 移动即时消息,例如Facebook Messenger
  4. 智能硬件、智能家具、智能电器
  5. 车联网通信,电动车站桩采集
  6. 智慧城市、远程医疗、远程教育
  7. 电力、石油与能源等行业市场

MQTT基于主题(Topic)消息路由

MQTT协议基于主题(Topic)进行消息路由,主题(Topic)类似URL路径,例如:

chat/room/1

sensor/10/temperature

sensor/+/temperature

$SYS/broker/metrics/packets/received

$SYS/broker/metrics/#

主题(Topic)通过’/’分割层级,支持’+’, ‘#’通配符:

'+': 表示通配一个层级,例如a/+,匹配a/x, a/y

'#': 表示通配多个层级,例如a/#,匹配a/x, a/b/c/d

订阅者与发布者之间通过主题路由消息进行通信,例如采用mosquitto命令行发布订阅消息:

mosquitto_sub -t a/b/+ -q 1

mosquitto_pub -t a/b/c -m hello -q 1

注解

订阅者可以订阅含通配符主题,但发布者不允许向含通配符主题发布消息。

MQTT V3.1.1协议报文

报文结构

固定报头(Fixed header)
可变报头(Variable header)

报文有效载荷(Payload)

固定报头

Bit76543210
byte1MQTT Packet typeFlags
byte2…Remaining Length

报文类型

类型名称类型值报文说明
CONNECT1发起连接
CONNACK2连接回执
PUBLISH3发布消息
PUBACK4发布回执
PUBREC5QoS2消息回执
PUBREL6QoS2消息释放
PUBCOMP7QoS2消息完成
SUBSCRIBE8订阅主题
SUBACK9订阅回执
UNSUBSCRIBE10取消订阅
UNSUBACK11取消订阅回执
PINGREQ12PING请求
PINGRESP13PING响应
DISCONNECT14断开连接

PUBLISH发布消息

PUBLISH报文承载客户端与服务器间双向的发布消息。 PUBACK报文用于接收端确认QoS1报文,PUBREC/PUBREL/PUBCOMP报文用于QoS2消息流程。

PINGREQ/PINGRESP心跳

客户端在无报文发送时,按保活周期(KeepAlive)定时向服务端发送PINGREQ心跳报文,服务端响应PINGRESP报文。PINGREQ/PINGRESP报文均2个字节。

MQTT消息QoS

MQTT发布消息QoS保证不是端到端的,是客户端与服务器之间的。订阅者收到MQTT消息的QoS级别,最终取决于发布消息的QoS和主题订阅的QoS。

发布消息的QoS主题订阅的QoS接收消息的QoS
000
010
020
100
111
121
200
211
222

Qos0消息发布订阅

_images/qos0_seq.png

Qos1消息发布订阅

Qos2消息发布订阅

 

_images/qos2_seq.png

MQTT会话(Clean Session)

MQTT客户端向服务器发起CONNECT请求时,可以通过’Clean Session’标志设置会话。

‘Clean Session’设置为0,表示创建一个持久会话,在客户端断开连接时,会话仍然保持并保存离线消息,直到会话超时注销。

‘Clean Session’设置为1,表示创建一个新的临时会话,在客户端断开时,会话自动销毁。

MQTT连接保活心跳

MQTT客户端向服务器发起CONNECT请求时,通过KeepAlive参数设置保活周期。

客户端在无报文发送时,按KeepAlive周期定时发送2字节的PINGREQ心跳报文,服务端收到PINGREQ报文后,回复2字节的PINGRESP报文。

服务端在1.5个心跳周期内,既没有收到客户端发布订阅报文,也没有收到PINGREQ心跳报文时,主动心跳超时断开客户端TCP连接。

注解

emqttd消息服务器默认按最长2.5心跳周期超时设计。

MQTT遗愿消息(Last Will)

MQTT客户端向服务器端CONNECT请求时,可以设置是否发送遗愿消息(Will Message)标志,和遗愿消息主题(Topic)与内容(Payload)。

MQTT客户端异常下线时(客户端断开前未向服务器发送DISCONNECT消息),MQTT消息服务器会发布遗愿消息。

MQTT保留消息(Retained Message)

MQTT客户端向服务器发布(PUBLISH)消息时,可以设置保留消息(Retained Message)标志。保留消息(Retained Message)会驻留在消息服务器,后来的订阅者订阅主题时仍可以接收该消息。

例如mosquitto命令行发布一条保留消息到主题’a/b/c’:

mosquitto_pub -r -q 1 -t a/b/c -m 'hello'

之后连接上来的MQTT客户端订阅主题’a/b/c’时候,仍可收到该消息:

$ mosquitto_sub -t a/b/c -q 1
hello

保留消息(Retained Message)有两种清除方式:

  1. 客户端向有保留消息的主题发布一个空消息:

    mosquitto_pub -r -q 1 -t a/b/c -m ''
    
  2. 消息服务器设置保留消息的超期时间。

 

MQTT WebSocket连接

MQTT协议除支持TCP传输层外,还支持WebSocket作为传输层。通过WebSocket浏览器可以直连MQTT消息服务器,发布订阅模式与其他MQTT客户端通信。

MQTT协议的WebSocket连接,必须采用binary模式,并携带子协议Header:

Sec-WebSocket-Protocol: mqttv3.1 或 mqttv3.1.1

MQTT协议客户端库

emqtt客户端库

emqtt项目组: https://github.com/emqtt

emqttcErlang MQTT客户端库
CocoaMQTTSwift语言MQTT客户端库
QMQTTQT框架MQTT客户端库

Eclipse Paho客户端库

Paho官网: http://www.eclipse.org/paho/

mqtt.org官网客户端库

mqtt.org: https://github.com/mqtt/mqtt.github.io/wiki/libraries

MQTT与XMPP协议对比

MQTT协议设计简单轻量、路由灵活,将在移动互联网物联网消息领域,全面取代PC时代的XMPP协议:

  1. MQTT协议一个字节固定报头,两个字节心跳报文,报文体积小编解码容易。XMPP协议基于繁重的XML,报文体积大且交互繁琐。
  2. MQTT协议基于主题(Topic)发布订阅模式消息路由,相比XMPP基于JID的点对点消息路由更为灵活。
  3. MQTT协议未定义报文内容格式,可以承载JSON、二进制等不同类型报文。XMPP协议采用XML承载报文,二进制必须Base64编码等处理。
  4. MQTT协议支持消息收发确认和QoS保证,XMPP主协议并未定义类似机制。MQTT协议有更好的消息可靠性保证。

MQTT 在线测试工具

MQTT Web Toolkit 是 EMQ 最近开源的一款 MQTT (WebSocket) 测试工具,支持在线访问使用。该工具采用了聊天界面形式,简化了页面操作逻辑,方便用户快速测试验证 MQTT 应用场景:

  • 支持通过普通或者加密的 WebSocket 端口连接至 MQTT 消息服务器;
  • 链接的新建、编辑、删除以及缓存链接方便下次访问使用;
  • 不同链接的订阅列表管理;
  • 消息发布、接收、以及接收到新消息时提示,同时支持按照消息类型过滤消息列表。

访问 http://tools.emqx.io 即可查看使用。

 

 

参考资料

MQTT协议介绍 (Protocol):https://docs.emqx.io/broker/latest/cn/protocol.html#mqtt

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

No8g攻城狮

向每一个努力改变现状的你致敬!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值