MQTT 简介
Message Queuing Telemetry Transport
无状态 VS 长连接
HTTP 是典型的无状态协议
RESTful 风格
每个请求作为与之前任何请求都无关的独立的事务
就是没有上下文
WebSocket 是个长连接
RPC 协议
Connecting / Connected / Disconnected
需要知道之前发生了什么
Req/Res VS Pub/Sub
HTTP 是典型的 Req / Res
RPC 都是 Req / Res
Socket.IO / ActionCable
队列系统
Kafka / RabbitMQ
其实就是推 (Push) 和拉 (Pull)
什么是 MQTT ?
MQTT 全称为 Message Queuing Telemetry Transport(消息队列遥测传输),是一种基于 发布/订阅 (Pub/Sub)模式的 轻量级物联网消息传输协议。
IBM 公司的安迪·斯坦福-克拉克及 Arcom 公司的阿兰·尼普于 1999 年撰写了该协议的第一个版本,之后 MQTT 便以简单易实现、支持 QoS、轻量且省带宽等众多特性逐渐成为了 IoT 通讯的标准。
目前 MQTT 标准是由 OASIS 维护的
什么是 OASIS ?
或许没听说这个组织。
但 Advanced Message Queueing Protocol (AMQP) 应该都有所耳闻
大名顶顶的 RabbitMQ 就是个协议的 Broker
这东西有什么用?
Web 实时消息
MQTT family
那用 HTTP 的变种协议?
HTTP VS MQTT
|
|
|
|
|
|
HTTP 的 Payload 要在 Header 里面指定类型,MQTT 没有这种参数
CoAP VS HTTP
MQTT 协议中有三种角色
MQTT 消息服务质量(QoS)
注:QoS 是针对于和 Broker 的通信(订阅者和发送者实际 QoS 会变成最低的)
主题层级
斜杠(“/” U+002F)用于分割主题的每个层级,为主题名提供一个分层结构。
分隔符用于将结构化引入主题名。如果存在分隔符,它将主题名分割为多个主题层级,是消息主题层级设计中很重要的符号。
比方说:aaa/bbb、aaa/bbb/ccc 和 aaa/bbb/ccc/ddd 这样的消息主题格式,是一个层层递进的关系,可通过多层通配符同时匹配两者,或者单层通配符只匹配一个。
主题过滤器(Topic Filter)
有两种主题过滤字符:
`#` 类似于 正则的 `.*` 的通配符
`+` 类似于 正则的 `.` 的通配符
主题过滤例子
当我们想获取卧室的所有数据时,可以订阅 myhome/bedroom/+ 主题,当我们想获取所有个房间的温度数据的时候,可以订阅 myhome/+/temperature 主题,当我们想获取所有的数据的时候,可以订阅 myhome/# 或者 #。
驻留消息(Retained Message)
类似于 IM 工具的置顶功能,当加入这个 topic 时就会收到这个消息
用过 IRC 的人或者会有体会,有些工具也许会叫 Pin
遗嘱消息(Will Message)
当检测到客户端异常断开时,服务器发布这个消息
用来检测客户端的是否在线
注:遗嘱消息只能在 Connect 包里面,中间不能更改
eclipse/paho 项目
或许是一个很好的 Socket.IO 的替代品