1 of 24

MQTT 简介

Message Queuing Telemetry Transport

2 of 24

无状态 VS 长连接

HTTP 是典型的无状态协议

RESTful 风格

每个请求作为与之前任何请求都无关的独立的事务

就是没有上下文

WebSocket 是个长连接

RPC 协议

Connecting / Connected / Disconnected

需要知道之前发生了什么

3 of 24

Req/Res VS Pub/Sub

HTTP 是典型的 Req / Res

RPC 都是 Req / Res

Socket.IO / ActionCable

队列系统

Kafka / RabbitMQ

4 of 24

其实就是推 (Push) 和拉 (Pull)

5 of 24

6 of 24

什么是 MQTT ?

MQTT 全称为 Message Queuing Telemetry Transport(消息队列遥测传输),是一种基于 发布/订阅 (Pub/Sub)模式的 轻量级物联网消息传输协议。

IBM 公司的安迪·斯坦福-克拉克及 Arcom 公司的阿兰·尼普于 1999 年撰写了该协议的第一个版本,之后 MQTT 便以简单易实现、支持 QoS、轻量且省带宽等众多特性逐渐成为了 IoT 通讯的标准。

目前 MQTT 标准是由 OASIS 维护的

7 of 24

什么是 OASIS ?

或许没听说这个组织。

Advanced Message Queueing Protocol (AMQP) 应该都有所耳闻

大名顶顶的 RabbitMQ 就是个协议的 Broker

8 of 24

这东西有什么用?

9 of 24

10 of 24

Web 实时消息

  • Websocket
  • ActionCable (ruby on rails)
  • AnyCable (兼容 ActionCable 的 golang 实现)
  • Socket.IO (JavaScript)
  • Django Channels (Python)
  • Broadcasting (PHP laravel)

11 of 24

MQTT family

  1. MQTT v3.1.1
  2. MQTT v5

  • MQTT-SN
  • MQTT over Websocket

12 of 24

13 of 24

那用 HTTP 的变种协议?

14 of 24

HTTP VS MQTT

  • URL
  • Topic
  • Header
  • Header
  • Payload
  • Payload

HTTP 的 Payload 要在 Header 里面指定类型,MQTT 没有这种参数

15 of 24

CoAP VS HTTP

  1. HTTP 的无状态
  2. HTTP 的 header
  3. HTTP 的状态码

16 of 24

MQTT 协议中有三种角色

  • 发布者(Publisher)
  • 代理(Broker)
  • 订阅者(Subscriber)

17 of 24

MQTT 消息服务质量(QoS)

  • QoS 0:消息最多传递一次,如果当时客户端不可用,则会丢失该消息。
  • QoS 1:消息传递至少 1 次。
  • QoS 2:消息仅传送一次。

注:QoS 是针对于和 Broker 的通信(订阅者和发送者实际 QoS 会变成最低的)

18 of 24

主题层级

斜杠(“/” U+002F)用于分割主题的每个层级,为主题名提供一个分层结构。

分隔符用于将结构化引入主题名。如果存在分隔符,它将主题名分割为多个主题层级,是消息主题层级设计中很重要的符号。

比方说:aaa/bbb、aaa/bbb/ccc 和 aaa/bbb/ccc/ddd 这样的消息主题格式,是一个层层递进的关系,可通过多层通配符同时匹配两者,或者单层通配符只匹配一个。

19 of 24

主题过滤器(Topic Filter)

有两种主题过滤字符:

`#` 类似于 正则的 `.*` 的通配符

`+` 类似于 正则的 `.` 的通配符

20 of 24

主题过滤例子

  • myhome/bedroom/temperature
  • myhome/bedroom/humidity
  • myhome/bedroom/airquality
  • myhome/livingroom/temperature
  • myhome/livingroom/humidity
  • myhome/livingroom/airquality

当我们想获取卧室的所有数据时,可以订阅 myhome/bedroom/+ 主题,当我们想获取所有个房间的温度数据的时候,可以订阅 myhome/+/temperature 主题,当我们想获取所有的数据的时候,可以订阅 myhome/# 或者 #。

21 of 24

驻留消息(Retained Message)

类似于 IM 工具的置顶功能,当加入这个 topic 时就会收到这个消息

用过 IRC 的人或者会有体会,有些工具也许会叫 Pin

22 of 24

遗嘱消息(Will Message)

当检测到客户端异常断开时,服务器发布这个消息

用来检测客户端的是否在线

注:遗嘱消息只能在 Connect 包里面,中间不能更改

23 of 24

eclipse/paho 项目

  • Mosquitto (eclipse MQTT broker)
  • Paho (eclipse MQTT lib, 各种编程语言都有)
  • Emqx (国内某公司做的 MQTT broker)

24 of 24

或许是一个很好的 Socket.IO 的替代品